org.pentaho.pms.ui.concept.editor.PropertyGroupHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.pms.ui.concept.editor.PropertyGroupHelper.java

Source

/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.pms.ui.concept.editor;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.OrderedMap;
import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.collections.map.MultiValueMap;
import org.pentaho.pms.schema.concept.DefaultPropertyID;

/**
 * Helper for getting groups, properties belonging to groups, and a group for a given property. Maintains
 * arbitrary ordering of groups and properties.
 * @author mlowery
 */
public class PropertyGroupHelper {

    // ~ Static fields/initializers ======================================================================================

    /**
     * Keys are property IDs. Values are group names.
     */
    private static OrderedMap groupMapping = new ListOrderedMap();

    /**
     * Not to be accessed except via <code>getOrderedGroups()</code>.
     */
    private static ListOrderedMap wrappedPropertyMap = new ListOrderedMap();

    /**
     * Keys are group names. Values are collections of property IDs.
     */
    private static MultiValueMap propertyMapping = MultiValueMap.decorate(wrappedPropertyMap);

    public static final String GROUP_GENERAL = "General";

    public static final String GROUP_FORMATTING = "Formatting";

    public static final String GROUP_MODEL_DESCRIPTORS = "Model Descriptors";

    public static final String GROUP_CALCULATION = "Calculation";

    public static final String GROUP_MISC = "Miscellaneous";

    public static final String GROUP_CUSTOM = "Custom";

    /**
     * Do not directly access groupMapping or propertyMapping. Instead, use add method. The order that the groups
     * and properties are added matter!
     */
    static {
        // general group
        add(DefaultPropertyID.NAME.getId(), GROUP_GENERAL);
        add(DefaultPropertyID.DESCRIPTION.getId(), GROUP_GENERAL);
        add(DefaultPropertyID.COMMENTS.getId(), GROUP_GENERAL);
        add(DefaultPropertyID.SECURITY.getId(), GROUP_GENERAL);
        add(DefaultPropertyID.ROW_LEVEL_SECURITY.getId(), GROUP_GENERAL);

        // formatting group
        add(DefaultPropertyID.FONT.getId(), GROUP_FORMATTING);
        add(DefaultPropertyID.COLOR_FG.getId(), GROUP_FORMATTING);
        add(DefaultPropertyID.ALIGNMENT.getId(), GROUP_FORMATTING);
        add(DefaultPropertyID.COLOR_BG.getId(), GROUP_FORMATTING);
        add(DefaultPropertyID.RELATIVE_SIZE.getId(), GROUP_FORMATTING);

        // model descriptors group
        add(DefaultPropertyID.AGGREGATION.getId(), GROUP_MODEL_DESCRIPTORS);
        add(DefaultPropertyID.AGGREGATION_LIST.getId(), GROUP_MODEL_DESCRIPTORS);
        add(DefaultPropertyID.DATA_TYPE.getId(), GROUP_MODEL_DESCRIPTORS);
        add(DefaultPropertyID.FIELD_TYPE.getId(), GROUP_MODEL_DESCRIPTORS);
        add(DefaultPropertyID.TABLE_TYPE.getId(), GROUP_MODEL_DESCRIPTORS);

        // calculation group
        add(DefaultPropertyID.FORMULA.getId(), GROUP_CALCULATION);
        add(DefaultPropertyID.EXACT.getId(), GROUP_CALCULATION);

        // miscellaneous group
        add(DefaultPropertyID.COLUMN_WIDTH.getId(), GROUP_MISC);
        add(DefaultPropertyID.HIDDEN.getId(), GROUP_MISC);
        add(DefaultPropertyID.MASK.getId(), GROUP_MISC);
        add(DefaultPropertyID.TARGET_SCHEMA.getId(), GROUP_MISC);
        add(DefaultPropertyID.TARGET_TABLE.getId(), GROUP_MISC);
    }

    // ~ Instance fields =================================================================================================

    // ~ Constructors ====================================================================================================

    // ~ Methods =========================================================================================================

