http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class deleted file mode 100755 index 83e5d83..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$3.class and /dev/null differ
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class deleted file mode 100755 index df35a60..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$4.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class deleted file mode 100755 index 5a154d2..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$5.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class deleted file mode 100755 index a151fc3..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$6.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class deleted file mode 100755 index a09f698..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$7.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class deleted file mode 100755 index 3e26446..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$8.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class deleted file mode 100755 index 442972d..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean$9.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class deleted file mode 100755 index c7034a5..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/PrimitiveObjectsBean.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class deleted file mode 100755 index 7ce45da..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI$TestURIb.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class b/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class deleted file mode 100755 index cc1ea6d..0000000 Binary files a/com.ibm.team.juno.releng/bin/core.test/com/ibm/juno/testbeans/TestURI.class and /dev/null differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF b/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF old mode 100755 new mode 100644 index 99e8745..1196f32 --- a/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF +++ b/com.ibm.team.juno.releng/bin/core/META-INF/MANIFEST.MF @@ -1,26 +1,27 @@ Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.8.3 -Created-By: pwa6470_27sr1-20140411_01 (SR1) (IBM Corporation) +Ant-Version: Apache Ant 1.9.6 +Created-By: 1.8.0_77-b03 (Oracle Corporation) Bundle-ManifestVersion: 2 -Bundle-Name: Juno Cloud API - Core -Bundle-SymbolicName: com.ibm.team.juno -Bundle-Version: 5.2.0.0 +Bundle-Name: Juneau Cloud Tools - Core +Bundle-SymbolicName: org.apache.juneau +Bundle-Version: 6.0.0 Bundle-Vendor: IBM DynamicImport-Package: com.hp.hpl.jena.rdf.model,com.hp.hpl.jena.share d -Export-Package: com.ibm.juno.core,com.ibm.juno.core.annotation,com.ibm - .juno.core.csv,com.ibm.juno.core.dto,com.ibm.juno.core.dto.atom,com.i - bm.juno.core.dto.cognos,com.ibm.juno.core.dto.jsonschema,com.ibm.juno - .core.encoders,com.ibm.juno.core.filter,com.ibm.juno.core.filters,com - .ibm.juno.core.html,com.ibm.juno.core.html.annotation,com.ibm.juno.co - re.html.dto,com.ibm.juno.core.ini,com.ibm.juno.core.jena,com.ibm.juno - .core.jena.annotation,com.ibm.juno.core.jso,com.ibm.juno.core.json,co - m.ibm.juno.core.json.annotation,com.ibm.juno.core.parser,com.ibm.juno - .core.plaintext,com.ibm.juno.core.serializer,com.ibm.juno.core.soap,c - om.ibm.juno.core.urlencoding,com.ibm.juno.core.urlencoding.annotation - ,com.ibm.juno.core.utils,com.ibm.juno.core.xml,com.ibm.juno.core.xml. - annotation +Export-Package: org.apache.juneau,org.apache.juneau.annotation,org.apa + che.juneau.csv,org.apache.juneau.dto,org.apache.juneau.dto.atom,org.a + pache.juneau.dto.cognos,org.apache.juneau.dto.jsonschema,org.apache.j + uneau.encoders,org.apache.juneau.html,org.apache.juneau.html.annotati + on,org.apache.juneau.html.dto,org.apache.juneau.ini,org.apache.juneau + .internal,org.apache.juneau.jena,org.apache.juneau.jena.annotation,or + g.apache.juneau.jso,org.apache.juneau.json,org.apache.juneau.json.ann + otation,org.apache.juneau.msgpack,org.apache.juneau.parser,org.apache + .juneau.plaintext,org.apache.juneau.serializer,org.apache.juneau.soap + ,org.apache.juneau.svl,org.apache.juneau.svl.vars,org.apache.juneau.t + ransform,org.apache.juneau.transforms,org.apache.juneau.urlencoding,o + rg.apache.juneau.urlencoding.annotation,org.apache.juneau.utils,org.a + pache.juneau.xml,org.apache.juneau.xml.annotation Bundle-RequiredExecutionEnvironment: JavaSE-1.6 -Built-By: jbognar -Build-Date: December 30 2015 +Built-By: james.bognar +Build-Date: July 24 2016 http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.class deleted file mode 100755 index 813762c..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.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/BeanContext.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java deleted file mode 100755 index 7030b8b..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContext.java +++ /dev/null @@ -1,1804 +0,0 @@ -/******************************************************************************* - * Licensed Materials - Property of IBM - * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved. - * - * Note to U.S. Government Users Restricted Rights: Use, - * duplication or disclosure restricted by GSA ADP Schedule - * Contract with IBM Corp. - *******************************************************************************/ -package com.ibm.juno.core; - -import static com.ibm.juno.core.utils.ClassUtils.*; -import static com.ibm.juno.core.utils.ThrowableUtils.*; - -import java.lang.reflect.*; -import java.text.*; -import java.util.*; -import java.util.concurrent.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.filter.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; -import com.ibm.juno.core.utils.*; - -/** - * Core class of the Juno architecture. - * <p> - * This class servers multiple purposes: - * <ul> - * <li>Provides the ability to wrap beans inside {@link Map} interfaces. - * <li>Serves as a repository for metadata on POJOs, such as associated {@link Filter filters}, {@link PropertyNamer property namers}, etc... - * which are used to tailor how POJOs are serialized and parsed. - * <li>Serves as a common utility class for all {@link Serializer Serializers} and {@link Parser Parsers} - * for serializing and parsing Java beans. - * </ul> - * - * - * <h5 class='topic'>Bean Contexts</h5> - * <p> - * Typically, it will be sufficient to use the existing {@link #DEFAULT} contexts for creating - * bean maps. However, if you want to tweak any of the settings on the context, you must - * either clone the default context or create a new one from scratch (whichever is simpler for you). - * You'll notice that this context class uses a fluent interface for defining settings. - * <p> - * Bean context factories can be locked using the {@link BeanContextFactory#lock()} method. This makes the context settings - * read-only. Attempting to change a setting on a locked context will cause a {@link LockedException} - * to be thrown. The default context is locked by default. Cloning a locked context using the - * {@link #clone()} method produces a new unlocked context. Locking a context is optional, although - * it can prevent errors where bean contexts, parsers, or serializers start behaving differently - * because a setting was changed. As a general rule, if you want to change a setting on an existing - * context, you should clone it, modify the setting(s), and then lock the new context. - * - * - * <h5 class='topic'>BeanContext settings</h5> - * <code>BeanContexts</code> have several settings that can be used to tweak behavior on how beans are handled. - * <p> - * Some settings (e.g. {@link BeanContextProperties#BEAN_beansRequireDefaultConstructor}) are used to differentiate between bean and non-bean classes. - * Attempting to create a bean map around one of these objects will throw a {@link BeanRuntimeException}. - * The purpose for this behavior is so that the serializers can identify these non-bean classes and convert them to plain strings using the {@link Object#toString()} method. - * <p> - * Some settings (e.g. {@link BeanContextProperties#BEAN_beanFieldVisibility}) are used to determine what kinds of properties are detected on beans. - * <p> - * Some settings (e.g. {@link BeanContextProperties#BEAN_beanMapPutReturnsOldValue}) change the runtime behavior of bean maps. - * - * - * <h6 class='topic'>Configurable properties</h6> - * This class has configurable properties that can be set through the {@link BeanContextFactory#setProperty(String, Object)} method. - * <p> - * See {@link BeanContextProperties} for settings applicable to this class. - * - * - * <h6 class='topic'>Examples</h6> - * <p class='bcode'> - * <jc>// Construct a context from scratch.</jc> - * BeanContext beanContext = <jk>new</jk> BeanContextFactory() - * .setProperty(BeanContextProperties.<jsf>BEAN_beansRequireDefaultConstructor</jsf>, <jk>true</jk>) - * .addNotBeanClasses(Foo.<jk>class</jk>) - * .getBeanContext(); - * - * <jc>// Clone an existing context factory.</jc> - * BeanContext beanContext = otherBeanContextFactory.clone() - * .setProperty(BeanContextProperties.<jsf>BEAN_beansRequireDefaultConstructor</jsf>, <jk>true</jk>) - * .addNotBeanClasses(Foo.<jk>class</jk>) - * .getBeanContext(); - * </p> - * - * - * <h5 class='topic'>Bean Maps</h5> - * <p> - * {@link BeanMap BeanMaps} are wrappers around Java beans that allow properties to be retrieved and - * set using the common {@link Map#put(Object,Object)} and {@link Map#get(Object)} methods.<br> - * <br> - * Bean maps are created in two ways... - * <ol> - * <li> {@link BeanContext#forBean(Object) BeanContext.forBean()} - Wraps an existing bean inside a {@code Map} wrapper. - * <li> {@link BeanContext#newBeanMap(Class) BeanContext.newInstance()} - Create a new bean instance wrapped in a {@code Map} wrapper. - * </ol> - * - * - * <h6 class='topic'>Examples</h6> - * <p class='bcode'> - * <jc>// A sample bean class</jc> - * <jk>public class</jk> Person { - * <jk>public</jk> String getName(); - * <jk>public void</jk> setName(String name); - * <jk>public int</jk> getAge(); - * <jk>public void</jk> setAge(<jk>int</jk> age); - * } - * - * <jc>// Wrap an existing bean in a new bean map</jc> - * BeanMap<Person> m1 = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> Person()); - * m1.put(<js>"name"</js>, <js>"John Smith"</js>); - * m1.put(<js>"age"</js>, 45); - * - * <jc>// Create a new bean instance wrapped in a new bean map</jc> - * BeanMap<Person> m2 = BeanContext.<jsf>DEFAULT</jsf>.newInstance(Person.<jk>class</jk>); - * m2.put(<js>"name"</js>, <js>"John Smith"</js>); - * m2.put(<js>"age"</js>, 45); - * Person p = m2.getBean(); <jc>// Get the bean instance that was created.</jc> - * </p> - * - * - * <h5 class='topic'>Bean Annotations</h5> - * <p> - * This package contains annotations that can be applied to - * class definitions to override what properties are detected on a bean. - * <h6 class='topic'>Examples</h6> - * <p class='bcode'> - * <jc>// Bean class definition where only property 'name' is detected.</jc> - * <ja>@Bean</ja>(properties={<js>"name"</js>}) - * <jk>public class</jk> Person { - * <jk>public</jk> String getName(); - * <jk>public void</jk> setName(String name); - * <jk>public int</jk> getAge(); - * <jk>public void</jk> setAge(<jk>int</jk> age); - * } - * <p> - * See {@link Bean @Bean} and {@link BeanProperty @BeanProperty} for more information. - * - * - * <h5 class='topic'>Beans with read-only properties</h5> - * <p> - * Bean maps can also be defined on top of beans with read-only properties by adding a - * {@link BeanConstructor @BeanConstructor} annotation to one of the constructors on the - * bean class. This will allow read-only properties to be set through constructor arguments. - * <p> - * When the <code>@BeanConstructor</code> annotation is present, bean instantiation is delayed until the call to {@link BeanMap#getBean()}. - * Until then, bean property values are stored in a local cache until <code>getBean()</code> is called. - * Because of this additional caching step, parsing into read-only beans tends to be slower and use - * more memory than parsing into beans with writable properties. - * <p> - * Attempting to call {@link BeanMap#put(String,Object)} on a read-only property after calling {@link BeanMap#getBean()} - * will result in a {@link BeanRuntimeException} being thrown. - * Multiple calls to {@link BeanMap#getBean()} will return the same bean instance. - * <p> - * Beans can be defined with a combination of read-only and read-write properties. - * <p> - * See {@link BeanConstructor @BeanConstructor} for more information. - * - * - * <h5 class='topic'>Filters</h5> - * <p> - * {@link Filter Filters} are used to tailor how beans and non-beans are handled.<br> - * There are two subclasses of filters: - * <ol> - * <li>{@link BeanFilter} - Allows you to tailor handling of bean classes. - * This class can be considered a programmatic equivalent to the {@link Bean} annotation when - * annotating classes are not possible (e.g. you don't have access to the source). - * <li>{@link PojoFilter} - Allows you to convert objects to serializable forms. - * </ol> - * <p> - * See {@link com.ibm.juno.core.filter} for more information. - * - * - * <h5 class='topic'>ClassMetas</h5> - * <p> - * The {@link ClassMeta} class is a wrapper around {@link Class} object that provides cached information - * about that class (e.g. whether it's a {@link Map} or {@link Collection} or bean). - * <p> - * As a general rule, it's best to reuse bean contexts (and therefore serializers and parsers too) - * whenever possible since it takes some time to populate the internal {@code ClassMeta} object cache. - * By reusing bean contexts, the class type metadata only needs to be calculated once which significantly - * improves performance. - * <p> - * See {@link ClassMeta} for more information. - * - * @author Barry M. Caceres - * @author James Bognar ([email protected]) - */ -@SuppressWarnings({"unchecked","rawtypes"}) -public final class BeanContext { - - // Cache of all instances of classMetaCache for all bean contexts keyed by - // the hashcode of the bean context during creation. - // TODO - Convert these to soft references. - private static final ConcurrentHashMap<BeanContext,Map<Class,ClassMeta>> cmCacheCache = new ConcurrentHashMap<BeanContext,Map<Class,ClassMeta>>(); - - /** Default context. All default settings. */ - public static final BeanContext DEFAULT = new BeanContextFactory().getBeanContext(); - - final boolean - beansRequireDefaultConstructor, - beansRequireSerializable, - beansRequireSettersForGetters, - beansRequireSomeProperties, - beanMapPutReturnsOldValue, - useInterfaceProxies, - ignoreUnknownBeanProperties, - ignoreUnknownNullBeanProperties, - ignorePropertiesWithoutSetters, - ignoreInvocationExceptionsOnGetters, - ignoreInvocationExceptionsOnSetters, - useJavaBeanIntrospector; - - final Visibility - beanConstructorVisibility, - beanClassVisibility, - beanMethodVisibility, - beanFieldVisibility; - - final int b; - final BeanFilter[] beanFilters; - final PojoFilter[] pojoFilters; - final Class[] notBeanClasses; - final String[] notBeanPackages; - final Map<Class<?>,Class<?>> implClasses = new TreeMap<Class<?>, Class<?>>(new ClassComparator()); - final Map<String,String> uriVars = new TreeMap<String,String>(); - final Class[] implKeyClasses, implValueClasses; - final String[] uriKeys, uriVals; - final Map<Class,ClassMeta> cmCache; - final ClassMeta<Object> cmObject; // Reusable ClassMeta that represents general Objects. - final ClassMeta<String> cmString; // Reusable ClassMeta that represents general Strings. - final String[] notBeanPackageNames, notBeanPackagePrefixes; - final int hashCode; - final ClassLoader classLoader; - - // Optional default parser set by setDefaultParser(). - final ReaderParser defaultParser; - - // Holds pending ClassMetas (created, but not yet initialized). - final Deque<ClassMeta> pendingClassMetas = new LinkedList<ClassMeta>(); - - - BeanContext(BeanContextFactory bc) { - beansRequireDefaultConstructor = bc.beansRequireDefaultConstructor; - beansRequireSerializable = bc.beansRequireSerializable; - beansRequireSettersForGetters = bc.beansRequireSettersForGetters; - beansRequireSomeProperties = bc.beansRequireSomeProperties; - beanMapPutReturnsOldValue = bc.beanMapPutReturnsOldValue; - useInterfaceProxies = bc.useInterfaceProxies; - ignoreUnknownBeanProperties = bc.ignoreUnknownBeanProperties; - ignoreUnknownNullBeanProperties = bc.ignoreUnknownNullBeanProperties; - ignorePropertiesWithoutSetters = bc.ignorePropertiesWithoutSetters; - ignoreInvocationExceptionsOnGetters = bc.ignoreInvocationExceptionsOnGetters; - ignoreInvocationExceptionsOnSetters = bc.ignoreInvocationExceptionsOnSetters; - useJavaBeanIntrospector = bc.useJavaBeanIntrospector; - beanConstructorVisibility = bc.beanConstructorVisibility; - beanClassVisibility = bc.beanClassVisibility; - beanMethodVisibility = bc.beanMethodVisibility; - beanFieldVisibility = bc.beanFieldVisibility; - - b = - (beansRequireDefaultConstructor ? 1<<1 : 0) - + (beansRequireSerializable ? 1<<2 : 0) - + (beansRequireSettersForGetters ? 1<<3 : 0) - + (beansRequireSomeProperties ? 1<<4 : 0) - + (beanMapPutReturnsOldValue ? 1<<5 : 0) - + (useJavaBeanIntrospector ? 1<<6 : 0) - + (useInterfaceProxies ? 1<<8 : 0) - + (ignoreUnknownBeanProperties ? 1<<9 : 0) - + (ignoreUnknownNullBeanProperties ? 1<<10 : 0) - + (ignorePropertiesWithoutSetters ? 1<<11 : 0) - + (ignoreInvocationExceptionsOnGetters ? 1<<12 : 0) - + (ignoreInvocationExceptionsOnSetters ? 1<<13 : 0); - - LinkedList<BeanFilter> lbf = new LinkedList<BeanFilter>(); - LinkedList<PojoFilter> lpf = new LinkedList<PojoFilter>(); - for (Class<?> c : bc.filters) { - if (isParentClass(Filter.class, c)) { - try { - if (isParentClass(BeanFilter.class, c)) { - BeanFilter f = (BeanFilter)c.newInstance(); - f.setBeanContext(this); - lbf.add(f); - } else if (isParentClass(PojoFilter.class, c)) { - PojoFilter f = (PojoFilter)c.newInstance(); - f.setBeanContext(this); - lpf.add(f); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } else { - if (! c.getClass().isInterface()) { - List<SurrogateFilter<?,?>> l = SurrogateFilter.findFilters(c); - if (! l.isEmpty()) { - for (SurrogateFilter<?,?> f : l) { - f.setBeanContext(this); - lpf.add(f); - } - continue; - } - } - BeanFilter f = new InterfaceBeanFilter(c); - f.setBeanContext(this); - lbf.add(f); - } - } - beanFilters = lbf.toArray(new BeanFilter[0]); - pojoFilters = lpf.toArray(new PojoFilter[0]); - notBeanClasses = bc.notBeanClasses.toArray(new Class[0]); - notBeanPackages = bc.notBeanPackages.toArray(new String[0]); - implClasses.putAll(bc.implClasses); - uriVars.putAll(bc.uriVars); - implKeyClasses = implClasses.keySet().toArray(new Class[0]); - implValueClasses = implClasses.values().toArray(new Class[0]); - uriKeys = uriVars.keySet().toArray(new String[0]); - uriVals = uriVars.values().toArray(new String[0]); - - List<String> l1 = new LinkedList<String>(); - List<String> l2 = new LinkedList<String>(); - for (String s : notBeanPackages) { - if (s.endsWith(".*")) - l2.add(s.substring(0, s.length()-2)); - else - l1.add(s); - } - notBeanPackageNames = l1.toArray(new String[l1.size()]); - notBeanPackagePrefixes = l2.toArray(new String[l2.size()]); - - defaultParser = bc.defaultParser; - - int h = b; - for (BeanFilter f : beanFilters) - h = hash(h, f.hashCode()); - for (PojoFilter f : pojoFilters) - h = hash(h, f.hashCode()); - h = hash(h, beanConstructorVisibility.hashCode()); - h = hash(h, beanClassVisibility.hashCode()); - h = hash(h, beanMethodVisibility.hashCode()); - h = hash(h, beanFieldVisibility.hashCode()); - for (Class c : notBeanClasses) - h += c.hashCode(); - for (String s : notBeanPackages) - h += s.hashCode(); - for (Map.Entry<Class<?>,Class<?>> e : implClasses.entrySet()) { - h += e.getKey().hashCode(); - h += e.getValue().hashCode(); - } - for (Map.Entry<String,String> e : uriVars.entrySet()) { - h += e.getKey().hashCode(); - h += e.getValue().hashCode(); - } - hashCode = h; - - Map<Class,ClassMeta> cmc = cmCacheCache.get(this); - if (cmc == null) { - cmc = new ConcurrentHashMap<Class,ClassMeta>(); - cmc.put(Object.class, new ClassMeta(Object.class, this)); - cmc.put(String.class, new ClassMeta(String.class, this)); - Map<Class,ClassMeta> cmc2 = cmCacheCache.putIfAbsent(this, cmc); - cmc = (cmc2 == null ? cmc : cmc2); - } - cmCache = cmc; - cmObject = cmc.get(Object.class); - cmString = cmc.get(String.class); - - classLoader = bc.classLoader; - } - - /** - * Returns <jk>true</jk> if the specified bean context shares the same cache as this bean context. - * Useful for testing purposes. - * - * @param bc The bean context to compare to. - * @return <jk>true</jk> if the bean contexts have equivalent settings and thus share caches. - */ - public boolean hasSameCache(BeanContext bc) { - return bc.cmCache == this.cmCache; - } - - - /** - * Bean property getter: <property>ignoreUnknownBeanProperties</property>. - * See {@link BeanContextProperties#BEAN_ignoreUnknownBeanProperties}. - * - * @return The value of the <property>ignoreUnknownBeanProperties</property> property on this bean. - */ - public boolean isIgnoreUnknownBeanProperties() { - return ignoreUnknownBeanProperties; - } - - - /** - * Determines whether the specified class is ignored as a bean class based on the various - * exclusion parameters specified on this context class. - * - * @param c The class type being tested. - * @return <jk>true</jk> if the specified class matches any of the exclusion parameters. - */ - protected boolean isNotABean(Class<?> c) { - if (c.isArray() || c.isPrimitive() || c.isEnum() || c.isAnnotation()) - return true; - Package p = c.getPackage(); - if (p != null) { - for (String p2 : notBeanPackageNames) - if (p.getName().equals(p2)) - return true; - for (String p2 : notBeanPackagePrefixes) - if (p.getName().startsWith(p2)) - return true; - } - for (Class exclude : notBeanClasses) - if (isParentClass(exclude, c)) - return true; - return false; - } - - /** - * Prints meta cache statistics to <code>System.out</code>. - */ - protected static void dumpCacheStats() { - try { - int ctCount = 0; - for (Map<Class,ClassMeta> cm : cmCacheCache.values()) - ctCount += cm.size(); - System.out.println(MessageFormat.format("ClassMeta cache: {0} instances in {1} caches", ctCount, cmCacheCache.size())); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Wraps an object inside a {@link BeanMap} object (i.e. a modifiable {@link Map}). - * <p> - * If object is not a true bean, then throws a {@link BeanRuntimeException} with an explanation of why it's not a bean. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a bean map around a bean instance</jc> - * BeanMap<Person> bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> Person()); - * </p> - * </dd> - * </dl> - * - * @param <T> The class of the object being wrapped. - * @param o The object to wrap in a map interface. Must not be null. - * @return The wrapped object. - */ - public <T> BeanMap<T> forBean(T o) { - return this.forBean(o, (Class<T>)o.getClass()); - } - - /** - * Determines whether the specified object matches the requirements on this context of being a bean. - * - * @param o The object being tested. - * @return <jk>true</jk> if the specified object is considered a bean. - */ - public boolean isBean(Object o) { - if (o == null) - return false; - return isBean(o.getClass()); - } - - /** - * Determines whether the specified class matches the requirements on this context of being a bean. - * - * @param c The class being tested. - * @return <jk>true</jk> if the specified class is considered a bean. - */ - public boolean isBean(Class<?> c) { - return getBeanMeta(c) != null; - } - - /** - * Wraps an object inside a {@link BeanMap} object (i.e.: a modifiable {@link Map}) - * defined as a bean for one of its class, a super class, or an implemented interface. - * <p> - * If object is not a true bean, throws a {@link BeanRuntimeException} with an explanation of why it's not a bean. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a bean map for new bean using only properties defined in a superclass</jc> - * BeanMap<MySubBean> bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> MySubBean(), MySuperBean.<jk>class</jk>); - * - * <jc>// Construct a bean map for new bean using only properties defined in an interface</jc> - * BeanMap<MySubBean> bm = BeanContext.<jsf>DEFAULT</jsf>.forBean(<jk>new</jk> MySubBean(), MySuperInterface.<jk>class</jk>); - * </p> - * </dd> - * </dl> - * - * @param <T> The class of the object being wrapped. - * @param o The object to wrap in a bean interface. Must not be null. - * @param c The superclass to narrow the bean properties to. Must not be null. - * @return The bean representation, or <jk>null</jk> if the object is not a true bean. - * @throws NullPointerException If either parameter is null. - * @throws IllegalArgumentException If the specified object is not an an instance of the specified class. - * @throws BeanRuntimeException If specified object is not a bean according to the bean rules - * specified in this context class. - */ - public <T> BeanMap<T> forBean(T o, Class<? super T> c) throws BeanRuntimeException { - assertFieldNotNull(o, "o"); - assertFieldNotNull(c, "c"); - - if (! c.isInstance(o)) - illegalArg("The specified object is not an instance of the specified class. class=''{0}'', objectClass=''{1}'', object=''{2}''", c.getName(), o.getClass().getName(), 0); - - ClassMeta cm = getClassMeta(c); - - BeanMeta m = cm.getBeanMeta(); - if (m == null) - throw new BeanRuntimeException(c, "Class is not a bean. Reason=''{0}''", cm.getNotABeanReason()); - return new BeanMap<T>(o, m); - } - - /** - * Creates a new {@link BeanMap} object (i.e. a modifiable {@link Map}) of the given class with uninitialized property values. - * <p> - * If object is not a true bean, then throws a {@link BeanRuntimeException} with an explanation of why it's not a bean. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a new bean map wrapped around a new Person object</jc> - * BeanMap<Person> bm = BeanContext.<jsf>DEFAULT</jsf>.newBeanMap(Person.<jk>class</jk>); - * </p> - * </dd> - * </dl> - * - * @param <T> The class of the object being wrapped. - * @param c The name of the class to create a new instance of. - * @return A new instance of the class. - */ - public <T> BeanMap<T> newBeanMap(Class<T> c) { - return newBeanMap(null, c); - } - - /** - * Same as {@link #newBeanMap(Class)}, except used for instantiating inner member classes that must - * be instantiated within another class instance. - * - * @param <T> The class of the object being wrapped. - * @param c The name of the class to create a new instance of. - * @param outer If class is a member class, this is the instance of the containing class. - * Should be <jk>null</jk> if not a member class. - * @return A new instance of the class. - */ - public <T> BeanMap<T> newBeanMap(Object outer, Class<T> c) { - BeanMeta m = getBeanMeta(c); - if (m == null) - return null; - T bean = null; - if (m.constructorArgs.length == 0) { - bean = newBean(outer, c); - // Beans with subtypes won't be instantiated until the sub type property is specified. - if (bean == null && ! m.getClassMeta().hasSubTypes()) - return null; - } - return new BeanMap<T>(bean, m); - } - - /** - * Creates a new empty bean of the specified type, except used for instantiating inner member classes that must - * be instantiated within another class instance. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <p class='bcode'> - * <jc>// Construct a new instance of the specified bean class</jc> - * Person p = BeanContext.<jsf>DEFAULT</jsf>.newBean(Person.<jk>class</jk>); - * </p> - * </dd> - * </dl> - * - * @param <T> The class type of the bean being created. - * @param c The class type of the bean being created. - * @return A new bean object. - * @throws BeanRuntimeException If the specified class is not a valid bean. - */ - public <T> T newBean(Class<T> c) throws BeanRuntimeException { - return newBean(null, c); - } - - /** - * Same as {@link #newBean(Class)}, except used for instantiating inner member classes that must - * be instantiated within another class instance. - * - * @param <T> The class type of the bean being created. - * @param c The class type of the bean being created. - * @param outer If class is a member class, this is the instance of the containing class. - * Should be <jk>null</jk> if not a member class. - * @return A new bean object. - * @throws BeanRuntimeException If the specified class is not a valid bean. - */ - public <T> T newBean(Object outer, Class<T> c) throws BeanRuntimeException { - ClassMeta<T> cm = getClassMeta(c); - BeanMeta m = cm.getBeanMeta(); - if (m == null) - return null; - try { - T o = (T)m.newBean(outer); - if (o == null) { - // Beans with subtypes won't be instantiated until the sub type property is specified. - if (cm.beanFilter != null && cm.beanFilter.getSubTypeProperty() != null) - return null; - throw new BeanRuntimeException(c, "Class does not have a no-arg constructor."); - } - return o; - } catch (BeanRuntimeException e) { - throw e; - } catch (Exception e) { - throw new BeanRuntimeException(e); - } - } - - /** - * Returns the {@link BeanMeta} class for the specified class. - * - * @param <T> The class type to get the meta-data on. - * @param c The class to get the meta-data on. - * @return The {@link BeanMeta} for the specified class, or <jk>null</jk> if the class - * is not a bean per the settings on this context. - */ - public <T> BeanMeta<T> getBeanMeta(Class<T> c) { - if (c == null) - return null; - return getClassMeta(c).getBeanMeta(); - } - - /** - * Returns the class type bound to this bean context if the specified class type - * is from another bean context. - * <p> - * For example, this method allows you to pass in an object from <code>BeanContext.<jsf>DEFAULT</jsf>.getMapClassMeta(...)</code> - * to any of the <code>ReaderParser.parse(Reader, ClassMeta, ParserContext)</code> methods, and the parsers - * will use this method to replace the class type with the one registered with the parser. - * This ensures that registered filters are applied correctly. - * - * @param <T> The class type. - * @param cm The class type. - * @return The class type bound by this bean context. - */ - public <T> ClassMeta<T> normalizeClassMeta(ClassMeta<T> cm) { - if (cm == null) - return (ClassMeta<T>)object(); - if (cm.beanContext == this || cm.beanContext.equals(this)) - return cm; - if (cm.isMap()) { - ClassMeta<Map> cm2 = (ClassMeta<Map>)cm; - cm2 = getMapClassMeta(cm2.getInnerClass(), cm2.getKeyType().getClass(), cm2.getValueType().getClass()); - return (ClassMeta<T>)cm2; - } - if (cm.isCollection()) { - ClassMeta<Collection> cm2 = (ClassMeta<Collection>)cm; - cm2 = getCollectionClassMeta(cm2.getInnerClass(), cm2.getElementType().getClass()); - } - return getClassMeta(cm.getInnerClass()); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Class} object. - * - * @param <T> The class type being wrapped. - * @param c The class being wrapped. - * of type {@link Class} or {@link ClassMeta}. - * @return If the class is not an array, returns a cached {@link ClassMeta} object. - * Otherwise, returns a new {@link ClassMeta} object every time.<br> - */ - public <T> ClassMeta<T> getClassMeta(Class<T> c) { - - // If this is an array, then we want it wrapped in an uncached ClassMeta object. - // Note that if it has a pojo filter, we still want to cache it so that - // we can cache something like byte[] with ByteArrayBase64Filter. - if (c.isArray() && findPojoFilter(c) == null) - return new ClassMeta(c, this); - - ClassMeta<T> cm = cmCache.get(c); - if (cm == null) { - - synchronized (this) { - - // Make sure someone didn't already set it while this thread was blocked. - cm = cmCache.get(c); - if (cm == null) { - - // Note: Bean properties add the possibility that class reference loops exist. - // To handle this possibility, we create a set of pending ClassMetas, and - // call init (which finds the bean properties) after it's been added to the pending set. - for (ClassMeta pcm : pendingClassMetas) - if (pcm.innerClass == c) - return pcm; - - cm = new ClassMeta<T>(c, this, true); - pendingClassMetas.addLast(cm); - try { - cm.init(); - } finally { - pendingClassMetas.removeLast(); - } - cmCache.put(c, cm); - } - } - } - return cm; - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are OBJECT, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, ClassMeta<K> keyType, ClassMeta<V> valueType) { - if (keyType.isObject() && valueType.isObject()) - return getClassMeta(c); - return new ClassMeta(c, this).setKeyType(keyType).setValueType(valueType); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <K> The map key class type. - * @param <V> The map value class type. - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <K,V,T extends Map<K,V>> ClassMeta<T> getMapClassMeta(Class<T> c, Class<K> keyType, Class<V> valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Map} object. - * - * @param <T> The map class type. - * @param c The map class type. - * @param keyType The map key class type. - * @param valueType The map value class type. - * @return If the key and value types are Object, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <T extends Map> ClassMeta<T> getMapClassMeta(Class<T> c, Type keyType, Type valueType) { - return getMapClassMeta(c, getClassMeta(keyType), getClassMeta(valueType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <E> The collection element class type. - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, ClassMeta<E> elementType) { - if (elementType.isObject()) - return getClassMeta(c); - return new ClassMeta(c, this).setElementType(elementType); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <E> The collection element class type. - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <E,T extends Collection<E>> ClassMeta<T> getCollectionClassMeta(Class<T> c, Class<E> elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); - } - - /** - * Construct a {@code ClassMeta} wrapper around a {@link Collection} object. - * - * @param <T> The collection class type. - * @param c The collection class type. - * @param elementType The collection element class type. - * @return If the element type is <code>OBJECT</code>, returns a cached {@link ClassMeta} object.<br> - * Otherwise, returns a new {@link ClassMeta} object every time. - */ - public <T extends Collection> ClassMeta<T> getCollectionClassMeta(Class<T> c, Type elementType) { - return getCollectionClassMeta(c, getClassMeta(elementType)); - } - - /** - * Constructs a ClassMeta object given the specified object and parameters. - * - * @param o The parent class type. - * Can be any of the following types: - * <ul> - * <li>{@link ClassMeta} object, which just returns the same object. - * <li>{@link Class} object (e.g. <code>String.<jk>class</jk></code>). - * <li>{@link Type} object (e.g. {@link ParameterizedType} or {@link GenericArrayType}. - * <li>Anything else is interpreted as {@code getClassMeta(o.getClass(), parameters);} - * </ul> - * @return A ClassMeta object, or <jk>null</jk> if the object is null. - */ - public ClassMeta getClassMeta(Type o) { - return getClassMeta(o, null); - } - - ClassMeta getClassMeta(Type o, Map<Class<?>,Class<?>[]> typeVarImpls) { - if (o == null) - return null; - - if (o instanceof ClassMeta) - return (ClassMeta)o; - - Class c = null; - if (o instanceof Class) { - c = (Class)o; - } else if (o instanceof ParameterizedType) { - // A parameter (e.g. <String>. - c = (Class<?>)((ParameterizedType)o).getRawType(); - } else if (o instanceof GenericArrayType) { - // An array parameter (e.g. <byte[]>. - GenericArrayType gat = (GenericArrayType)o; - Type gatct = gat.getGenericComponentType(); - if (gatct instanceof Class) { - Class gatctc = (Class)gatct; - c = Array.newInstance(gatctc, 0).getClass(); - } else if (gatct instanceof ParameterizedType) { - Class gatctc = (Class<?>)((ParameterizedType)gatct).getRawType(); - c = Array.newInstance(gatctc, 0).getClass(); - } else { - return null; - } - } else if (o instanceof TypeVariable) { - if (typeVarImpls != null) { - TypeVariable t = (TypeVariable) o; - String varName = t.getName(); - int varIndex = -1; - Class gc = (Class)t.getGenericDeclaration(); - TypeVariable[] tv = gc.getTypeParameters(); - for (int i = 0; i < tv.length; i++) { - if (tv[i].getName().equals(varName)) { - varIndex = i; - } - } - if (varIndex != -1) { - - // If we couldn't find a type variable implementation, that means - // the type was defined at runtime (e.g. Bean b = new Bean<Foo>();) - // in which case the type is lost through erasure. - // Assume java.lang.Object as the type. - if (! typeVarImpls.containsKey(gc)) - return object(); - - return getClassMeta(typeVarImpls.get(gc)[varIndex]); - } - } - // We don't know the bounded type, so just resolve to Object. - return object(); - } else { - // This can happen when trying to resolve the "E getFirst()" method on LinkedList, whose type is a TypeVariable - // These should just resolve to Object. - return object(); - } - - ClassMeta rawType = getClassMeta(c); - - // If this is a Map or Collection, and the parameter types aren't part - // of the class definition itself (e.g. class AddressBook extends List<Person>), - // then we need to figure out the parameters. - if (rawType.isMap() || rawType.isCollection()) { - ClassMeta[] params = findParameters(o, c); - if (params == null) - return rawType; - if (rawType.isMap()) { - if (params.length != 2) - return rawType; - if (params[0].isObject() && params[1].isObject()) - return rawType; - return new ClassMeta(rawType.innerClass, this).setKeyType(params[0]).setValueType(params[1]); - } - if (rawType.isCollection()) { - if (params.length != 1) - return rawType; - if (params[0].isObject()) - return rawType; - return new ClassMeta(rawType.innerClass, this).setElementType(params[0]); - } - } - - return rawType; - } - - /** - * Given an array of {@link Class} objects, returns an array of corresponding {@link ClassMeta} objects. - * Constructs a new array on each call. - * - * @param classes The array of classes to get class metas for. - * @return An array of {@link ClassMeta} objects corresponding to the classes. Never <jk>null</jk>. - */ - public ClassMeta<?>[] getClassMetas(Class<?>[] classes) { - assertFieldNotNull(classes, "classes"); - ClassMeta<?>[] cm = new ClassMeta<?>[classes.length]; - for (int i = 0; i < classes.length; i++) - cm[i] = getClassMeta(classes[i]); - return cm; - } - - ClassMeta[] findParameters(Type o, Class c) { - if (o == null) - o = c; - - // Loop until we find a ParameterizedType - if (! (o instanceof ParameterizedType)) { - loop: do { - o = c.getGenericSuperclass(); - if (o instanceof ParameterizedType) - break loop; - for (Type t : c.getGenericInterfaces()) { - o = t; - if (o instanceof ParameterizedType) - break loop; - } - c = c.getSuperclass(); - } while (c != null); - } - - if (o instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType)o; - if (! pt.getRawType().equals(Enum.class)) { - List<ClassMeta<?>> l = new LinkedList<ClassMeta<?>>(); - for (Type pt2 : pt.getActualTypeArguments()) { - if (pt2 instanceof WildcardType || pt2 instanceof TypeVariable) - return null; - l.add(getClassMeta(pt2, null)); - } - if (l.isEmpty()) - return null; - return l.toArray(new ClassMeta[l.size()]); - } - } - - return null; - } - - /** - * Shortcut for calling {@code getClassMeta(o.getClass())}. - * - * @param <T> The class of the object being passed in. - * @param o The class to find the class type for. - * @return The ClassMeta object, or <jk>null</jk> if {@code o} is <jk>null</jk>. - */ - public <T> ClassMeta<T> getClassMetaForObject(T o) { - if (o == null) - return null; - return (ClassMeta<T>)getClassMeta(o.getClass()); - } - - - /** - * Used for determining the class type on a method or field where a {@code @BeanProperty} annotation - * may be present. - * - * @param <T> The class type we're wrapping. - * @param p The property annotation on the type if there is one. - * @param t The type. - * @param typeVarImpls Contains known resolved type parameters on the specified class so - * that we can result {@code ParameterizedTypes} and {@code TypeVariables}.<br> - * Can be <jk>null</jk> if the information is not known. - * @return The new {@code ClassMeta} object wrapped around the {@code Type} object. - */ - protected <T> ClassMeta<T> getClassMeta(BeanProperty p, Type t, Map<Class<?>,Class<?>[]> typeVarImpls) { - ClassMeta<T> cm = getClassMeta(t, typeVarImpls); - ClassMeta<T> cm2 = cm; - if (p != null) { - - if (p.type() != Object.class) - cm2 = getClassMeta(p.type(), typeVarImpls); - - if (cm2.isMap()) { - Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class, Object.class} : p.params()); - if (pParams.length != 2) - throw new RuntimeException("Invalid number of parameters specified for Map (must be 2): " + pParams.length); - ClassMeta<?> keyType = resolveType(pParams[0], cm2.getKeyType(), cm.getKeyType()); - ClassMeta<?> valueType = resolveType(pParams[1], cm2.getValueType(), cm.getValueType()); - if (keyType.isObject() && valueType.isObject()) - return cm2; - return new ClassMeta<T>(cm2.innerClass, this).setKeyType(keyType).setValueType(valueType); - } - - if (cm2.isCollection()) { - Class<?>[] pParams = (p.params().length == 0 ? new Class[]{Object.class} : p.params()); - if (pParams.length != 1) - throw new RuntimeException("Invalid number of parameters specified for Collection (must be 1): " + pParams.length); - ClassMeta<?> elementType = resolveType(pParams[0], cm2.getElementType(), cm.getElementType()); - if (elementType.isObject()) - return cm2; - return new ClassMeta<T>(cm2.innerClass, this).setElementType(elementType); - } - - return cm2; - } - - return cm; - } - - private ClassMeta<?> resolveType(Type...t) { - for (Type tt : t) { - if (tt != null) { - ClassMeta<?> cm = getClassMeta(tt); - if (tt != cmObject) - return cm; - } - } - return cmObject; - } - - /** - * Converts class name strings to ClassMeta objects. - * - * <dl> - * <dt>Example:</dt> - * <dd> - * <ul> - * <li>{@code java.lang.String} - * <li>{@code com.ibm.sample.MyBean[]} - * <li>{@code java.util.HashMap<java.lang.String,java.lang.Integer>} - * <li>{@code [Ljava.lang.String;} (i.e. the value of <code>String[].<jk>class</jk>.getName()</code> - * </ul> - * </dd> - * </dl> - * - * @param s The class name. - * @return The ClassMeta corresponding to the class name string. - */ - public ClassMeta<?> getClassMetaFromString(String s) { - int d = 0; - if (s == null || s.isEmpty()) - return null; - - // Check for Class.getName() on array class types. - if (s.charAt(0) == '[') { - try { - return getClassMeta(findClass(s)); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - int i1 = 0; - int i2 = 0; - int dim = 0; - List<ClassMeta<?>> p = null; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '<') { - if (d == 0) { - i1 = i; - i2 = i+1; - p = new LinkedList<ClassMeta<?>>(); - } - d++; - } else if (c == '>') { - d--; - if (d == 0 && p != null) - p.add(getClassMetaFromString(s.substring(i2, i))); - } else if (c == ',' && d == 1) { - if (p != null) - p.add(getClassMetaFromString(s.substring(i2, i))); - i2 = i+1; - } - if (c == '[') { - if (i1 == 0) - i1 = i; - dim++; - } - } - if (i1 == 0) - i1 = s.length(); - try { - String name = s.substring(0, i1).trim(); - char x = name.charAt(0); - Class<?> c = null; - if (x >= 'b' && x <= 's') { - if (x == 'b' && name.equals("boolean")) - c = boolean.class; - else if (x == 'b' && name.equals("byte")) - c = byte.class; - else if (x == 'c' && name.equals("char")) - c = char.class; - else if (x == 'd' && name.equals("double")) - c = double.class; - else if (x == 'i' && name.equals("int")) - c = int.class; - else if (x == 'l' && name.equals("long")) - c = long.class; - else if (x == 's' && name.equals("short")) - c = short.class; - else - c = findClass(name); - } else { - c = findClass(name); - } - - ClassMeta<?> cm = getClassMeta(c); - - if (p != null) { - if (cm.isMap()) - cm = new ClassMeta(c, this).setKeyType(p.get(0)).setValueType(p.get(1)); - if (cm.isCollection()) - cm = new ClassMeta(c, this).setElementType(p.get(0)); - } - - while (dim > 0) { - cm = new ClassMeta(Array.newInstance(cm.getInnerClass(), 0).getClass(), this); - dim--; - } - - return cm; - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - - private Class<?> findClass(String name) throws ClassNotFoundException { - return classLoader == null ? Class.forName(name) : Class.forName(name, true, classLoader); - } - - /** - * Returns the {@link PojoFilter} associated with the specified class, or <jk>null</jk> if there is no - * pojo filter associated with the class. - * - * @param <T> The class associated with the filter. - * @param c The class associated with the filter. - * @return The filter associated with the class, or null if there is no association. - */ - protected <T> PojoFilter findPojoFilter(Class<T> c) { - // Note: On first - if (c != null) - for (PojoFilter f : pojoFilters) - if (isParentClass(f.forClass(), c)) - return f; - return null; - } - - /** - * Checks whether a class has a {@link PojoFilter} associated with it in this bean context. - * @param c The class to check. - * @return <jk>true</jk> if the specified class or one of its subclasses has a {@link PojoFilter} associated with it. - */ - protected boolean hasChildPojoFilters(Class<?> c) { - if (c != null) - for (PojoFilter f : pojoFilters) - if (isParentClass(c, f.forClass())) - return true; - return false; - } - - /** - * Returns the {@link BeanFilter} associated with the specified class, or <jk>null</jk> if there is no - * bean filter associated with the class. - * - * @param <T> The class associated with the filter. - * @param c The class associated with the filter. - * @return The filter associated with the class, or null if there is no association. - */ - protected <T> BeanFilter findBeanFilter(Class<T> c) { - if (c != null) - for (BeanFilter f : beanFilters) - if (isParentClass(f.forClass(), c)) - return f; - return null; - } - - /** - * Gets the no-arg constructor for the specified class. - * - * @param <T> The class to check. - * @param c The class to check. - * @param v The minimum visibility for the constructor. - * @return The no arg constructor, or <jk>null</jk> if the class has no no-arg constructor. - */ - protected <T> Constructor<? extends T> getImplClassConstructor(Class<T> c, Visibility v) { - if (implClasses.isEmpty()) - return null; - Class cc = c; - while (cc != null) { - Class implClass = implClasses.get(cc); - if (implClass != null) - return ClassMeta.findNoArgConstructor(implClass, v); - for (Class ic : cc.getInterfaces()) { - implClass = implClasses.get(ic); - if (implClass != null) - return ClassMeta.findNoArgConstructor(implClass, v); - } - cc = cc.getSuperclass(); - } - return null; - } - - /** - * Converts the specified value to the specified class type. - * <p> - * See {@link #convertToType(Object, ClassMeta)} for the list of valid conversions. - * - * @param <T> The class type to convert the value to. - * @param value The value to convert. - * @param type The class type to convert the value to. - * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type. - * @return The converted value. - */ - public <T> T convertToType(Object value, Class<T> type) throws InvalidDataConversionException { - // Shortcut for most common case. - if (value != null && value.getClass() == type) - return (T)value; - return convertToType(null, value, getClassMeta(type)); - } - - /** - * Same as {@link #convertToType(Object, Class)}, except used for instantiating inner member classes that must - * be instantiated within another class instance. - * - * @param <T> The class type to convert the value to. - * @param outer If class is a member class, this is the instance of the containing class. - * Should be <jk>null</jk> if not a member class. - * @param value The value to convert. - * @param type The class type to convert the value to. - * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type. - * @return The converted value. - */ - public <T> T convertToType(Object outer, Object value, Class<T> type) throws InvalidDataConversionException { - return convertToType(outer, value, getClassMeta(type)); - } - - /** - * Returns a reusable {@link ClassMeta} representation for the class <code>Object</code>. - * <p> - * This <code>ClassMeta</code> is often used to represent "any object type" when an object type - * is not known. - * <p> - * This method is identical to calling <code>getClassMeta(Object.<jk>class</jk>)</code> but uses - * a cached copy to avoid a hashmap lookup. - * - * @return The {@link ClassMeta} object associated with the <code>Object</code> class. - */ - public ClassMeta<Object> object() { - return cmObject; - } - - /** - * Returns a reusable {@link ClassMeta} representation for the class <code>String</code>. - * <p> - * This <code>ClassMeta</code> is often used to represent key types in maps. - * <p> - * This method is identical to calling <code>getClassMeta(String.<jk>class</jk>)</code> but uses - * a cached copy to avoid a hashmap lookup. - * - * @return The {@link ClassMeta} object associated with the <code>String</code> class. - */ - public ClassMeta<String> string() { - return cmString; - } - - /** - * Casts the specified value into the specified type. - * <p> - * If the value isn't an instance of the specified type, then converts - * the value if possible.<br> - * <p> - * The following conversions are valid: - * <table class='styled'> - * <tr><th>Convert to type</th><th>Valid input value types</th><th>Notes</th></tr> - * <tr> - * <td> - * A class that is the normal type of a registered {@link PojoFilter}. - * </td> - * <td> - * A value whose class matches the filtered type of that registered {@link PojoFilter}. - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * A class that is the filtered type of a registered {@link PojoFilter}. - * </td> - * <td> - * A value whose class matches the normal type of that registered {@link PojoFilter}. - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * {@code Number} (e.g. {@code Integer}, {@code Short}, {@code Float},...)<br> - * <code>Number.<jsf>TYPE</jsf></code> (e.g. <code>Integer.<jsf>TYPE</jsf></code>, <code>Short.<jsf>TYPE</jsf></code>, <code>Float.<jsf>TYPE</jsf></code>,...) - * </td> - * <td> - * {@code Number}, {@code String}, <jk>null</jk> - * </td> - * <td> - * For primitive {@code TYPES}, <jk>null</jk> returns the JVM default value for that type. - * </td> - * </tr> - * <tr> - * <td> - * {@code Map} (e.g. {@code Map}, {@code HashMap}, {@code TreeMap}, {@code ObjectMap}) - * </td> - * <td> - * {@code Map} - * </td> - * <td> - * If {@code Map} is not constructible, a {@code ObjectMap} is created. - * </td> - * </tr> - * <tr> - * <td> - * {@code Collection} (e.g. {@code List}, {@code LinkedList}, {@code HashSet}, {@code ObjectList}) - * </td> - * <td> - * {@code Collection<Object>}<br> - * {@code Object[]} - * </td> - * <td> - * If {@code Collection} is not constructible, a {@code ObjectList} is created. - * </td> - * </tr> - * <tr> - * <td> - * {@code X[]} (array of any type X)<br> - * </td> - * <td> - * {@code List<X>}<br> - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * {@code X[][]} (multi-dimensional arrays)<br> - * </td> - * <td> - * {@code List<List<X>>}<br> - * {@code List<X[]>}<br> - * {@code List[]<X>}<br> - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * {@code Enum}<br> - * </td> - * <td> - * {@code String}<br> - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * Bean<br> - * </td> - * <td> - * {@code Map}<br> - * </td> - * <td> </td> - * </tr> - * <tr> - * <td> - * {@code String}<br> - * </td> - * <td> - * Anything<br> - * </td> - * <td> - * Arrays are converted to JSON arrays<br> - * </td> - * </tr> - * <tr> - * <td> - * Anything with one of the following methods:<br> - * <code><jk>public static</jk> T fromString(String)</code><br> - * <code><jk>public static</jk> T valueOf(String)</code><br> - * <code><jk>public<jk> T(String)</code><br> - * </td> - * <td> - * <code>String</code><br> - * </td> - * <td> - * <br> - * </td> - * </tr> - * </table> - * - * @param <T> The class type to convert the value to. - * @param value The value to be converted. - * @param type The target object type. - * @return The converted type. - * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type. - */ - public <T> T convertToType(Object value, ClassMeta<T> type) throws InvalidDataConversionException { - return convertToType(null, value, type); - } - - /** - * Same as {@link #convertToType(Object, ClassMeta)}, except used for instantiating inner member classes that must - * be instantiated within another class instance. - * - * @param <T> The class type to convert the value to. - * @param outer If class is a member class, this is the instance of the containing class. - * Should be <jk>null</jk> if not a member class. - * @param value The value to convert. - * @param type The class type to convert the value to. - * @throws InvalidDataConversionException If the specified value cannot be converted to the specified type. - * @return The converted value. - */ - public <T> T convertToType(Object outer, Object value, ClassMeta<T> type) throws InvalidDataConversionException { - if (type == null) - type = (ClassMeta<T>)object(); - - try { - // Handle the case of a null value. - if (value == null) { - - // If it's a primitive, then use the converters to get the default value for the primitive type. - if (type.isPrimitive()) - return type.getPrimitiveDefault(); - - // Otherwise, just return null. - return null; - } - - Class<T> tc = type.getInnerClass(); - - // If no conversion needed, then just return the value. - // Don't include maps or collections, because child elements may need conversion. - if (tc.isInstance(value)) - if (! ((type.isMap() && type.getValueType().isNotObject()) || (type.isCollection() && type.getElementType().isNotObject()))) - return (T)value; - - if (type.getPojoFilter() != null) { - PojoFilter f = type.getPojoFilter(); - Class<?> nc = f.getNormalClass(), fc = f.getFilteredClass(); - if (isParentClass(nc, tc) && isParentClass(fc, value.getClass())) - return (T)f.unfilter(value, type); - } - - ClassMeta<?> vt = getClassMetaForObject(value); - if (vt.getPojoFilter() != null) { - PojoFilter f = vt.getPojoFilter(); - Class<?> nc = f.getNormalClass(), fc = f.getFilteredClass(); - if (isParentClass(nc, vt.getInnerClass()) && isParentClass(fc, tc)) - return (T)f.filter(value); - } - - if (type.isPrimitive()) { - if (value.toString().isEmpty()) - return type.getPrimitiveDefault(); - - if (type.isNumber()) { - if (value instanceof Number) { - Number n = (Number)value; - if (tc == Integer.TYPE) - return (T)Integer.valueOf(n.intValue()); - if (tc == Short.TYPE) - return (T)Short.valueOf(n.shortValue()); - if (tc == Long.TYPE) - return (T)Long.valueOf(n.longValue()); - if (tc == Float.TYPE) - return (T)Float.valueOf(n.floatValue()); - if (tc == Double.TYPE) - return (T)Double.valueOf(n.doubleValue()); - if (tc == Byte.TYPE) - return (T)Byte.valueOf(n.byteValue()); - } else { - String n = null; - if (value instanceof Boolean) - n = ((Boolean)value).booleanValue() ? "1" : "0"; - else - n = value.toString(); - if (tc == Integer.TYPE) - return (T)Integer.valueOf(n); - if (tc == Short.TYPE) - return (T)Short.valueOf(n); - if (tc == Long.TYPE) - return (T)Long.valueOf(n); - if (tc == Float.TYPE) - return (T)new Float(n); - if (tc == Double.TYPE) - return (T)new Double(n); - if (tc == Byte.TYPE) - return (T)Byte.valueOf(n); - } - } else if (type.isChar()) { - String s = value.toString(); - return (T)Character.valueOf(s.length() == 0 ? 0 : s.charAt(0)); - } else if (type.isBoolean()) { - if (value instanceof Number) { - int i = ((Number)value).intValue(); - return (T)(i == 0 ? Boolean.FALSE : Boolean.TRUE); - } - return (T)Boolean.valueOf(value.toString()); - } - } - - if (type.isNumber()) { - if (value instanceof Number) { - Number n = (Number)value; - if (tc == Integer.class) - return (T)Integer.valueOf(n.intValue()); - if (tc == Short.class) - return (T)Short.valueOf(n.shortValue()); - if (tc == Long.class) - return (T)Long.valueOf(n.longValue()); - if (tc == Float.class) - return (T)Float.valueOf(n.floatValue()); - if (tc == Double.class) - return (T)Double.valueOf(n.doubleValue()); - if (tc == Byte.class) - return (T)Byte.valueOf(n.byteValue()); - } else { - if (value.toString().isEmpty()) - return null; - String n = null; - if (value instanceof Boolean) - n = ((Boolean)value).booleanValue() ? "1" : "0"; - else - n = value.toString(); - if (tc == Integer.class) - return (T)Integer.valueOf(n); - if (tc == Short.class) - return (T)Short.valueOf(n); - if (tc == Long.class) - return (T)Long.valueOf(n); - if (tc == Float.class) - return (T)new Float(n); - if (tc == Double.class) - return (T)new Double(n); - if (tc == Byte.class) - return (T)Byte.valueOf(n); - } - } - - if (type.isChar()) { - String s = value.toString(); - return (T)Character.valueOf(s.length() == 0 ? 0 : s.charAt(0)); - } - - // Handle setting of array properties - if (type.isArray()) { - if (value instanceof List) - return (T)toArray(type, (List)value); - else if (value.getClass().isArray()) - return (T)toArray(type, Arrays.asList((Object[])value)); - else if (StringUtils.startsWith(value.toString(), '[')) - return (T)toArray(type, new ObjectList(value.toString()).setBeanContext(this)); - } - - // Target type is some sort of Map that needs to be converted. - if (type.isMap()) { - try { - if (value instanceof Map) { - Map m = type.canCreateNewInstance(outer) ? (Map)type.newInstance(outer) : new ObjectMap(this); - ClassMeta keyType = type.getKeyType(), valueType = type.getValueType(); - for (Map.Entry e : (Set<Map.Entry>)((Map)value).entrySet()) { - Object k = e.getKey(); - if (keyType.isNotObject()) { - if (keyType.isString()) - k = k.toString(); - else - k = convertToType(m, k, keyType); - } - Object v = e.getValue(); - if (valueType.isNotObject()) - v = convertToType(m, v, valueType); - m.put(k, v); - } - return (T)m; - } else if (!type.canCreateNewInstanceFromString(outer)) { - ObjectMap m = new ObjectMap(value.toString(), defaultParser); - return convertToType(outer, m, type); - } - } catch (Exception e) { - throw new InvalidDataConversionException(value.getClass(), tc, e); - } - } - - // Target type is some sort of Collection - if (type.isCollection()) { - try { - Collection l = type.canCreateNewInstance(outer) ? (Collection)type.newInstance(outer) : new ObjectList(this); - ClassMeta elementType = type.getElementType(); - - if (value.getClass().isArray()) - for (Object o : (Object[])value) - l.add(elementType.isObject() ? o : convertToType(l, o, elementType)); - else if (value instanceof Collection) - for (Object o : (Collection)value) - l.add(elementType.isObject() ? o : convertToType(l, o, elementType)); - else if (value instanceof Map) - l.add(elementType.isObject() ? value : convertToType(l, value, elementType)); - else if (! value.toString().isEmpty()) - throw new InvalidDataConversionException(value.getClass(), tc, null); - return (T)l; - } catch (InvalidDataConversionException e) { - throw e; - } catch (Exception e) { - throw new InvalidDataConversionException(value.getClass(), tc, e); - } - } - - if (type.isString()) { - Class<?> c = value.getClass(); - if (c.isArray()) { - if (c.getComponentType().isPrimitive()) { - ObjectList l = new ObjectList(this); - int size = Array.getLength(value); - for (int i = 0; i < size; i++) - l.add(Array.get(value, i)); - return (T)l.toString(); - } - return (T)new ObjectList((Object[])value).setBeanContext(this).toString(); - } - return (T)value.toString(); - } - - if (type.isCharSequence()) { - Class<?> c = value.getClass(); - if (c.isArray()) { - if (c.getComponentType().isPrimitive()) { - ObjectList l = new ObjectList(this); - int size = Array.getLength(value); - for (int i = 0; i < size; i++) - l.add(Array.get(value, i)); - value = l; - } - value = new ObjectList((Object[])value).setBeanContext(this); - } - - return type.newInstanceFromString(outer, value.toString()); - } - - if (type.isBoolean()) { - if (value instanceof Number) - return (T)(Boolean.valueOf(((Number)value).intValue() != 0)); - return (T)Boolean.valueOf(value.toString()); - } - - // It's a bean being initialized with a Map - if (type.isBean() && value instanceof Map) - return newBeanMap(tc).load((Map<?,?>) value).getBean(); - - if (type.canCreateNewInstanceFromObjectMap(outer) && value instanceof ObjectMap) - return type.newInstanceFromObjectMap(outer, (ObjectMap)value); - - if (type.canCreateNewInstanceFromString(outer)) - return type.newInstanceFromString(outer, value.toString()); - - if (type.isBean()) - return newBeanMap(type.getInnerClass()).load(value.toString()).getBean(); - - } catch (Exception e) { - throw new InvalidDataConversionException(value, type.getInnerClass(), e); - } - - throw new InvalidDataConversionException(value, type.getInnerClass(), null); - } - - /** - * Converts the contents of the specified list into an array. - * <p> - * Works on both object and primitive arrays. - * <p> - * In the case of multi-dimensional arrays, the incoming list must - * contain elements of type n-1 dimension. i.e. if {@code type} is <code><jk>int</jk>[][]</code> - * then {@code list} must have entries of type <code><jk>int</jk>[]</code>. - * - * @param type The type to convert to. Must be an array type. - * @param list The contents to populate the array with. - * @return A new object or primitive array. - */ - public Object toArray(ClassMeta<?> type, Collection<?> list) { - if (list == null) - return null; - ClassMeta<?> componentType = type.getElementType(); - Object array = Array.newInstance(componentType.getInnerClass(), list.size()); - int i = 0; - for (Object o : list) { - if (! type.getInnerClass().isInstance(o)) { - if (componentType.isArray() && o instanceof Collection) - o = toArray(componentType, (Collection<?>)o); - else if (o == null && componentType.isPrimitive()) - o = componentType.getPrimitiveDefault(); - else - o = convertToType(null, o, componentType); - } - try { - Array.set(array, i++, o); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - throw e; - } - } - return array; - } - - @Override /* Object */ - public int hashCode() { - return hashCode; - } - - private int hash(int h1, int h2) { - return Integer.rotateLeft(h1, 1) + h2; - } - - @Override /* Object */ - public boolean equals(Object o) { - if (o instanceof BeanContext) { - BeanContext bcs = (BeanContext)o; - if (hashCode != bcs.hashCode - || b != bcs.b - || beanFilters.length != bcs.beanFilters.length - || pojoFilters.length != bcs.pojoFilters.length - || notBeanClasses.length != bcs.notBeanClasses.length - || implKeyClasses.length != bcs.implKeyClasses.length - || implValueClasses.length != bcs.implValueClasses.length - || uriKeys.length != bcs.uriKeys.length - || uriVals.length != bcs.uriVals.length - || beanConstructorVisibility != bcs.beanConstructorVisibility - || beanClassVisibility != bcs.beanClassVisibility - || beanMethodVisibility != bcs.beanMethodVisibility - || beanFieldVisibility != bcs.beanFieldVisibility) - return false; - for (int i = 0; i < beanFilters.length; i++) - if (! beanFilters[i].isSameAs(bcs.beanFilters[i])) - return false; - for (int i = 0; i < pojoFilters.length; i++) - if (! pojoFilters[i].isSameAs(bcs.pojoFilters[i])) - return false; - for (int i = 0; i < notBeanClasses.length; i++) - if (! notBeanClasses[i].equals(bcs.notBeanClasses[i])) - return false; - for (int i = 0; i < notBeanPackages.length; i++) - if (! notBeanPackages[i].equals(bcs.notBeanPackages[i])) - return false; - for (int i = 0; i < implKeyClasses.length; i++) - if (! implKeyClasses[i].equals(bcs.implKeyClasses[i])) - return false; - for (int i = 0; i < implValueClasses.length; i++) - if (! implValueClasses[i].equals(bcs.implValueClasses[i])) - return false; - for (int i = 0; i < uriKeys.length; i++) - if (! uriKeys[i].equals(bcs.uriKeys[i])) - return false; - for (int i = 0; i < uriVals.length; i++) - if (! uriVals[i].equals(bcs.uriVals[i])) - return false; - return true; - } - return false; - } - - @Override /* Object */ - public String toString() { - 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("beanFilters", beanFilters) - .append("pojoFilters", pojoFilters) - .append("notBeanPackages", notBeanPackages) - .append("notBeanClasses", notBeanClasses) - .append("implClasses", implClasses) - .append("uriVars", uriVars); - try { - return m.toString(JsonSerializer.DEFAULT_LAX_READABLE); - } catch (SerializeException e) { - return e.getLocalizedMessage(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class deleted file mode 100755 index 261d824..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanContextFactory.class and /dev/null differ
