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
015package org.apache.tapestry5.beaneditor;
016
017import org.apache.tapestry5.PropertyConduit;
018import 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 */
029public 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}