    /**
     * Adds group and property to maps maintained by this helper class.
     * @param id the id of the property
     * @param group the group name to which this property belongs
     */
    @SuppressWarnings("unchecked")
    private static void add(final String id, final String group) {
        groupMapping.put(id, group);
        propertyMapping.put(group, id);
    }

    /**
     * Gets all properties belonging to given group.
     * @param group the group to search
     * @return a set of property IDs
     */
    @SuppressWarnings("unchecked")
    public static List getPropertiesForGroup(final String group) {
        if (null != propertyMapping.getCollection(group)) {
            return new ArrayList<Object>(propertyMapping.getCollection(group));
        } else {
            return Collections.EMPTY_LIST;
        }
    }

    /**
     * Gets the group to which the property with the given id belongs.
     * @param id the id of the property
     * @return group name
     */
    public static String getGroupForProperty(final String id) {
        if (null != groupMapping.get(id)) {
            return (String) groupMapping.get(id);
        } else {
            return GROUP_CUSTOM;
        }
    }

    /**
     * Gets a subset of all properties belonging to given group, eliminating properties not currently present in the
     * given concept.
     * @param group the group to search
     * @param conceptModel the concept to search
     * @return a set of property IDs
     */
    public static List getUsedPropertiesForGroup(final String group, final IConceptModel conceptModel) {
        if (GROUP_CUSTOM.equals(group)) {
            Map effectivePropertyMap = conceptModel.getEffectivePropertyMap();
            Iterator keyIter = effectivePropertyMap.keySet().iterator();
            List<String> customProperties = new ArrayList<String>();
            while (keyIter.hasNext()) {
                String id = (String) keyIter.next();
                if (GROUP_CUSTOM.equals(getGroupForProperty(id))) {
                    customProperties.add(id);
                }
            }
            return customProperties;
        }
        final List allProperties = getPropertiesForGroup(group);
        List<String> usedProperties = new ArrayList<String>();
        for (Iterator iter = allProperties.iterator(); iter.hasNext();) {
            String id = (String) iter.next();
            if (null != conceptModel.getEffectiveProperty(id)) {
                usedProperties.add(id);
            }
        }
        return usedProperties;
    }

    /**
     * Gets a subset of all properties belonging to given group, eliminating properties currently present in the given
     * concept.
     * @param group the group to search
     * @param conceptModel the concept to search
     * @return a set of property IDs
     */
    @SuppressWarnings("unchecked")
    public static List<String> getUnusedPropertiesForGroup(final String group, final IConceptModel conceptModel) {
        if (GROUP_CUSTOM.equals(group)) {
            return Collections.<String>emptyList();
        }
        final List allProperties = getPropertiesForGroup(group);
        final List usedProperties = getUsedPropertiesForGroup(group, conceptModel);
        return new ArrayList<String>(CollectionUtils.subtract(allProperties, usedProperties));
    }

    @SuppressWarnings("unchecked")
    private static List<String> getOrderedGroups() {
        List<String> groups = new ArrayList<String>();
        groups.addAll(wrappedPropertyMap.keyList());
        groups.add(GROUP_CUSTOM);
        return groups;
    }

    public static List getGroups() {
        return getOrderedGroups();
    }

    public static List getUsedGroups(final IConceptModel conceptModel) {
        List allGroups = getGroups();
        List<String> usedGroups = new ArrayList<String>();
        for (Iterator iter = allGroups.iterator(); iter.hasNext();) {
            String groupName = (String) iter.next();
            if (!getUsedPropertiesForGroup(groupName, conceptModel).isEmpty()) {
                usedGroups.add(groupName);
            }
        }
        return usedGroups;
    }

    public static List getUnusedGroups(final IConceptModel conceptModel) {
        List allGroups = getGroups();
        List<String> unusedGroups = new ArrayList<String>();
        for (Iterator iter = allGroups.iterator(); iter.hasNext();) {
            String groupName = (String) iter.next();
            if (!getUnusedPropertiesForGroup(groupName, conceptModel).isEmpty()) {
                unusedGroups.add(groupName);
            }
        }
        return unusedGroups;
    }

}