001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.messaging.amf.io.util; 022 023import java.lang.annotation.Annotation; 024import java.lang.reflect.Type; 025 026import org.granite.messaging.amf.io.convert.Converters; 027 028/** 029 * @author Franck WOLFF 030 */ 031public abstract class Property { 032 033 private final String name; 034 private final Converters converters; 035 036 protected Property(Converters converters, String name) { 037 this.name = name; 038 this.converters = converters; 039 } 040 041 public String getName() { 042 return name; 043 } 044 045 protected Converters getConverters() { 046 return converters; 047 } 048 049 public void setProperty(Object instance, Object value) { 050 setProperty(instance, value, true); 051 } 052 053 public abstract void setProperty(Object instance, Object value, boolean convert); 054 public abstract Object getProperty(Object instance); 055 public abstract Type getType(); 056 public abstract Class<?> getDeclaringClass(); 057 058 public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) { 059 return isAnnotationPresent(annotationClass, false); 060 } 061 public abstract boolean isAnnotationPresent(Class<? extends Annotation> annotationClass, boolean recursive); 062 063 public <T extends Annotation> T getAnnotation(Class<T> annotationClass) { 064 return getAnnotation(annotationClass, false); 065 } 066 public abstract <T extends Annotation> T getAnnotation(Class<T> annotationClass, boolean recursive); 067 068 protected Object convert(Object value) { 069 return converters.convert(value, getType()); 070 } 071 072 @Override 073 public String toString() { 074 return name; 075 } 076}