[Yanel-dev] Patch: Make toolbar replaceable

Rob Adamson bobacus at gmail.com
Thu Nov 4 19:28:24 CET 2010


Hi,

Please could you have a look at the attached patch, which makes the
whole Yanel toolbar configurable?

It re-uses the <menu> entry in the realm configuration - if the class
implements the new interface YanelToolbar, this is used, otherwise the
DefaultYanelToolbar is used and the <menu> entry is treated as a
subclass of org.wyona.yanel.servlet.menu.Menu.

I had to give YanelServlet.getIdentity public visibility  (previously
it was package visibility).

Hopefully it is backward compatible.

Kind regards,

Rob
-------------- next part --------------
Index: src/webapp/src/java/org/wyona/yanel/servlet/YanelHTMLUI.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/webapp/src/java/org/wyona/yanel/servlet/YanelHTMLUI.java	(revision =
54331)
+++ src/webapp/src/java/org/wyona/yanel/servlet/YanelHTMLUI.java	(working c=
opy)
@@ -1,20 +1,19 @@
 package org.wyona.yanel.servlet;
 =

-import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 =

-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 =

 import org.apache.log4j.Logger;
-import org.wyona.security.core.api.Identity;
 import org.wyona.yanel.core.Resource;
-import org.wyona.yanel.core.api.attributes.VersionableV2;
 import org.wyona.yanel.core.attributes.viewable.View;
 import org.wyona.yanel.core.map.Map;
-import org.wyona.yanel.core.util.ResourceAttributeHelper;
+import org.wyona.yanel.servlet.menu.Menu;
+import org.wyona.yanel.servlet.menu.impl.DefaultMenu;
+import org.wyona.yanel.servlet.toolbar.YanelToolbar;
+import org.wyona.yanel.servlet.toolbar.impl.DefaultYanelToolbar;
 =

 =

 /**
@@ -58,114 +57,32 @@
         }
     }
 =

-    /**
-     * Get toolbar menus
-     */
-    private  String getToolbarMenus(Resource resource, HttpServletRequest =
request) throws ServletException, IOException, Exception {
-        org.wyona.yanel.servlet.menu.Menu menu =3D null;
-        String menuRealmClass =3D resource.getRealm().getMenuClass();
-        if (menuRealmClass !=3D null) {
-            menu =3D (org.wyona.yanel.servlet.menu.Menu) Class.forName(men=
uRealmClass).newInstance();
+	private YanelToolbar getYanelToolbar(Resource resource) throws ClassNotFo=
undException, InstantiationException,
+			IllegalAccessException {
+		YanelToolbar yanelToolbar =3D null;
+		Menu menu =3D null;
+		String menuRealmClassName =3D resource.getRealm().getMenuClass();
+		if (menuRealmClassName !=3D null) {
+			Class<?> menuRealmClass =3D Class.forName(menuRealmClassName);
+			if (Menu.class.isAssignableFrom(menuRealmClass)) {
+				menu =3D (Menu) menuRealmClass.newInstance();
+				yanelToolbar =3D new DefaultYanelToolbar(menu);
+			} else if (YanelToolbar.class.isAssignableFrom(menuRealmClass)) {
+				yanelToolbar =3D (YanelToolbar) menuRealmClass.newInstance();
+			} else {
+				new ClassCastException("Realm menu must either subclass ...Menu or imp=
lement ...YanelToolbar, but is ["
+						+ menuRealmClassName + "]");
+			}
         // TODO: Check resource configuration ...
         //} else if (RESOURCE) {
         } else {
-            menu =3D new org.wyona.yanel.servlet.menu.impl.DefaultMenu();
+			menu =3D new DefaultMenu();
+			yanelToolbar =3D new DefaultYanelToolbar(menu);
         }
-        final String reservedPrefix =3D this.reservedPrefix;
-        final Map map =3D this.map;
-        return menu.getAllMenus(resource, request, map, reservedPrefix);
+		return yanelToolbar;
     }
 =

     /**
-     * Gets the part of the toolbar which has to be inserted into the html=
 header.
-     * @param resource
-     * @param request
-     * @return
-     * @throws Exception
-     */
-    private String getToolbarHeader(Resource resource, HttpServletRequest =
request) throws Exception {
-        final String reservedPrefix =3D this.reservedPrefix;
- =

-        String backToRealm =3D org.wyona.yanel.core.util.PathUtil.backToRe=
alm(resource.getPath());
-        StringBuilder sb=3D new StringBuilder();
-        =

-        sb.append("<!-- START: Dynamically added code by " + this.getClass=
().getName() + " -->");
-        sb.append(System.getProperty("line.separator"));
-        sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm + re=
servedPrefix + "/toolbar.css\" rel=3D\"stylesheet\"/>");
-        sb.append(System.getProperty("line.separator"));
-        sb.append("<style type=3D\"text/css\" media=3D\"screen\">");
-        sb.append(System.getProperty("line.separator"));
-        sb.append("#yaneltoolbar_menu li li.haschild{ background: lightgre=
y url(" + backToRealm + reservedPrefix + "/yanel-img/submenu.gif) no-repeat=
 98% 50%;}");
-        sb.append(System.getProperty("line.separator"));
-        sb.append("#yaneltoolbar_menu li li.haschild:hover{  background: l=
ightsteelblue url(" + backToRealm + reservedPrefix + "/yanel-img/submenu.gi=
f) no-repeat 98% 50%;}");
-        sb.append("</style>");
-        sb.append(System.getProperty("line.separator"));
-        =

-        // If browser is Mozilla (gecko engine rv:1.7)
-        if (request.getHeader("User-Agent").indexOf("rv:1.7") >=3D 0) {
-            sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm =
+ reservedPrefix + "/toolbarMozilla.css\" rel=3D\"stylesheet\"/>");
-            sb.append(System.getProperty("line.separator"));
-        }
-        // If browser is IE
-        if (request.getHeader("User-Agent").indexOf("compatible; MSIE") >=
=3D 0 && request.getHeader("User-Agent").indexOf("Windows") >=3D 0 ) {
-            sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm =
+ reservedPrefix + "/toolbarIE.css\" rel=3D\"stylesheet\"/>");
-            sb.append(System.getProperty("line.separator"));
-            sb.append("<style type=3D\"text/css\" media=3D\"screen\">");
-            sb.append("  body{behavior:url(" + backToRealm + reservedPrefi=
x + "/csshover.htc);font-size:100%;}");
-            sb.append("</style>");
-            =

-        }
-        // If browser is IE6
-        if (request.getHeader("User-Agent").indexOf("compatible; MSIE 6") =
>=3D 0 && request.getHeader("User-Agent").indexOf("Windows") >=3D 0 ) {
-            sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm =
+ reservedPrefix + "/toolbarIE6.css\" rel=3D\"stylesheet\"/>");
-            sb.append(System.getProperty("line.separator"));
-        }
-        sb.append("<!-- END: Dynamically added code by " + this.getClass()=
.getName() + " -->");
-
-        return sb.toString();
-    }
-    =

