/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.messaging.amf.io.util; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Map; import java.util.Set; import org.granite.util.Introspector; import org.granite.util.PropertyDescriptor; /** * @author Franck WOLFF */ public class DefaultGroovyClassDescriptor extends JavaClassDescriptor { public DefaultGroovyClassDescriptor(Class<?> type) { super(type); } @Override protected List<Property> introspectProperties() { List<Property> properties = null; Class<?> type = getType(); if (!isExternalizable() && !Map.class.isAssignableFrom(type) && !Hashtable.class.isAssignableFrom(type)) { properties = new ArrayList<Property>(); try { Set<String> propertyNames = new HashSet<String>(); // Add read/write properties (ie: public getter/setter). Introspector.flushFromCaches(type); // Ensure that we don't get a cached reference, the Groovy class could have been modified PropertyDescriptor[] descs = Introspector.getPropertyDescriptors(type); for (PropertyDescriptor property : descs) { String propertyName = property.getName(); if (property.getWriteMethod() != null && property.getReadMethod() != null) { properties.add(new MethodProperty(converters, propertyName, property.getWriteMethod(), property.getReadMethod())); propertyNames.add(propertyName); } } // Add other public fields. Field[] fields = type.getFields(); for (Field field : fields) { String propertyName = field.getName(); if (!propertyNames.contains(propertyName) && !Modifier.isStatic(field.getModifiers()) && !Modifier.isTransient(field.getModifiers())) { properties.add(new FieldProperty(converters, field)); propertyNames.add(propertyName); } } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } return properties; } }