http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java deleted file mode 100755 index e69a32b..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.java +++ /dev/null @@ -1,454 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import static com.ibm.juno.core.BeanContextProperties.*; - -import java.io.*; -import java.util.*; -import java.util.concurrent.locks.*; - -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.json.*; -import com.ibm.juno.core.parser.*; -import com.ibm.juno.core.serializer.*; -import com.ibm.juno.core.utils.ClassUtils.ClassComparator; - -/** - * Factory class for creating instances of {@link BeanContext}. - * - * @author James Bognar ([email protected]) - */ -public final class BeanContextFactory extends Lockable { - - //-------------------------------------------------------------------------------- - // Static constants - //-------------------------------------------------------------------------------- - - /** - * The default package pattern exclusion list. - * Any beans in packages in this list will not be considered beans. - */ - private static final String DEFAULT_NOTBEAN_PACKAGES = - "java.lang,java.lang.annotation,java.lang.ref,java.lang.reflect,java.io,java.net,java.nio.*,java.util.*"; - - /** - * The default bean class exclusion list. - * Anything in this list will not be considered beans. - */ - private static final Class<?>[] DEFAULT_NOTBEAN_CLASSES = { - Map.class, - Collection.class, - Reader.class, - Writer.class, - InputStream.class, - OutputStream.class, - Throwable.class - }; - - //-------------------------------------------------------------------------------- - // Properties - //-------------------------------------------------------------------------------- - - boolean - beansRequireDefaultConstructor = false, - beansRequireSerializable = false, - beansRequireSettersForGetters = false, - beansRequireSomeProperties = true, - beanMapPutReturnsOldValue = false, - useInterfaceProxies = true, - ignoreUnknownBeanProperties = false, - ignoreUnknownNullBeanProperties = true, - ignorePropertiesWithoutSetters = true, - ignoreInvocationExceptionsOnGetters = false, - ignoreInvocationExceptionsOnSetters = false, - useJavaBeanIntrospector = false; - - Set<String> notBeanPackages = new TreeSet<String>(); - Set<Class<?>> notBeanClasses = newClassTreeSet(); - Map<Class<?>,Class<?>> implClasses = newClassTreeMap(); - Map<String,String> uriVars = new TreeMap<String,String>(); - LinkedList<Class<?>> filters = new LinkedList<Class<?>>(); - ClassLoader classLoader = null; - - Visibility - beanConstructorVisibility = Visibility.PUBLIC, - beanClassVisibility = Visibility.PUBLIC, - beanFieldVisibility = Visibility.PUBLIC, - beanMethodVisibility = Visibility.PUBLIC; - - // Optional default parser set by setDefaultParser(). - ReaderParser defaultParser = null; - - // Read-write lock for preventing acess to the getBeanContext() method while this factory is being modified. - private ReadWriteLock lock = new ReentrantReadWriteLock(); - - // Current BeanContext instance. - private BeanContext beanContext; - - //-------------------------------------------------------------------------------- - // Methods - //-------------------------------------------------------------------------------- - - /** - * Default constructor. - */ - public BeanContextFactory() { - addNotBeanClasses(DEFAULT_NOTBEAN_CLASSES); - setProperty(BEAN_addNotBeanPackages, DEFAULT_NOTBEAN_PACKAGES); - } - - /** - * Creates and returns a {@link BeanContext} with settings currently specified on this factory class. - * This method will return the same object until the factory settings are modified at which point - * a new {@link BeanContext} will be constructed. - * - * @return The bean context object. - */ - public BeanContext getBeanContext() { - readLock(); - try { - if (beanContext == null) - beanContext = new BeanContext(this); - return beanContext; - } finally { - readUnlock(); - } - } - - /** - * Sets the default parser for this bean context. - * <p> - * The default parser is used in the following methods: - * <ul> - * <code>beanContext.newBeanMap(Bean.<jk>class</jk>).load(String)</code> - Used for parsing init properties. - * <li>{@link BeanContext#convertToType(Object, ClassMeta)} - Used for converting strings to beans. - * </ul> - * - * @param defaultParser The new default parser. - * @return This object (for method chaining). - */ - public BeanContextFactory setDefaultParser(ReaderParser defaultParser) { - writeLock(); - try { - this.defaultParser = defaultParser; - return this; - } finally { - writeUnlock(); - } - } - - - //-------------------------------------------------------------------------------- - // Configuration property methods - //-------------------------------------------------------------------------------- - - /** - * Sets a property on this context. - * <p> - * Refer to {@link BeanContextProperties} for a description of available properties. - * - * @param property The property whose value is getting changed. - * @param value The new value. - * @throws LockedException If {@link #lock()} was called on this object. - * @return This object (for method chaining). - */ - public BeanContextFactory setProperty(String property, Object value) throws LockedException { - writeLock(); - try { - // Note: Have to use the default bean context to set these properties since calling - // convertToType will cause the cache object to be initialized. - BeanContext bc = BeanContext.DEFAULT; - - if (property.equals(BEAN_beansRequireDefaultConstructor)) - beansRequireDefaultConstructor = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_beansRequireSerializable)) - beansRequireSerializable = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_beansRequireSettersForGetters)) - beansRequireSettersForGetters = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_beansRequireSomeProperties)) - beansRequireSomeProperties = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_beanMapPutReturnsOldValue)) - beanMapPutReturnsOldValue = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_beanConstructorVisibility)) - beanConstructorVisibility = Visibility.valueOf(value.toString()); - else if (property.equals(BEAN_beanClassVisibility)) - beanClassVisibility = Visibility.valueOf(value.toString()); - else if (property.equals(BEAN_beanFieldVisibility)) - beanFieldVisibility = Visibility.valueOf(value.toString()); - else if (property.equals(BEAN_methodVisibility)) - beanMethodVisibility = Visibility.valueOf(value.toString()); - else if (property.equals(BEAN_useJavaBeanIntrospector)) - useJavaBeanIntrospector = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_useInterfaceProxies)) - useInterfaceProxies = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_ignoreUnknownBeanProperties)) - ignoreUnknownBeanProperties = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_ignoreUnknownNullBeanProperties)) - ignoreUnknownNullBeanProperties = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_ignorePropertiesWithoutSetters)) - ignorePropertiesWithoutSetters = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_ignoreInvocationExceptionsOnGetters)) - ignoreInvocationExceptionsOnGetters = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_ignoreInvocationExceptionsOnSetters)) - ignoreInvocationExceptionsOnSetters = bc.convertToType(value, Boolean.class); - else if (property.equals(BEAN_addNotBeanPackages)) { - Set<String> set = new TreeSet<String>(notBeanPackages); - for (String s : value.toString().split(",")) - set.add(s.trim()); - notBeanPackages = set; - } else if (property.equals(BEAN_removeNotBeanPackages)) { - Set<String> set = new TreeSet<String>(notBeanPackages); - for (String s : value.toString().split(",")) - set.remove(s.trim()); - notBeanPackages = set; - } - } finally { - writeUnlock(); - } - return this; - } - - /** - * Sets multiple properties on this context. - * <p> - * Refer to {@link BeanContextProperties} for a description of available properties. - * - * @param properties The properties to set. Ignored if <jk>null</jk>. - * @throws LockedException If {@link #lock()} was called on this object. - * @return This object (for method chaining). - */ - public BeanContextFactory setProperties(ObjectMap properties) throws LockedException { - writeLock(); - try { - if (properties != null) - for (Map.Entry<String,Object> e : properties.entrySet()) - setProperty(e.getKey(), e.getValue()); - return this; - } finally { - writeUnlock(); - } - } - - /** - * Adds an explicit list of Java classes to be excluded from consideration as being beans. - * - * @param classes One or more fully-qualified Java class names. - * @return This object (for method chaining). - */ - public BeanContextFactory addNotBeanClasses(Class<?>...classes) { - writeLock(); - try { - this.notBeanClasses.addAll(Arrays.asList(classes)); - return this; - } finally { - writeUnlock(); - } - } - - /** - * Add filters to this context. - * <p> - * There are two category of classes that can be passed in through this method: - * <ul> - * <li>Subclasses of {@link PojoFilter} and {@link BeanFilter}. - * <li>Any other class. - * </ul> - * <p> - * When <code>IFilter</code> classes are specified, they identify objects that need to be - * transformed into some other type during serialization (and optionally the reverse during parsing). - * <p> - * When non-<code>IFilter</code> classes are specified, they are wrapped inside {@link BeanFilter BeanFilters}. - * For example, if you have an interface <code>IFoo</code> and a subclass <code>Foo</code>, and you - * only want properties defined on <code>IFoo</code> to be visible as bean properties for <code>Foo</code> objects, - * you can simply pass in <code>IFoo.<jk>class</jk></code> to this method. - * <p> - * The following code shows the order in which filters are applied: - * <p class='bcode'> - * <jc>// F3,F4,F1,F2</jc> - * beanContext.addFilters(F1.<jk>class</jk>,F2.<jk>class</jk>); - * beanContext.addFilters(F3.<jk>class</jk>,F4.<jk>class</jk>); - * </p> - * - * @param classes One or more classes to add as filters to this context. - * @throws LockedException If {@link #lock()} was called on this object. - * @return This object (for method chaining). - */ - public BeanContextFactory addFilters(Class<?>...classes) throws LockedException { - writeLock(); - try { - classes = Arrays.copyOf(classes, classes.length); // Copy array to prevent modification! - Collections.reverse(Arrays.asList(classes)); - for (Class<?> c : classes) - filters.addFirst(c); - return this; - } finally { - writeUnlock(); - } - } - - /** - * Specifies an implementation class for an interface or abstract class. - * <p> - * For interfaces and abstract classes this method can be used to specify an implementation - * class for the interface/abstract class so that instances of the implementation - * class are used when instantiated (e.g. during a parse). - * - * @param <T> The interface class. - * @param interfaceClass The interface class. - * @param implClass The implementation of the interface class. - * @throws LockedException If {@link #lock()} was called on this object. - * @return This object (for method chaining). - */ - public <T> BeanContextFactory addImplClass(Class<T> interfaceClass, Class<? extends T> implClass) throws LockedException { - writeLock(); - try { - this.implClasses.put(interfaceClass, implClass); - return this; - } finally { - writeUnlock(); - } - } - - /** - * Specifies the classloader to use when resolving classes, usually <js>"_class"</js> attributes. - * <p> - * Can be used for resolving class names when the classes being created are in a different - * classloader from the Juno code. - * <p> - * If <jk>null</jk>, <code>Class.forName(String)</code> will be used to resolve classes. - * - * @param classLoader The new classloader. - * @throws LockedException If {@link #lock()} was called on this object. - * @return This object (for method chaining). - */ - public BeanContextFactory setClassLoader(ClassLoader classLoader) throws LockedException { - writeLock(); - try { - this.classLoader = classLoader; - return this; - } finally { - writeUnlock(); - } - } - - //-------------------------------------------------------------------------------- - // Overridden methods on Lockable - //-------------------------------------------------------------------------------- - - @Override /* Lockable */ - public BeanContextFactory lock() { - if (! isLocked()) { - writeLock(); - super.lock(); - try { - notBeanPackages = Collections.unmodifiableSet(notBeanPackages); - notBeanClasses = Collections.unmodifiableSet(notBeanClasses); - implClasses = Collections.unmodifiableMap(implClasses); - uriVars = Collections.unmodifiableMap(uriVars); - } finally { - writeUnlock(); - } - } - return this; - } - - private void writeLock() { - checkLock(); - lock.writeLock().lock(); - beanContext = null; - } - - private void writeUnlock() { - lock.writeLock().unlock(); - } - - private void readLock() { - lock.readLock().lock(); - } - - private void readUnlock() { - lock.readLock().unlock(); - } - - @Override /* Lockable */ - public synchronized BeanContextFactory clone() { - try { - return (BeanContextFactory)super.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); // Shouldn't happen. - } - } - - @Override /* Lockable */ - public void onUnclone() { - readLock(); - try { - notBeanPackages = new LinkedHashSet<String>(notBeanPackages); - filters = new LinkedList<Class<?>>(filters); - notBeanClasses = newClassTreeSet(notBeanClasses); - implClasses = newClassTreeMap(implClasses); - uriVars = new TreeMap<String,String>(uriVars); - beanContext = null; - } finally { - readUnlock(); - } - } - - @Override /* Object */ - public String toString() { - readLock(); - try { - ObjectMap m = new ObjectMap() - .append("id", System.identityHashCode(this)) - .append("beansRequireDefaultConstructor", beansRequireDefaultConstructor) - .append("beansRequireSerializable", beansRequireSerializable) - .append("beansRequireSettersForGetters", beansRequireSettersForGetters) - .append("beansRequireSomeProperties", beansRequireSomeProperties) - .append("beanMapPutReturnsOldValue", beanMapPutReturnsOldValue) - .append("useInterfaceProxies", useInterfaceProxies) - .append("ignoreUnknownBeanProperties", ignoreUnknownBeanProperties) - .append("ignoreUnknownNullBeanProperties", ignoreUnknownNullBeanProperties) - .append("ignorePropertiesWithoutSetters", ignorePropertiesWithoutSetters) - .append("ignoreInvocationExceptionsOnGetters", ignoreInvocationExceptionsOnGetters) - .append("ignoreInvocationExceptionsOnSetters", ignoreInvocationExceptionsOnSetters) - .append("useJavaBeanIntrospector", useJavaBeanIntrospector) - .append("filters", filters) - .append("notBeanPackages", notBeanPackages) - .append("notBeanClasses", notBeanClasses) - .append("implClasses", implClasses) - .append("uriVars", uriVars); - return m.toString(JsonSerializer.DEFAULT_LAX_READABLE); - } catch (SerializeException e) { - return e.getLocalizedMessage(); - } finally { - readUnlock(); - } - } - - private TreeMap<Class<?>,Class<?>> newClassTreeMap(Map<Class<?>,Class<?>> m) { - TreeMap<Class<?>,Class<?>> tm = newClassTreeMap(); - tm.putAll(m); - return tm; - } - - private TreeMap<Class<?>,Class<?>> newClassTreeMap() { - return new TreeMap<Class<?>,Class<?>>(new ClassComparator()); - } - - private TreeSet<Class<?>> newClassTreeSet(Set<Class<?>> s) { - TreeSet<Class<?>> ts = newClassTreeSet(); - ts.addAll(s); - return ts; - } - - private TreeSet<Class<?>> newClassTreeSet() { - return new TreeSet<Class<?>>(new ClassComparator()); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class deleted file mode 100755 index 652c6b4..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java deleted file mode 100755 index 4edaf17..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextProperties.java +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2014. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import java.beans.*; -import java.io.*; -import java.lang.reflect.*; - -import com.ibm.juno.core.annotation.*; - -/** - * Configurable properties on the {@link BeanContextFactory} class. - * <p> - * Use the {@link BeanContextFactory#setProperty(String, Object)} method to set properties on - * bean contexts. - * - * @author James Bognar ([email protected]) - */ -public final class BeanContextProperties { - - /** - * Require no-arg constructor ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, a Java class must implement a default no-arg constructor to be considered a bean. - * <p> - * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>. - */ - public static final String BEAN_beansRequireDefaultConstructor = "BeanContext.beansRequireDefaultConstructor"; - - /** - * Require {@link Serializable} interface ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, a Java class must implement the {@link Serializable} interface to be considered a bean. - * <p> - * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>. - */ - public static final String BEAN_beansRequireSerializable = "BeanContext.beansRequireSerializable"; - - /** - * Require setters for getters ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, only getters that have equivalent setters will be considered as properties on a bean. - * Otherwise, they will be ignored. - */ - public static final String BEAN_beansRequireSettersForGetters = "BeanContext.beansRequireSettersForGetters"; - - /** - * Require some properties ({@link Boolean}, default=<jk>true</jk>). - * <p> - * If <jk>true</jk>, then a Java class must contain at least 1 property to be considered a bean. - * <p> - * The {@link Bean @Bean} annotation can be used on a class to override this setting when <jk>true</jk>. - */ - public static final String BEAN_beansRequireSomeProperties = "BeanContext.beansRequireSomeProperties"; - - /** - * Put returns old value ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, then the {@link BeanMap#put(String,Object) BeanMap.put()} method will return old property values. - * <p> - * Disabled by default because it introduces a slight performance penalty. - */ - public static final String BEAN_beanMapPutReturnsOldValue = "BeanContext.beanMapPutReturnsOldValue"; - - /** - * Look for bean constructors with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}). - */ - public static final String BEAN_beanConstructorVisibility = "BeanContext.beanConstructorVisibility"; - - /** - * Look for bean classes with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}). - * <p> - * Classes are not considered beans unless they meet the minimum visibility requirements. - * For example, if the visibility is <code>PUBLIC</code> and the bean class is <jk>protected</jk>, then - * the class will not be interpreted as a bean class. - */ - public static final String BEAN_beanClassVisibility = "BeanContext.beanClassVisibility"; - - /** - * Look for bean fields with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}). - * <p> - * Fields are not considered bean properties unless they meet the minimum visibility requirements. - * For example, if the visibility is <code>PUBLIC</code> and the bean field is <jk>protected</jk>, then - * the field will not be interpreted as a bean property. - * <p> - * Use {@link Visibility#NONE} to prevent bean fields from being interpreted as bean properties altogether. - */ - public static final String BEAN_beanFieldVisibility = "BeanContext.beanFieldVisibility"; - - /** - * Look for bean methods with the specified minimum visibility ({@link Visibility}, default={@link Visibility#PUBLIC}). - * <p> - * Methods are not considered bean getters/setters unless they meet the minimum visibility requirements. - * For example, if the visibility is <code>PUBLIC</code> and the bean method is <jk>protected</jk>, then - * the method will not be interpreted as a bean getter or setter. - */ - public static final String BEAN_methodVisibility = "BeanContext.methodVisibility"; - - /** - * Use Java {@link Introspector} for determining bean properties ({@link Boolean}, default=<jk>false</jk>). - * <p> - * Using the built-in Java bean introspector will not pick up fields or non-standard getters/setters. - * Most {@link Bean @Bean} annotations will be ignored. - */ - public static final String BEAN_useJavaBeanIntrospector = "BeanContext.useJavaBeanIntrospector"; - - /** - * Use interface proxies ({@link Boolean}, default=<jk>true</jk>). - * <p> - * If <jk>true</jk>, then interfaces will be instantiated as proxy classes through the use of an {@link InvocationHandler} - * if there is no other way of instantiating them. - */ - public static final String BEAN_useInterfaceProxies = "BeanContext.useInterfaceProxies"; - - /** - * Ignore unknown properties ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, trying to set a value on a non-existent bean property will silently be ignored. - * Otherwise, a {@code RuntimeException} is thrown. - */ - public static final String BEAN_ignoreUnknownBeanProperties = "BeanContext.ignoreUnknownBeanProperties"; - - /** - * Ignore unknown properties with null values ({@link Boolean}, default=<jk>true</jk>). - * <p> - * If <jk>true</jk>, trying to set a <jk>null</jk> value on a non-existent bean property will silently be ignored. - * Otherwise, a {@code RuntimeException} is thrown. - */ - public static final String BEAN_ignoreUnknownNullBeanProperties = "BeanContext.ignoreUnknownNullBeanProperties"; - - /** - * Ignore properties without setters ({@link Boolean}, default=<jk>true</jk>). - * <p> - * If <jk>true</jk>, trying to set a value on a bean property without a setter will silently be ignored. - * Otherwise, a {@code RuntimeException} is thrown. - */ - public static final String BEAN_ignorePropertiesWithoutSetters = "BeanContext.ignorePropertiesWithoutSetters"; - - /** - * Ignore invocation errors on getters ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, errors thrown when calling bean getter methods will silently be ignored. - * Otherwise, a {@code BeanRuntimeException} is thrown. - */ - public static final String BEAN_ignoreInvocationExceptionsOnGetters = "BeanContext.ignoreInvocationExceptionsOnGetters"; - - /** - * Ignore invocation errors on setters ({@link Boolean}, default=<jk>false</jk>). - * <p> - * If <jk>true</jk>, errors thrown when calling bean setter methods will silently be ignored. - * Otherwise, a {@code BeanRuntimeException} is thrown. - */ - public static final String BEAN_ignoreInvocationExceptionsOnSetters = "BeanContext.ignoreInvocationExceptionsOnSetters"; - - /** - * Add to the list of packages whose classes should not be considered beans ({@link String}, comma-delimited list). - * <p> - * When specified, the current list of ignore packages are appended to. - * The default list of ignore packages are as follows: - * <ul> - * <li><code>java.lang</code> - * <li><code>java.lang.annotation</code> - * <li><code>java.lang.ref</code> - * <li><code>java.lang.reflect</code> - * <li><code>java.io</code> - * <li><code>java.net</code> - * <li><code>java.nio.*</code> - * <li><code>java.util.*</code> - * </ul> - * Any classes within these packages will be serialized to strings using {@link Object#toString()}. - * <p> - * Note that you can specify prefix patterns to include all subpackages. - */ - public static final String BEAN_addNotBeanPackages = "BeanContext.addNotBeanPackages"; - - /** - * Remove from the list of packages whose classes should not be considered beans ({@link String}, comma-delimited list). - * <p> - * Essentially the opposite of {@link #BEAN_addNotBeanPackages}. - */ - public static final String BEAN_removeNotBeanPackages = "BeanContext.removeNotBeanPackages"; -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class deleted file mode 100755 index a16cbe6..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1$1.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class deleted file mode 100755 index f6be25f..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap$1.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class deleted file mode 100755 index 61512ad..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java deleted file mode 100755 index 8aa1fb5..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMap.java +++ /dev/null @@ -1,461 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import java.io.*; -import java.lang.reflect.*; -import java.util.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.parser.*; -import com.ibm.juno.core.xml.annotation.*; - -/** - * Java bean wrapper class. - * - * - * <h6 class='topic'>Description</h6> - * <p> - * A wrapper that wraps Java bean instances inside of a {@link Map} interface that allows - * properties on the wrapped object can be accessed using the {@link Map#get(Object) get()} and {@link Map#put(Object,Object) put()} methods. - * <p> - * Use the {@link BeanContext} class to create instances of this class. - * - * - * <h6 class='topic'>Bean property order</h6> - * <p> - * The order of the properties returned by the {@link Map#keySet() keySet()} and {@link Map#entrySet() entrySet()} methods are as follows: - * <ul> - * <li>If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties in the annotation. - * <li>If {@link Bean @Bean} annotation is not specified on the class, then the order is the same as that returned - * by the {@link java.beans.BeanInfo} class (i.e. ordered by definition in the class). - * </ul> - * <br> - * The order can also be overridden through the use of a {@link BeanFilter}. - * - * - * <h6 class='topic'>POJO filters</h6> - * <p> - * If {@link PojoFilter PojoFilters} are defined on the class types of the properties of this bean or the bean properties themselves, the - * {@link #get(Object)} and {@link #put(Object, Object)} methods will automatically - * transform the property value to and from the serialized form. - * - * @author Barry M. Caceres - * @author James Bognar ([email protected]) - * @param <T> Specifies the type of object that this map encapsulates. - */ -public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T> { - - /** The wrapped object. */ - protected T bean; - - /** Temporary holding cache for beans with read-only properties. Normally null. */ - protected Map<String,Object> propertyCache; - - /** Temporary holding cache for bean properties of array types when the add() method is being used. */ - protected Map<String,List<?>> arrayPropertyCache; - - /** The BeanMeta associated with the class of the object. */ - protected BeanMeta<T> meta; - - /** - * Instance of this class are instantiated through the BeanContext class. - * - * @param bean The bean to wrap inside this map. - * @param meta The metadata associated with the bean class. - */ - protected BeanMap(T bean, BeanMeta<T> meta) { - this.bean = bean; - this.meta = meta; - if (meta.constructorArgs.length > 0) - propertyCache = new TreeMap<String,Object>(); - } - - /** - * Returns the metadata associated with this bean map. - * - * @return The metadata associated with this bean map. - */ - public BeanMeta<T> getMeta() { - return meta; - } - - /** - * Returns the wrapped bean object. - * Triggers bean creation if bean has read-only properties set through a constructor - * defined by the {@link BeanConstructor} annotation. - * - * @return The inner bean object. - */ - public T getBean() { - T b = getBean(true); - - // If we have any arrays that need to be constructed, do it now. - if (arrayPropertyCache != null) { - for (Map.Entry<String,List<?>> e : arrayPropertyCache.entrySet()) { - String key = e.getKey(); - List<?> value = e.getValue(); - BeanPropertyMeta<T> bpm = getPropertyMeta(key); - try { - bpm.setArray(b, value); - } catch (Exception e1) { - throw new RuntimeException(e1); - } - } - arrayPropertyCache = null; - } - return b; - } - - /** - * Returns the wrapped bean object. - * <p> - * If <code>create</code> is <jk>false</jk>, then this method may return <jk>null</jk> - * if the bean has read-only properties set through a constructor - * defined by the {@link BeanConstructor} annotation. - * <p> - * This method does NOT always return the bean in it's final state. - * Array properties temporary stored as ArrayLists are not finalized - * until the {@link #getBean()} method is called. - * - * @param create If bean hasn't been instantiated yet, then instantiate it. - * @return The inner bean object. - */ - public T getBean(boolean create) { - /** If this is a read-only bean, then we need to create it. */ - if (bean == null && create && meta.constructorArgs.length > 0) { - String[] props = meta.constructorArgs; - Constructor<T> c = meta.constructor; - Object[] args = new Object[props.length]; - for (int i = 0; i < props.length; i++) - args[i] = propertyCache.remove(props[i]); - try { - bean = c.newInstance(args); - for (Map.Entry<String,Object> e : propertyCache.entrySet()) - put(e.getKey(), e.getValue()); - propertyCache = null; - } catch (Exception e) { - throw new BeanRuntimeException(e); - } - } - return bean; - } - - /** - * Returns the value of the property identified as the URI property (annotated with {@link BeanProperty#beanUri()} as <jk>true</jk>). - * - * @return The URI value, or <jk>null</jk> if no URI property exists on this bean. - */ - public Object getBeanUri() { - BeanMeta<T> bm = getMeta(); - return bm.hasBeanUriProperty() ? bm.getBeanUriProperty().get(this) : null; - } - - /** - * Sets the bean URI property if the bean has a URI property. - * Ignored otherwise. - * - * @param o The bean URI object. - * @return If the bean context setting {@code beanMapPutReturnsOldValue} is <jk>true</jk>, then the old value of the property is returned. - * Otherwise, this method always returns <jk>null</jk>. - */ - public Object putBeanUri(Object o) { - BeanMeta<T> bm = getMeta(); - return bm.hasBeanUriProperty() ? bm.getBeanUriProperty().set(this, o) : null; - } - - /** - * Sets a property on the bean. - * <p> - * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then - * you must pass in a filtered value. - * For example, if the bean property type class is a {@link Date} and the bean property has the - * {@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the - * {@link BeanProperty#filter() @BeanProperty.filter()} annotation, the value being passed in must be - * a String containing an ISO8601 date-time string value. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a bean with a 'birthDate' Date field</jc> - * Person p = <jk>new</jk> Person(); - * - * <jc>// Create a bean context and add the ISO8601 date-time filter</jc> - * BeanContext beanContext = <jk>new</jk> BeanContext().addFilter(DateFilter.ISO8601DT.<jk>class</jk>); - * - * <jc>// Wrap our bean in a bean map</jc> - * BeanMap<Person> b = beanContext.forBean(p); - * - * <jc>// Set the field</jc> - * myBeanMap.put(<js>"birthDate"</js>, <js>"'1901-03-03T04:05:06-5000'"</js>); - * </p> - * </dd> - * </dl> - * - * @param property The name of the property to set. - * @param value The value to set the property to. - * @return If the bean context setting {@code beanMapPutReturnsOldValue} is <jk>true</jk>, then the old value of the property is returned. - * Otherwise, this method always returns <jk>null</jk>. - * @throws RuntimeException if any of the following occur. - * <ul> - * <li>BeanMapEntry does not exist on the underlying object. - * <li>Security settings prevent access to the underlying object setter method. - * <li>An exception occurred inside the setter method. - * </ul> - */ - @Override /* Map */ - public Object put(String property, Object value) { - BeanPropertyMeta<T> p = meta.properties.get(property); - if (p == null) { - if (meta.ctx.ignoreUnknownBeanProperties) - return null; - if (property.equals("<uri>") && meta.uriProperty != null) - return meta.uriProperty.set(this, value); - - // If this bean has subtypes, and we haven't set the subtype yet, - // store the property in a temporary cache until the bean can be instantiated. - // This eliminates the need for requiring that the sub type attribute be provided first. - if (meta.subTypeIdProperty != null) { - if (propertyCache == null) - propertyCache = new TreeMap<String,Object>(); - return propertyCache.put(property, value); - } - - throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property); - } - if (meta.filter != null) - if (meta.filter.writeProperty(this.bean, property, value)) - return null; - return p.set(this, value); - } - - /** - * Add a value to a collection or array property. - * <p> - * As a general rule, adding to arrays is not recommended since the array must be recreate each time - * this method is called. - * - * @param property Property name or child-element name (if {@link Xml#childName()} is specified). - * @param value The value to add to the collection or array. - */ - public void add(String property, Object value) { - BeanPropertyMeta<T> p = meta.properties.get(property); - if (p == null) { - if (meta.ctx.ignoreUnknownBeanProperties) - return; - throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property); - } - p.add(this, value); - } - - - /** - * Gets a property on the bean. - * <p> - * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then - * this method will return the filtered value. - * For example, if the bean property type class is a {@link Date} and the bean property has the - * {@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the - * {@link BeanProperty#filter() @BeanProperty.filter()} annotation, this method will return a String - * containing an ISO8601 date-time string value. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a bean with a 'birthDate' Date field</jc> - * Person p = <jk>new</jk> Person(); - * p.setBirthDate(<jk>new</jk> Date(1, 2, 3, 4, 5, 6)); - * - * <jc>// Create a bean context and add the ISO8601 date-time filter</jc> - * BeanContext beanContext = <jk>new</jk> BeanContext().addFilter(DateFilter.ISO8601DT.<jk>class</jk>); - * - * <jc>// Wrap our bean in a bean map</jc> - * BeanMap<Person> b = beanContext.forBean(p); - * - * <jc>// Get the field as a string (i.e. "'1901-03-03T04:05:06-5000'")</jc> - * String s = myBeanMap.get(<js>"birthDate"</js>); - * </p> - * </dd> - * </dl> - * - * @param property The name of the property to get. - * @throws RuntimeException if any of the following occur. - * <ol> - * <li>BeanMapEntry does not exist on the underlying object. - * <li>Security settings prevent access to the underlying object getter method. - * <li>An exception occurred inside the getter method. - * </ol> - */ - @Override /* Map */ - public Object get(Object property) { - BeanPropertyMeta<T> p = meta.properties.get(property); - if (p == null) - return null; - if (meta.filter != null && property != null) - return meta.filter.readProperty(this.bean, property.toString(), p.get(this)); - return p.get(this); - } - - /** - * Convenience method for setting multiple property values by passing in JSON (or other) text. - * <p> - * Typically the input is going to be JSON, although the actual data type - * depends on the default parser specified by the {@link BeanContextFactory#setDefaultParser(ReaderParser)} method - * on the bean context that created this map. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * aPersonBean.load(<js>"{name:'John Smith',age:21}"</js>) - * </p> - * </dd> - * </dl> - * - * @param input The text that will get parsed into a map and then added to this map. - * @return This object (for method chaining). - * @throws ParseException If the input contains a syntax error or is malformed. - */ - public BeanMap<T> load(String input) throws ParseException { - putAll(new ObjectMap(input, this.meta.ctx.defaultParser)); - return this; - } - - /** - * Convenience method for setting multiple property values by passing in a reader. - * - * @param r The text that will get parsed into a map and then added to this map. - * @param p The parser to use to parse the text. - * @return This object (for method chaining). - * @throws ParseException If the input contains a syntax error or is malformed. - * @throws IOException Thrown by <code>Reader</code>. - */ - public BeanMap<T> load(Reader r, ReaderParser p) throws ParseException, IOException { - putAll(new ObjectMap(r, p)); - return this; - } - - /** - * Convenience method for loading this map with the contents of the specified map. - * <p> - * Identical to {@link #putAll(Map)} except as a fluent-style method. - * - * @param entries The map containing the entries to add to this map. - * @return This object (for method chaining). - */ - @SuppressWarnings({"unchecked","rawtypes"}) - public BeanMap<T> load(Map entries) { - putAll(entries); - return this; - } - - /** - * Returns the names of all properties associated with the bean. - * <p> - * The returned set is unmodifiable. - */ - @Override /* Map */ - public Set<String> keySet() { - return meta.properties.keySet(); - } - - /** - * Returns the specified property on this bean map. - * <p> - * Allows you to get and set an individual property on a bean without having a - * handle to the bean itself by using the {@link BeanMapEntry#getValue()} - * and {@link BeanMapEntry#setValue(Object)} methods. - * <p> - * This method can also be used to get metadata on a property by - * calling the {@link BeanMapEntry#getMeta()} method. - * - * @param propertyName The name of the property to look up. - * @return The bean property, or null if the bean has no such property. - */ - public BeanMapEntry<T> getProperty(String propertyName) { - BeanPropertyMeta<T> p = meta.properties.get(propertyName); - if (p == null) - return null; - return new BeanMapEntry<T>(this, p); - } - - /** - * Returns the metadata on the specified property. - * - * @param propertyName The name of the bean property. - * @return Metadata on the specified property, or <jk>null</jk> if that property does not exist. - */ - public BeanPropertyMeta<T> getPropertyMeta(String propertyName) { - return meta.properties.get(propertyName); - } - - /** - * Returns the {@link ClassMeta} of the wrapped bean. - * - * @return The class type of the wrapped bean. - */ - @Override /* Delagate */ - public ClassMeta<T> getClassMeta() { - return this.meta.getClassMeta(); - } - - /** - * Returns all the properties associated with the bean. - */ - @Override /* Map */ - public Set<Entry<String,Object>> entrySet() { - - // Construct our own anonymous set to implement this function. - Set<Entry<String,Object>> s = new AbstractSet<Entry<String,Object>>() { - - // Get the list of properties from the meta object. - // Note that the HashMap.values() method caches results, so this collection - // will really only be constructed once per bean type since the underlying - // map never changes. - final Collection<BeanPropertyMeta<T>> pSet = meta.properties.values(); - - @Override /* Set */ - public Iterator<java.util.Map.Entry<String, Object>> iterator() { - - // Construct our own anonymous iterator that uses iterators against the meta.properties - // map to maintain position. This prevents us from having to construct any of our own - // collection objects. - return new Iterator<Entry<String,Object>>() { - - final Iterator<BeanPropertyMeta<T>> pIterator = pSet.iterator(); - - @Override /* Iterator */ - public boolean hasNext() { - return pIterator.hasNext(); - } - - @Override /* Iterator */ - public Map.Entry<String, Object> next() { - return new BeanMapEntry<T>(BeanMap.this, pIterator.next()); - } - - @Override /* Iterator */ - public void remove() { - throw new UnsupportedOperationException("Cannot remove item from iterator."); - } - }; - } - - @Override /* Set */ - public int size() { - return pSet.size(); - } - }; - - return s; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class deleted file mode 100755 index eb1afcc..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java deleted file mode 100755 index c502776..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMapEntry.java +++ /dev/null @@ -1,121 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import java.util.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.filter.*; - -/** - * Represents a single entry in a bean map. - * <p> - * This class can be used to get and set property values on a bean, or to get metadata on a property. - * - * <h6 class='topic'>Examples</h6> - * <p class='bcode'> - * <jc>// Construct a new bean</jc> - * Person p = <jk>new</jk> Person(); - * - * <jc>// Wrap it in a bean map</jc> - * BeanMap<Person> b = BeanContext.<jsf>DEFAULT</jsf>.forBean(p); - * - * <jc>// Get a reference to the birthDate property</jc> - * BeanMapEntry birthDate = b.getProperty(<js>"birthDate"</js>); - * - * <jc>// Set the property value</jc> - * birthDate.setValue(<jk>new</jk> Date(1, 2, 3, 4, 5, 6)); - * - * <jc>// Or if the DateFilter.DEFAULT_ISO8601DT is registered with the bean context, set a filtered value</jc> - * birthDate.setFilteredValue(<js>"'1901-03-03T04:05:06-5000'"</js>); - * </p> - * - * @author James Bognar ([email protected]) - * - * @param <T> The bean type. - */ -public class BeanMapEntry<T> implements Map.Entry<String,Object> { - private final BeanMap<T> beanMap; - private final BeanPropertyMeta<T> meta; - - /** - * Constructor. - * - * @param beanMap The bean map that this entry belongs to. - * @param property The bean property. - */ - protected BeanMapEntry(BeanMap<T> beanMap, BeanPropertyMeta<T> property) { - this.beanMap = beanMap; - this.meta = property; - } - - @Override /* Map.Entry */ - public String getKey() { - return meta.getName(); - } - - /** - * Returns the value of this property. - * <p> - * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then - * this method will return the filtered value. - * For example, if the bean property type class is a {@link Date} and the bean property has the - * {@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the - * {@link BeanProperty#filter() @BeanProperty.filter()} annotation, this method will return a String - * containing an ISO8601 date-time string value. - */ - @Override /* Map.Entry */ - public Object getValue() { - return meta.get(this.beanMap); - } - - /** - * Sets the value of this property. - * <p> - * If the property is an array of type {@code X}, then the value can be a {@code Collection<X>} or {@code X[]} or {@code Object[]}. - * <p> - * If the property is a bean type {@code X}, then the value can either be an {@code X} or a {@code Map}. - * <p> - * If there is a {@link PojoFilter} associated with this bean property or bean property type class, then - * you must pass in a filtered value. - * For example, if the bean property type class is a {@link Date} and the bean property has the - * {@link com.ibm.juno.core.filters.DateFilter.ISO8601DT} filter associated with it through the - * {@link BeanProperty#filter() @BeanProperty.filter()} annotation, the value being passed in must be - * a String containing an ISO8601 date-time string value. - * - * @return The set value after it's been converted. - */ - @Override /* Map.Entry */ - public Object setValue(Object value) { - return meta.set(this.beanMap, value); - } - - /** - * Returns the bean map that contains this property. - * - * @return The bean map that contains this property. - */ - public BeanMap<T> getBeanMap() { - return this.beanMap; - } - - /** - * Returns the metadata about this bean property. - * - * @return Metadata about this bean property. - */ - public BeanPropertyMeta<T> getMeta() { - return this.meta; - } - - @Override /* Object */ - public String toString() { - return this.getKey() + "=" + this.getValue(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class deleted file mode 100755 index a4cbf3a..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$BeanMethod.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class deleted file mode 100755 index 2a98356..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta$SubTypePropertyMeta.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class deleted file mode 100755 index c6c554a..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java deleted file mode 100755 index d5ac436..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMeta.java +++ /dev/null @@ -1,749 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2011, 2015. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import static com.ibm.juno.core.Visibility.*; -import static com.ibm.juno.core.utils.ClassUtils.*; - -import java.beans.*; -import java.io.*; -import java.lang.reflect.*; -import java.util.*; -import java.util.Map.Entry; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.html.*; -import com.ibm.juno.core.jena.*; -import com.ibm.juno.core.utils.*; -import com.ibm.juno.core.xml.*; - - -/** - * Encapsulates all access to the properties of a bean class (like a souped-up {@link java.beans.BeanInfo}). - * - * - * <h6 class='topic'>Description</h6> - * <p> - * Uses introspection to find all the properties associated with this class. If the {@link Bean @Bean} annotation - * is present on the class, or the class has a {@link BeanFilter} registered with it in the bean context, - * then that information is used to determine the properties on the class. - * Otherwise, the {@code BeanInfo} functionality in Java is used to determine the properties on the class. - * - * - * <h6 class='topic'>Bean property ordering</h6> - * <p> - * The order of the properties are as follows: - * <ul> - * <li>If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties in the annotation. - * <li>If {@link Bean @Bean} annotation is not specified on the class, then the order is based on the following. - * <ul> - * <li>Public fields (same order as {@code Class.getFields()}). - * <li>Properties returned by {@code BeanInfo.getPropertyDescriptors()}. - * <li>Non-standard getters/setters with {@link BeanProperty @BeanProperty} annotation defined on them. - * </ul> - * </ul> - * <br> - * The order can also be overridden through the use of an {@link BeanFilter}. - * - * - * @param <T> The class type that this metadata applies to. - * @author Barry M. Caceres - * @author James Bognar ([email protected]) - */ -public class BeanMeta<T> { - - /** The target class type that this meta object describes. */ - protected ClassMeta<T> classMeta; - - /** The target class that this meta object describes. */ - protected Class<T> c; - - /** The properties on the target class. */ - protected Map<String,BeanPropertyMeta<T>> properties; - - /** The getter properties on the target class. */ - protected Map<Method,String> getterProps = new HashMap<Method,String>(); - - /** The setter properties on the target class. */ - protected Map<Method,String> setterProps = new HashMap<Method,String>(); - - /** The bean context that created this metadata object. */ - protected BeanContext ctx; - - /** Optional bean filter associated with the target class. */ - protected BeanFilter<? extends T> filter; - - /** Type variables implemented by this bean. */ - protected Map<Class<?>,Class<?>[]> typeVarImpls; - - /** The constructor for this bean. */ - protected Constructor<T> constructor; - - /** For beans with constructors with BeanConstructor annotation, this is the list of constructor arg properties. */ - protected String[] constructorArgs = new String[0]; - - /** XML-related metadata */ - protected XmlBeanMeta<T> xmlMeta; - - // Other fields - BeanPropertyMeta<T> uriProperty; // The property identified as the URI for this bean (annotated with @BeanProperty.beanUri). - BeanPropertyMeta<T> subTypeIdProperty; // The property indentified as the sub type differentiator property (identified by @Bean.subTypeProperty annotation). - PropertyNamer propertyNamer; // Class used for calculating bean property names. - - BeanMeta() {} - - /** - * Constructor. - * - * @param classMeta The target class. - * @param ctx The bean context that created this object. - * @param filter Optional bean filter associated with the target class. Can be <jk>null</jk>. - */ - protected BeanMeta(ClassMeta<T> classMeta, BeanContext ctx, com.ibm.juno.core.filter.BeanFilter<? extends T> filter) { - this.classMeta = classMeta; - this.ctx = ctx; - this.filter = filter; - this.c = classMeta.getInnerClass(); - } - - /** - * Returns the {@link ClassMeta} of this bean. - * - * @return The {@link ClassMeta} of this bean. - */ - @BeanIgnore - public ClassMeta<T> getClassMeta() { - return classMeta; - } - - /** - * Initializes this bean meta, and returns an error message if the specified class is not - * a bean for any reason. - * - * @return Reason why this class isn't a bean, or <jk>null</jk> if no problems detected. - * @throws BeanRuntimeException If unexpected error occurs such as invalid annotations on the bean class. - */ - @SuppressWarnings("unchecked") - protected String init() throws BeanRuntimeException { - - try { - Visibility - conVis = ctx.beanConstructorVisibility, - cVis = ctx.beanClassVisibility, - mVis = ctx.beanMethodVisibility, - fVis = ctx.beanFieldVisibility; - - // If @Bean.interfaceClass is specified on the parent class, then we want - // to use the properties defined on that class, not the subclass. - Class<?> c2 = (filter != null && filter.getInterfaceClass() != null ? filter.getInterfaceClass() : c); - - Class<?> stopClass = (filter != null ? filter.getStopClass() : Object.class); - if (stopClass == null) - stopClass = Object.class; - - Map<String,BeanPropertyMeta<T>> normalProps = new LinkedHashMap<String,BeanPropertyMeta<T>>(); - - /// See if this class matches one the patterns in the exclude-class list. - if (ctx.isNotABean(c)) - return "Class matches exclude-class list"; - - if (! cVis.isVisible(c.getModifiers())) - return "Class is not public"; - - if (c.isAnnotationPresent(BeanIgnore.class)) - return "Class is annotated with @BeanIgnore"; - - // Make sure it's serializable. - if (filter == null && ctx.beansRequireSerializable && ! isParentClass(Serializable.class, c)) - return "Class is not serializable"; - - // Look for @BeanConstructor constructor. - for (Constructor<?> x : c.getConstructors()) { - if (x.isAnnotationPresent(BeanConstructor.class)) { - if (constructor != null) - throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found."); - constructor = (Constructor<T>)x; - constructorArgs = x.getAnnotation(BeanConstructor.class).properties(); - if (constructorArgs.length != x.getParameterTypes().length) - throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor."); - if (! setAccessible(constructor)) - throw new BeanRuntimeException(c, "Could not set accessibility to true on method with @BeanConstructor annotation. Method=''{0}''", constructor.getName()); - } - } - - // If this is an interface, look for impl classes defined in the context. - if (constructor == null) - constructor = (Constructor<T>)ctx.getImplClassConstructor(c, conVis); - - if (constructor == null) - constructor = (Constructor<T>)ClassMeta.findNoArgConstructor(c, conVis); - - if (constructor == null && filter == null && ctx.beansRequireDefaultConstructor) - return "Class does not have the required no-arg constructor"; - - if (! setAccessible(constructor)) - throw new BeanRuntimeException(c, "Could not set accessibility to true on no-arg constructor"); - - // Explicitly defined property names in @Bean annotation. - Set<String> fixedBeanProps = new LinkedHashSet<String>(); - - if (filter != null) { - - // Get the 'properties' attribute if specified. - if (filter.getProperties() != null) - for (String p : filter.getProperties()) - fixedBeanProps.add(p); - - if (filter.getPropertyNamer() != null) - propertyNamer = filter.getPropertyNamer().newInstance(); - } - - if (propertyNamer == null) - propertyNamer = new PropertyNamerDefault(); - - // First populate the properties with those specified in the bean annotation to - // ensure that ordering first. - for (String name : fixedBeanProps) - normalProps.put(name, new BeanPropertyMeta<T>(this, name)); - - if (ctx.useJavaBeanIntrospector) { - BeanInfo bi = null; - if (! c2.isInterface()) - bi = Introspector.getBeanInfo(c2, stopClass); - else - bi = Introspector.getBeanInfo(c2, null); - if (bi != null) { - for (PropertyDescriptor pd : bi.getPropertyDescriptors()) { - String name = pd.getName(); - if (! normalProps.containsKey(name)) - normalProps.put(name, new BeanPropertyMeta<T>(this, name)); - normalProps.get(name).setGetter(pd.getReadMethod()).setSetter(pd.getWriteMethod()); - } - } - - } else /* Use 'better' introspection */ { - - for (Field f : findBeanFields(c2, stopClass, fVis)) { - String name = findPropertyName(f, fixedBeanProps); - if (name != null) { - if (! normalProps.containsKey(name)) - normalProps.put(name, new BeanPropertyMeta<T>(this, name)); - normalProps.get(name).setField(f); - } - } - - List<BeanMethod> bms = findBeanMethods(c2, stopClass, mVis, fixedBeanProps, propertyNamer); - - // Iterate through all the getters. - for (BeanMethod bm : bms) { - String pn = bm.propertyName; - Method m = bm.method; - if (! normalProps.containsKey(pn)) - normalProps.put(pn, new BeanPropertyMeta<T>(this, pn)); - BeanPropertyMeta<?> bpm = normalProps.get(pn); - if (! bm.isSetter) - bpm.setGetter(m); - } - - // Now iterate through all the setters. - for (BeanMethod bm : bms) { - if (bm.isSetter) { - BeanPropertyMeta<?> bpm = normalProps.get(bm.propertyName); - if (bm.matchesPropertyType(bpm)) - bpm.setSetter(bm.method); - } - } - } - - typeVarImpls = new HashMap<Class<?>,Class<?>[]>(); - findTypeVarImpls(c, typeVarImpls); - if (typeVarImpls.isEmpty()) - typeVarImpls = null; - - // Eliminate invalid properties, and set the contents of getterProps and setterProps. - for (Iterator<BeanPropertyMeta<T>> i = normalProps.values().iterator(); i.hasNext();) { - BeanPropertyMeta<T> p = i.next(); - try { - if (p.validate()) { - - if (p.getGetter() != null) - getterProps.put(p.getGetter(), p.getName()); - - if (p.getSetter() != null) - setterProps.put(p.getSetter(), p.getName()); - - if (p.isBeanUri()) - uriProperty = p; - - } else { - i.remove(); - } - } catch (ClassNotFoundException e) { - throw new BeanRuntimeException(c, e.getLocalizedMessage()); - } - } - - // Check for missing properties. - for (String fp : fixedBeanProps) - if (! normalProps.containsKey(fp)) - throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @Bean(properties=X) annotation but was not found on the class definition.", fp); - - // Mark constructor arg properties. - for (String fp : constructorArgs) { - BeanPropertyMeta<T> m = normalProps.get(fp); - if (m == null) - throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @BeanConstructor(properties=X) annotation but was not found on the class definition.", fp); - m.setAsConstructorArg(); - } - - // Make sure at least one property was found. - if (filter == null && ctx.beansRequireSomeProperties && normalProps.size() == 0) - return "No properties detected on bean class"; - - properties = new LinkedHashMap<String,BeanPropertyMeta<T>>(); - - if (filter != null && filter.getSubTypeProperty() != null) { - String subTypeProperty = filter.getSubTypeProperty(); - this.subTypeIdProperty = new SubTypePropertyMeta(subTypeProperty, filter.getSubTypes(), normalProps.remove(subTypeProperty)); - properties.put(subTypeProperty, this.subTypeIdProperty); - } - - properties.putAll(normalProps); - - // If a filter is defined, look for inclusion and exclusion lists. - if (filter != null) { - - // Eliminated excluded properties if BeanFilter.excludeKeys is specified. - String[] includeKeys = filter.getProperties(); - String[] excludeKeys = filter.getExcludeProperties(); - if (excludeKeys != null) { - for (String k : excludeKeys) - properties.remove(k); - - // Only include specified properties if BeanFilter.includeKeys is specified. - // Note that the order must match includeKeys. - } else if (includeKeys != null) { - Map<String,BeanPropertyMeta<T>> properties2 = new LinkedHashMap<String,BeanPropertyMeta<T>>(); - for (String k : includeKeys) { - if (properties.containsKey(k)) - properties2.put(k, properties.get(k)); - } - properties = properties2; - } - } - - xmlMeta = new XmlBeanMeta<T>(this, null); - - // We return this through the Bean.keySet() interface, so make sure it's not modifiable. - properties = Collections.unmodifiableMap(properties); - - } catch (BeanRuntimeException e) { - throw e; - } catch (Exception e) { - return "Exception: " + StringUtils.getStackTrace(e); - } - - return null; - } - - /** - * Returns the subtype ID property of this bean if it has one. - * <p> - * The subtype id is specified using the {@link Bean#subTypeProperty()} annotation. - * - * @return The meta property for the sub type property, or <jk>null</jk> if no subtype is defined for this bean. - */ - public BeanPropertyMeta<T> getSubTypeIdProperty() { - return subTypeIdProperty; - } - - /** - * Returns <jk>true</jk> if this bean has subtypes associated with it. - * Subtypes are defined using the {@link Bean#subTypes()} annotation. - * - * @return <jk>true</jk> if this bean has subtypes associated with it. - */ - public boolean isSubTyped() { - return subTypeIdProperty != null; - } - - /** - * Returns <jk>true</jk> if one of the properties on this bean is annotated with {@link BeanProperty#beanUri()} as <jk>true</jk> - * - * @return <jk>true</jk> if this bean has subtypes associated with it. <jk>true</jk> if there is a URI property associated with this bean. - */ - public boolean hasBeanUriProperty() { - return uriProperty != null; - } - - /** - * Returns the bean property marked as the URI for the bean (annotated with {@link BeanProperty#beanUri()} as <jk>true</jk>). - * - * @return The URI property, or <jk>null</jk> if no URI property exists on this bean. - */ - public BeanPropertyMeta<T> getBeanUriProperty() { - return uriProperty; - } - - /* - * Temporary getter/setter method struct. - */ - private static class BeanMethod { - String propertyName; - boolean isSetter; - Method method; - Class<?> type; - - BeanMethod(String propertyName, boolean isSetter, Method method) { - this.propertyName = propertyName; - this.isSetter = isSetter; - this.method = method; - if (isSetter) - this.type = method.getParameterTypes()[0]; - else - this.type = method.getReturnType(); - } - - /* - * Returns true if this method matches the class type of the specified property. - * Only meant to be used for setters. - */ - boolean matchesPropertyType(BeanPropertyMeta<?> b) { - if (b == null) - return false; - - // Get the bean property type from the getter/field. - Class<?> pt = null; - if (b.getGetter() != null) - pt = b.getGetter().getReturnType(); - else if (b.getField() != null) - pt = b.getField().getType(); - - // Doesn't match if no getter/field defined. - if (pt == null) - return false; - - // Doesn't match if not same type or super type as getter/field. - if (! isParentClass(type, pt)) - return false; - - // If a setter was previously set, only use this setter if it's a closer - // match (e.g. prev type is a superclass of this type). - if (b.getSetter() == null) - return true; - - Class<?> prevType = b.getSetter().getParameterTypes()[0]; - return isParentClass(prevType, type, true); - } - - @Override /* Object */ - public String toString() { - return method.toString(); - } - } - - /* - * Find all the bean methods on this class. - * - * @param c The filtered class. - * @param stopClass Don't look above this class in the hierarchy. - * @param v The minimum method visibility. - * @param fixedBeanProps Only include methods whose properties are in this list. - * @param pn Use this property namer to determine property names from the method names. - */ - private static List<BeanMethod> findBeanMethods(Class<?> c, Class<?> stopClass, Visibility v, Set<String> fixedBeanProps, PropertyNamer pn) { - List<BeanMethod> l = new LinkedList<BeanMethod>(); - - for (Class<?> c2 : findClasses(c, stopClass)) { - for (Method m : c2.getDeclaredMethods()) { - int mod = m.getModifiers(); - if (Modifier.isStatic(mod) || Modifier.isTransient(mod)) - continue; - if (m.isAnnotationPresent(BeanIgnore.class)) - continue; - if (m.isBridge()) // This eliminates methods with covariant return types from parent classes on child classes. - continue; - if (! (v.isVisible(m) || m.isAnnotationPresent(BeanProperty.class))) - continue; - String n = m.getName(); - Class<?>[] pt = m.getParameterTypes(); - Class<?> rt = m.getReturnType(); - boolean isGetter = false, isSetter = false; - if (pt.length == 1 && n.startsWith("set") && (isParentClass(rt, c) || rt.equals(Void.TYPE))) { - isSetter = true; - n = n.substring(3); - } else if (pt.length == 0 && n.startsWith("get") && (! rt.equals(Void.TYPE))) { - isGetter = true; - n = n.substring(3); - } else if (pt.length == 0 && n.startsWith("is") && (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) { - isGetter = true; - n = n.substring(2); - } - n = pn.getPropertyName(n); - if (isGetter || isSetter) { - BeanProperty bp = m.getAnnotation(BeanProperty.class); - if (bp != null && ! bp.name().equals("")) { - n = bp.name(); - if (! fixedBeanProps.isEmpty()) - if (! fixedBeanProps.contains(n)) - throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", n); - } - l.add(new BeanMethod(n, isSetter, m)); - } - } - } - return l; - } - - private static Collection<Field> findBeanFields(Class<?> c, Class<?> stopClass, Visibility v) { - List<Field> l = new LinkedList<Field>(); - for (Class<?> c2 : findClasses(c, stopClass)) { - for (Field f : c2.getDeclaredFields()) { - int m = f.getModifiers(); - if (Modifier.isStatic(m) || Modifier.isTransient(m)) - continue; - if (f.isAnnotationPresent(BeanIgnore.class)) - continue; - if (! (v.isVisible(f) || f.isAnnotationPresent(BeanProperty.class))) - continue; - l.add(f); - } - } - return l; - } - - private static List<Class<?>> findClasses(Class<?> c, Class<?> stopClass) { - LinkedList<Class<?>> l = new LinkedList<Class<?>>(); - findClasses(c, l, stopClass); - return l; - } - - private static void findClasses(Class<?> c, LinkedList<Class<?>> l, Class<?> stopClass) { - while (c != null && stopClass != c) { - l.addFirst(c); - for (Class<?> ci : c.getInterfaces()) - findClasses(ci, l, stopClass); - c = c.getSuperclass(); - } - } - - /** - * Returns the metadata on all properties associated with this bean. - * - * @return Metadata on all properties associated with this bean. - */ - public Collection<BeanPropertyMeta<T>> getPropertyMetas() { - return this.properties.values(); - } - - /** - * Returns the metadata on the specified list of properties. - * - * @param pNames The list of properties to retrieve. If <jk>null</jk>, returns all properties. - * @return The metadata on the specified list of properties. - */ - public Collection<BeanPropertyMeta<T>> getPropertyMetas(final String...pNames) { - if (pNames == null) - return getPropertyMetas(); - List<BeanPropertyMeta<T>> l = new ArrayList<BeanPropertyMeta<T>>(pNames.length); - for (int i = 0; i < pNames.length; i++) - l.add(getPropertyMeta(pNames[i])); - return l; - } - - /** - * Returns XML related metadata for this bean type. - * - * @return The XML metadata for this bean type. - */ - public XmlBeanMeta<T> getXmlMeta() { - return xmlMeta; - } - - /** - * Returns metadata about the specified property. - * - * @param name The name of the property on this bean. - * @return The metadata about the property, or <jk>null</jk> if no such property exists - * on this bean. - */ - public BeanPropertyMeta<T> getPropertyMeta(String name) { - return this.properties.get(name); - } - - /** - * Creates a new instance of this bean. - * - * @param outer The outer object if bean class is a non-static inner member class. - * @return A new instance of this bean if possible, or <jk>null</jk> if not. - * @throws IllegalArgumentException Thrown by constructor. - * @throws InstantiationException Thrown by constructor. - * @throws IllegalAccessException Thrown by constructor. - * @throws InvocationTargetException Thrown by constructor. - */ - @SuppressWarnings("unchecked") - protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { - if (classMeta.isMemberClass) { - if (constructor != null) - return constructor.newInstance(outer); - } else { - if (constructor != null) - return constructor.newInstance((Object[])null); - InvocationHandler h = classMeta.getProxyInvocationHandler(); - if (h != null) { - ClassLoader cl = classMeta.beanContext.classLoader; - if (cl == null) - cl = this.getClass().getClassLoader(); - return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h); - } - } - return null; - } - - /* - * Returns the property name of the specified field if it's a valid property. - * Returns null if the field isn't a valid property. - */ - private String findPropertyName(Field f, Set<String> fixedBeanProps) { - BeanProperty bp = f.getAnnotation(BeanProperty.class); - if (bp != null && ! bp.name().equals("")) { - String name = bp.name(); - if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name)) - return name; - throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", name); - } - String name = propertyNamer.getPropertyName(f.getName()); - if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name)) - return name; - return null; - } - - /** - * Recursively determines the classes represented by parameterized types in the class hierarchy of - * the specified type, and puts the results in the specified map.<br> - * <p> - * For example, given the following classes... - * <p class='bcode'> - * public static class BeanA<T> { - * public T x; - * } - * public static class BeanB extends BeanA<Integer>} {...} - * <p> - * ...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating - * that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}: - * <p class='bcode'> - * {BeanA.class:[Integer.class]} - * <p> - * TODO: This code doesn't currently properly handle the following situation: - * <p class='bcode'> - * public static class BeanB<T extends Number> extends BeanA<T>; - * public static class BeanC extends BeanB<Integer>; - * <p> - * When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<br> - * If anyone can figure out a better way of doing this, please do so! - * - * @param t The type we're recursing. - * @param m Where the results are loaded. - */ - private static void findTypeVarImpls(Type t, Map<Class<?>,Class<?>[]> m) { - if (t instanceof Class) { - Class<?> c = (Class<?>)t; - findTypeVarImpls(c.getGenericSuperclass(), m); - for (Type ci : c.getGenericInterfaces()) - findTypeVarImpls(ci, m); - } else if (t instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType)t; - Type rt = pt.getRawType(); - if (rt instanceof Class) { - Type[] gImpls = pt.getActualTypeArguments(); - Class<?>[] gTypes = new Class[gImpls.length]; - for (int i = 0; i < gImpls.length; i++) { - Type gt = gImpls[i]; - if (gt instanceof Class) - gTypes[i] = (Class<?>)gt; - else if (gt instanceof TypeVariable) { - TypeVariable<?> tv = (TypeVariable<?>)gt; - for (Type upperBound : tv.getBounds()) - if (upperBound instanceof Class) - gTypes[i] = (Class<?>)upperBound; - } - } - m.put((Class<?>)rt, gTypes); - findTypeVarImpls(pt.getRawType(), m); - } - } - } - - /* - * Bean property for getting and setting bean subtype. - */ - @SuppressWarnings({"rawtypes","unchecked"}) - private class SubTypePropertyMeta extends BeanPropertyMeta<T> { - - private Map<Class<?>,String> subTypes; - private BeanPropertyMeta<T> realProperty; // Bean property if bean actually has a real subtype field. - - SubTypePropertyMeta(String subTypeAttr, Map<Class<?>,String> subTypes, BeanPropertyMeta<T> realProperty) { - super(BeanMeta.this, subTypeAttr, ctx.string()); - this.subTypes = subTypes; - this.realProperty = realProperty; - this.htmlMeta = new HtmlBeanPropertyMeta<T>(this); - this.xmlMeta = new XmlBeanPropertyMeta<T>(this); - this.rdfMeta = new RdfBeanPropertyMeta<T>(this); - } - - /* - * Setting this bean property causes the inner bean to be set to the subtype implementation. - */ - @Override /* BeanPropertyMeta */ - public Object set(BeanMap<T> m, Object value) throws BeanRuntimeException { - if (value == null) - throw new BeanRuntimeException("Attempting to set bean subtype property to null."); - String subTypeId = value.toString(); - for (Entry<Class<?>,String> e : subTypes.entrySet()) { - if (e.getValue().equals(subTypeId)) { - Class subTypeClass = e.getKey(); - m.meta = ctx.getBeanMeta(subTypeClass); - try { - m.bean = (T)subTypeClass.newInstance(); - if (realProperty != null) - realProperty.set(m, value); - // If subtype attribute wasn't specified first, set them again from the temporary cache. - if (m.propertyCache != null) - for (Map.Entry<String,Object> me : m.propertyCache.entrySet()) - m.put(me.getKey(), me.getValue()); - } catch (Exception e1) { - throw new BeanRuntimeException(e1); - } - return null; - } - } - throw new BeanRuntimeException(c, "Unknown subtype ID ''{0}''", subTypeId); - } - - @Override /* BeanPropertyMeta */ - public Object get(BeanMap<T> m) throws BeanRuntimeException { - String subTypeId = filter.getSubTypes().get(c); - if (subTypeId == null) - throw new BeanRuntimeException(c, "Unmapped sub type class"); - return subTypeId; - } - } - - @Override /* Object */ - public String toString() { - StringBuilder sb = new StringBuilder(c.getName()); - sb.append(" {\n"); - for (BeanPropertyMeta<?> pm : this.properties.values()) - sb.append("\t").append(pm.toString()).append(",\n"); - sb.append("}"); - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class deleted file mode 100755 index 6f63839..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java deleted file mode 100755 index 9effae3..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanMetaFiltered.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved. - * - * The source code for this program is not published or otherwise - * divested of its trade secrets, irrespective of what has been - * deposited with the U.S. Copyright Office. - *******************************************************************************/ -package com.ibm.juno.core; - -import java.util.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.xml.*; - -/** - * Sames as {@link BeanMeta}, except the list of bean properties are limited - * by a {@link BeanProperty#properties()} annotation. - * - * @param <T> The class type that this metadata applies to. - * @author James Bognar ([email protected]) - */ -public final class BeanMetaFiltered<T> extends BeanMeta<T> { - - private final BeanMeta<T> innerMeta; - - /** - * Wrapper constructor. - * - * @param innerMeta The unfiltered bean meta of the bean property. - * @param pNames The list of filtered property names. - */ - public BeanMetaFiltered(BeanMeta<T> innerMeta, String[] pNames) { - this.innerMeta = innerMeta; - this.properties = new LinkedHashMap<String,BeanPropertyMeta<T>>(); - for (String p : pNames) - properties.put(p, innerMeta.getPropertyMeta(p)); - this.xmlMeta = new XmlBeanMeta<T>(innerMeta, pNames); - } - - /** - * Wrapper constructor. - * - * @param innerMeta The unfiltered bean meta of the bean property. - * @param pNames The list of filtered property names. - */ - public BeanMetaFiltered(BeanMeta<T> innerMeta, Collection<String> pNames) { - this(innerMeta, pNames.toArray(new String[pNames.size()])); - } - - @Override /* Delagate */ - public ClassMeta<T> getClassMeta() { - return innerMeta.classMeta; - } - - @Override /* BeanMeta */ - public Collection<BeanPropertyMeta<T>> getPropertyMetas() { - return properties.values(); - } - - @Override /* BeanMeta */ - public BeanPropertyMeta<T> getPropertyMeta(String name) { - return properties.get(name); - } - - @Override /* Object */ - public String toString() { - return innerMeta.c.getName(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class deleted file mode 100755 index d55611b..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.class and /dev/null differ
