]> WPIA git - gigi.git/commitdiff
ADD: Dynamic menu
authorJanis Streib <janis@dogcraft.de>
Sat, 23 Aug 2014 17:13:16 +0000 (19:13 +0200)
committerJanis Streib <janis@dogcraft.de>
Sat, 23 Aug 2014 17:23:50 +0000 (19:23 +0200)
src/org/cacert/gigi/Gigi.java
src/org/cacert/gigi/Gigi.templ
src/org/cacert/gigi/output/Menu.java
src/org/cacert/gigi/output/PageMenuItem.java [new file with mode: 0644]

index b8f216de0c784d9a015405558a7659d0d1236770..710ddb43833aa3532438b976b246446afc5d3cf8 100644 (file)
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Calendar;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
 
@@ -18,7 +19,7 @@ import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.output.Form.CSRFException;
 import org.cacert.gigi.output.Menu;
 import org.cacert.gigi.output.Outputable;
-import org.cacert.gigi.output.SimpleMenuItem;
+import org.cacert.gigi.output.PageMenuItem;
 import org.cacert.gigi.output.template.Template;
 import org.cacert.gigi.pages.LoginPage;
 import org.cacert.gigi.pages.MainPage;
@@ -38,6 +39,8 @@ import org.cacert.gigi.util.ServerConstants;
 
 public class Gigi extends HttpServlet {
 
+    private boolean firstInstanceInited = false;
+
     public static final String LOGGEDIN = "loggedin";
 
     public static final String USER = "user";
@@ -46,11 +49,13 @@ public class Gigi extends HttpServlet {
 
     private Template baseTemplate;
 
+    private LinkedList<Menu> categories = new LinkedList<Menu>();
+
     private HashMap<String, Page> pages = new HashMap<String, Page>();
-    
+
     private HashMap<Page, String> reveresePages = new HashMap<Page, String>();
 
-    private Menu m;
+    private Menu rootMenu;
 
     private static Gigi instance;
 
@@ -58,32 +63,57 @@ public class Gigi extends HttpServlet {
         if (instance != null) {
             new IllegalStateException("Multiple Gigi instances!");
         }
+        instance = this;
         DatabaseConnection.init(conf);
     }
 
     @Override
     public void init() throws ServletException {
-        putPage("/error", new PageNotFound());
-        putPage("/login", new LoginPage("CACert - Login"));
-        putPage("/", new MainPage("CACert - Home"));
-        putPage("/secure", new TestSecure());
-        putPage(Verify.PATH, new Verify());
-        putPage(AssurePage.PATH + "/*", new AssurePage());
-        putPage(Certificates.PATH + "/*", new Certificates());
-        putPage(MyDetails.PATH, new MyDetails());
-        putPage(ChangePasswordPage.PATH, new ChangePasswordPage());
-        putPage(RegisterPage.PATH, new RegisterPage());
-        putPage(CertificateAdd.PATH, new CertificateAdd());
-        putPage(MailOverview.DEFAULT_PATH, new MailOverview("My email addresses"));
-        putPage(DomainOverview.PATH, new DomainOverview("Domains"));
-        baseTemplate = new Template(Gigi.class.getResource("Gigi.templ"));
-        m = new Menu("Certificates", "cert", new SimpleMenuItem(MailOverview.DEFAULT_PATH, "Emails"), new SimpleMenuItem("", "Client Certificates"), new SimpleMenuItem("", "Domains"), new SimpleMenuItem("", "Server Certificates"));
+        if ( !firstInstanceInited) {
+            putPage("/error", new PageNotFound(), null);
+            putPage("/login", new LoginPage("CACert - Login"), "Join CAcert.org");
+            putPage("/", new MainPage("CACert - Home"), null);
+            putPage(ChangePasswordPage.PATH, new ChangePasswordPage(), "My Account");
+            putPage("/secure", new TestSecure(), null);
+            putPage(Verify.PATH, new Verify(), null);
+            putPage(AssurePage.PATH + "/*", new AssurePage(), "CAcert Web of Trust");
+            putPage(Certificates.PATH + "/*", new Certificates(), "Certificates");
+            putPage(MyDetails.PATH, new MyDetails(), "My Account");
+            putPage(RegisterPage.PATH, new RegisterPage(), "My Account");
+            putPage(CertificateAdd.PATH, new CertificateAdd(), "Certificates");
+            putPage(MailOverview.DEFAULT_PATH, new MailOverview("My email addresses"), "Certificates");
+            putPage(DomainOverview.PATH, new DomainOverview("Domains"), "Certificates");
+            baseTemplate = new Template(Gigi.class.getResource("Gigi.templ"));
+            rootMenu = new Menu("Main", "");
+            for (Menu menu : categories) {
+                menu.prepare();
+                rootMenu.addItem(menu);
+            }
+            rootMenu.prepare();
+            firstInstanceInited = true;
+        }
         super.init();
     }
 
-    private void putPage(String path, Page p) {
+    private void putPage(String path, Page p, String category) {
         pages.put(path, p);
         reveresePages.put(p, path);
+        if (category == null) {
+            return;
+        }
+        Menu m = null;
+        for (Menu menu : categories) {
+            if (menu.getMenuName().equals(category)) {
+                m = menu;
+                break;
+            }
+        }
+        if (m == null) {
+            m = new Menu(category, "");
+            categories.add(m);
+        }
+        m.addItem(new PageMenuItem(p));
+
     }
 
     @Override
@@ -106,7 +136,8 @@ public class Gigi extends HttpServlet {
         final Page p = getPage(req.getPathInfo());
         if (p != null) {
 
-            if ( !p.isPermitted(LoginPage.getUser(req)) && hs.getAttribute("loggedin") == null) {
+            User currentPageUser = LoginPage.getUser(req);
+            if ( !p.isPermitted(currentPageUser) && hs.getAttribute("loggedin") == null) {
                 String request = req.getPathInfo();
                 request = request.split("\\?")[0];
                 hs.setAttribute(LoginPage.LOGIN_RETURNPATH, request);
@@ -144,7 +175,8 @@ public class Gigi extends HttpServlet {
 
                 }
             };
-            vars.put("menu", m);
+            vars.put(Menu.USER_VALUE, currentPageUser);
+            vars.put("menu", rootMenu);
             vars.put("title", p.getTitle());
             vars.put("static", ServerConstants.getStaticHostNamePort());
             vars.put("year", Calendar.getInstance().get(Calendar.YEAR));
@@ -207,7 +239,7 @@ public class Gigi extends HttpServlet {
     }
 
     public static String getPathByPage(Page p) {
-        return instance.reveresePages.get(p);
+        return instance.reveresePages.get(p).replaceFirst("\\*$", "");
     }
 
 }
index 0d5121e2720107dd6f73493c888b46a9ae84d8f1..37858f7452130812f1db504b145842c42aa1a8d6 100644 (file)
                        </div>
                </div>
                <div id="pageNav">
-                       <div>
-                               <h3>CAcert.org beitreten</h3>
-                               <a href="/register">Beitreten</a> <a
-                                       href="/policy/CAcertCommunityAgreement.php">Vereinbarung der
-                                       Gemeinschaft (Community Agreement)</a> <a href="/index.php?id=3">Stammzertifikat</a>
-                       </div>
-                       <div>
-                               <h3 class="pointer">Mein Konto</h3>
-                               <a href="/login">Anmelden mit
-                                       Kennwort</a> <a href="">Kennwort
-                                       vergessen</a> <a
-                                       href="https://www.cacert.org/index.php?id=4&amp;noauto=1">Anmelden
-                                       im Net-Cafe</a> <a href="/login">Anmelden
-                                       mit Zertifikat</a>
-                       </div>
                        <?=$menu?>
                        <div>
                                <h3 class="pointer">+ Über CAcert.org</h3>
index 629154cc4476b783179da5380bac6fa837327b5b..9ad9ba9919e2edd133f77e894c25b3d99cdff735 100644 (file)
@@ -1,11 +1,14 @@
 package org.cacert.gigi.output;
 
 import java.io.PrintWriter;
+import java.util.LinkedList;
 import java.util.Map;
 
 import org.cacert.gigi.localisation.Language;
 
-public class Menu implements Outputable {
+public class Menu implements IMenuItem {
+
+    public static final String USER_VALUE = "user";
 
     private String menuName;
 
@@ -13,10 +16,11 @@ public class Menu implements Outputable {
 
     private IMenuItem[] content;
 
-    public Menu(String menuName, String id, IMenuItem... content) {
+    private LinkedList<IMenuItem> prepare = new LinkedList<IMenuItem>();
+
+    public Menu(String menuName, String id) {
         this.menuName = menuName;
         this.id = id;
-        this.content = content;
     }
 
     @Override
@@ -31,7 +35,28 @@ public class Menu implements Outputable {
         for (Outputable mi : content) {
             mi.output(out, l, vars);
         }
-
         out.println("</ul></div>");
     }
+
+    public void addItem(IMenuItem item) {
+        prepare.add(item);
+    }
+
+    public void prepare() {
+        content = new IMenuItem[prepare.size()];
+        content = prepare.toArray(content);
+        prepare = null;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof Menu) {
+            return menuName.equals(((Menu) obj).getMenuName());
+        }
+        return super.equals(obj);
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
 }
diff --git a/src/org/cacert/gigi/output/PageMenuItem.java b/src/org/cacert/gigi/output/PageMenuItem.java
new file mode 100644 (file)
index 0000000..846563f
--- /dev/null
@@ -0,0 +1,28 @@
+package org.cacert.gigi.output;
+
+import java.io.PrintWriter;
+import java.util.Map;
+
+import org.cacert.gigi.Gigi;
+import org.cacert.gigi.User;
+import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.pages.Page;
+import org.cacert.gigi.util.ServerConstants;
+
+
+public class PageMenuItem extends SimpleMenuItem {
+
+    private Page p;
+
+    public PageMenuItem(Page p) {
+        super("https://" + ServerConstants.getWwwHostNamePort() + Gigi.getPathByPage(p), p.getTitle());
+        this.p = p;
+    }
+
+    @Override
+    public void output(PrintWriter out, Language l, Map<String, Object> vars) {
+        if (p.isPermitted((User) vars.get(Menu.USER_VALUE))) {
+            super.output(out, l, vars);
+        }
+    }
+}