/******************************************************************************* * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se). * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0-standalone.html ******************************************************************************/ package se.unlogic.standardutils.string; import se.unlogic.standardutils.reflection.ReflectionUtils; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; public class BeanTagSourceFactory<T> implements TagSourceFactory<T>{ private Class<T> beanClass; private HashMap<String,Method> tagMethodMap = new HashMap<String, Method>(); private HashMap<String,Field> tagFieldMap = new HashMap<String, Field>(); private HashSet<String> tagsSet = new HashSet<String>(); public BeanTagSourceFactory(Class<T> beanClass) { this.beanClass = beanClass; } public void addMethodMapping(String tag, String methodName) throws NoSuchMethodException{ Method method = ReflectionUtils.getMethod(beanClass, methodName, Object.class); if(method == null){ throw new NoSuchMethodException("Method " + methodName + " with no input parameters not found in " + beanClass); } addMethodMapping(tag, method); } protected void addMethodMapping(String tag, Method method){ if(!method.isAccessible()){ ReflectionUtils.fixMethodAccess(method); } tagMethodMap.put(tag, method); this.tagsSet.add(tag); } public void addFieldMapping(String tag, String fieldName) throws NoSuchFieldException{ Field field = ReflectionUtils.getField(beanClass, fieldName); if(field == null){ throw new NoSuchFieldException("Field " + fieldName + " not found in " + beanClass); } addFieldMapping(tag, field); } protected void addFieldMapping(String tag, Field field){ if(!field.isAccessible()){ ReflectionUtils.fixFieldAccess(field); } tagFieldMap.put(tag, field); this.tagsSet.add(tag); } public void addAllFields(String fieldPrefix, String... excludedFields){ List<String> exclusionList = null; if(excludedFields != null){ exclusionList = Arrays.asList(excludedFields); } List<Field> fields = ReflectionUtils.getFields(beanClass); for(Field field : fields){ if(exclusionList == null || !exclusionList.contains(field.getName())){ if(!field.isAccessible()){ ReflectionUtils.fixFieldAccess(field); } this.tagFieldMap.put(fieldPrefix + field.getName(), field); this.tagsSet.add(fieldPrefix + field.getName()); } } } public <X extends T> BeanTagSource<T> getTagSource(X bean){ return new BeanTagSource<T>(bean, tagMethodMap, tagFieldMap, tagsSet); } public HashSet<String> getTagsSet() { return new HashSet<String>(tagsSet); } public String getAvailableTags(){ return StringUtils.toCommaSeparatedString(this.tagsSet); } }