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