001// Copyright 2007, 2008, 2010, 2011, 2014 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.internal.beaneditor; 016 017import java.lang.annotation.Annotation; 018 019import org.apache.tapestry5.PropertyConduit; 020import org.apache.tapestry5.beaneditor.BeanModel; 021import org.apache.tapestry5.beaneditor.PropertyModel; 022import org.apache.tapestry5.beaneditor.Sortable; 023import org.apache.tapestry5.ioc.Messages; 024import org.apache.tapestry5.ioc.internal.util.InternalCommonsUtils; 025import org.apache.tapestry5.ioc.internal.util.InternalCommonsUtils; 026import org.apache.tapestry5.plastic.PlasticUtils; 027 028@SuppressWarnings("all") 029public class PropertyModelImpl implements PropertyModel 030{ 031 private final BeanModel model; 032 033 private final String name; 034 035 private final PropertyConduit conduit; 036 037 private final String id; 038 039 private String label; 040 041 private String dataType; 042 043 private boolean sortable; 044 045 public PropertyModelImpl(BeanModel model, String name, PropertyConduit conduit, Messages messages) 046 { 047 this.model = model; 048 this.name = name; 049 this.conduit = conduit; 050 051 id = InternalCommonsUtils.extractIdFromPropertyExpression(name); 052 053 label = InternalCommonsUtils.defaultLabel(id, messages, name); 054 055 // TAP5-2305 056 if (conduit != null) 057 { 058 Sortable sortableAnnotation = conduit.getAnnotation(Sortable.class); 059 if (sortableAnnotation != null) 060 { 061 sortable = sortableAnnotation.value(); 062 } 063 else 064 { 065 // Primitive types need to be converted to wrapper types before checking to see 066 // if they are sortable. 067 Class wrapperType = PlasticUtils.toWrapperType(getPropertyType()); 068 sortable = Comparable.class.isAssignableFrom(wrapperType); 069 } 070 } 071 } 072 073 public String getId() 074 { 075 return id; 076 } 077 078 public Class getPropertyType() 079 { 080 return conduit == null ? Object.class : conduit.getPropertyType(); 081 } 082 083 public PropertyConduit getConduit() 084 { 085 return conduit; 086 } 087 088 public PropertyModel label(String label) 089 { 090 assert InternalCommonsUtils.isNonBlank(label); 091 this.label = label; 092 093 return this; 094 } 095 096 public String getLabel() 097 { 098 return label; 099 } 100 101 public String getPropertyName() 102 { 103 return name; 104 } 105 106 public BeanModel model() 107 { 108 return model; 109 } 110 111 public PropertyModel dataType(String dataType) 112 { 113 this.dataType = dataType; 114 115 return this; 116 } 117 118 public String getDataType() 119 { 120 return dataType; 121 } 122 123 public boolean isSortable() 124 { 125 return sortable; 126 } 127 128 public PropertyModel sortable(boolean sortable) 129 { 130 this.sortable = sortable; 131 132 return this; 133 } 134 135 public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 136 { 137 return conduit == null ? null : conduit.getAnnotation(annotationClass); 138 } 139}