Java tutorial
///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2013 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.web; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.projectforge.core.Translation; import org.projectforge.xml.stream.XmlField; import org.projectforge.xml.stream.XmlObject; import org.projectforge.xml.stream.XmlOmitField; /** * Defining a new menu entry or modify the existing tree by config.xml or configures an existing menu entry as invisible. Any access * settings are not yet available (planned if really needed by the community). * @author Kai Reinhard (k.reinhard@micromata.de) * */ @XmlObject(alias = "menu-entry") public class MenuEntryConfig { @XmlField(asAttribute = true) private String url; @XmlField(alias = "id") private String menuItemId; @XmlField(asAttribute = true) private String label; private List<Translation> translations; @XmlField(defaultBooleanValue = true) private boolean visible = true; @XmlField(alias = "sub-menu") private List<MenuEntryConfig> children; @XmlOmitField private MenuEntryConfig parent; /** * @return The MenuItemDef if this menu entry is one of the ProjectForge pre-defined menu entries, otherwise null. */ public String getMenuItemId() { return menuItemId; } public String getUrl() { return url; } /** * This label is the default label if no label for the user's language is found in the list of translations. */ public String getLabel() { return label; } MenuEntryConfig setLabel(final String label) { this.label = label; return this; } public String getLabel(final Locale locale) { if (locale == null || translations == null) { return getLabel(); } final Translation translation = getTranslation(locale); if (translation != null) { return translation.getTranslation(); } return getLabel(); } public Translation getTranslation(final Locale locale) { if (locale == null || translations == null) { return null; } String lang = locale.toString().toLowerCase(); for (int i = 0; i < 4; i++) { // Endless loop protection. final Translation translation = getTranslation(lang); if (translation != null) { return translation; } final int pos = lang.lastIndexOf('_'); if (pos > 0) { lang = lang.substring(0, pos); } else { break; } } return null; } public Translation getTranslation(final String lang) { if (lang == null || translations == null) { return null; } for (final Translation translation : translations) { if (lang.toLowerCase().equals(translation.getLocale().toString().toLowerCase()) == true) { return translation; } } return null; } public boolean isVisible() { return visible; } /** * Needed but not used, otherwise code reformatter transforms member visible to final member. * @param visible the visible to set */ void setVisible(final boolean visible) { this.visible = visible; } public List<MenuEntryConfig> getChildren() { return children; } /** * Find a pre-defined ProjectForge menu entry. */ public MenuEntryConfig findMenuEntry(final MenuItemDef menuItemDef) { if (menuItemDef != null && menuItemDef.getId() != null && menuItemDef.getId().equals(menuItemId) == true) { return this; } if (children == null) { return null; } for (final MenuEntryConfig child : children) { final MenuEntryConfig foundEntry = child.findMenuEntry(menuItemDef); if (foundEntry != null) { return foundEntry; } } return null; } public void setParent(final MenuEntryConfig parent) { this.parent = parent; } /** * Ensure that you have called setParents on the root element before, otherwise the parent field is always null. */ public MenuEntryConfig getParent() { return parent; } /** * Walks through the tree and sets the parent menu entry for each descendant. */ public void setParents() { if (children == null) { return; } for (final MenuEntryConfig child : children) { child.setParent(this); child.setParents(); } } /** * Label in the different languages. */ public List<Translation> getTranslations() { return translations; } MenuEntryConfig addTranslation(final Translation translation) { if (translations == null) { translations = new ArrayList<Translation>(); } translations.add(translation); return this; } MenuEntryConfig addTranslation(final Locale locale, final String translation) { return addTranslation(new Translation(locale, translation)); } MenuEntryConfig addTranslation(final String locale, final String translation) { return addTranslation(new Locale(locale), translation); } /** * @see ReflectionToStringBuilder */ @Override public String toString() { final ReflectionToStringBuilder tos = new ReflectionToStringBuilder(this); return tos.toString(); } }