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 }