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}