    001// Copyright 2007, 2008, 2009, 2010, 2011 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007// http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.internal.beaneditor;
    016
    017import org.apache.tapestry5.beaneditor.BeanModel;
    018import org.apache.tapestry5.ioc.internal.util.InternalCommonsUtils;
    019
    020/**
    021 * Utilities used in a few places to modify an existing {@link BeanModel}.
    022 */
    023public final class BeanModelUtils
    024{
    025
    026    final private static String[] EMPTY_STRING_ARRAY = new String[0];
    027
    028    /**
    029     * Performs standard set of modifications to a {@link org.apache.tapestry5.beaneditor.BeanModel}
    030     * . First new
    031     * properties may be added, then properties removed, then properties reordered.
    032     *
    033     * @param model                to modifiy
    034     * @param addPropertyNames     comma seperated list of property names to add, or null
    035     * @param includePropertyNames comma seperated list of property names to include
    036     * @param excludePropertyNames comma seperated list of property names to exclude, or null
    037     * @param reorderPropertyNames comma seperated list of property names to reorder, or null
    038     */
    039    public static void modify(BeanModel model, String addPropertyNames,
    040                              String includePropertyNames, String excludePropertyNames, String reorderPropertyNames)
    041    {
    042        if (addPropertyNames != null)
    043            add(model, addPropertyNames);
    044
    045        if (includePropertyNames != null)
    046            include(model, join(includePropertyNames, addPropertyNames));
    047
    048        if (excludePropertyNames != null)
    049            exclude(model, excludePropertyNames);
    050
    051        if (reorderPropertyNames != null)
    052            reorder(model, reorderPropertyNames);
    053    }
    054
    055    private static final String join(String firstList, String optionalSecondList)
    056    {
    057        if (InternalCommonsUtils.isBlank(optionalSecondList))
    058            return firstList;
    059
    060        return firstList + "," + optionalSecondList;
    061    }
    062
    063    /**
    064     * Adds empty properties to the bean model. New properties are added with a <em>null</em>
    065     * {@link org.apache.tapestry5.PropertyConduit}. `
    066     *
    067     * @param model         to be modified
    068     * @param propertyNames comma-separated list of property names
    069     * @see BeanModel#addEmpty(String)
    070     */
    071    public static void add(BeanModel model, String propertyNames)
    072    {
    073        for (String name : split(propertyNames))
    074        {
    075            model.addEmpty(name);
    076        }
    077    }
    078
    079    /**
    080     * Removes properties from the bean model.
    081     *
    082     * @param model
    083     * @param propertyNames comma-separated list of property names
    084     * @see BeanModel#exclude(String...)
    085     */
    086    public static void exclude(BeanModel model, String propertyNames)
    087    {
    088        model.exclude(split(propertyNames));
    089    }
    090
    091    /**
    092     * Selects a subset of the properties to keep, and reorders them.
    093     */
    094    public static void include(BeanModel model, String propertyNames)
    095    {
    096        model.include(split(propertyNames));
    097    }
    098
    099    /**
    100     * Reorders properties within the bean model.
    101     *
    102     * @param model
    103     * @param propertyNames comma-separated list of property names
    104     * @see BeanModel#reorder(String...)
    105     */
    106    public static void reorder(BeanModel model, String propertyNames)
    107    {
    108        model.reorder(split(propertyNames));
    109    }
    110
    111    static String[] split(String propertyNames)
    112    {
    113        String trimmed = propertyNames.trim();
    114
    115        if (trimmed.length() == 0)
    116            return EMPTY_STRING_ARRAY;
    117
    118        return trimmed.split("\\s*,\\s*");
    119    }
    120}