org.projectforge.web.MenuEntryConfig.java Source code

Java tutorial

Introduction

Here is the source code for org.projectforge.web.MenuEntryConfig.java

Source

/////////////////////////////////////////////////////////////////////////////
//
// 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();
    }
}