-    /**
-     * Gets the part of the toolbar which has to be inserted into the html=
 body =

-     * right after the opening body tag.
-     * @param resource
-     * @return
-     * @throws Exception
-     */
-    private String getToolbarBodyStart(Resource resource, HttpServletReque=
st request) throws Exception {
-        final String reservedPrefix =3D this.reservedPrefix;
-        final Map map =3D this.map;
-
-        String backToRealm =3D org.wyona.yanel.core.util.PathUtil.backToRe=
alm(resource.getPath());
-        StringBuilder buf =3D new StringBuilder();
-        buf.append("<div id=3D\"yaneltoolbar_headerwrap\">");
-        buf.append("<div id=3D\"yaneltoolbar_menu\">");
-        buf.append(getToolbarMenus(resource, request));
-        buf.append("</div>");
-        =

-        buf.append(getInfo(resource, request));
-        =

-        buf.append("<span id=3D\"yaneltoolbar_logo\">");
-        buf.append("<a href=3D\"http://www.yanel.org\"><img src=3D\"" + ba=
ckToRealm + reservedPrefix + "/yanel_toolbar_logo.png\" border=3D\"0\"/></a=
>");
-        buf.append("</span>");
-
-        buf.append("</div>");
-        buf.append("<div id=3D\"yaneltoolbar_middlewrap\">");
-        return buf.toString();
-    }
-    =

-    /**
-     * Gets the part of the toolbar which has to be inserted into the html=
 body
-     * right before the closing body tag.
-     * @param resource
-     * @return
-     * @throws Exception
-     */
-    private String getToolbarBodyEnd(Resource resource, HttpServletRequest=
 request) throws Exception {
-        return "</div>";
-    }
-    =

-    /**
      * Merges the toolbar and the page content. This will parse the html s=
tream and add
      * the toolbar.
      * @param response
@@ -175,6 +92,8 @@
      */
     void mergeToolbarWithContent(HttpServletRequest request, HttpServletRe=
sponse response, Resource resource, View view) throws Exception {
 =

+		YanelToolbar yanelToolbar =3D getYanelToolbar(resource);
+
         final int INSIDE_TAG =3D 0;
         final int OUTSIDE_TAG =3D 1;
 =

@@ -210,7 +129,7 @@
                         headExists =3D true;
                         if (headcount =3D=3D 0) {
                             writer.write(tag, 0, tag.length());
-                            String toolbarString =3D getToolbarHeader(reso=
urce, request);
+								String toolbarString =3D yanelToolbar.getToolbarHeader(resource, r=
equest, reservedPrefix);
                             writer.write(toolbarString, 0, toolbarString.l=
ength());
                         } else {
                             writer.write(tag, 0, tag.length());
@@ -221,7 +140,7 @@
                             log.warn("No <head> exists. Hence <head> will =
be added dynamically.");
                             String headStartTag =3D "<head>";
                             writer.write(headStartTag, 0, headStartTag.len=
gth());
-                            String toolbarString =3D getToolbarHeader(reso=
urce, request);
+								String toolbarString =3D yanelToolbar.getToolbarHeader(resource, r=
equest, reservedPrefix);
                             writer.write(toolbarString, 0, toolbarString.l=
ength());
                             String headEndTag =3D "</head>";
                             writer.write(headEndTag, 0, headEndTag.length(=
));
@@ -239,7 +158,7 @@
                     } else if (tag.equals("</body>")) {
                         bodycount--;
                         if (bodycount =3D=3D 0) {
-                            String toolbarString =3D getToolbarBodyEnd(res=
ource, request);
+								String toolbarString =3D yanelToolbar.getToolbarBodyEnd(resource, =
request);
                             writer.write(toolbarString, 0, toolbarString.l=
ength());
                             writer.write(tag, 0, tag.length());
                         } else {
@@ -263,7 +182,11 @@
         }
     }
     =

-    /**
+	private String getToolbarBodyStart(Resource resource, HttpServletRequest =
request) throws Exception {
+		return getYanelToolbar(resource).getToolbarBodyStart(resource, request, =
map, reservedPrefix);
+	}
+
+	/**
      *
      */
     void enableToolbar(HttpServletRequest request) {
@@ -286,87 +209,10 @@
             String yanelToolbar =3D request.getParameter(TOOLBAR_PARAM_NAM=
E);
             if(yanelToolbar !=3D null && request.getParameter(TOOLBAR_PARA=
M_NAME).equals("suppress")) {
                 return false;
-            } else {
-                return true;
             }
+			return true;
         }
         return false;
     }
 =

-    /**
-     * Get information such as realm name, user name, etc.
-     */
-    private String getInfo(Resource resource, HttpServletRequest request) =
throws Exception {
-        String userLanguage =3D getUserLanguage(resource);
-        StringBuilder buf =3D new StringBuilder();
-        buf.append("<span id=3D\"yaneltoolbar_info\">");
-        //buf.append("Version: " + yanel.getVersion() + "-r" + yanel.getRe=
vision() + "&#160;&#160;");
-
-        if (ResourceAttributeHelper.hasAttributeImplemented(resource, "Ver=
sionable", "2")) {
-            VersionableV2 versionableRes =3D (VersionableV2)resource;
-            if (versionableRes.isCheckedOut()) {
-                buf.append(getLabel("page", userLanguage) + ": <b>Locked b=
y " + versionableRes.getCheckoutUserID() + "</b> (<a href=3D\"?" + YanelSer=
vlet.YANEL_RESOURCE_USECASE + "=3D" + YanelServlet.RELEASE_LOCK + "\">unloc=
k</a>)&#160;&#160;");
-            }
-        }
-
-        Identity identity =3D YanelServlet.getIdentity(request, map);
-        if (identity !=3D null && !identity.isWorld()) {
-            String backToRealm =3D org.wyona.yanel.core.util.PathUtil.back=
ToRealm(resource.getPath());
-            buf.append(getLabel("user", userLanguage) + ": <b><a href=3D\"=
" + backToRealm + "yanel/users/" + identity.getUsername() + ".html\" style=
=3D\"font-size: 13px; text-decoration: none;\">" + identity.getAlias() + "<=
/a></b>"); // TODO: yanel/users should be replaced by reservedPrefix, also =
see src/webapp/src/java/org/wyona/yanel/servlet/menu/Menu.java
-        } else {
-            buf.append(getLabel("user", userLanguage) + ": <b>Not signed i=
n!</b>");
-        }
-        buf.append("</span>");
-        return buf.toString();
-    }
-
-    /**
-     * Get i18n (TODO: Replace this by something more generic)
-     *
-     * @param key I18n key
-     * @param language Language
-     */
-    private static String getLabel(String key, String language) {
-        if (language.equals("de")) {
-            if(key.equals("user")) {
-                return "Benutzer";
-            } else if(key.equals("page")) {
-                return "Seite";
-            } else {
-                log.warn("Key '" + key + "' not supported yet by requested=
 language '" + language + "'. Fallback to english!");
-                return getLabel(key, "en");
-            }
-        } else if (language.equals("en")) {
-            if(key.equals("user")) {
-                return "User";
-            } else if(key.equals("page")) {
-                return "Page";
-            } else {
-                log.warn("Key '" + key + "' not supported yet!");
-                return key;
-            }
-        } else {
-            log.warn("Language '" + language + "' not supported yet. Fallb=
ack to english!");
-            return getLabel(key, "en");
-        }
-    }
-
-    /**
-     * Get user language (order: profile, browser, ...) (Also see org/wyon=
a/yanel/servlet/menu/Menu.java)
-     */
-    private String getUserLanguage(Resource resource) throws Exception {
-        Identity identity =3D resource.getEnvironment().getIdentity();
-        String language =3D resource.getRequestedLanguage();
-        String userID =3D identity.getUsername();
-        if (userID !=3D null) {
-            String userLanguage =3D resource.getRealm().getIdentityManager=
().getUserManager().getUser(userID).getLanguage();
-            if(userLanguage !=3D null) {
-                language =3D userLanguage;
-                log.debug("Use user profile language: " + language);
-            } else {
-                log.debug("Use requested language: " + language);
-            }
-        }
-        return language;
-    }
 }
Index: src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	(revision=
 54331)
+++ src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	(working =
copy)
@@ -1,10 +1,8 @@
 package org.wyona.yanel.servlet;
 =

-import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.net.URL;
@@ -28,17 +26,27 @@
 import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamSource;
 =

+import org.apache.commons.io.FilenameUtils;
+import org.apache.log4j.Logger;
+import org.apache.xalan.transformer.TransformerIdentityImpl;
+import org.apache.xml.resolver.tools.CatalogResolver;
+import org.apache.xml.serializer.Serializer;
+import org.quartz.Scheduler;
+import org.quartz.impl.StdSchedulerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 import org.wyona.commons.xml.XMLHelper;
-
 import org.wyona.neutron.XMLExceptionV1;
-
-import org.wyona.yanel.core.ResourceTypeIdentifier;
-import org.wyona.yanel.core.StateOfView;
+import org.wyona.security.core.api.Identity;
+import org.wyona.security.core.api.Usecase;
+import org.wyona.security.core.api.User;
 import org.wyona.yanel.core.Environment;
 import org.wyona.yanel.core.Path;
 import org.wyona.yanel.core.Resource;
 import org.wyona.yanel.core.ResourceConfiguration;
+import org.wyona.yanel.core.ResourceTypeIdentifier;
 import org.wyona.yanel.core.ResourceTypeRegistry;
+import org.wyona.yanel.core.StateOfView;
 import org.wyona.yanel.core.Yanel;
 import org.wyona.yanel.core.api.attributes.IntrospectableV1;
 import org.wyona.yanel.core.api.attributes.ModifiableV1;
@@ -52,6 +60,8 @@
 import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
 import org.wyona.yanel.core.attributes.viewable.View;
 import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+import org.wyona.yanel.core.map.Map;
+import org.wyona.yanel.core.map.Realm;
 import org.wyona.yanel.core.navigation.Node;
 import org.wyona.yanel.core.navigation.Sitetree;
 import org.wyona.yanel.core.serialization.SerializerFactory;
@@ -60,38 +70,13 @@
 import org.wyona.yanel.core.transformation.I18nTransformer2;
 import org.wyona.yanel.core.util.DateUtil;
 import org.wyona.yanel.core.util.HttpServletRequestHelper;
+import org.wyona.yanel.core.util.ResourceAttributeHelper;
 import org.wyona.yanel.core.workflow.Workflow;
 import org.wyona.yanel.core.workflow.WorkflowException;
 import org.wyona.yanel.core.workflow.WorkflowHelper;
-import org.wyona.yanel.core.map.Map;
-import org.wyona.yanel.core.map.Realm;
-import org.wyona.yanel.core.util.ResourceAttributeHelper;
-
-import org.wyona.yanel.servlet.IdentityMap;
 import org.wyona.yanel.servlet.communication.HttpRequest;
 import org.wyona.yanel.servlet.communication.HttpResponse;
 =

-import org.wyona.security.core.api.Identity;
-import org.wyona.security.core.api.Usecase;
-import org.wyona.security.core.api.User;
-
-import org.apache.log4j.Logger;
-import org.apache.xalan.transformer.TransformerIdentityImpl;
-import org.apache.xml.resolver.tools.CatalogResolver;
-import org.apache.xml.serializer.Serializer;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import org.quartz.JobDetail;
-import org.quartz.Scheduler;
-import org.quartz.SimpleTrigger;
-import org.quartz.Trigger;
-import org.quartz.impl.StdSchedulerFactory;
-
 /**
  * Main entry of Yanel webapp
  */
@@ -1607,7 +1592,7 @@
      * @param map Map in order to determine realm
      * @return Identity if one exist, or otherwise an empty identity
      */
-    static Identity getIdentity(HttpServletRequest request, Map map) throw=
s Exception {
+	public static Identity getIdentity(HttpServletRequest request, Map map) t=
hrows Exception {
         Realm realm =3D map.getRealm(request.getServletPath());
         HttpSession session =3D request.getSession(false);
         if (session !=3D null) {
Index: src/webapp/src/java/org/wyona/yanel/servlet/toolbar/YanelToolbar.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/webapp/src/java/org/wyona/yanel/servlet/toolbar/YanelToolbar.java	(=
revision 0)
+++ src/webapp/src/java/org/wyona/yanel/servlet/toolbar/YanelToolbar.java	(=
revision 0)
@@ -0,0 +1,16 @@
+package org.wyona.yanel.servlet.toolbar;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.map.Map;
+
+public interface YanelToolbar {
+
+	String getToolbarBodyStart(Resource resource, HttpServletRequest request,=
 Map map, String reservedPrefix) throws Exception;
+
+	String getToolbarHeader(Resource resource, HttpServletRequest request, St=
ring reservedPrefix);
+
+	String getToolbarBodyEnd(Resource resource, HttpServletRequest request);
+
+}
Index: src/webapp/src/java/org/wyona/yanel/servlet/toolbar/impl/DefaultYane=
lToolbar.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/webapp/src/java/org/wyona/yanel/servlet/toolbar/impl/DefaultYanelTo=
olbar.java	(revision 0)
+++ src/webapp/src/java/org/wyona/yanel/servlet/toolbar/impl/DefaultYanelTo=
olbar.java	(revision 0)
@@ -0,0 +1,216 @@
+package org.wyona.yanel.servlet.toolbar.impl;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+import org.wyona.security.core.api.Identity;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.api.attributes.VersionableV2;
+import org.wyona.yanel.core.map.Map;
+import org.wyona.yanel.core.util.ResourceAttributeHelper;
+import org.wyona.yanel.servlet.YanelServlet;
+import org.wyona.yanel.servlet.menu.Menu;
+import org.wyona.yanel.servlet.toolbar.YanelToolbar;
+
+/**
+ * The default Yanel toolbar, wrapping a {@link Menu}.
+ */
+public class DefaultYanelToolbar implements YanelToolbar {
+
+	private static Logger log =3D Logger.getLogger(DefaultYanelToolbar.class);
+
+	private final Menu menu;
+
+	public DefaultYanelToolbar(Menu menu) {
+		this.menu =3D menu;
+	}
+
+	/**
+	 * Get toolbar menus
+	 */
+	private String getToolbarMenus(Resource resource, HttpServletRequest requ=
est, Map map, String reservedPrefix)
+			throws ServletException, IOException, Exception {
+		return menu.getAllMenus(resource, request, map, reservedPrefix);
+	}
+
+	/**
+	 * Gets the part of the toolbar which has to be inserted into the html bo=
dy
+	 * right after the opening body tag.
+	 * =

+	 * @param resource
+	 * @return
+	 * @throws Exception
+	 */
+	public String getToolbarBodyStart(Resource resource, HttpServletRequest r=
equest, Map map, String reservedPrefix)
+			throws Exception {
+		String backToRealm =3D org.wyona.yanel.core.util.PathUtil.backToRealm(re=
source.getPath());
+		StringBuilder buf =3D new StringBuilder();
+		buf.append("<div id=3D\"yaneltoolbar_headerwrap\">");
+		buf.append("<div id=3D\"yaneltoolbar_menu\">");
+		buf.append(getToolbarMenus(resource, request, map, reservedPrefix));
+		buf.append("</div>");
+
+		buf.append(getInfo(resource, request, map));
+
+		buf.append("<span id=3D\"yaneltoolbar_logo\">");
+		buf.append("<a href=3D\"http://www.yanel.org\"><img src=3D\"" + backToRe=
alm + reservedPrefix
+				+ "/yanel_toolbar_logo.png\" border=3D\"0\"/></a>");
+		buf.append("</span>");
+
+		buf.append("</div>");
+		buf.append("<div id=3D\"yaneltoolbar_middlewrap\">");
+		return buf.toString();
+	}
+
+	/**
+	 * Get information such as realm name, user name, etc.
+	 */
+	private String getInfo(Resource resource, HttpServletRequest request, Map=
 map) throws Exception {
+		String userLanguage =3D getUserLanguage(resource);
+		StringBuilder buf =3D new StringBuilder();
+		buf.append("<span id=3D\"yaneltoolbar_info\">");
+		//buf.append("Version: " + yanel.getVersion() + "-r" + yanel.getRevision=
() + "&#160;&#160;");
+
+		if (ResourceAttributeHelper.hasAttributeImplemented(resource, "Versionab=
le", "2")) {
+			VersionableV2 versionableRes =3D (VersionableV2) resource;
+			if (versionableRes.isCheckedOut()) {
+				buf.append(getLabel("page", userLanguage) + ": <b>Locked by " + versio=
nableRes.getCheckoutUserID()
+						+ "</b> (<a href=3D\"?" + YanelServlet.YANEL_RESOURCE_USECASE + "=3D=
" + YanelServlet.RELEASE_LOCK
+						+ "\">unlock</a>)&#160;&#160;");
+			}
+		}
+
+		Identity identity =3D YanelServlet.getIdentity(request, map);
+		if (identity !=3D null && !identity.isWorld()) {
+			String backToRealm =3D org.wyona.yanel.core.util.PathUtil.backToRealm(r=
esource.getPath());
+			buf.append(getLabel("user", userLanguage) + ": <b><a href=3D\"" + backT=
oRealm + "yanel/users/" + identity.getUsername()
+					+ ".html\" style=3D\"font-size: 13px; text-decoration: none;\">" + id=
entity.getAlias() + "</a></b>"); // TODO: yanel/users should be replaced by=
 reservedPrefix, also see src/webapp/src/java/org/wyona/yanel/servlet/menu/=
Menu.java
+		} else {
+			buf.append(getLabel("user", userLanguage) + ": <b>Not signed in!</b>");
+		}
+		buf.append("</span>");
+		return buf.toString();
+	}
+
+	/**
+	 * Get user language (order: profile, browser, ...) (Also see
+	 * org/wyona/yanel/servlet/menu/Menu.java)
+	 */
+	private String getUserLanguage(Resource resource) throws Exception {
+		Identity identity =3D resource.getEnvironment().getIdentity();
+		String language =3D resource.getRequestedLanguage();
+		String userID =3D identity.getUsername();
+		if (userID !=3D null) {
+			String userLanguage =3D resource.getRealm().getIdentityManager().getUse=
rManager().getUser(userID).getLanguage();
+			if (userLanguage !=3D null) {
+				language =3D userLanguage;
+				log.debug("Use user profile language: " + language);
+			} else {
+				log.debug("Use requested language: " + language);
+			}
+		}
+		return language;
+	}
+
+	/**
+	 * Get i18n (TODO: Replace this by something more generic)
+	 * =

+	 * @param key I18n key
+	 * @param language Language
+	 */
+	private static String getLabel(String key, String language) {
+		if (language.equals("de")) {
+			if (key.equals("user")) {
+				return "Benutzer";
+			} else if (key.equals("page")) {
+				return "Seite";
+			} else {
+				log.warn("Key '" + key + "' not supported yet by requested language '"=
 + language + "'. Fallback to english!");
+				return getLabel(key, "en");
+			}
+		} else if (language.equals("en")) {
+			if (key.equals("user")) {
+				return "User";
+			} else if (key.equals("page")) {
+				return "Page";
+			} else {
+				log.warn("Key '" + key + "' not supported yet!");
+				return key;
+			}
+		} else {
+			log.warn("Language '" + language + "' not supported yet. Fallback to en=
glish!");
+			return getLabel(key, "en");
+		}
+	}
+
+	/**
+	 * Gets the part of the toolbar which has to be inserted into the html
+	 * header.
+	 * =

+	 * @param resource
+	 * @param request
+	 * @return
+	 * @throws Exception
+	 */
+	public String getToolbarHeader(Resource resource, HttpServletRequest requ=
est, String reservedPrefix) {
+
+		String backToRealm =3D org.wyona.yanel.core.util.PathUtil.backToRealm(re=
source.getPath());
+		StringBuilder sb =3D new StringBuilder();
+
+		sb.append("<!-- START: Dynamically added code by " + this.getClass().get=
Name() + " -->");
+		sb.append(System.getProperty("line.separator"));
+		sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm + reserved=
Prefix + "/toolbar.css\" rel=3D\"stylesheet\"/>");
+		sb.append(System.getProperty("line.separator"));
+		sb.append("<style type=3D\"text/css\" media=3D\"screen\">");
+		sb.append(System.getProperty("line.separator"));
+		sb.append("#yaneltoolbar_menu li li.haschild{ background: lightgrey url(=
" + backToRealm + reservedPrefix
+				+ "/yanel-img/submenu.gif) no-repeat 98% 50%;}");
+		sb.append(System.getProperty("line.separator"));
+		sb.append("#yaneltoolbar_menu li li.haschild:hover{  background: lightst=
eelblue url(" + backToRealm + reservedPrefix
+				+ "/yanel-img/submenu.gif) no-repeat 98% 50%;}");
+		sb.append("</style>");
+		sb.append(System.getProperty("line.separator"));
+
+		// If browser is Mozilla (gecko engine rv:1.7)
+		if (request.getHeader("User-Agent").indexOf("rv:1.7") >=3D 0) {
+			sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm + reserve=
dPrefix
+					+ "/toolbarMozilla.css\" rel=3D\"stylesheet\"/>");
+			sb.append(System.getProperty("line.separator"));
+		}
+		// If browser is IE
+		if (request.getHeader("User-Agent").indexOf("compatible; MSIE") >=3D 0
+				&& request.getHeader("User-Agent").indexOf("Windows") >=3D 0) {
+			sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm + reserve=
dPrefix + "/toolbarIE.css\" rel=3D\"stylesheet\"/>");
+			sb.append(System.getProperty("line.separator"));
+			sb.append("<style type=3D\"text/css\" media=3D\"screen\">");
+			sb.append("  body{behavior:url(" + backToRealm + reservedPrefix + "/css=
hover.htc);font-size:100%;}");
+			sb.append("</style>");
+
+		}
+		// If browser is IE6
+		if (request.getHeader("User-Agent").indexOf("compatible; MSIE 6") >=3D 0
+				&& request.getHeader("User-Agent").indexOf("Windows") >=3D 0) {
+			sb.append("<link type=3D\"text/css\" href=3D\"" + backToRealm + reserve=
dPrefix + "/toolbarIE6.css\" rel=3D\"stylesheet\"/>");
+			sb.append(System.getProperty("line.separator"));
+		}
+		sb.append("<!-- END: Dynamically added code by " + this.getClass().getNa=
me() + " -->");
+
+		return sb.toString();
+	}
+
+	/**
+	 * Gets the part of the toolbar which has to be inserted into the html bo=
dy
+	 * right before the closing body tag.
+	 * =

+	 * @param resource
+	 * @return
+	 * @throws Exception
+	 */
+	public String getToolbarBodyEnd(Resource resource, HttpServletRequest req=
uest) {
+		return "</div>";
+	}
+
+}


More information about the Yanel-development mailing list