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}