001    // Copyright 2006, 2008, 2010, 2011 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    // http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.tapestry5.ioc.services;
016    
017    import org.apache.tapestry5.ioc.AnnotationProvider;
018    
019    import java.lang.reflect.Field;
020    import java.lang.reflect.Method;
021    
022    /**
023     * Provides access to a single property within a class. Acts as an {@link org.apache.tapestry5.ioc.AnnotationProvider};
024     * when searching for annotations, the read method (if present) is checked first, followed by the write method, followed
025     * by the underlying field (when the property name matches the field name).
026     * <p/>
027     * Starting in release 5.2, this property may actually be a public field. In 5.3, it may be a public static field.
028     *
029     * @see org.apache.tapestry5.ioc.services.ClassPropertyAdapter
030     */
031    @SuppressWarnings("unchecked")
032    public interface PropertyAdapter extends AnnotationProvider
033    {
034        /**
035         * Returns the name of the property (or public field).
036         */
037        String getName();
038    
039        /**
040         * Returns true if the property is readable (i.e., has a getter method or is a public field).
041         */
042        boolean isRead();
043    
044        /**
045         * Returns the method used to read the property, or null if the property is not readable (or is a public field).
046         */
047        public Method getReadMethod();
048    
049        /**
050         * Returns true if the property is writeable (i.e., has a setter method or is a non-final field).
051         */
052        boolean isUpdate();
053    
054        /**
055         * Returns the method used to update the property, or null if the property is not writeable (or a public field).
056         */
057        public Method getWriteMethod();
058    
059        /**
060         * Reads the property value.
061         *
062         * @param instance to read from
063         * @throws UnsupportedOperationException if the property is write only
064         */
065        Object get(Object instance);
066    
067        /**
068         * Updates the property value. The provided value must not be null if the property type is primitive, and must
069         * otherwise be of the proper type.
070         *
071         * @param instance to update
072         * @param value    new value for the property
073         * @throws UnsupportedOperationException if the property is read only
074         */
075        void set(Object instance, Object value);
076    
077        /**
078         * Returns the type of the property.
079         */
080        Class getType();
081    
082        /**
083         * Returns true if the return type of the read method is not the same as the property type. This can occur when the
084         * property has been defined using generics, in which case, the method's type may be Object when the property type
085         * is something more specific. This method is primarily used when generating runtime code related to the property.
086         */
087        boolean isCastRequired();
088    
089        /**
090         * Returns the {@link org.apache.tapestry5.ioc.services.ClassPropertyAdapter} that provides access to other
091         * properties defined by the same class.
092         */
093        ClassPropertyAdapter getClassAdapter();
094    
095        /**
096         * Returns the type of bean to which this property belongs. This is the same as
097         * {@link org.apache.tapestry5.ioc.services.ClassPropertyAdapter#getBeanType()}.
098         */
099        Class getBeanType();
100    
101        /**
102         * Returns true if the property is actually a public field (possibly, a public static field).
103         *
104         * @since 5.2
105         */
106        boolean isField();
107    
108        /**
109         * Returns the field if the property is a public field or null if the property is accessed via the read method.
110         *
111         * @since 5.2
112         */
113        Field getField();
114    
115        /**
116         * The class in which the property (or public field) is defined.
117         *
118         * @since 5.2
119         */
120        Class getDeclaringClass();
121    }