http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java deleted file mode 100755 index ea9fc3c..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanPropertyMeta.java +++ /dev/null @@ -1,803 +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 static com.ibm.juno.core.utils.CollectionUtils.*; -import static com.ibm.juno.core.utils.ReflectionUtils.*; - -import java.lang.annotation.*; -import java.lang.reflect.*; -import java.net.*; -import java.util.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.annotation.URI; -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.html.*; -import com.ibm.juno.core.jena.*; -import com.ibm.juno.core.parser.*; -import com.ibm.juno.core.serializer.*; -import com.ibm.juno.core.utils.*; -import com.ibm.juno.core.xml.*; - -/** - * Contains metadata about a bean property. - * <p> - * Contains information such as type of property (e.g. field/getter/setter), class type of property value, - * and whether any filters are associated with this property. - * <p> - * Developers will typically not need access to this class. The information provided by it is already - * exposed through several methods on the {@link BeanMap} API. - * - * @param <T> The class type of the bean that this metadata applies to. - * @author James Bognar ([email protected]) - */ -@SuppressWarnings({ "rawtypes", "unchecked" }) -public class BeanPropertyMeta<T> { - - private Field field; - private Method getter, setter; - private boolean isConstructorArg, isBeanUri, isUri; - - private final BeanMeta<T> beanMeta; - - private String name; - private ClassMeta<?> - rawTypeMeta, // The real class type of the bean property. - typeMeta; // The filtered class type of the bean property. - private String[] properties; - private PojoFilter filter; // PojoFilter defined only via @BeanProperty annotation. - - /** HTML related metadata on this bean property. */ - protected HtmlBeanPropertyMeta<T> htmlMeta; - - /** XML related metadata on this bean property. */ - protected XmlBeanPropertyMeta<T> xmlMeta; - - /** RDF related metadata on this bean property. */ - protected RdfBeanPropertyMeta<T> rdfMeta; // - - BeanPropertyMeta(BeanMeta<T> beanMeta, String name) { - this.beanMeta = beanMeta; - this.name = name; - } - - BeanPropertyMeta(BeanMeta<T> beanMeta, String name, ClassMeta<?> rawTypeMeta) { - this(beanMeta, name); - this.rawTypeMeta = rawTypeMeta; - } - - BeanPropertyMeta(BeanMeta<T> beanMeta, String name, Method getter, Method setter) { - this(beanMeta, name); - setGetter(getter); - setSetter(setter); - } - - /** - * Returns the name of this bean property. - * - * @return The name of the bean property. - */ - public String getName() { - return name; - } - - /** - * Returns the bean meta that this property belongs to. - * - * @return The bean meta that this property belongs to. - */ - @BeanIgnore - public BeanMeta<T> getBeanMeta() { - return beanMeta; - } - - /** - * Returns the getter method for this property. - * - * @return The getter method for this bean property, or <jk>null</jk> if there is no getter method. - */ - public Method getGetter() { - return getter; - } - - /** - * Returns the setter method for this property. - * - * @return The setter method for this bean property, or <jk>null</jk> if there is no setter method. - */ - public Method getSetter() { - return setter; - } - - /** - * Returns the field for this property. - * - * @return The field for this bean property, or <jk>null</jk> if there is no field associated with this bean property. - */ - public Field getField() { - return field; - } - - /** - * Returns the {@link ClassMeta} of the class of this property. - * <p> - * If this property or the property type class has a {@link PojoFilter} associated with it, this - * method returns the filtered class meta. - * This matches the class type that is used by the {@link #get(BeanMap)} and {@link #set(BeanMap, Object)} methods. - * - * @return The {@link ClassMeta} of the class of this property. - */ - public ClassMeta<?> getClassMeta() { - if (typeMeta == null) - typeMeta = (filter != null ? filter.getFilteredClassMeta() : rawTypeMeta.getFilteredClassMeta()); - return typeMeta; - } - - /** - * Sets the getter method for this property. - * - * @param getter The getter method to associate with this property. - * @return This object (for method chaining). - */ - BeanPropertyMeta<T> setGetter(Method getter) { - setAccessible(getter); - this.getter = getter; - return this; - } - - /** - * Sets the setter method for this property. - * - * @param setter The setter method to associate with this property. - * @return This object (for method chaining). - */ - BeanPropertyMeta<T> setSetter(Method setter) { - setAccessible(setter); - this.setter = setter; - return this; - } - - /** - * Sets the field for this property. - * - * @param field The field to associate with this property. - * @return This object (for method chaining). - */ - BeanPropertyMeta<T> setField(Field field) { - setAccessible(field); - this.field = field; - return this; - } - - /** - * Marks this property as only settable through a constructor arg. - * - * @return This object (for method chaining). - */ - BeanPropertyMeta<T> setAsConstructorArg() { - this.isConstructorArg = true; - return this; - } - - /** - * Returns <jk>true</jk> if this bean property is marked with {@link BeanProperty#beanUri()} as <jk>true</jk>. - * - * @return <jk>true</jk> if this bean property is marked with {@link BeanProperty#beanUri()} as <jk>true</jk>. - */ - public boolean isBeanUri() { - return isBeanUri; - } - - /** - * Returns <jk>true</jk> if this bean property is a URI. - * <p> - * A bean property can be considered a URI if any of the following are true: - * <ul> - * <li>Property class type is {@link URL} or {@link URI}. - * <li>Property class type is annotated with {@link com.ibm.juno.core.annotation.URI}. - * <li>Property getter, setter, or field is annotated with {@link com.ibm.juno.core.annotation.URI}. - * </ul> - * - * @return <jk>true</jk> if this bean property is a URI. - */ - public boolean isUri() { - return isUri; - } - - /** - * Returns the override list of properties defined through a {@link BeanProperty#properties()} annotation - * on this property. - * - * @return The list of override properties, or <jk>null</jk> if annotation not specified. - */ - public String[] getProperties() { - return properties; - } - - /** - * Returns the HTML-related metadata on this bean property. - * - * @return The HTML-related metadata on this bean property. Never <jk>null</jk>/. - */ - public HtmlBeanPropertyMeta<T> getHtmlMeta() { - return htmlMeta; - } - - /** - * Returns the XML-related metadata on this bean property. - * - * @return The XML-related metadata on this bean property. Never <jk>null</jk>/. - */ - public XmlBeanPropertyMeta<T> getXmlMeta() { - return xmlMeta; - } - - /** - * Returns the RDF-related metadata on this bean property. - * - * @return The RDF-related metadata on this bean property. Never <jk>null</jk>/. - */ - public RdfBeanPropertyMeta<T> getRdfMeta() { - return rdfMeta; - } - - boolean validate() throws Exception { - - BeanContext f = beanMeta.ctx; - Map<Class<?>,Class<?>[]> typeVarImpls = beanMeta.typeVarImpls; - - if (field == null && getter == null) - return false; - - if (field == null && setter == null && f.beansRequireSettersForGetters && ! isConstructorArg) - return false; - - if (field != null) { - BeanProperty p = field.getAnnotation(BeanProperty.class); - rawTypeMeta = f.getClassMeta(p, field.getGenericType(), typeVarImpls); - isUri |= (rawTypeMeta.isUri() || field.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class)); - if (p != null) { - filter = getPropertyPojoFilter(p); - if (p.properties().length != 0) - properties = p.properties(); - isBeanUri |= p.beanUri(); - } - } - - if (getter != null) { - BeanProperty p = getter.getAnnotation(BeanProperty.class); - if (rawTypeMeta == null) - rawTypeMeta = f.getClassMeta(p, getter.getGenericReturnType(), typeVarImpls); - isUri |= (rawTypeMeta.isUri() || getter.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class)); - if (p != null) { - if (filter == null) - filter = getPropertyPojoFilter(p); - if (properties != null && p.properties().length != 0) - properties = p.properties(); - isBeanUri |= p.beanUri(); - } - } - - if (setter != null) { - BeanProperty p = setter.getAnnotation(BeanProperty.class); - if (rawTypeMeta == null) - rawTypeMeta = f.getClassMeta(p, setter.getGenericParameterTypes()[0], typeVarImpls); - isUri |= (rawTypeMeta.isUri() || setter.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class)); - if (p != null) { - if (filter == null) - filter = getPropertyPojoFilter(p); - if (properties != null && p.properties().length != 0) - properties = p.properties(); - isBeanUri |= p.beanUri(); - } - } - - if (rawTypeMeta == null) - return false; - - // Do some annotation validation. - Class<?> c = rawTypeMeta.getInnerClass(); - if (getter != null && ! isParentClass(getter.getReturnType(), c)) - return false; - if (setter != null && ! isParentClass(setter.getParameterTypes()[0], c)) - return false; - if (field != null && ! isParentClass(field.getType(), c)) - return false; - - htmlMeta = new HtmlBeanPropertyMeta(this); - xmlMeta = new XmlBeanPropertyMeta(this); - rdfMeta = new RdfBeanPropertyMeta(this); - - return true; - } - - private PojoFilter getPropertyPojoFilter(BeanProperty p) throws Exception { - Class<? extends PojoFilter> c = p.filter(); - if (c == PojoFilter.NULL.class) - return null; - try { - PojoFilter f = c.newInstance(); - f.setBeanContext(this.beanMeta.ctx); - return f; - } catch (Exception e) { - throw new BeanRuntimeException(this.beanMeta.c, "Could not instantiate PojoFilter ''{0}'' for bean property ''{1}''", c.getName(), this.name).initCause(e); - } - } - - /** - * Equivalent to calling {@link BeanMap#get(Object)}, but is faster since it avoids looking up the property meta. - * - * @param m The bean map to get the filtered value from. - * @return The property value. - */ - public Object get(BeanMap<T> m) { - try { - // Read-only beans have their properties stored in a cache until getBean() is called. - Object bean = m.bean; - if (bean == null) - return m.propertyCache.get(name); - - Object o = null; - - if (getter == null && field == null) - throw new BeanRuntimeException(beanMeta.c, "Getter or public field not defined on property ''{0}''", name); - - if (getter != null) - o = getter.invoke(bean, (Object[])null); - - else if (field != null) - o = field.get(bean); - - o = filter(o); - if (o == null) - return null; - if (properties != null) { - if (rawTypeMeta.isArray()) { - Object[] a = (Object[])o; - List l = new ArrayList(a.length); - ClassMeta childType = rawTypeMeta.getElementType(); - for (Object c : a) - l.add(applyChildPropertiesFilter(childType, c)); - return l; - } else if (rawTypeMeta.isCollection()) { - Collection c = (Collection)o; - List l = new ArrayList(c.size()); - ClassMeta childType = rawTypeMeta.getElementType(); - for (Object cc : c) - l.add(applyChildPropertiesFilter(childType, cc)); - return l; - } else { - return applyChildPropertiesFilter(rawTypeMeta, o); - } - } - return o; - } catch (SerializeException e) { - throw new BeanRuntimeException(e); - } catch (Throwable e) { - if (beanMeta.ctx.ignoreInvocationExceptionsOnGetters) { - if (rawTypeMeta.isPrimitive()) - return rawTypeMeta.getPrimitiveDefault(); - return null; - } - throw new BeanRuntimeException(beanMeta.c, "Exception occurred while getting property ''{0}''", name).initCause(e); - } - } - - /** - * Equivalent to calling {@link BeanMap#put(Object, Object)}, but is faster since it avoids - * looking up the property meta. - * - * @param m The bean map to set the property value on. - * @param value The value to set. - * @return The previous property value. - * @throws BeanRuntimeException If property could not be set. - */ - public Object set(BeanMap<T> m, Object value) throws BeanRuntimeException { - try { - // Comvert to raw form. - value = unfilter(value); - BeanContext bc = this.beanMeta.ctx; - - if (m.bean == null) { - - // 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. - if (m.meta.subTypeIdProperty != null && m.propertyCache == null) - m.propertyCache = new TreeMap<String,Object>(); - - // Read-only beans get their properties stored in a cache. - if (m.propertyCache != null) - return m.propertyCache.put(name, value); - - throw new BeanRuntimeException("Non-existent bean instance on bean."); - } - - boolean isMap = rawTypeMeta.isMap(); - boolean isCollection = rawTypeMeta.isCollection(); - - if (field == null && setter == null && ! (isMap || isCollection)) { - if ((value == null && bc.ignoreUnknownNullBeanProperties) || bc.ignorePropertiesWithoutSetters) - return null; - throw new BeanRuntimeException(beanMeta.c, "Setter or public field not defined on property ''{0}''", name); - } - - Object bean = m.getBean(true); // Don't use getBean() because it triggers array creation! - - try { - - Object r = beanMeta.ctx.beanMapPutReturnsOldValue || isMap || isCollection ? get(m) : null; - Class<?> propertyClass = rawTypeMeta.getInnerClass(); - - if (value == null && (isMap || isCollection)) { - if (setter != null) { - setter.invoke(bean, new Object[] { null }); - return r; - } else if (field != null) { - field.set(bean, null); - return r; - } - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' to null because no setter or public field is defined", name); - } - - if (isMap) { - - if (! (value instanceof Map)) { - if (value instanceof CharSequence) - value = new ObjectMap((CharSequence)value).setBeanContext(beanMeta.ctx); - else - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value)); - } - - Map valueMap = (Map)value; - Map propMap = (Map)r; - ClassMeta<?> valueType = rawTypeMeta.getValueType(); - - // If the property type is abstract, then we either need to reuse the existing - // map (if it's not null), or try to assign the value directly. - if (! rawTypeMeta.canCreateNewInstance()) { - if (propMap == null) { - if (setter == null && field == null) - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined, and the current value is null", name, propertyClass.getName(), findClassName(value)); - - if (propertyClass.isInstance(valueMap)) { - if (! valueType.isObject()) { - for (Map.Entry e : (Set<Map.Entry>)valueMap.entrySet()) { - Object v = e.getValue(); - if (v != null && ! valueType.getInnerClass().isInstance(v)) - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because the value types in the assigned map do not match the specified ''elementClass'' attribute on the property, and the property value is currently null", name, propertyClass.getName(), findClassName(value)); - } - } - if (setter != null) - setter.invoke(bean, valueMap); - else - field.set(bean, valueMap); - return r; - } - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{2}'' to object of type ''{2}'' because the assigned map cannot be converted to the specified type because the property type is abstract, and the property value is currently null", name, propertyClass.getName(), findClassName(value)); - } - } else { - if (propMap == null) { - propMap = (Map)propertyClass.newInstance(); - if (setter != null) - setter.invoke(bean, propMap); - else if (field != null) - field.set(bean, propMap); - else - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined on this property, and the existing property value is null", name, propertyClass.getName(), findClassName(value)); - } else { - propMap.clear(); - } - } - - // Set the values. - for (Map.Entry e : (Set<Map.Entry>)valueMap.entrySet()) { - Object k = e.getKey(); - Object v = e.getValue(); - if (! valueType.isObject()) - v = beanMeta.ctx.convertToType(v, valueType); - propMap.put(k, v); - } - - } else if (isCollection) { - - if (! (value instanceof Collection)) { - if (value instanceof CharSequence) - value = new ObjectList((CharSequence)value).setBeanContext(beanMeta.ctx); - else - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}''", name, propertyClass.getName(), findClassName(value)); - } - - Collection valueList = (Collection)value; - Collection propList = (Collection)r; - ClassMeta elementType = rawTypeMeta.getElementType(); - - // If the property type is abstract, then we either need to reuse the existing - // collection (if it's not null), or try to assign the value directly. - if (! rawTypeMeta.canCreateNewInstance()) { - if (propList == null) { - if (setter == null && field == null) - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter or public field is defined, and the current value is null", name, propertyClass.getName(), findClassName(value)); - - if (propertyClass.isInstance(valueList)) { - if (! elementType.isObject()) { - List l = new ObjectList(valueList); - for (ListIterator<Object> i = l.listIterator(); i.hasNext(); ) { - Object v = i.next(); - if (v != null && (! elementType.getInnerClass().isInstance(v))) { - i.set(bc.convertToType(v, elementType)); - } - } - valueList = l; - } - if (setter != null) - setter.invoke(bean, valueList); - else - field.set(bean, valueList); - return r; - } - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because the assigned map cannot be converted to the specified type because the property type is abstract, and the property value is currently null", name, propertyClass.getName(), findClassName(value)); - } - propList.clear(); - } else { - if (propList == null) { - propList = (Collection)propertyClass.newInstance(); - if (setter != null) - setter.invoke(bean, propList); - else if (field != null) - field.set(bean, propList); - else - throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is defined on this property, and the existing property value is null", name, propertyClass.getName(), findClassName(value)); - } else { - propList.clear(); - } - } - - // Set the values. - for (Object v : valueList) { - if (! elementType.isObject()) - v = beanMeta.ctx.convertToType(v, elementType); - propList.add(v); - } - - } else { - if (filter != null && value != null && isParentClass(filter.getFilteredClass(), value.getClass())) { - value = filter.unfilter(value, rawTypeMeta); - } else { - value = beanMeta.ctx.convertToType(value, rawTypeMeta); - } - if (setter != null) - setter.invoke(bean, new Object[] { value }); - else if (field != null) - field.set(bean, value); - } - - return r; - - } catch (BeanRuntimeException e) { - throw e; - } catch (Exception e) { - if (beanMeta.ctx.ignoreInvocationExceptionsOnSetters) { - if (rawTypeMeta.isPrimitive()) - return rawTypeMeta.getPrimitiveDefault(); - return null; - } - throw new BeanRuntimeException(beanMeta.c, "Error occurred trying to set property ''{0}''", name).initCause(e); - } - } catch (ParseException e) { - throw new BeanRuntimeException(e); - } - } - - /** - * Sets an array field on this bean. - * Works on both <code>Object</code> and primitive arrays. - * - * @param bean The bean of the field. - * @param l The collection to use to set the array field. - * @throws IllegalArgumentException Thrown by method invocation. - * @throws IllegalAccessException Thrown by method invocation. - * @throws InvocationTargetException Thrown by method invocation. - */ - protected void setArray(T bean, List l) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { - Object array = ArrayUtils.toArray(l, this.rawTypeMeta.getElementType().getInnerClass()); - if (setter != null) - setter.invoke(bean, array); - else if (field != null) - field.set(bean, array); - else - throw new BeanRuntimeException(beanMeta.c, "Attempt to initialize array property ''{0}'', but no setter or field defined.", name); - } - - /** - * Adds a value to a {@link Collection} or array property. - * Note that adding values to an array property is inefficient for large - * arrays since it must copy the array into a larger array on each operation. - * - * @param m The bean of the field being set. - * @param value The value to add to the field. - * @throws BeanRuntimeException If field is not a collection or array. - */ - public void add(BeanMap<T> m, Object value) throws BeanRuntimeException { - - BeanContext bc = beanMeta.ctx; - - // Read-only beans get their properties stored in a cache. - if (m.bean == null) { - if (! m.propertyCache.containsKey(name)) - m.propertyCache.put(name, new ObjectList(bc)); - ((ObjectList)m.propertyCache.get(name)).add(value); - return; - } - - boolean isCollection = rawTypeMeta.isCollection(); - boolean isArray = rawTypeMeta.isArray(); - - if (! (isCollection || isArray)) - throw new BeanRuntimeException(beanMeta.c, "Attempt to add element to property ''{0}'' which is not a collection or array", name); - - Object bean = m.getBean(true); - - ClassMeta<?> elementType = rawTypeMeta.getElementType(); - - try { - Object v = bc.convertToType(value, elementType); - - if (isCollection) { - Collection c = null; - if (getter != null) { - c = (Collection)getter.invoke(bean, (Object[])null); - } else if (field != null) { - c = (Collection)field.get(bean); - } else { - throw new BeanRuntimeException(beanMeta.c, "Attempt to append to collection property ''{0}'', but no getter or field defined.", name); - } - - if (c != null) { - c.add(v); - return; - } - - if (rawTypeMeta.canCreateNewInstance()) - c = (Collection)rawTypeMeta.newInstance(); - else - c = new ObjectList(bc); - - c.add(v); - - if (setter != null) - setter.invoke(bean, c); - else if (field != null) - field.set(bean, c); - else - throw new BeanRuntimeException(beanMeta.c, "Attempt to initialize collection property ''{0}'', but no setter or field defined.", name); - - } else /* isArray() */ { - - if (m.arrayPropertyCache == null) - m.arrayPropertyCache = new TreeMap<String,List<?>>(); - - List l = m.arrayPropertyCache.get(name); - if (l == null) { - l = new LinkedList(); // ArrayLists and LinkLists appear to perform equally. - m.arrayPropertyCache.put(name, l); - - // Copy any existing array values into the temporary list. - Object oldArray; - if (getter != null) - oldArray = getter.invoke(bean, (Object[])null); - else if (field != null) - oldArray = field.get(bean); - else - throw new BeanRuntimeException(beanMeta.c, "Attempt to append to array property ''{0}'', but no getter or field defined.", name); - ArrayUtils.copyToList(oldArray, l); - } - - // Add new entry to our array. - l.add(v); - } - - } catch (BeanRuntimeException e) { - throw e; - } catch (Exception e) { - throw new BeanRuntimeException(e); - } - } - - /** - * Returns all instances of the specified annotation in the hierarchy of this bean property. - * <p> - * Searches through the class hierarchy (e.g. superclasses, interfaces, packages) for all - * instances of the specified annotation. - * - * @param a The class to find annotations for. - * @return A list of annotations ordered in child-to-parent order. Never <jk>null</jk>. - */ - public <A extends Annotation> List<A> findAnnotations(Class<A> a) { - List<A> l = new LinkedList<A>(); - if (field != null) { - addIfNotNull(l, field.getAnnotation(a)); - appendAnnotations(a, field.getType(), l); - } - if (getter != null) { - addIfNotNull(l, getter.getAnnotation(a)); - appendAnnotations(a, getter.getReturnType(), l); - } - if (setter != null) { - addIfNotNull(l, setter.getAnnotation(a)); - appendAnnotations(a, setter.getReturnType(), l); - } - appendAnnotations(a, this.getBeanMeta().getClassMeta().getInnerClass(), l); - return l; - } - - private Object filter(Object o) throws SerializeException { - // First use filter defined via @BeanProperty. - if (filter != null) - return filter.filter(o); - if (o == null) - return null; - // Otherwise, look it up via bean context. - if (rawTypeMeta.hasChildPojoFilters()) { - Class c = o.getClass(); - ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c); - PojoFilter f = cm.getPojoFilter(); - if (f != null) - return f.filter(o); - } - return o; - } - - private Object unfilter(Object o) throws ParseException { - if (filter != null) - return filter.unfilter(o, rawTypeMeta); - if (o == null) - return null; - if (rawTypeMeta.hasChildPojoFilters()) { - Class c = o.getClass(); - ClassMeta<?> cm = rawTypeMeta.innerClass == c ? rawTypeMeta : beanMeta.ctx.getClassMeta(c); - PojoFilter f = cm.getPojoFilter(); - if (f != null) - return f.unfilter(o, rawTypeMeta); - } - return o; - } - - private Object applyChildPropertiesFilter(ClassMeta cm, Object o) { - if (o == null) - return null; - if (cm.isBean()) - return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties)); - if (cm.isMap()) - return new FilteredMap((Map)o, properties); - if (cm.isObject()) { - if (o instanceof Map) - return new FilteredMap((Map)o, properties); - BeanMeta bm = this.getBeanMeta().ctx.getBeanMeta(o.getClass()); - if (bm != null) - return new BeanMap(o, new BeanMetaFiltered(cm.getBeanMeta(), properties)); - } - return o; - } - - private String findClassName(Object o) { - if (o == null) - return null; - if (o instanceof Class) - return ((Class<?>)o).getName(); - return o.getClass().getName(); - } - - @Override /* Object */ - public String toString() { - return name + ": " + this.rawTypeMeta.getInnerClass().getName() + ", field=["+field+"], getter=["+getter+"], setter=["+setter+"]"; - } -}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.class deleted file mode 100755 index 4b8f78d..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.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/BeanProxyInvocationHandler.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java deleted file mode 100755 index 3e628aa..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanProxyInvocationHandler.java +++ /dev/null @@ -1,78 +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.lang.reflect.*; -import java.util.*; - -/** - * Provides an {@link InvocationHandler} for creating beans from bean interfaces. - * <p> - * If the {@code useInterfaceProxies} setting is enabled in {@link BeanContext}, this - * is the class that creates instances of beans from interfaces. - * - * @author Barry M. Caceres - * @param <T> The interface class - */ -public class BeanProxyInvocationHandler<T> implements InvocationHandler { - - private final BeanMeta<T> meta; // The BeanMeta for this instance - private Map<String, Object> beanProps; // The map of property names to bean property values. - - /** - * Constructs with the specified {@link BeanMeta}. - * - * @param meta The bean meta data. - */ - public BeanProxyInvocationHandler(BeanMeta<T> meta) { - this.meta = meta; - this.beanProps = new HashMap<String, Object>(); - } - - /** - * Implemented to handle the method called. - */ - @Override /* InvocationHandler */ - public Object invoke(Object proxy, Method method, Object[] args) { - Class<?>[] paramTypes = method.getParameterTypes(); - if (method.getName().equals("equals") && (paramTypes.length == 1) && (paramTypes[0] == java.lang.Object.class)) { - Object arg = args[0]; - if (arg == null) - return false; - if (proxy == arg) - return true; - if (proxy.getClass() == arg.getClass()) { - InvocationHandler ih = Proxy.getInvocationHandler(arg); - if (ih instanceof BeanProxyInvocationHandler) { - return this.beanProps.equals(((BeanProxyInvocationHandler<?>)ih).beanProps); - } - } - BeanMap<Object> bean = this.meta.ctx.forBean(arg); - return this.beanProps.equals(bean); - } - - if (method.getName().equals("hashCode") && (paramTypes.length == 0)) - return Integer.valueOf(this.beanProps.hashCode()); - - if (method.getName().equals("toString") && (paramTypes.length == 0)) - return this.beanProps.toString(); - - String prop = this.meta.getterProps.get(method); - if (prop != null) - return this.beanProps.get(prop); - - prop = this.meta.setterProps.get(method); - if (prop != null) { - this.beanProps.put(prop, args[0]); - return null; - } - - throw new UnsupportedOperationException("Unsupported bean method. method=[ " + method + " ]"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.class deleted file mode 100755 index e3247f1..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.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/BeanRuntimeException.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java deleted file mode 100755 index f931e98..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/BeanRuntimeException.java +++ /dev/null @@ -1,63 +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 java.text.*; - -/** - * General bean runtime operation exception. - * - * @author James Bognar ([email protected]) - */ -public final class BeanRuntimeException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - /** - * Constructor. - * - * @param message The error message. - */ - public BeanRuntimeException(String message) { - super(message); - } - - /** - * Shortcut for calling <code><jk>new</jk> BeanRuntimeException(String.format(c.getName() + <js>": "</js> + message, args));</code> - * - * @param c The class name of the bean that caused the exception. - * @param message The error message. - * @param args Arguments passed in to the {@code String.format()} method. - */ - public BeanRuntimeException(Class<?> c, String message, Object... args) { - this(c.getName() + ": " + (args.length == 0 ? message : MessageFormat.format(message, args))); - } - - /** - * Constructor. - * - * @param cause The initial cause of the exception. - */ - public BeanRuntimeException(Throwable cause) { - super(cause == null ? null : cause.getLocalizedMessage()); - initCause(cause); - } - - /** - * Sets the inner cause for this exception. - * - * @param cause The inner cause. - * @return This object (for method chaining). - */ - @Override /* Throwable */ - public synchronized BeanRuntimeException initCause(Throwable cause) { - super.initCause(cause); - return this; - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$1.class deleted file mode 100755 index 6ff209f..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$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/ClassMeta$ClassCategory.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.class deleted file mode 100755 index 28f91ed..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta$ClassCategory.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/ClassMeta.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.class deleted file mode 100755 index 7e0e41a..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.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/ClassMeta.java ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java deleted file mode 100755 index a95bfdb..0000000 --- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/ClassMeta.java +++ /dev/null @@ -1,1262 +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 static com.ibm.juno.core.ClassMeta.ClassCategory.*; -import static com.ibm.juno.core.ClassMeta.ClassCategory.URI; -import static com.ibm.juno.core.utils.ClassUtils.*; - -import java.io.*; -import java.lang.reflect.*; -import java.lang.reflect.Proxy; -import java.net.*; -import java.net.URI; -import java.util.*; - -import com.ibm.juno.core.annotation.*; -import com.ibm.juno.core.filter.*; -import com.ibm.juno.core.filter.Filter; -import com.ibm.juno.core.html.*; -import com.ibm.juno.core.jena.*; -import com.ibm.juno.core.json.*; -import com.ibm.juno.core.urlencoding.*; -import com.ibm.juno.core.utils.*; -import com.ibm.juno.core.xml.*; - -/** - * A wrapper class around the {@link Class} object that provides cached information - * about that class. - * - * <p> - * Instances of this class can be created through the {@link BeanContext#getClassMeta(Class)} method. - * <p> - * The {@link BeanContext} class will cache and reuse instances of this class except for the following class types: - * <ul> - * <li>Arrays - * <li>Maps with non-Object key/values. - * <li>Collections with non-Object key/values. - * </ul> - * <p> - * This class is tied to the {@link BeanContext} class because it's that class that makes the determination - * of what is a bean. - * - * @author James Bognar ([email protected]) - * @param <T> The class type of the wrapped class. - */ -@Bean(properties={"innerClass","classCategory","elementType","keyType","valueType","notABeanReason","initException","beanMeta"}) -public final class ClassMeta<T> implements Type { - - /** Class categories. */ - enum ClassCategory { - MAP, COLLECTION, NUMBER, DECIMAL, BOOLEAN, CHAR, DATE, ARRAY, ENUM, BEAN, UNKNOWN, OTHER, CHARSEQ, STR, OBJ, URI, BEANMAP, READER, INPUTSTREAM - } - - final BeanContext beanContext; // The bean context that created this object. - ClassCategory classCategory = UNKNOWN; // The class category. - final Class<T> innerClass; // The class being wrapped. - ClassMeta<?> - filteredClassMeta, // The filtered class type (in class has filter associated with it. - elementType = null, // If ARRAY or COLLECTION, the element class type. - keyType = null, // If MAP, the key class type. - valueType = null; // If MAP, the value class type. - InvocationHandler invocationHandler; // The invocation handler for this class (if it has one). - volatile BeanMeta<T> beanMeta; // The bean meta for this bean class (if it's a bean). - Method valueOfMethod; // The static valueOf(String) or fromString(String) method (if it has one). - Constructor<? extends T> noArgConstructor; // The no-arg constructor for this class (if it has one). - Constructor<T> stringConstructor; // The X(String) constructor (if it has one). - Constructor<T> objectMapConstructor; // The X(ObjectMap) constructor (if it has one). - Method toObjectMapMethod; // The toObjectMap() method (if it has one). - Method namePropertyMethod; // The method to set the name on an object (if it has one). - Method parentPropertyMethod; // The method to set the parent on an object (if it has one). - String notABeanReason; // If this isn't a bean, the reason why. - PojoFilter<T,?> pojoFilter; // The object filter associated with this bean (if it has one). - BeanFilter<? extends T> beanFilter; // The bean filter associated with this bean (if it has one). - boolean - isDelegate, // True if this class extends Delegate. - isAbstract, // True if this class is abstract. - isMemberClass; // True if this is a non-static member class. - - private XmlClassMeta xmlMeta; // Class-related metadata from the @Xml annotation found on this class or parent class. - private JsonClassMeta jsonMeta; // Class-related metadata from the @Json annotation found on this class or parent class. - private HtmlClassMeta htmlMeta; // Class-related metadata from the @Html annotation found on this class or parent class. - private UrlEncodingClassMeta urlEncodingMeta; // Class-related metadata from the @UrlEncoding annotation found on this class or parent class. - private RdfClassMeta rdfMeta; // Class-related metadata from the @Rdf annotation found on this class or parent class. - - private Throwable initException; // Any exceptions thrown in the init() method. - private boolean hasChildPojoFilters; // True if this class or any subclass of this class has a PojoFilter associated with it. - private Object primitiveDefault; // Default value for primitive type classes. - private Map<String,Method> remoteableMethods, // Methods annotated with @Remoteable. Contains all public methods if class is annotated with @Remotable. - publicMethods; // All public methods, including static methods. - - private static final Boolean BOOLEAN_DEFAULT = false; - private static final Character CHARACTER_DEFAULT = (char)0; - private static final Short SHORT_DEFAULT = (short)0; - private static final Integer INTEGER_DEFAULT = 0; - private static final Long LONG_DEFAULT = 0l; - private static final Float FLOAT_DEFAULT = 0f; - private static final Double DOUBLE_DEFAULT = 0d; - private static final Byte BYTE_DEFAULT = (byte)0; - - /** - * Shortcut for calling <code>ClassMeta(innerClass, beanContext, <jk>false</jk>)</code>. - */ - ClassMeta(Class<T> innerClass, BeanContext beanContext) { - this(innerClass, beanContext, false); - } - - /** - * Construct a new {@code ClassMeta} based on the specified {@link Class}. - * - * @param innerClass The class being wrapped. - * @param beanContext The bean context that created this object. - * @param delayedInit Don't call init() in constructor. - * Used for delayed initialization when the possibility of class reference loops exist. - */ - ClassMeta(Class<T> innerClass, BeanContext beanContext, boolean delayedInit) { - this.innerClass = innerClass; - this.beanContext = beanContext; - if (! delayedInit) - init(); - } - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - ClassMeta init() { - - try { - Filter filter = findFilter(beanContext); - if (filter != null) { - if (filter.getType() == Filter.FilterType.BEAN) - beanFilter = (BeanFilter)filter; - else - pojoFilter = (PojoFilter)filter; - filteredClassMeta = (pojoFilter == null ? this : beanContext.getClassMeta(pojoFilter.getFilteredClass())); - } else { - filteredClassMeta = this; - } - - if (innerClass != Object.class) { - this.noArgConstructor = beanContext.getImplClassConstructor(innerClass, Visibility.PUBLIC); - if (noArgConstructor == null) - noArgConstructor = findNoArgConstructor(innerClass, Visibility.PUBLIC); - } - - this.hasChildPojoFilters = beanContext.hasChildPojoFilters(innerClass); - - this.xmlMeta = new XmlClassMeta(innerClass); - this.jsonMeta = new JsonClassMeta(innerClass); - this.htmlMeta = new HtmlClassMeta(innerClass); - this.urlEncodingMeta = new UrlEncodingClassMeta(innerClass); - this.rdfMeta = new RdfClassMeta(innerClass); - - Class c = innerClass; - - if (c.isPrimitive()) { - if (c == Boolean.TYPE) - classCategory = BOOLEAN; - else if (c == Byte.TYPE || c == Short.TYPE || c == Integer.TYPE || c == Long.TYPE || c == Float.TYPE || c == Double.TYPE) { - if (c == Float.TYPE || c == Double.TYPE) - classCategory = DECIMAL; - else - classCategory = NUMBER; - } - else if (c == Character.TYPE) - classCategory = CHAR; - } else { - if (isParentClass(Delegate.class, c)) - isDelegate = true; - if (c == Object.class) - classCategory = OBJ; - else if (c.isEnum()) - classCategory = ENUM; - else if (isParentClass(CharSequence.class, c)) { - if (c.equals(String.class)) - classCategory = STR; - else - classCategory = CHARSEQ; - } - else if (isParentClass(Number.class, c)) { - if (isParentClass(Float.class, c) || isParentClass(Double.class, c)) - classCategory = DECIMAL; - else - classCategory = NUMBER; - } - else if (isParentClass(Collection.class, c)) - classCategory = COLLECTION; - else if (isParentClass(Map.class, c)) { - if (isParentClass(BeanMap.class, c)) - classCategory = BEANMAP; - else - classCategory = MAP; - } - else if (c == Character.class) - classCategory = CHAR; - else if (c == Boolean.class) - classCategory = BOOLEAN; - else if (isParentClass(Date.class, c) || isParentClass(Calendar.class, c)) - classCategory = DATE; - else if (c.isArray()) - classCategory = ARRAY; - else if (isParentClass(URL.class, c) || isParentClass(URI.class, c) || c.isAnnotationPresent(com.ibm.juno.core.annotation.URI.class)) - classCategory = URI; - else if (isParentClass(Reader.class, c)) - classCategory = READER; - else if (isParentClass(InputStream.class, c)) - classCategory = INPUTSTREAM; - } - - isMemberClass = c.isMemberClass() && ! Modifier.isStatic(c.getModifiers()); - - // Find static fromString(String) or equivalent method. - // fromString() must be checked before valueOf() so that Enum classes can create their own - // specialized fromString() methods to override the behavior of Enum.valueOf(String). - // valueOf() is used by enums. - // parse() is used by the java logging Level class. - // forName() is used by Class and Charset - for (String methodName : new String[]{"fromString","valueOf","parse","parseString","forName"}) { - if (this.valueOfMethod == null) { - for (Method m : c.getMethods()) { - int mod = m.getModifiers(); - if (Modifier.isStatic(mod) && Modifier.isPublic(mod)) { - String mName = m.getName(); - if (mName.equals(methodName) && m.getReturnType() == innerClass) { - Class<?>[] args = m.getParameterTypes(); - if (args.length == 1 && args[0] == String.class) { - this.valueOfMethod = m; - break; - } - } - } - } - } - } - - // Find toObjectMap() method if present. - for (Method m : c.getMethods()) { - int mod = m.getModifiers(); - if (Modifier.isPublic(mod) && ! Modifier.isStatic(mod)) { - String mName = m.getName(); - if (mName.equals("toObjectMap")) { - if (m.getParameterTypes().length == 0 && m.getReturnType() == ObjectMap.class) { - this.toObjectMapMethod = m; - break; - } - } - } - } - - // Find @NameProperty and @ParentProperty methods if present. - for (Method m : c.getDeclaredMethods()) { - if (m.isAnnotationPresent(ParentProperty.class) && m.getParameterTypes().length == 1) { - m.setAccessible(true); - parentPropertyMethod = m; - } - if (m.isAnnotationPresent(NameProperty.class) && m.getParameterTypes().length == 1) { - m.setAccessible(true); - namePropertyMethod = m; - } - } - - // Find constructor(String) method if present. - for (Constructor cs : c.getConstructors()) { - int mod = cs.getModifiers(); - if (Modifier.isPublic(mod)) { - Class<?>[] args = cs.getParameterTypes(); - if (args.length == (isMemberClass ? 2 : 1)) { - Class<?> arg = args[(isMemberClass ? 1 : 0)]; - if (arg == String.class) - this.stringConstructor = cs; - else if (ObjectMap.class.isAssignableFrom(arg)) - this.objectMapConstructor = cs; - } - } - } - - // Note: Primitive types are normally abstract. - isAbstract = Modifier.isAbstract(c.getModifiers()) && ! isPrimitive(); - - // If this is an array, get the element type. - if (classCategory == ARRAY) - elementType = beanContext.getClassMeta(innerClass.getComponentType()); - - // If this is a MAP, see if it's parameterized (e.g. AddressBook extends HashMap<String,Person>) - else if (classCategory == MAP) { - ClassMeta[] parameters = beanContext.findParameters(innerClass, innerClass); - if (parameters != null && parameters.length == 2) { - keyType = parameters[0]; - valueType = parameters[1]; - } else { - keyType = beanContext.getClassMeta(Object.class); - valueType = beanContext.getClassMeta(Object.class); - } - } - - // If this is a COLLECTION, see if it's parameterized (e.g. AddressBook extends LinkedList<Person>) - else if (classCategory == COLLECTION) { - ClassMeta[] parameters = beanContext.findParameters(innerClass, innerClass); - if (parameters != null && parameters.length == 1) { - elementType = parameters[0]; - } else { - elementType = beanContext.getClassMeta(Object.class); - } - } - - // If the category is unknown, see if it's a bean. - // Note that this needs to be done after all other initialization has been done. - else if (classCategory == UNKNOWN) { - - BeanMeta newMeta = new BeanMeta(this, beanContext, beanFilter); - try { - notABeanReason = newMeta.init(); - } catch (RuntimeException e) { - notABeanReason = e.getMessage(); - throw e; - } - if (notABeanReason != null) - classCategory = OTHER; - else { - beanMeta = newMeta; - classCategory = BEAN; - } - } - - if (c.isPrimitive()) { - if (c == Boolean.TYPE) - primitiveDefault = BOOLEAN_DEFAULT; - else if (c == Character.TYPE) - primitiveDefault = CHARACTER_DEFAULT; - else if (c == Short.TYPE) - primitiveDefault = SHORT_DEFAULT; - else if (c == Integer.TYPE) - primitiveDefault = INTEGER_DEFAULT; - else if (c == Long.TYPE) - primitiveDefault = LONG_DEFAULT; - else if (c == Float.TYPE) - primitiveDefault = FLOAT_DEFAULT; - else if (c == Double.TYPE) - primitiveDefault = DOUBLE_DEFAULT; - else if (c == Byte.TYPE) - primitiveDefault = BYTE_DEFAULT; - } else { - if (c == Boolean.class) - primitiveDefault = BOOLEAN_DEFAULT; - else if (c == Character.class) - primitiveDefault = CHARACTER_DEFAULT; - else if (c == Short.class) - primitiveDefault = SHORT_DEFAULT; - else if (c == Integer.class) - primitiveDefault = INTEGER_DEFAULT; - else if (c == Long.class) - primitiveDefault = LONG_DEFAULT; - else if (c == Float.class) - primitiveDefault = FLOAT_DEFAULT; - else if (c == Double.class) - primitiveDefault = DOUBLE_DEFAULT; - else if (c == Byte.class) - primitiveDefault = BYTE_DEFAULT; - } - } catch (NoClassDefFoundError e) { - this.initException = e; - } catch (RuntimeException e) { - this.initException = e; - throw e; - } - - if (innerClass.getAnnotation(Remoteable.class) != null) { - remoteableMethods = getPublicMethods(); - } else { - for (Method m : innerClass.getMethods()) { - if (m.getAnnotation(Remoteable.class) != null) { - if (remoteableMethods == null) - remoteableMethods = new LinkedHashMap<String,Method>(); - remoteableMethods.put(ClassUtils.getMethodSignature(m), m); - } - } - } - if (remoteableMethods != null) - remoteableMethods = Collections.unmodifiableMap(remoteableMethods); - - return this; - } - - /** - * Returns the category of this class. - * - * @return The category of this class. - */ - public ClassCategory getClassCategory() { - return classCategory; - } - - /** - * Returns <jk>true</jk> if this class is a superclass of or the same as the specified class. - * - * @param c The comparison class. - * @return <jk>true</jk> if this class is a superclass of or the same as the specified class. - */ - public boolean isAssignableFrom(Class<?> c) { - return isParentClass(innerClass, c); - } - - /** - * Returns <jk>true</jk> if this class as subtypes defined through {@link Bean#subTypes} or {@link BeanFilter#getSubTypes()}. - * - * @return <jk>true</jk> if this class has subtypes. - */ - public boolean hasSubTypes() { - return beanFilter != null && beanFilter.getSubTypeProperty() != null; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of or the same as the specified class. - * - * @param c The comparison class. - * @return <jk>true</jk> if this class is a subclass of or the same as the specified class. - */ - public boolean isInstanceOf(Class<?> c) { - return isParentClass(c, innerClass); - } - - /** - * Returns <jk>true</jk> if this class or any child classes has a {@link PojoFilter} associated with it. - * <p> - * Used when filtering bean properties to prevent having to look up filters if we know for certain - * that no filters are associated with a bean property. - * - * @return <jk>true</jk> if this class or any child classes has a {@link PojoFilter} associated with it. - */ - public boolean hasChildPojoFilters() { - return hasChildPojoFilters; - } - - private Filter findFilter(BeanContext context) { - try { - com.ibm.juno.core.annotation.Filter b = innerClass.getAnnotation(com.ibm.juno.core.annotation.Filter.class); - if (b != null) { - Class<? extends Filter> c = b.value(); - if (c != Filter.NULL.class) { - Filter f = c.newInstance(); - f.setBeanContext(context); - return f; - } - } - if (context == null) - return null; - Filter f = context.findBeanFilter(innerClass); - if (f != null) - return f; - f = context.findPojoFilter(innerClass); - if (f != null) - return f; - List<Bean> ba = ReflectionUtils.findAnnotations(Bean.class, innerClass); - if (! ba.isEmpty()) - f = new AnnotationBeanFilter<T>(innerClass, ba); - return f; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Locates the no-arg constructor for the specified class. - * Constructor must match the visibility requirements specified by parameter 'v'. - * If class is abstract, always returns <jk>null</jk>. - * Note that this also returns the 1-arg constructor for non-static member classes. - * - * @param c The class from which to locate the no-arg constructor. - * @param v The minimum visibility. - * @return The constructor, or <jk>null</jk> if no no-arg constructor exists with the required visibility. - */ - @SuppressWarnings({"rawtypes","unchecked"}) - protected static <T> Constructor<? extends T> findNoArgConstructor(Class<T> c, Visibility v) { - int mod = c.getModifiers(); - if (Modifier.isAbstract(mod)) - return null; - boolean isMemberClass = c.isMemberClass() && ! Modifier.isStatic(mod); - for (Constructor cc : c.getConstructors()) { - mod = cc.getModifiers(); - if (cc.getParameterTypes().length == (isMemberClass ? 1 : 0) && v.isVisible(mod)) - return v.filter(cc); - } - return null; - } - - /** - * Set element type on non-cached <code>Collection</code> types. - * - * @param elementType The class type for elements in the collection class represented by this metadata. - * @return This object (for method chaining). - */ - protected ClassMeta<T> setElementType(ClassMeta<?> elementType) { - this.elementType = elementType; - return this; - } - - /** - * Set key type on non-cached <code>Map</code> types. - * - * @param keyType The class type for keys in the map class represented by this metadata. - * @return This object (for method chaining). - */ - protected ClassMeta<T> setKeyType(ClassMeta<?> keyType) { - this.keyType = keyType; - return this; - } - - /** - * Set value type on non-cached <code>Map</code> types. - * - * @param valueType The class type for values in the map class represented by this metadata. - * @return This object (for method chaining). - */ - protected ClassMeta<T> setValueType(ClassMeta<?> valueType) { - this.valueType = valueType; - return this; - } - - /** - * Returns the {@link Class} object that this class type wraps. - * - * @return The wrapped class object. - */ - public Class<T> getInnerClass() { - return innerClass; - } - - /** - * Returns the generalized form of this class if there is an {@link PojoFilter} associated with it. - * - * @return The filtered class type, or this object if no filter is associated with the class. - */ - @BeanIgnore - public ClassMeta<?> getFilteredClassMeta() { - return filteredClassMeta; - } - - /** - * For array and {@code Collection} types, returns the class type of the components of the array or {@code Collection}. - * - * @return The element class type, or <jk>null</jk> if this class is not an array or Collection. - */ - public ClassMeta<?> getElementType() { - return elementType; - } - - /** - * For {@code Map} types, returns the class type of the keys of the {@code Map}. - * - * @return The key class type, or <jk>null</jk> if this class is not a Map. - */ - public ClassMeta<?> getKeyType() { - return keyType; - } - - /** - * For {@code Map} types, returns the class type of the values of the {@code Map}. - * - * @return The value class type, or <jk>null</jk> if this class is not a Map. - */ - public ClassMeta<?> getValueType() { - return valueType; - } - - /** - * Returns <jk>true</jk> if this class implements {@link Delegate}, meaning - * it's a representation of some other object. - * - * @return <jk>true</jk> if this class implements {@link Delegate}. - */ - public boolean isDelegate() { - return isDelegate; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link Map}. - * - * @return <jk>true</jk> if this class is a subclass of {@link Map}. - */ - public boolean isMap() { - return classCategory == MAP || classCategory == BEANMAP; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link BeanMap}. - * - * @return <jk>true</jk> if this class is a subclass of {@link BeanMap}. - */ - public boolean isBeanMap() { - return classCategory == BEANMAP; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link Collection}. - * - * @return <jk>true</jk> if this class is a subclass of {@link Collection}. - */ - public boolean isCollection() { - return classCategory == COLLECTION; - } - - /** - * Returns <jk>true</jk> if this class is an {@link Enum}. - * - * @return <jk>true</jk> if this class is an {@link Enum}. - */ - public boolean isEnum() { - return classCategory == ENUM; - } - - /** - * Returns <jk>true</jk> if this class is an array. - * - * @return <jk>true</jk> if this class is an array. - */ - public boolean isArray() { - return classCategory == ARRAY; - } - - /** - * Returns <jk>true</jk> if this class is a bean. - * - * @return <jk>true</jk> if this class is a bean. - */ - public boolean isBean() { - return classCategory == BEAN; - } - - /** - * Returns <jk>true</jk> if this class is {@link Object}. - * - * @return <jk>true</jk> if this class is {@link Object}. - */ - public boolean isObject() { - return classCategory == OBJ; - } - - /** - * Returns <jk>true</jk> if this class is not {@link Object}. - * - * @return <jk>true</jk> if this class is not {@link Object}. - */ - public boolean isNotObject() { - return classCategory != OBJ; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link Number}. - * - * @return <jk>true</jk> if this class is a subclass of {@link Number}. - */ - public boolean isNumber() { - return classCategory == NUMBER || classCategory == DECIMAL; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link Float} or {@link Double}. - * - * @return <jk>true</jk> if this class is a subclass of {@link Float} or {@link Double}. - */ - public boolean isDecimal() { - return classCategory == DECIMAL; - } - - /** - * Returns <jk>true</jk> if this class is a {@link Boolean}. - * - * @return <jk>true</jk> if this class is a {@link Boolean}. - */ - public boolean isBoolean() { - return classCategory == BOOLEAN; - } - - /** - * Returns <jk>true</jk> if this class is a subclass of {@link CharSequence}. - * - * @return <jk>true</jk> if this class is a subclass of {@link CharSequence}. - */ - public boolean isCharSequence() { - return classCategory == STR || classCategory == CHARSEQ; - } - - /** - * Returns <jk>true</jk> if this class is a {@link String}. - * - * @return <jk>true</jk> if this class is a {@link String}. - */ - public boolean isString() { - return classCategory == STR; - } - - /** - * Returns <jk>true</jk> if this class is a {@link Character}. - * - * @return <jk>true</jk> if this class is a {@link Character}. - */ - public boolean isChar() { - return classCategory == CHAR; - } - - /** - * Returns <jk>true</jk> if this class is a primitive. - * - * @return <jk>true</jk> if this class is a primitive. - */ - public boolean isPrimitive() { - return innerClass.isPrimitive(); - } - - /** - * Returns <jk>true</jk> if this class is a {@link Date} or {@link Calendar}. - * - * @return <jk>true</jk> if this class is a {@link Date} or {@link Calendar}. - */ - public boolean isDate() { - return classCategory == DATE; - } - - /** - * Returns <jk>true</jk> if this class is a {@link URI} or {@link URL}. - * - * @return <jk>true</jk> if this class is a {@link URI} or {@link URL}. - */ - public boolean isUri() { - return classCategory == URI; - } - - /** - * Returns <jk>true</jk> if this class is a {@link Reader}. - * - * @return <jk>true</jk> if this class is a {@link Reader}. - */ - public boolean isReader() { - return classCategory == READER; - } - - /** - * Returns <jk>true</jk> if this class is an {@link InputStream}. - * - * @return <jk>true</jk> if this class is an {@link InputStream}. - */ - public boolean isInputStream() { - return classCategory == INPUTSTREAM; - } - - /** - * Returns <jk>true</jk> if instance of this object can be <jk>null</jk>. - * <p> - * Objects can be <jk>null</jk>, but primitives cannot, except for chars which can be represented - * by <code>(<jk>char</jk>)0</code>. - * - * @return <jk>true</jk> if instance of this class can be null. - */ - public boolean isNullable() { - if (innerClass.isPrimitive()) - return classCategory == CHAR; - return true; - } - - /** - * Returns <jk>true</jk> if this class or one of it's methods are annotated with {@link Remoteable @Remotable}. - * - * @return <jk>true</jk> if this class is remoteable. - */ - public boolean isRemoteable() { - return remoteableMethods != null; - } - - /** - * All methods on this class annotated with {@link Remoteable @Remotable}, or all public methods if class is annotated. - * Keys are method signatures (see {@link ClassUtils#getMethodSignature(Method)}) - * - * @return All remoteable methods on this class. - */ - public Map<String,Method> getRemoteableMethods() { - return remoteableMethods; - } - - /** - * All public methods on this class including static methods. - * Keys are method signatures (see {@link ClassUtils#getMethodSignature(Method)}). - * - * @return The public methods on this class. - */ - public Map<String,Method> getPublicMethods() { - if (publicMethods == null) { - synchronized(this) { - Map<String,Method> map = new LinkedHashMap<String,Method>(); - for (Method m : innerClass.getMethods()) - if (Modifier.isPublic(m.getModifiers())) - map.put(ClassUtils.getMethodSignature(m), m); - publicMethods = Collections.unmodifiableMap(map); - } - } - return publicMethods; - } - - /** - * Returns the {@link PojoFilter} associated with this class. - * - * @return The {@link PojoFilter} associated with this class, or <jk>null</jk> if there is no POJO filter - * associated with this class. - */ - public PojoFilter<T,?> getPojoFilter() { - return pojoFilter; - } - - /** - * Returns the {@link BeanMeta} associated with this class. - * - * @return The {@link BeanMeta} associated with this class, or <jk>null</jk> if there is no bean meta - * associated with this class. - */ - public BeanMeta<T> getBeanMeta() { - return beanMeta; - } - - /** - * Returns the no-arg constructor for this class. - * - * @return The no-arg constructor for this class, or <jk>null</jk> if it does not exist. - */ - public Constructor<? extends T> getConstructor() { - return noArgConstructor; - } - - /** - * Returns the <ja>@Xml</ja> annotation defined on this class, superclass, or interface of this class. - * - * @return XML metadata on this class. Never <jk>null</jk>. - */ - public XmlClassMeta getXmlMeta() { - return xmlMeta; - } - - /** - * Returns metadata from the <ja>@Json</ja> annotation defined on this class, superclass, or interface of this class. - * - * @return JSON metadata on this class. Never <jk>null</jk>. - */ - public JsonClassMeta getJsonMeta() { - return jsonMeta; - } - - /** - * Returns metadata from the <ja>@Html</ja> annotation defined on this class, superclass, or interface of this class. - * - * @return HTML metadata on this class. Never <jk>null</jk>. - */ - public HtmlClassMeta getHtmlMeta() { - return htmlMeta; - } - - /** - * Returns metadata from the <ja>@UrlEncoding</ja> annotation defined on this class, superclass, or interface of this class. - * - * @return URL-Encoding metadata on this class. Never <jk>null</jk>. - */ - public UrlEncodingClassMeta getUrlEncodingMeta() { - return urlEncodingMeta; - } - - /** - * Returns metadata from the <ja>@Rdf</ja> annotation defined on this class, superclass, or interface of this class. - * - * @return RDF metadata on this class. Never <jk>null</jk>. - */ - public RdfClassMeta getRdfMeta() { - return rdfMeta; - } - - /** - * Returns the interface proxy invocation handler for this class. - * - * @return The interface proxy invocation handler, or <jk>null</jk> if it does not exist. - */ - public InvocationHandler getProxyInvocationHandler() { - if (invocationHandler == null && beanMeta != null && beanContext.useInterfaceProxies && innerClass.isInterface()) - invocationHandler = new BeanProxyInvocationHandler<T>(beanMeta); - return invocationHandler; - } - - /** - * Returns <jk>true</jk> if this class has a no-arg constructor or invocation handler. - * - * @return <jk>true</jk> if a new instance of this class can be constructed. - */ - public boolean canCreateNewInstance() { - if (isMemberClass) - return false; - if (noArgConstructor != null) - return true; - if (getProxyInvocationHandler() != null) - return true; - if (isArray() && elementType.canCreateNewInstance()) - return true; - return false; - } - - /** - * Returns <jk>true</jk> if this class has a no-arg constructor or invocation handler. - * Returns <jk>false</jk> if this is a non-static member class and the outer object does not match - * the class type of the defining class. - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @return <jk>true</jk> if a new instance of this class can be created within the context of the specified outer object. - */ - public boolean canCreateNewInstance(Object outer) { - if (isMemberClass) - return outer != null && noArgConstructor != null && noArgConstructor.getParameterTypes()[0] == outer.getClass(); - return canCreateNewInstance(); - } - - /** - * Returns <jk>true</jk> if this class can be instantiated as a bean. - * Returns <jk>false</jk> if this is a non-static member class and the outer object does not match - * the class type of the defining class. - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @return <jk>true</jk> if a new instance of this bean can be created within the context of the specified outer object. - */ - public boolean canCreateNewBean(Object outer) { - if (beanMeta == null) - return false; - // Beans with filters with subtype properties are assumed to be constructable. - if (beanFilter != null && beanFilter.getSubTypeProperty() != null) - return true; - if (beanMeta.constructor == null) - return false; - if (isMemberClass) - return outer != null && beanMeta.constructor.getParameterTypes()[0] == outer.getClass(); - return true; - } - - /** - * Returns <jk>true</jk> if this class can call the {@link #newInstanceFromString(Object, String)} method. - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @return <jk>true</jk> if this class has a no-arg constructor or invocation handler. - */ - public boolean canCreateNewInstanceFromString(Object outer) { - if (valueOfMethod != null) - return true; - if (stringConstructor != null) { - if (isMemberClass) - return outer != null && stringConstructor.getParameterTypes()[0] == outer.getClass(); - return true; - } - return false; - } - - /** - * Returns <jk>true</jk> if this class can call the {@link #newInstanceFromString(Object, String)} method. - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @return <jk>true</jk> if this class has a no-arg constructor or invocation handler. - */ - public boolean canCreateNewInstanceFromObjectMap(Object outer) { - if (objectMapConstructor != null) { - if (isMemberClass) - return outer != null && objectMapConstructor.getParameterTypes()[0] == outer.getClass(); - return true; - } - return false; - } - - /** - * Returns <jk>true</jk> if this class has an <code>ObjectMap toObjectMap()</code> method. - * - * @return <jk>true</jk> if class has a <code>toObjectMap()</code> method. - */ - public boolean hasToObjectMapMethod() { - return toObjectMapMethod != null; - } - - /** - * Returns the method annotated with {@link NameProperty @NameProperty}. - * - * @return The method annotated with {@link NameProperty @NameProperty} or <jk>null</jk> if method does not exist. - */ - public Method getNameProperty() { - return namePropertyMethod; - } - - /** - * Returns the method annotated with {@link ParentProperty @ParentProperty}. - * - * @return The method annotated with {@link ParentProperty @ParentProperty} or <jk>null</jk> if method does not exist. - */ - public Method getParentProperty() { - return parentPropertyMethod; - } - - /** - * Converts an instance of this class to an {@link ObjectMap}. - * - * @param t The object to convert to a map. - * @return The converted object, or <jk>null</jk> if method does not have a <code>toObjectMap()</code> method. - * @throws BeanRuntimeException Thrown by <code>toObjectMap()</code> method invocation. - */ - public ObjectMap toObjectMap(Object t) throws BeanRuntimeException { - try { - if (toObjectMapMethod != null) - return (ObjectMap)toObjectMapMethod.invoke(t); - return null; - } catch (Exception e) { - throw new BeanRuntimeException(e); - } - } - - /** - * Returns the reason why this class is not a bean, or <jk>null</jk> if it is a bean. - * - * @return The reason why this class is not a bean, or <jk>null</jk> if it is a bean. - */ - public synchronized String getNotABeanReason() { - return notABeanReason; - } - - /** - * Returns <jk>true</jk> if this class is abstract. - * @return <jk>true</jk> if this class is abstract. - */ - public boolean isAbstract() { - return isAbstract; - } - - /** - * Returns any exception that was throw in the <code>init()</code> method. - * - * @return The cached exception. - */ - public Throwable getInitException() { - return initException; - } - - /** - * Returns the {@link BeanContext} that created this object. - * - * @return The bean context. - */ - public BeanContext getBeanContext() { - return beanContext; - } - - /** - * Returns the default value for primitives such as <jk>int</jk> or <jk>Integer</jk>. - * - * @return The default value, or <jk>null</jk> if this class type is not a primitive. - */ - @SuppressWarnings("unchecked") - public T getPrimitiveDefault() { - return (T)primitiveDefault; - } - - /** - * Create a new instance of the main class of this declared type from a <code>String</code> input. - * <p> - * In order to use this method, the class must have one of the following methods: - * <ul> - * <li><code><jk>public static</jk> T valueOf(String in);</code> - * <li><code><jk>public static</jk> T fromString(String in);</code> - * <li><code><jk>public</jk> T(String in);</code> - * </ul> - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @param arg The input argument value. - * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object. - * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible. - * @throws IllegalArgumentException If the parameter type on the method was invalid. - * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class, or - * does not have one of the methods described above. - * @throws InvocationTargetException If the underlying constructor throws an exception. - */ - @SuppressWarnings("unchecked") - public T newInstanceFromString(Object outer, String arg) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException { - Method m = valueOfMethod; - if (m != null) - return (T)m.invoke(null, arg); - Constructor<T> c = stringConstructor; - if (c != null) { - if (isMemberClass) - return c.newInstance(outer, arg); - return c.newInstance(arg); - } - throw new InstantiationError("No string constructor or valueOf(String) method found for class '"+getInnerClass().getName()+"'"); - } - - /** - * Create a new instance of the main class of this declared type from an <code>ObjectMap</code> input. - * <p> - * In order to use this method, the class must have one of the following methods: - * <ul> - * <li><code><jk>public</jk> T(ObjectMap in);</code> - * </ul> - * - * @param outer The outer class object for non-static member classes. Can be <jk>null</jk> for non-member or static classes. - * @param arg The input argument value. - * @return A new instance of the object. - * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible. - * @throws IllegalArgumentException If the parameter type on the method was invalid. - * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class, or - * does not have one of the methods described above. - * @throws InvocationTargetException If the underlying constructor throws an exception. - */ - public T newInstanceFromObjectMap(Object outer, ObjectMap arg) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException { - Constructor<T> c = objectMapConstructor; - if (c != null) { - if (isMemberClass) - return c.newInstance(outer, arg); - return c.newInstance(arg); - } - throw new InstantiationError("No map constructor method found for class '"+getInnerClass().getName()+"'"); - } - - /** - * Create a new instance of the main class of this declared type. - * - * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object. - * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible. - * @throws IllegalArgumentException If one of the following occurs: - * <ul> - * <li>The number of actual and formal parameters differ. - * <li>An unwrapping conversion for primitive arguments fails. - * <li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion. - * <li>The constructor pertains to an enum type. - * </ul> - * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class. - * @throws InvocationTargetException If the underlying constructor throws an exception. - */ - @SuppressWarnings("unchecked") - public T newInstance() throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { - if (isArray()) - return (T)Array.newInstance(getInnerClass().getComponentType(), 0); - Constructor<? extends T> c = getConstructor(); - if (c != null) - return c.newInstance((Object[])null); - InvocationHandler h = getProxyInvocationHandler(); - if (h != null) - return (T)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { getInnerClass(), java.io.Serializable.class }, h); - if (isArray()) - return (T)Array.newInstance(this.elementType.innerClass,0); - return null; - } - - /** - * Same as {@link #newInstance()} except for instantiating non-static member classes. - * - * @param outer The instance of the owning object of the member class instance. Can be <jk>null</jk> if instantiating a non-member or static class. - * @return A new instance of the object, or <jk>null</jk> if there is no no-arg constructor on the object. - * @throws IllegalAccessException If the <code>Constructor</code> object enforces Java language access control and the underlying constructor is inaccessible. - * @throws IllegalArgumentException If one of the following occurs: - * <ul> - * <li>The number of actual and formal parameters differ. - * <li>An unwrapping conversion for primitive arguments fails. - * <li>A parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion. - * <li>The constructor pertains to an enum type. - * </ul> - * @throws InstantiationException If the class that declares the underlying constructor represents an abstract class. - * @throws InvocationTargetException If the underlying constructor throws an exception. - */ - public T newInstance(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { - if (isMemberClass) - return noArgConstructor.newInstance(outer); - return newInstance(); - } - - /** - * Checks to see if the specified class type is the same as this one. - * - * @param t The specified class type. - * @return <jk>true</jk> if the specified class type is the same as the class for this type. - */ - @Override /* Object */ - public boolean equals(Object t) { - if (t == null || ! (t instanceof ClassMeta)) - return false; - ClassMeta<?> t2 = (ClassMeta<?>)t; - return t2.getInnerClass() == this.getInnerClass(); - } - - @Override /* Object */ - public String toString() { - return toString(false); - } - - /** - * Same as {@link #toString()} except use simple class names. - * - * @param simple Print simple class names only (no package). - * @return A new string. - */ - public String toString(boolean simple) { - return toString(new StringBuilder(), simple).toString(); - } - - /** - * Appends this object as a readable string to the specified string builder. - * - * @param sb The string builder to append this object to. - * @param simple Print simple class names only (no package). - * @return The same string builder passed in (for method chaining). - */ - protected StringBuilder toString(StringBuilder sb, boolean simple) { - String name = innerClass.getName(); - if (simple) { - int i = name.lastIndexOf('.'); - name = name.substring(i == -1 ? 0 : i+1).replace('$', '.'); - } - switch(classCategory) { - case ARRAY: - return elementType.toString(sb, simple).append('[').append(']'); - case MAP: - return sb.append(name).append(keyType.isObject() && valueType.isObject() ? "" : "<"+keyType.toString(simple)+","+valueType.toString(simple)+">"); - case BEANMAP: - return sb.append(BeanMap.class.getName()).append("<").append(name).append(">"); - case COLLECTION: - return sb.append(name).append(elementType.isObject() ? "" : "<"+elementType.toString(simple)+">"); - case OTHER: - if (simple) - return sb.append(name); - sb.append("OTHER-").append(name).append(",notABeanReason=").append(notABeanReason); - if (initException != null) - sb.append(",initException=").append(initException); - return sb; - default: - return sb.append(name); - } - } - - /** - * Returns <jk>true</jk> if the specified object is an instance of this class. - * This is a simple comparison on the base class itself and not on - * any generic parameters. - * - * @param o The object to check. - * @return <jk>true</jk> if the specified object is an instance of this class. - */ - public boolean isInstance(Object o) { - if (o != null) - return ClassUtils.isParentClass(this.innerClass, o.getClass()); - return false; - } - - /** - * Returns a readable name for this class (e.g. <js>"java.lang.String"</js>, <js>"boolean[]"</js>). - * - * @return The readable name for this class. - */ - public String getReadableName() { - return ClassUtils.getReadableClassName(this.innerClass); - } - - @Override /* Object */ - public int hashCode() { - return super.hashCode(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class ---------------------------------------------------------------------- diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class deleted file mode 100755 index 44730ed..0000000 Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/CoreApi.class and /dev/null differ
