1 16 17 package org.pentaho.ui.portlet.jboss; 18 19 import org.jboss.portal.core.api.JBossPortalNode; 20 import org.jboss.portal.core.model.portal.Context; 21 import org.jboss.portal.core.model.portal.Page; 22 import org.jboss.portal.core.model.portal.Portal; 23 import org.jboss.portal.core.model.portal.PortalObject; 24 import org.jboss.portal.core.model.portal.Window; 25 import org.jboss.portal.security.PortalPermissionFactory; 26 import org.jboss.portal.security.PortalPolicyException; 27 import org.jboss.portlet.JBossPortlet; 28 import org.jboss.portlet.JBossRenderRequest; 29 import org.jboss.portlet.JBossRenderResponse; 30 import org.jboss.portlet.PortalNode; 31 32 import javax.portlet.PortletException; 33 import javax.portlet.PortletPreferences; 34 import java.io.IOException ; 35 import java.util.ArrayList ; 36 import java.util.Collections ; 37 import java.util.Comparator ; 38 import java.util.Iterator ; 39 40 import org.pentaho.messages.Messages; 41 42 public class PentahoMenuBar extends JBossPortlet { 43 44 private static final String ORDER = "order"; 47 private static final String LEVELS = "levels"; 49 private static final String PORTALS = "portals-menu"; 51 private PortalPermissionFactory permissionFactory; 52 53 public void init() throws PortletException { 54 55 permissionFactory = (PortalPermissionFactory) getPortletContext().getAttribute("PortalPermissionFactory"); 57 if (permissionFactory == null) { 59 } 61 } 62 63 public void destroy() { 64 super.destroy(); 65 66 permissionFactory = null; 68 } 69 70 public void render(JBossRenderRequest req, JBossRenderResponse resp) throws IOException { 71 72 resp.setContentType("text/html"); 74 PortletPreferences prefs = req.getPreferences(); 75 String menuLevels = prefs.getValue(LEVELS, "1"); String portalsPref = prefs.getValue(PORTALS, "true"); 78 boolean secured = "true".equals( prefs.getValue( "secured", "false" ) ); 80 boolean doTransMenu = menuLevels.equals("2"); boolean doPortalsMenu = portalsPref.equals("true"); 83 PortalNode current = req.getPortalNode(); 84 PortalNode thisPage = current; 85 if (thisPage.getType() != PortalNode.TYPE_PAGE) { 86 thisPage = thisPage.getParent(); 87 } 88 89 resp.setTitle("Navigation"); StringBuffer content = new StringBuffer (); 92 93 content.append("<div id=\"topmenu\">\n<div id=\"mtm_menu\">\n"); 95 try { 96 while (current != null && current.getType() != PortalNode.TYPE_PORTAL) { 97 current = current.getParent(); 98 } 99 100 if (current != null && current.getType() == PortalNode.TYPE_PORTAL) { 101 103 ArrayList pages = new ArrayList (); 104 Iterator pageIterator = current.getChildren().iterator(); 105 for (; pageIterator.hasNext();) { 106 PortalNode pageNode = (PortalNode) pageIterator.next(); 107 if( pageNode instanceof JBossPortalNode && allowed( (JBossPortalNode) pageNode, secured ) ) { 108 pages.add(pageNode); 109 } 110 } 111 112 Collections.sort(pages, new Comparator () { 113 public int compare(Object o1, Object o2) { 114 Float high1 = getOrder(o1); 115 Float high2 = getOrder(o2); 116 if (high1.equals(high2)) { 117 if (o1 instanceof PortalObject && o2 instanceof PortalObject) { 118 String name1 = ((PortalObject) o1).getName(); 119 String name2 = ((PortalObject) o2).getName(); 120 if (name1.charAt(0) == '[' && name1.charAt(3) == ']' && name2.charAt(0) == '[' && name2.charAt(3) == ']') { 121 String idx1 = name1.substring(1, 3); 122 String idx2 = name2.substring(1, 3); 123 return idx1.compareTo(idx2); 124 } else { 125 return ((PortalObject) o2).getName().compareTo(((PortalObject) o2).getName()); 126 } 127 } else if (o1 instanceof PortalNode && o2 instanceof PortalNode) { 128 String name1 = ((PortalNode) o1).getName(); 129 String name2 = ((PortalNode) o2).getName(); 130 if (name1.charAt(0) == '[' && name1.charAt(3) == ']' && name2.charAt(0) == '[' && name2.charAt(3) == ']') { 131 String idx1 = name1.substring(1, 3); 132 String idx2 = name2.substring(1, 3); 133 return idx1.compareTo(idx2); 134 } else { 135 return ((PortalNode) o2).getName().compareTo(((PortalNode) o2).getName()); 136 } 137 } else { 138 return 0; 139 } 140 } else { 141 return high1.compareTo(high2); 142 } 143 } 144 145 }); 146 147 for (int pageNo = 0; pageNo < pages.size(); pageNo++) { 148 PortalNode pageNode = (PortalNode) pages.get(pageNo); 149 String pageName = pageNode.getName().replace(' ', '_'); 150 if (pageNode.equals(thisPage)) { 151 content.append("<span class=\"active\">\n"); } 153 content.append("<a HREF=\"") .append(resp.createRenderURL(pageNode).toString()).append("\" id=\"page_") .append(pageName).append("\">") .append(getDisplayName(pageNode.getName())).append("</a>\n"); if (pageNode.equals(thisPage)) { 158 content.append("</span>\n"); } 160 } 161 162 PortalNode top = current.getParent(); 164 boolean doPortalList = false; 165 if (top != null && doPortalsMenu) { 166 167 Iterator portalIterator = top.getChildren().iterator(); 168 for (; portalIterator.hasNext();) { 169 PortalNode pageNode = (PortalNode) portalIterator.next(); 170 if( pageNode instanceof JBossPortalNode && allowed( (JBossPortalNode) pageNode, secured ) ) { 171 doPortalList = true; 172 break; 173 } 174 } 175 176 if (doPortalList) { 177 content.append("<span class=\"portals_menu\">\n<a HREF=\"javascript:void\" id=\"portal_menu") .append("\">") .append(Messages.getString("UI.USER_PORTALS")) .append("</a></span>\n\n"); } 182 } 183 184 doTransMenu |= doPortalList; 185 content.append("</div>\n"); if (doTransMenu) { 187 content.append("<script type=\"text/javascript\" language=\"javascript\">\n") .append("//<![CDATA[ \n") 190 .append("function initMenu() {\n") .append(" if (TransMenu.isSupported()) {\n") .append(" TransMenu.initialize();\n"); 195 for (int pageNo = 0; pageNo < pages.size(); pageNo++) { 196 PortalNode pageNode = (PortalNode) pages.get(pageNo); 197 199 if (pageNode.getChildren().size() > 0) { 200 Iterator children = pageNode.getChildren().iterator(); 201 String pageName = pageNode.getName().replace(' ', '_'); 202 boolean done = false; 203 for (; children.hasNext();) { 204 PortalNode subPageNode = (PortalNode) children.next(); 205 if( subPageNode instanceof JBossPortalNode && allowed( (JBossPortalNode) subPageNode, secured ) ) { 206 if (subPageNode.getType() == PortalNode.TYPE_PAGE) { 207 content.append(" menu") .append(pageNo).append(".onactivate = function() { document.getElementById(\"page_") .append(pageName).append("\").className = \"hover\"; };\n") .append(" menu") .append(pageNo).append(".ondeactivate = function() { document.getElementById(\"page_") .append(pageName).append("\").className = \"\"; };\n"); done = true; 215 break; 216 } 217 } 218 } 219 if (!done) { 220 content.append(" document.getElementById(\"page_") .append(pageName).append("\").onmouseover = function() { ms.hideCurrent(); this.className = \"hover\"; }\n") .append(" document.getElementById(\"page_") .append(pageName).append("\").onmouseout = function() { this.className = \"\"; } \n"); } 226 } 227 228 } 229 if (doPortalList) { 230 content.append(" menu_portals.onactivate = function() { document.getElementById(\"portal_menu\").className = \"hover\"; };\n") .append(" menu_portals.ondeactivate = function() { document.getElementById(\"portal_menu\").className = \"\"; };\n"); } 233 234 content.append(" }\n") .append("}\n"); 237 content.append("if (TransMenu.isSupported()) {\n") .append(" var ms = new TransMenuSet(TransMenu.direction.down, 1, 0, TransMenu.reference.bottomLeft);\n"); 241 for (int pageNo = 0; pageNo < pages.size(); pageNo++) { 243 PortalNode pageNode = (PortalNode) pages.get(pageNo); 244 String pageName = pageNode.getName().replace(' ', '_'); 245 if (pageNode.getChildren().size() > 0) { 246 Iterator children = pageNode.getChildren().iterator(); 247 boolean firstSubPage = true; 248 for (; children.hasNext();) { 249 PortalNode subPageNode = (PortalNode) children.next(); 250 if( subPageNode instanceof JBossPortalNode && allowed( (JBossPortalNode) subPageNode, secured ) ) { 251 if (subPageNode.getType() == PortalNode.TYPE_PAGE) { 252 if (firstSubPage) { 254 content.append(" var menu") .append(pageNo).append(" = ms.addMenu(document.getElementById(\"page_") .append(pageName).append("\"));\n"); firstSubPage = false; 258 } 259 content.append(" menu") .append(pageNo).append(".addItem(\"") .append(getDisplayName(subPageNode.getName())).append("\", \"") .append(resp.createRenderURL(subPageNode).toString()).append("\", \"0\");\n"); } 264 } 265 266 } 267 } 268 } 269 270 if (doPortalList) { 271 content.append(" var menu_portals = ms.addMenu(document.getElementById(\"portal_menu\"));\n"); Iterator portals = top.getChildren().iterator(); 273 for (; portals.hasNext();) { 274 PortalNode portalNode = (PortalNode) portals.next(); 275 if (!portalNode.equals(current) ) { 276 if (portalNode instanceof JBossPortalNode && allowed( (JBossPortalNode) portalNode, secured ) ) { 277 280 JBossPortalNode jbossNode = (JBossPortalNode) portalNode; 281 PortalNode a = null; 282 a = jbossNode.resolve("default"); if (a == null) { 286 a = jbossNode.resolve("Default"); } 288 if (a == null) { 289 a = jbossNode.resolve("Home"); } 291 if (a == null) { 292 a = jbossNode.resolve("home"); } 294 if (a == null) { 295 if (jbossNode.getChildren().size() > 0) { 296 PortalNode child = (PortalNode) jbossNode.getChildren().iterator().next(); 297 a = jbossNode.resolve(child.getName()); 298 } 299 } 300 if (a != null) { 301 302 content.append(" menu_portals.addItem(\"") .append(getDisplayName(portalNode.getName())).append("\", \"") .append(resp.createRenderURL(a).toString()).append("\", \"0\");\n"); 306 } 307 } 308 } 309 } 310 } 311 312 content.append(" TransMenu.renderAll();\n") .append("}\n") .append("initFunctions.push(\"initMenu()\");") .append("// ]]>\n") .append("</script>\n"); 318 } 319 content.append("</div>\n"); 321 } 322 323 } catch (Exception e) { 324 e.printStackTrace(); 325 } 326 resp.getWriter().print(content.toString()); 327 328 } 329 330 private String getDisplayName(String name) { 331 if (name.length() > 4 && name.charAt(0) == '[' && name.charAt(3) == ']') { 332 return name.substring(4); 333 } else { 334 return name; 335 } 336 } 337 338 private boolean allowed(JBossPortalNode node, boolean secured ) throws PortalPolicyException { 339 340 if( !secured ) { 341 return true; 342 } 343 if( node == null || permissionFactory == null ) { 344 return false; 345 } 346 return permissionFactory.checkPermission("portalobject", node.getHandle(), "view"); 348 } 349 350 369 protected Float getOrder(Object o) { 370 if (o instanceof Context) { 371 return new Float (0); 372 } 373 if (o instanceof Portal) { 374 return new Float (1); 375 } 376 if (o instanceof Page) { 377 String orderProperty = ((Page) o).getDeclaredProperty(ORDER); 378 if (orderProperty == null) { 379 return new Float (2.999f); 380 } 381 try { 382 return new Float ("2." + orderProperty); } catch (NumberFormatException e) { 384 return new Float (2.999f); 385 } 386 } 387 if (o instanceof PortalObject) { 388 String orderProperty = ((PortalObject) o).getDeclaredProperty(ORDER); 389 if (orderProperty == null) { 390 orderProperty = ((PortalObject) o).getProperty(ORDER); 391 } 392 if (orderProperty == null) { 393 return new Float (2.999f); 394 } 395 try { 396 return new Float ("2." + orderProperty); } catch (NumberFormatException e) { 398 return new Float (2.999f); 399 } 400 } 401 if (o instanceof Window) { 402 return new Float (3); 403 } 404 return new Float (4); 405 } 406 } 407 | Popular Tags |