    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.beanmodel;
    016
    017import org.apache.tapestry5.commons.util.CommonsUtils;
    018
    019/**
    020 * Utilities used in a few places to modify an existing {@link BeanModel}.
    021 */
    022public final class BeanModelUtils
    023{
    024
    025    final private static String[] EMPTY_STRING_ARRAY = new String[0];
    026
    027    /**
    028     * Performs standard set of modifications to a {@link org.apache.tapestry5.beanmodel.BeanModel}
    029     * . First new
    030     * properties may be added, then properties removed, then properties reordered.
    031     *
    032     * @param model                to modifiy
    033     * @param addPropertyNames     comma seperated list of property names to add, or null
    034     * @param includePropertyNames comma seperated list of property names to include
    035     * @param excludePropertyNames comma seperated list of property names to exclude, or null
    036     * @param reorderPropertyNames comma seperated list of property names to reorder, or null
    037     */
    038    public static void modify(BeanModel model, String addPropertyNames,
    039                              String includePropertyNames, String excludePropertyNames, String reorderPropertyNames)
    040    {
    041        if (addPropertyNames != null)
    042            add(model, addPropertyNames);
    043
    044        if (includePropertyNames != null)
    045            include(model, join(includePropertyNames, addPropertyNames));
    046
    047        if (excludePropertyNames != null)
    048            exclude(model, excludePropertyNames);
    049
    050        if (reorderPropertyNames != null)
    051            reorder(model, reorderPropertyNames);
    052    }
    053
    054    private static final String join(String firstList, String optionalSecondList)
    055    {
    056        if (CommonsUtils.isBlank(optionalSecondList))
    057            return firstList;
    058
    059        return firstList + "," + optionalSecondList;
    060    }
    061
    062    /**
    063     * Adds empty properties to the bean model. New properties are added with a <em>null</em>
    064     * {@link org.apache.tapestry5.beanmodel.PropertyConduit}. `
    065     *
    066     * @param model         to be modified
    067     * @param propertyNames comma-separated list of property names
    068     * @see BeanModel#addEmpty(String)
    069     */
    070    public static void add(BeanModel model, String propertyNames)
    071    {
    072        for (String name : split(propertyNames))
    073        {
    074            model.addEmpty(name);
    075        }
    076    }
    077
    078    /**
    079     * Removes properties from the bean model.
    080     *
    081     * @param model
    082     * @param propertyNames comma-separated list of property names
    083     * @see BeanModel#exclude(String...)
    084     */
    085    public static void exclude(BeanModel model, String propertyNames)
    086    {
    087        model.exclude(split(propertyNames));
    088    }
    089
    090    /**
    091     * Selects a subset of the properties to keep, and reorders them.
    092     */
    093    public static void include(BeanModel model, String propertyNames)
    094    {
    095        model.include(split(propertyNames));
    096    }
    097
    098    /**
    099     * Reorders properties within the bean model.
    100     *
    101     * @param model
    102     * @param propertyNames comma-separated list of property names
    103     * @see BeanModel#reorder(String...)
    104     */
    105    public static void reorder(BeanModel model, String propertyNames)
    106    {
    107        model.reorder(split(propertyNames));
    108    }
    109
    110    /**
    111     * Don't use this method, which is only public for testing purposes.
    112     * @param propertyNames
    113     * @return a String array
    114     */
    115    public static String[] split(String propertyNames)
    116    {
    117        String trimmed = propertyNames.trim();
    118
    119        if (trimmed.length() == 0)
    120            return EMPTY_STRING_ARRAY;
    121
    122        return trimmed.split("\\s*,\\s*");
    123    }
    124}