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.reflect.Field; 024import java.lang.reflect.Modifier; 025import java.util.HashMap; 026 027import org.granite.util.TypeUtil; 028import org.granite.util.Introspector; 029import org.granite.util.PropertyDescriptor; 030 031/** 032 * @author Franck WOLFF 033 */ 034public class DefaultActionScriptClassDescriptor extends ActionScriptClassDescriptor { 035 036 public DefaultActionScriptClassDescriptor(String type, byte encoding) { 037 super(type, encoding); 038 } 039 040 @Override 041 public void defineProperty(String name) { 042 043 if (type.length() == 0 || instantiator != null) 044 properties.add(new MapProperty(converters, name)); 045 else { 046 try { 047 Class<?> clazz = TypeUtil.forName(type); 048 049 // Try to find public getter/setter. 050 PropertyDescriptor[] props = Introspector.getPropertyDescriptors(clazz); 051 for (PropertyDescriptor prop : props) { 052 if (name.equals(prop.getName()) && prop.getWriteMethod() != null && prop.getReadMethod() != null) { 053 properties.add(new MethodProperty(converters, name, prop.getWriteMethod(), prop.getReadMethod())); 054 return; 055 } 056 } 057 058 // Try to find public field. 059 Field field = clazz.getField(name); 060 if (!Modifier.isStatic(field.getModifiers()) && !Modifier.isTransient(field.getModifiers())) 061 properties.add(new FieldProperty(converters, field)); 062 063 } 064 catch (NoSuchFieldException e) { 065 if ("uid".equals(name)) // ObjectProxy specific property... 066 properties.add(new UIDProperty(converters)); 067 else 068 throw new RuntimeException(e); 069 } 070 catch (Exception e) { 071 throw new RuntimeException(e); 072 } 073 } 074 } 075 076 @Override 077 public Object newJavaInstance() { 078 079 if (type.length() == 0) 080 return new HashMap<String, Object>(); 081 082 String className = (instantiator != null ? instantiator : type); 083 try { 084 return TypeUtil.newInstance(className); 085 } catch (Exception e) { 086 throw new RuntimeException("Could not create instance of: " + className, e); 087 } 088 } 089}