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}