    001    // Copyright 2007, 2008 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.beaneditor;
    016
    017    import org.apache.tapestry5.PropertyConduit;
    018    import org.apache.tapestry5.ioc.AnnotationProvider;
    019
    020    /**
    021     * Part of a {@link org.apache.tapestry5.beaneditor.BeanModel} that defines the attributes of a single property of a
    022     * bean.
    023     * <p/>
    024     * <p/>
    025     * A PropertyModel is also an {@link AnnotationProvider}, as long as the {@link org.apache.tapestry5.PropertyConduit} is
    026     * non-null.  When there is no property conduit, then {@link org.apache.tapestry5.ioc.AnnotationProvider#getAnnotation(Class)}
    027     * will return null.
    028     */
    029    public interface PropertyModel extends AnnotationProvider
    030    {
    031        /**
    032         * Returns the name of the property (which may, in fact, be a property expression).
    033         */
    034        String getPropertyName();
    035
    036        /**
    037         * Returns the id used to access other resources (this is based on the property name, but with any excess
    038         * punctuation stripped out).
    039         */
    040        String getId();
    041
    042        /**
    043         * Returns a user-presentable label for the property.
    044         */
    045        String getLabel();
    046
    047        /**
    048         * Returns the type of the property.
    049         */
    050        Class getPropertyType();
    051
    052        /**
    053         * Returns a logical name for the type of UI needed to view or edit the property. This is initially determined from
    054         * the property type.
    055         */
    056        String getDataType();
    057
    058        /**
    059         * Changes the data type for the property.
    060         *
    061         * @param dataType
    062         * @return the property model, for further changes
    063         */
    064        PropertyModel dataType(String dataType);
    065
    066        /**
    067         * Returns an object used to read or update the property. For virtual properties (properties that do not actually
    068         * exist on the bean), the conduit may be null.
    069         */
    070        PropertyConduit getConduit();
    071
    072        /**
    073         * Changes the label for the property to the provided value.
    074         *
    075         * @param label new label for property
    076         * @return the property model, for further changes
    077         */
    078        PropertyModel label(String label);
    079
    080        /**
    081         * Returns the containing model, often used for "fluent" construction of the model.
    082         */
    083        BeanModel model();
    084
    085        /**
    086         * Returns true if the property can be used for sorting. By default, this is true only if the property type
    087         * implements Comparable.
    088         */
    089        boolean isSortable();
    090
    091        /**
    092         * Updates sortable and returns the model for further changes.
    093         *
    094         * @return the property model, for further changes
    095         */
    096        PropertyModel sortable(boolean sortable);
    097    }