[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() + "  ");
-
- 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>)  ");
- }
- }
-
- 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=
() + "  ");
+
+ 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>)  ");
+ }
+ }
+
+ 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