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    
015    package org.apache.tapestry5.internal.beaneditor;
016    
017    import org.apache.tapestry5.beaneditor.BeanModel;
018    import org.apache.tapestry5.internal.InternalConstants;
019    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
020    
021    /**
022     * Utilities used in a few places to modify an existing {@link BeanModel}.
023     */
024    public final class BeanModelUtils
025    {
026    
027        /**
028         * Performs standard set of modifications to a {@link org.apache.tapestry5.beaneditor.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 (InternalUtils.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.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        static String[] split(String propertyNames)
111        {
112            String trimmed = propertyNames.trim();
113    
114            if (trimmed.length() == 0)
115                return InternalConstants.EMPTY_STRING_ARRAY;
116    
117            return trimmed.split("\\s*,\\s*");
118        }
119    }