http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/5f11cb85/content/site/apidocs/src-html/org/apache/juneau/BeanMeta.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/BeanMeta.html b/content/site/apidocs/src-html/org/apache/juneau/BeanMeta.html index befee42..22b31d7 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/BeanMeta.html +++ b/content/site/apidocs/src-html/org/apache/juneau/BeanMeta.html @@ -219,7 +219,7 @@ <span class="sourceLineNo">211</span> if (constructor != null)<a name="line.211"></a> <span class="sourceLineNo">212</span> throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found.");<a name="line.212"></a> <span class="sourceLineNo">213</span> constructor = (Constructor<T>)x;<a name="line.213"></a> -<span class="sourceLineNo">214</span> constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties(), ',');<a name="line.214"></a> +<span class="sourceLineNo">214</span> constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties());<a name="line.214"></a> <span class="sourceLineNo">215</span> if (constructorArgs.length != x.getParameterTypes().length)<a name="line.215"></a> <span class="sourceLineNo">216</span> throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor.");<a name="line.216"></a> <span class="sourceLineNo">217</span> if (! setAccessible(constructor))<a name="line.217"></a> @@ -449,7 +449,7 @@ <span class="sourceLineNo">441</span> if (! name.isEmpty()) {<a name="line.441"></a> <span class="sourceLineNo">442</span> if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.442"></a> <span class="sourceLineNo">443</span> return name;<a name="line.443"></a> -<span class="sourceLineNo">444</span> throw new BeanRuntimeException(classMeta.getInnerClass(), "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", name);<a name="line.444"></a> +<span class="sourceLineNo">444</span> return null; // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties.<a name="line.444"></a> <span class="sourceLineNo">445</span> }<a name="line.445"></a> <span class="sourceLineNo">446</span> name = propertyNamer.getPropertyName(f.getName());<a name="line.446"></a> <span class="sourceLineNo">447</span> if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.447"></a> @@ -612,198 +612,199 @@ <span class="sourceLineNo">604</span> n = bpName;<a name="line.604"></a> <span class="sourceLineNo">605</span> if (! fixedBeanProps.isEmpty())<a name="line.605"></a> <span class="sourceLineNo">606</span> if (! fixedBeanProps.contains(n))<a name="line.606"></a> -<span class="sourceLineNo">607</span> throw new BeanRuntimeException(c, "Method property ''{0}'' identified in @BeanProperty, but missing from @Bean", n);<a name="line.607"></a> +<span class="sourceLineNo">607</span> n = null; // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties<a name="line.607"></a> <span class="sourceLineNo">608</span> }<a name="line.608"></a> -<span class="sourceLineNo">609</span> l.add(new BeanMethod(n, isSetter, m));<a name="line.609"></a> -<span class="sourceLineNo">610</span> }<a name="line.610"></a> -<span class="sourceLineNo">611</span> }<a name="line.611"></a> -<span class="sourceLineNo">612</span> }<a name="line.612"></a> -<span class="sourceLineNo">613</span> return l;<a name="line.613"></a> -<span class="sourceLineNo">614</span> }<a name="line.614"></a> -<span class="sourceLineNo">615</span><a name="line.615"></a> -<span class="sourceLineNo">616</span> private static Collection<Field> findBeanFields(Class<?> c, Class<?> stopClass, Visibility v) {<a name="line.616"></a> -<span class="sourceLineNo">617</span> List<Field> l = new LinkedList<Field>();<a name="line.617"></a> -<span class="sourceLineNo">618</span> for (Class<?> c2 : findClasses(c, stopClass)) {<a name="line.618"></a> -<span class="sourceLineNo">619</span> for (Field f : c2.getDeclaredFields()) {<a name="line.619"></a> -<span class="sourceLineNo">620</span> int m = f.getModifiers();<a name="line.620"></a> -<span class="sourceLineNo">621</span> if (Modifier.isStatic(m) || Modifier.isTransient(m))<a name="line.621"></a> -<span class="sourceLineNo">622</span> continue;<a name="line.622"></a> -<span class="sourceLineNo">623</span> if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.623"></a> -<span class="sourceLineNo">624</span> continue;<a name="line.624"></a> -<span class="sourceLineNo">625</span> if (! (v.isVisible(f) || f.isAnnotationPresent(BeanProperty.class)))<a name="line.625"></a> -<span class="sourceLineNo">626</span> continue;<a name="line.626"></a> -<span class="sourceLineNo">627</span> l.add(f);<a name="line.627"></a> -<span class="sourceLineNo">628</span> }<a name="line.628"></a> -<span class="sourceLineNo">629</span> }<a name="line.629"></a> -<span class="sourceLineNo">630</span> return l;<a name="line.630"></a> -<span class="sourceLineNo">631</span> }<a name="line.631"></a> -<span class="sourceLineNo">632</span><a name="line.632"></a> -<span class="sourceLineNo">633</span> private static List<Class<?>> findClasses(Class<?> c, Class<?> stopClass) {<a name="line.633"></a> -<span class="sourceLineNo">634</span> LinkedList<Class<?>> l = new LinkedList<Class<?>>();<a name="line.634"></a> -<span class="sourceLineNo">635</span> findClasses(c, l, stopClass);<a name="line.635"></a> -<span class="sourceLineNo">636</span> return l;<a name="line.636"></a> -<span class="sourceLineNo">637</span> }<a name="line.637"></a> -<span class="sourceLineNo">638</span><a name="line.638"></a> -<span class="sourceLineNo">639</span> private static void findClasses(Class<?> c, LinkedList<Class<?>> l, Class<?> stopClass) {<a name="line.639"></a> -<span class="sourceLineNo">640</span> while (c != null && stopClass != c) {<a name="line.640"></a> -<span class="sourceLineNo">641</span> l.addFirst(c);<a name="line.641"></a> -<span class="sourceLineNo">642</span> for (Class<?> ci : c.getInterfaces())<a name="line.642"></a> -<span class="sourceLineNo">643</span> findClasses(ci, l, stopClass);<a name="line.643"></a> -<span class="sourceLineNo">644</span> c = c.getSuperclass();<a name="line.644"></a> -<span class="sourceLineNo">645</span> }<a name="line.645"></a> -<span class="sourceLineNo">646</span> }<a name="line.646"></a> -<span class="sourceLineNo">647</span><a name="line.647"></a> -<span class="sourceLineNo">648</span> /**<a name="line.648"></a> -<span class="sourceLineNo">649</span> * Returns the metadata on all properties associated with this bean.<a name="line.649"></a> -<span class="sourceLineNo">650</span> *<a name="line.650"></a> -<span class="sourceLineNo">651</span> * @return Metadata on all properties associated with this bean.<a name="line.651"></a> -<span class="sourceLineNo">652</span> */<a name="line.652"></a> -<span class="sourceLineNo">653</span> public Collection<BeanPropertyMeta> getPropertyMetas() {<a name="line.653"></a> -<span class="sourceLineNo">654</span> return this.properties.values();<a name="line.654"></a> -<span class="sourceLineNo">655</span> }<a name="line.655"></a> -<span class="sourceLineNo">656</span><a name="line.656"></a> -<span class="sourceLineNo">657</span> /**<a name="line.657"></a> -<span class="sourceLineNo">658</span> * Returns the metadata on the specified list of properties.<a name="line.658"></a> -<span class="sourceLineNo">659</span> *<a name="line.659"></a> -<span class="sourceLineNo">660</span> * @param pNames The list of properties to retrieve. If <jk>null</jk>, returns all properties.<a name="line.660"></a> -<span class="sourceLineNo">661</span> * @return The metadata on the specified list of properties.<a name="line.661"></a> -<span class="sourceLineNo">662</span> */<a name="line.662"></a> -<span class="sourceLineNo">663</span> public Collection<BeanPropertyMeta> getPropertyMetas(final String...pNames) {<a name="line.663"></a> -<span class="sourceLineNo">664</span> if (pNames == null)<a name="line.664"></a> -<span class="sourceLineNo">665</span> return getPropertyMetas();<a name="line.665"></a> -<span class="sourceLineNo">666</span> List<BeanPropertyMeta> l = new ArrayList<BeanPropertyMeta>(pNames.length);<a name="line.666"></a> -<span class="sourceLineNo">667</span> for (int i = 0; i < pNames.length; i++)<a name="line.667"></a> -<span class="sourceLineNo">668</span> l.add(getPropertyMeta(pNames[i]));<a name="line.668"></a> -<span class="sourceLineNo">669</span> return l;<a name="line.669"></a> -<span class="sourceLineNo">670</span> }<a name="line.670"></a> -<span class="sourceLineNo">671</span><a name="line.671"></a> -<span class="sourceLineNo">672</span> /**<a name="line.672"></a> -<span class="sourceLineNo">673</span> * Returns the language-specified extended metadata on this bean class.<a name="line.673"></a> -<span class="sourceLineNo">674</span> *<a name="line.674"></a> -<span class="sourceLineNo">675</span> * @param metaDataClass The name of the metadata class to create.<a name="line.675"></a> -<span class="sourceLineNo">676</span> * @return Extended metadata on this bean class. Never <jk>null</jk>.<a name="line.676"></a> -<span class="sourceLineNo">677</span> */<a name="line.677"></a> -<span class="sourceLineNo">678</span> public <M extends BeanMetaExtended> M getExtendedMeta(Class<M> metaDataClass) {<a name="line.678"></a> -<span class="sourceLineNo">679</span> return extMeta.get(metaDataClass, this);<a name="line.679"></a> -<span class="sourceLineNo">680</span> }<a name="line.680"></a> -<span class="sourceLineNo">681</span><a name="line.681"></a> -<span class="sourceLineNo">682</span> /**<a name="line.682"></a> -<span class="sourceLineNo">683</span> * Returns metadata about the specified property.<a name="line.683"></a> -<span class="sourceLineNo">684</span> *<a name="line.684"></a> -<span class="sourceLineNo">685</span> * @param name The name of the property on this bean.<a name="line.685"></a> -<span class="sourceLineNo">686</span> * @return The metadata about the property, or <jk>null</jk> if no such property exists<a name="line.686"></a> -<span class="sourceLineNo">687</span> * on this bean.<a name="line.687"></a> -<span class="sourceLineNo">688</span> */<a name="line.688"></a> -<span class="sourceLineNo">689</span> public BeanPropertyMeta getPropertyMeta(String name) {<a name="line.689"></a> -<span class="sourceLineNo">690</span> BeanPropertyMeta bpm = properties.get(name);<a name="line.690"></a> -<span class="sourceLineNo">691</span> if (bpm == null)<a name="line.691"></a> -<span class="sourceLineNo">692</span> bpm = dynaProperty;<a name="line.692"></a> -<span class="sourceLineNo">693</span> return bpm;<a name="line.693"></a> -<span class="sourceLineNo">694</span> }<a name="line.694"></a> -<span class="sourceLineNo">695</span><a name="line.695"></a> -<span class="sourceLineNo">696</span> /**<a name="line.696"></a> -<span class="sourceLineNo">697</span> * Creates a new instance of this bean.<a name="line.697"></a> -<span class="sourceLineNo">698</span> *<a name="line.698"></a> -<span class="sourceLineNo">699</span> * @param outer The outer object if bean class is a non-static inner member class.<a name="line.699"></a> -<span class="sourceLineNo">700</span> * @return A new instance of this bean if possible, or <jk>null</jk> if not.<a name="line.700"></a> -<span class="sourceLineNo">701</span> * @throws IllegalArgumentException Thrown by constructor.<a name="line.701"></a> -<span class="sourceLineNo">702</span> * @throws InstantiationException Thrown by constructor.<a name="line.702"></a> -<span class="sourceLineNo">703</span> * @throws IllegalAccessException Thrown by constructor.<a name="line.703"></a> -<span class="sourceLineNo">704</span> * @throws InvocationTargetException Thrown by constructor.<a name="line.704"></a> -<span class="sourceLineNo">705</span> */<a name="line.705"></a> -<span class="sourceLineNo">706</span> @SuppressWarnings("unchecked")<a name="line.706"></a> -<span class="sourceLineNo">707</span> protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {<a name="line.707"></a> -<span class="sourceLineNo">708</span> if (classMeta.isMemberClass()) {<a name="line.708"></a> -<span class="sourceLineNo">709</span> if (constructor != null)<a name="line.709"></a> -<span class="sourceLineNo">710</span> return constructor.newInstance(outer);<a name="line.710"></a> -<span class="sourceLineNo">711</span> } else {<a name="line.711"></a> -<span class="sourceLineNo">712</span> if (constructor != null)<a name="line.712"></a> -<span class="sourceLineNo">713</span> return constructor.newInstance((Object[])null);<a name="line.713"></a> -<span class="sourceLineNo">714</span> InvocationHandler h = classMeta.getProxyInvocationHandler();<a name="line.714"></a> -<span class="sourceLineNo">715</span> if (h != null) {<a name="line.715"></a> -<span class="sourceLineNo">716</span> ClassLoader cl = classMeta.getBeanContext().classLoader;<a name="line.716"></a> -<span class="sourceLineNo">717</span> if (cl == null)<a name="line.717"></a> -<span class="sourceLineNo">718</span> cl = this.getClass().getClassLoader();<a name="line.718"></a> -<span class="sourceLineNo">719</span> return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h);<a name="line.719"></a> -<span class="sourceLineNo">720</span> }<a name="line.720"></a> -<span class="sourceLineNo">721</span> }<a name="line.721"></a> -<span class="sourceLineNo">722</span> return null;<a name="line.722"></a> -<span class="sourceLineNo">723</span> }<a name="line.723"></a> -<span class="sourceLineNo">724</span><a name="line.724"></a> -<span class="sourceLineNo">725</span> /**<a name="line.725"></a> -<span class="sourceLineNo">726</span> * Recursively determines the classes represented by parameterized types in the class hierarchy of<a name="line.726"></a> -<span class="sourceLineNo">727</span> * the specified type, and puts the results in the specified map.<br><a name="line.727"></a> -<span class="sourceLineNo">728</span> * <p><a name="line.728"></a> -<span class="sourceLineNo">729</span> * For example, given the following classes...<a name="line.729"></a> -<span class="sourceLineNo">730</span> * <p class='bcode'><a name="line.730"></a> -<span class="sourceLineNo">731</span> * public static class BeanA&lt;T> {<a name="line.731"></a> -<span class="sourceLineNo">732</span> * public T x;<a name="line.732"></a> -<span class="sourceLineNo">733</span> * }<a name="line.733"></a> -<span class="sourceLineNo">734</span> * public static class BeanB extends BeanA&lt;Integer>} {...}<a name="line.734"></a> -<span class="sourceLineNo">735</span> * <p><a name="line.735"></a> -<span class="sourceLineNo">736</span> * ...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating<a name="line.736"></a> -<span class="sourceLineNo">737</span> * that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}:<a name="line.737"></a> -<span class="sourceLineNo">738</span> * <p class='bcode'><a name="line.738"></a> -<span class="sourceLineNo">739</span> * {BeanA.class:[Integer.class]}<a name="line.739"></a> -<span class="sourceLineNo">740</span> * <p><a name="line.740"></a> -<span class="sourceLineNo">741</span> * TODO: This code doesn't currently properly handle the following situation:<a name="line.741"></a> -<span class="sourceLineNo">742</span> * <p class='bcode'><a name="line.742"></a> -<span class="sourceLineNo">743</span> * public static class BeanB&ltT extends Number> extends BeanA&ltT>;<a name="line.743"></a> -<span class="sourceLineNo">744</span> * public static class BeanC extends BeanB&ltInteger>;<a name="line.744"></a> -<span class="sourceLineNo">745</span> * <p><a name="line.745"></a> -<span class="sourceLineNo">746</span> * When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<br><a name="line.746"></a> -<span class="sourceLineNo">747</span> * If anyone can figure out a better way of doing this, please do so!<a name="line.747"></a> -<span class="sourceLineNo">748</span> *<a name="line.748"></a> -<span class="sourceLineNo">749</span> * @param t The type we're recursing.<a name="line.749"></a> -<span class="sourceLineNo">750</span> * @param m Where the results are loaded.<a name="line.750"></a> -<span class="sourceLineNo">751</span> */<a name="line.751"></a> -<span class="sourceLineNo">752</span> private static void findTypeVarImpls(Type t, Map<Class<?>,Class<?>[]> m) {<a name="line.752"></a> -<span class="sourceLineNo">753</span> if (t instanceof Class) {<a name="line.753"></a> -<span class="sourceLineNo">754</span> Class<?> c = (Class<?>)t;<a name="line.754"></a> -<span class="sourceLineNo">755</span> findTypeVarImpls(c.getGenericSuperclass(), m);<a name="line.755"></a> -<span class="sourceLineNo">756</span> for (Type ci : c.getGenericInterfaces())<a name="line.756"></a> -<span class="sourceLineNo">757</span> findTypeVarImpls(ci, m);<a name="line.757"></a> -<span class="sourceLineNo">758</span> } else if (t instanceof ParameterizedType) {<a name="line.758"></a> -<span class="sourceLineNo">759</span> ParameterizedType pt = (ParameterizedType)t;<a name="line.759"></a> -<span class="sourceLineNo">760</span> Type rt = pt.getRawType();<a name="line.760"></a> -<span class="sourceLineNo">761</span> if (rt instanceof Class) {<a name="line.761"></a> -<span class="sourceLineNo">762</span> Type[] gImpls = pt.getActualTypeArguments();<a name="line.762"></a> -<span class="sourceLineNo">763</span> Class<?>[] gTypes = new Class[gImpls.length];<a name="line.763"></a> -<span class="sourceLineNo">764</span> for (int i = 0; i < gImpls.length; i++) {<a name="line.764"></a> -<span class="sourceLineNo">765</span> Type gt = gImpls[i];<a name="line.765"></a> -<span class="sourceLineNo">766</span> if (gt instanceof Class)<a name="line.766"></a> -<span class="sourceLineNo">767</span> gTypes[i] = (Class<?>)gt;<a name="line.767"></a> -<span class="sourceLineNo">768</span> else if (gt instanceof TypeVariable) {<a name="line.768"></a> -<span class="sourceLineNo">769</span> TypeVariable<?> tv = (TypeVariable<?>)gt;<a name="line.769"></a> -<span class="sourceLineNo">770</span> for (Type upperBound : tv.getBounds())<a name="line.770"></a> -<span class="sourceLineNo">771</span> if (upperBound instanceof Class)<a name="line.771"></a> -<span class="sourceLineNo">772</span> gTypes[i] = (Class<?>)upperBound;<a name="line.772"></a> -<span class="sourceLineNo">773</span> }<a name="line.773"></a> -<span class="sourceLineNo">774</span> }<a name="line.774"></a> -<span class="sourceLineNo">775</span> m.put((Class<?>)rt, gTypes);<a name="line.775"></a> -<span class="sourceLineNo">776</span> findTypeVarImpls(pt.getRawType(), m);<a name="line.776"></a> -<span class="sourceLineNo">777</span> }<a name="line.777"></a> -<span class="sourceLineNo">778</span> }<a name="line.778"></a> -<span class="sourceLineNo">779</span> }<a name="line.779"></a> -<span class="sourceLineNo">780</span><a name="line.780"></a> -<span class="sourceLineNo">781</span> private static String bpName(BeanProperty bp) {<a name="line.781"></a> -<span class="sourceLineNo">782</span> if (bp == null)<a name="line.782"></a> -<span class="sourceLineNo">783</span> return "";<a name="line.783"></a> -<span class="sourceLineNo">784</span> if (! bp.name().isEmpty())<a name="line.784"></a> -<span class="sourceLineNo">785</span> return bp.name();<a name="line.785"></a> -<span class="sourceLineNo">786</span> return bp.value();<a name="line.786"></a> -<span class="sourceLineNo">787</span> }<a name="line.787"></a> -<span class="sourceLineNo">788</span><a name="line.788"></a> -<span class="sourceLineNo">789</span> @Override /* Object */<a name="line.789"></a> -<span class="sourceLineNo">790</span> public String toString() {<a name="line.790"></a> -<span class="sourceLineNo">791</span> StringBuilder sb = new StringBuilder(c.getName());<a name="line.791"></a> -<span class="sourceLineNo">792</span> sb.append(" {\n");<a name="line.792"></a> -<span class="sourceLineNo">793</span> for (BeanPropertyMeta pm : this.properties.values())<a name="line.793"></a> -<span class="sourceLineNo">794</span> sb.append('\t').append(pm.toString()).append(",\n");<a name="line.794"></a> -<span class="sourceLineNo">795</span> sb.append('}');<a name="line.795"></a> -<span class="sourceLineNo">796</span> return sb.toString();<a name="line.796"></a> -<span class="sourceLineNo">797</span> }<a name="line.797"></a> -<span class="sourceLineNo">798</span>}<a name="line.798"></a> +<span class="sourceLineNo">609</span> if (n != null)<a name="line.609"></a> +<span class="sourceLineNo">610</span> l.add(new BeanMethod(n, isSetter, m));<a name="line.610"></a> +<span class="sourceLineNo">611</span> }<a name="line.611"></a> +<span class="sourceLineNo">612</span> }<a name="line.612"></a> +<span class="sourceLineNo">613</span> }<a name="line.613"></a> +<span class="sourceLineNo">614</span> return l;<a name="line.614"></a> +<span class="sourceLineNo">615</span> }<a name="line.615"></a> +<span class="sourceLineNo">616</span><a name="line.616"></a> +<span class="sourceLineNo">617</span> private static Collection<Field> findBeanFields(Class<?> c, Class<?> stopClass, Visibility v) {<a name="line.617"></a> +<span class="sourceLineNo">618</span> List<Field> l = new LinkedList<Field>();<a name="line.618"></a> +<span class="sourceLineNo">619</span> for (Class<?> c2 : findClasses(c, stopClass)) {<a name="line.619"></a> +<span class="sourceLineNo">620</span> for (Field f : c2.getDeclaredFields()) {<a name="line.620"></a> +<span class="sourceLineNo">621</span> int m = f.getModifiers();<a name="line.621"></a> +<span class="sourceLineNo">622</span> if (Modifier.isStatic(m) || Modifier.isTransient(m))<a name="line.622"></a> +<span class="sourceLineNo">623</span> continue;<a name="line.623"></a> +<span class="sourceLineNo">624</span> if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.624"></a> +<span class="sourceLineNo">625</span> continue;<a name="line.625"></a> +<span class="sourceLineNo">626</span> if (! (v.isVisible(f) || f.isAnnotationPresent(BeanProperty.class)))<a name="line.626"></a> +<span class="sourceLineNo">627</span> continue;<a name="line.627"></a> +<span class="sourceLineNo">628</span> l.add(f);<a name="line.628"></a> +<span class="sourceLineNo">629</span> }<a name="line.629"></a> +<span class="sourceLineNo">630</span> }<a name="line.630"></a> +<span class="sourceLineNo">631</span> return l;<a name="line.631"></a> +<span class="sourceLineNo">632</span> }<a name="line.632"></a> +<span class="sourceLineNo">633</span><a name="line.633"></a> +<span class="sourceLineNo">634</span> private static List<Class<?>> findClasses(Class<?> c, Class<?> stopClass) {<a name="line.634"></a> +<span class="sourceLineNo">635</span> LinkedList<Class<?>> l = new LinkedList<Class<?>>();<a name="line.635"></a> +<span class="sourceLineNo">636</span> findClasses(c, l, stopClass);<a name="line.636"></a> +<span class="sourceLineNo">637</span> return l;<a name="line.637"></a> +<span class="sourceLineNo">638</span> }<a name="line.638"></a> +<span class="sourceLineNo">639</span><a name="line.639"></a> +<span class="sourceLineNo">640</span> private static void findClasses(Class<?> c, LinkedList<Class<?>> l, Class<?> stopClass) {<a name="line.640"></a> +<span class="sourceLineNo">641</span> while (c != null && stopClass != c) {<a name="line.641"></a> +<span class="sourceLineNo">642</span> l.addFirst(c);<a name="line.642"></a> +<span class="sourceLineNo">643</span> for (Class<?> ci : c.getInterfaces())<a name="line.643"></a> +<span class="sourceLineNo">644</span> findClasses(ci, l, stopClass);<a name="line.644"></a> +<span class="sourceLineNo">645</span> c = c.getSuperclass();<a name="line.645"></a> +<span class="sourceLineNo">646</span> }<a name="line.646"></a> +<span class="sourceLineNo">647</span> }<a name="line.647"></a> +<span class="sourceLineNo">648</span><a name="line.648"></a> +<span class="sourceLineNo">649</span> /**<a name="line.649"></a> +<span class="sourceLineNo">650</span> * Returns the metadata on all properties associated with this bean.<a name="line.650"></a> +<span class="sourceLineNo">651</span> *<a name="line.651"></a> +<span class="sourceLineNo">652</span> * @return Metadata on all properties associated with this bean.<a name="line.652"></a> +<span class="sourceLineNo">653</span> */<a name="line.653"></a> +<span class="sourceLineNo">654</span> public Collection<BeanPropertyMeta> getPropertyMetas() {<a name="line.654"></a> +<span class="sourceLineNo">655</span> return this.properties.values();<a name="line.655"></a> +<span class="sourceLineNo">656</span> }<a name="line.656"></a> +<span class="sourceLineNo">657</span><a name="line.657"></a> +<span class="sourceLineNo">658</span> /**<a name="line.658"></a> +<span class="sourceLineNo">659</span> * Returns the metadata on the specified list of properties.<a name="line.659"></a> +<span class="sourceLineNo">660</span> *<a name="line.660"></a> +<span class="sourceLineNo">661</span> * @param pNames The list of properties to retrieve. If <jk>null</jk>, returns all properties.<a name="line.661"></a> +<span class="sourceLineNo">662</span> * @return The metadata on the specified list of properties.<a name="line.662"></a> +<span class="sourceLineNo">663</span> */<a name="line.663"></a> +<span class="sourceLineNo">664</span> public Collection<BeanPropertyMeta> getPropertyMetas(final String...pNames) {<a name="line.664"></a> +<span class="sourceLineNo">665</span> if (pNames == null)<a name="line.665"></a> +<span class="sourceLineNo">666</span> return getPropertyMetas();<a name="line.666"></a> +<span class="sourceLineNo">667</span> List<BeanPropertyMeta> l = new ArrayList<BeanPropertyMeta>(pNames.length);<a name="line.667"></a> +<span class="sourceLineNo">668</span> for (int i = 0; i < pNames.length; i++)<a name="line.668"></a> +<span class="sourceLineNo">669</span> l.add(getPropertyMeta(pNames[i]));<a name="line.669"></a> +<span class="sourceLineNo">670</span> return l;<a name="line.670"></a> +<span class="sourceLineNo">671</span> }<a name="line.671"></a> +<span class="sourceLineNo">672</span><a name="line.672"></a> +<span class="sourceLineNo">673</span> /**<a name="line.673"></a> +<span class="sourceLineNo">674</span> * Returns the language-specified extended metadata on this bean class.<a name="line.674"></a> +<span class="sourceLineNo">675</span> *<a name="line.675"></a> +<span class="sourceLineNo">676</span> * @param metaDataClass The name of the metadata class to create.<a name="line.676"></a> +<span class="sourceLineNo">677</span> * @return Extended metadata on this bean class. Never <jk>null</jk>.<a name="line.677"></a> +<span class="sourceLineNo">678</span> */<a name="line.678"></a> +<span class="sourceLineNo">679</span> public <M extends BeanMetaExtended> M getExtendedMeta(Class<M> metaDataClass) {<a name="line.679"></a> +<span class="sourceLineNo">680</span> return extMeta.get(metaDataClass, this);<a name="line.680"></a> +<span class="sourceLineNo">681</span> }<a name="line.681"></a> +<span class="sourceLineNo">682</span><a name="line.682"></a> +<span class="sourceLineNo">683</span> /**<a name="line.683"></a> +<span class="sourceLineNo">684</span> * Returns metadata about the specified property.<a name="line.684"></a> +<span class="sourceLineNo">685</span> *<a name="line.685"></a> +<span class="sourceLineNo">686</span> * @param name The name of the property on this bean.<a name="line.686"></a> +<span class="sourceLineNo">687</span> * @return The metadata about the property, or <jk>null</jk> if no such property exists<a name="line.687"></a> +<span class="sourceLineNo">688</span> * on this bean.<a name="line.688"></a> +<span class="sourceLineNo">689</span> */<a name="line.689"></a> +<span class="sourceLineNo">690</span> public BeanPropertyMeta getPropertyMeta(String name) {<a name="line.690"></a> +<span class="sourceLineNo">691</span> BeanPropertyMeta bpm = properties.get(name);<a name="line.691"></a> +<span class="sourceLineNo">692</span> if (bpm == null)<a name="line.692"></a> +<span class="sourceLineNo">693</span> bpm = dynaProperty;<a name="line.693"></a> +<span class="sourceLineNo">694</span> return bpm;<a name="line.694"></a> +<span class="sourceLineNo">695</span> }<a name="line.695"></a> +<span class="sourceLineNo">696</span><a name="line.696"></a> +<span class="sourceLineNo">697</span> /**<a name="line.697"></a> +<span class="sourceLineNo">698</span> * Creates a new instance of this bean.<a name="line.698"></a> +<span class="sourceLineNo">699</span> *<a name="line.699"></a> +<span class="sourceLineNo">700</span> * @param outer The outer object if bean class is a non-static inner member class.<a name="line.700"></a> +<span class="sourceLineNo">701</span> * @return A new instance of this bean if possible, or <jk>null</jk> if not.<a name="line.701"></a> +<span class="sourceLineNo">702</span> * @throws IllegalArgumentException Thrown by constructor.<a name="line.702"></a> +<span class="sourceLineNo">703</span> * @throws InstantiationException Thrown by constructor.<a name="line.703"></a> +<span class="sourceLineNo">704</span> * @throws IllegalAccessException Thrown by constructor.<a name="line.704"></a> +<span class="sourceLineNo">705</span> * @throws InvocationTargetException Thrown by constructor.<a name="line.705"></a> +<span class="sourceLineNo">706</span> */<a name="line.706"></a> +<span class="sourceLineNo">707</span> @SuppressWarnings("unchecked")<a name="line.707"></a> +<span class="sourceLineNo">708</span> protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {<a name="line.708"></a> +<span class="sourceLineNo">709</span> if (classMeta.isMemberClass()) {<a name="line.709"></a> +<span class="sourceLineNo">710</span> if (constructor != null)<a name="line.710"></a> +<span class="sourceLineNo">711</span> return constructor.newInstance(outer);<a name="line.711"></a> +<span class="sourceLineNo">712</span> } else {<a name="line.712"></a> +<span class="sourceLineNo">713</span> if (constructor != null)<a name="line.713"></a> +<span class="sourceLineNo">714</span> return constructor.newInstance((Object[])null);<a name="line.714"></a> +<span class="sourceLineNo">715</span> InvocationHandler h = classMeta.getProxyInvocationHandler();<a name="line.715"></a> +<span class="sourceLineNo">716</span> if (h != null) {<a name="line.716"></a> +<span class="sourceLineNo">717</span> ClassLoader cl = classMeta.getBeanContext().classLoader;<a name="line.717"></a> +<span class="sourceLineNo">718</span> if (cl == null)<a name="line.718"></a> +<span class="sourceLineNo">719</span> cl = this.getClass().getClassLoader();<a name="line.719"></a> +<span class="sourceLineNo">720</span> return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h);<a name="line.720"></a> +<span class="sourceLineNo">721</span> }<a name="line.721"></a> +<span class="sourceLineNo">722</span> }<a name="line.722"></a> +<span class="sourceLineNo">723</span> return null;<a name="line.723"></a> +<span class="sourceLineNo">724</span> }<a name="line.724"></a> +<span class="sourceLineNo">725</span><a name="line.725"></a> +<span class="sourceLineNo">726</span> /**<a name="line.726"></a> +<span class="sourceLineNo">727</span> * Recursively determines the classes represented by parameterized types in the class hierarchy of<a name="line.727"></a> +<span class="sourceLineNo">728</span> * the specified type, and puts the results in the specified map.<br><a name="line.728"></a> +<span class="sourceLineNo">729</span> * <p><a name="line.729"></a> +<span class="sourceLineNo">730</span> * For example, given the following classes...<a name="line.730"></a> +<span class="sourceLineNo">731</span> * <p class='bcode'><a name="line.731"></a> +<span class="sourceLineNo">732</span> * public static class BeanA&lt;T> {<a name="line.732"></a> +<span class="sourceLineNo">733</span> * public T x;<a name="line.733"></a> +<span class="sourceLineNo">734</span> * }<a name="line.734"></a> +<span class="sourceLineNo">735</span> * public static class BeanB extends BeanA&lt;Integer>} {...}<a name="line.735"></a> +<span class="sourceLineNo">736</span> * <p><a name="line.736"></a> +<span class="sourceLineNo">737</span> * ...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating<a name="line.737"></a> +<span class="sourceLineNo">738</span> * that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}:<a name="line.738"></a> +<span class="sourceLineNo">739</span> * <p class='bcode'><a name="line.739"></a> +<span class="sourceLineNo">740</span> * {BeanA.class:[Integer.class]}<a name="line.740"></a> +<span class="sourceLineNo">741</span> * <p><a name="line.741"></a> +<span class="sourceLineNo">742</span> * TODO: This code doesn't currently properly handle the following situation:<a name="line.742"></a> +<span class="sourceLineNo">743</span> * <p class='bcode'><a name="line.743"></a> +<span class="sourceLineNo">744</span> * public static class BeanB&ltT extends Number> extends BeanA&ltT>;<a name="line.744"></a> +<span class="sourceLineNo">745</span> * public static class BeanC extends BeanB&ltInteger>;<a name="line.745"></a> +<span class="sourceLineNo">746</span> * <p><a name="line.746"></a> +<span class="sourceLineNo">747</span> * When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<br><a name="line.747"></a> +<span class="sourceLineNo">748</span> * If anyone can figure out a better way of doing this, please do so!<a name="line.748"></a> +<span class="sourceLineNo">749</span> *<a name="line.749"></a> +<span class="sourceLineNo">750</span> * @param t The type we're recursing.<a name="line.750"></a> +<span class="sourceLineNo">751</span> * @param m Where the results are loaded.<a name="line.751"></a> +<span class="sourceLineNo">752</span> */<a name="line.752"></a> +<span class="sourceLineNo">753</span> private static void findTypeVarImpls(Type t, Map<Class<?>,Class<?>[]> m) {<a name="line.753"></a> +<span class="sourceLineNo">754</span> if (t instanceof Class) {<a name="line.754"></a> +<span class="sourceLineNo">755</span> Class<?> c = (Class<?>)t;<a name="line.755"></a> +<span class="sourceLineNo">756</span> findTypeVarImpls(c.getGenericSuperclass(), m);<a name="line.756"></a> +<span class="sourceLineNo">757</span> for (Type ci : c.getGenericInterfaces())<a name="line.757"></a> +<span class="sourceLineNo">758</span> findTypeVarImpls(ci, m);<a name="line.758"></a> +<span class="sourceLineNo">759</span> } else if (t instanceof ParameterizedType) {<a name="line.759"></a> +<span class="sourceLineNo">760</span> ParameterizedType pt = (ParameterizedType)t;<a name="line.760"></a> +<span class="sourceLineNo">761</span> Type rt = pt.getRawType();<a name="line.761"></a> +<span class="sourceLineNo">762</span> if (rt instanceof Class) {<a name="line.762"></a> +<span class="sourceLineNo">763</span> Type[] gImpls = pt.getActualTypeArguments();<a name="line.763"></a> +<span class="sourceLineNo">764</span> Class<?>[] gTypes = new Class[gImpls.length];<a name="line.764"></a> +<span class="sourceLineNo">765</span> for (int i = 0; i < gImpls.length; i++) {<a name="line.765"></a> +<span class="sourceLineNo">766</span> Type gt = gImpls[i];<a name="line.766"></a> +<span class="sourceLineNo">767</span> if (gt instanceof Class)<a name="line.767"></a> +<span class="sourceLineNo">768</span> gTypes[i] = (Class<?>)gt;<a name="line.768"></a> +<span class="sourceLineNo">769</span> else if (gt instanceof TypeVariable) {<a name="line.769"></a> +<span class="sourceLineNo">770</span> TypeVariable<?> tv = (TypeVariable<?>)gt;<a name="line.770"></a> +<span class="sourceLineNo">771</span> for (Type upperBound : tv.getBounds())<a name="line.771"></a> +<span class="sourceLineNo">772</span> if (upperBound instanceof Class)<a name="line.772"></a> +<span class="sourceLineNo">773</span> gTypes[i] = (Class<?>)upperBound;<a name="line.773"></a> +<span class="sourceLineNo">774</span> }<a name="line.774"></a> +<span class="sourceLineNo">775</span> }<a name="line.775"></a> +<span class="sourceLineNo">776</span> m.put((Class<?>)rt, gTypes);<a name="line.776"></a> +<span class="sourceLineNo">777</span> findTypeVarImpls(pt.getRawType(), m);<a name="line.777"></a> +<span class="sourceLineNo">778</span> }<a name="line.778"></a> +<span class="sourceLineNo">779</span> }<a name="line.779"></a> +<span class="sourceLineNo">780</span> }<a name="line.780"></a> +<span class="sourceLineNo">781</span><a name="line.781"></a> +<span class="sourceLineNo">782</span> private static String bpName(BeanProperty bp) {<a name="line.782"></a> +<span class="sourceLineNo">783</span> if (bp == null)<a name="line.783"></a> +<span class="sourceLineNo">784</span> return "";<a name="line.784"></a> +<span class="sourceLineNo">785</span> if (! bp.name().isEmpty())<a name="line.785"></a> +<span class="sourceLineNo">786</span> return bp.name();<a name="line.786"></a> +<span class="sourceLineNo">787</span> return bp.value();<a name="line.787"></a> +<span class="sourceLineNo">788</span> }<a name="line.788"></a> +<span class="sourceLineNo">789</span><a name="line.789"></a> +<span class="sourceLineNo">790</span> @Override /* Object */<a name="line.790"></a> +<span class="sourceLineNo">791</span> public String toString() {<a name="line.791"></a> +<span class="sourceLineNo">792</span> StringBuilder sb = new StringBuilder(c.getName());<a name="line.792"></a> +<span class="sourceLineNo">793</span> sb.append(" {\n");<a name="line.793"></a> +<span class="sourceLineNo">794</span> for (BeanPropertyMeta pm : this.properties.values())<a name="line.794"></a> +<span class="sourceLineNo">795</span> sb.append('\t').append(pm.toString()).append(",\n");<a name="line.795"></a> +<span class="sourceLineNo">796</span> sb.append('}');<a name="line.796"></a> +<span class="sourceLineNo">797</span> return sb.toString();<a name="line.797"></a> +<span class="sourceLineNo">798</span> }<a name="line.798"></a> +<span class="sourceLineNo">799</span>}<a name="line.799"></a>
http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/5f11cb85/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.Builder.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.Builder.html b/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.Builder.html index f9e091e..d546695 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.Builder.html +++ b/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.Builder.html @@ -137,7 +137,7 @@ <span class="sourceLineNo">129</span> if (p != null) {<a name="line.129"></a> <span class="sourceLineNo">130</span> swap = getPropertyPojoSwap(p);<a name="line.130"></a> <span class="sourceLineNo">131</span> if (! p.properties().isEmpty())<a name="line.131"></a> -<span class="sourceLineNo">132</span> properties = split(p.properties(), ',');<a name="line.132"></a> +<span class="sourceLineNo">132</span> properties = split(p.properties());<a name="line.132"></a> <span class="sourceLineNo">133</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.133"></a> <span class="sourceLineNo">134</span> }<a name="line.134"></a> <span class="sourceLineNo">135</span> }<a name="line.135"></a> @@ -151,7 +151,7 @@ <span class="sourceLineNo">143</span> if (swap == null)<a name="line.143"></a> <span class="sourceLineNo">144</span> swap = getPropertyPojoSwap(p);<a name="line.144"></a> <span class="sourceLineNo">145</span> if (properties != null && ! p.properties().isEmpty())<a name="line.145"></a> -<span class="sourceLineNo">146</span> properties = split(p.properties(), ',');<a name="line.146"></a> +<span class="sourceLineNo">146</span> properties = split(p.properties());<a name="line.146"></a> <span class="sourceLineNo">147</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.147"></a> <span class="sourceLineNo">148</span> }<a name="line.148"></a> <span class="sourceLineNo">149</span> }<a name="line.149"></a> @@ -165,7 +165,7 @@ <span class="sourceLineNo">157</span> if (swap == null)<a name="line.157"></a> <span class="sourceLineNo">158</span> swap = getPropertyPojoSwap(p);<a name="line.158"></a> <span class="sourceLineNo">159</span> if (properties != null && ! p.properties().isEmpty())<a name="line.159"></a> -<span class="sourceLineNo">160</span> properties = split(p.properties(), ',');<a name="line.160"></a> +<span class="sourceLineNo">160</span> properties = split(p.properties());<a name="line.160"></a> <span class="sourceLineNo">161</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.161"></a> <span class="sourceLineNo">162</span> }<a name="line.162"></a> <span class="sourceLineNo">163</span> }<a name="line.163"></a> http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/5f11cb85/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.html b/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.html index f9e091e..d546695 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.html +++ b/content/site/apidocs/src-html/org/apache/juneau/BeanPropertyMeta.html @@ -137,7 +137,7 @@ <span class="sourceLineNo">129</span> if (p != null) {<a name="line.129"></a> <span class="sourceLineNo">130</span> swap = getPropertyPojoSwap(p);<a name="line.130"></a> <span class="sourceLineNo">131</span> if (! p.properties().isEmpty())<a name="line.131"></a> -<span class="sourceLineNo">132</span> properties = split(p.properties(), ',');<a name="line.132"></a> +<span class="sourceLineNo">132</span> properties = split(p.properties());<a name="line.132"></a> <span class="sourceLineNo">133</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.133"></a> <span class="sourceLineNo">134</span> }<a name="line.134"></a> <span class="sourceLineNo">135</span> }<a name="line.135"></a> @@ -151,7 +151,7 @@ <span class="sourceLineNo">143</span> if (swap == null)<a name="line.143"></a> <span class="sourceLineNo">144</span> swap = getPropertyPojoSwap(p);<a name="line.144"></a> <span class="sourceLineNo">145</span> if (properties != null && ! p.properties().isEmpty())<a name="line.145"></a> -<span class="sourceLineNo">146</span> properties = split(p.properties(), ',');<a name="line.146"></a> +<span class="sourceLineNo">146</span> properties = split(p.properties());<a name="line.146"></a> <span class="sourceLineNo">147</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.147"></a> <span class="sourceLineNo">148</span> }<a name="line.148"></a> <span class="sourceLineNo">149</span> }<a name="line.149"></a> @@ -165,7 +165,7 @@ <span class="sourceLineNo">157</span> if (swap == null)<a name="line.157"></a> <span class="sourceLineNo">158</span> swap = getPropertyPojoSwap(p);<a name="line.158"></a> <span class="sourceLineNo">159</span> if (properties != null && ! p.properties().isEmpty())<a name="line.159"></a> -<span class="sourceLineNo">160</span> properties = split(p.properties(), ',');<a name="line.160"></a> +<span class="sourceLineNo">160</span> properties = split(p.properties());<a name="line.160"></a> <span class="sourceLineNo">161</span> bdClasses.addAll(Arrays.asList(p.beanDictionary()));<a name="line.161"></a> <span class="sourceLineNo">162</span> }<a name="line.162"></a> <span class="sourceLineNo">163</span> }<a name="line.163"></a> http://git-wip-us.apache.org/repos/asf/incubator-juneau-website/blob/5f11cb85/content/site/apidocs/src-html/org/apache/juneau/BeanSession.html ---------------------------------------------------------------------- diff --git a/content/site/apidocs/src-html/org/apache/juneau/BeanSession.html b/content/site/apidocs/src-html/org/apache/juneau/BeanSession.html index a3d7882..3704bfb 100644 --- a/content/site/apidocs/src-html/org/apache/juneau/BeanSession.html +++ b/content/site/apidocs/src-html/org/apache/juneau/BeanSession.html @@ -496,7 +496,7 @@ <span class="sourceLineNo">488</span> else if (startsWith(value.toString(), '['))<a name="line.488"></a> <span class="sourceLineNo">489</span> return (T)toArray(type, new ObjectList(value.toString()).setBeanSession(this));<a name="line.489"></a> <span class="sourceLineNo">490</span> else<a name="line.490"></a> -<span class="sourceLineNo">491</span> return (T)toArray(type, new ObjectList((Object[])StringUtils.split(value.toString(), ',')).setBeanSession(this));<a name="line.491"></a> +<span class="sourceLineNo">491</span> return (T)toArray(type, new ObjectList((Object[])StringUtils.split(value.toString())).setBeanSession(this));<a name="line.491"></a> <span class="sourceLineNo">492</span> }<a name="line.492"></a> <span class="sourceLineNo">493</span><a name="line.493"></a> <span class="sourceLineNo">494</span> // Target type is some sort of Map that needs to be converted.<a name="line.494"></a>
