001/** 002 * GRANITE DATA SERVICES 003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S. 004 * 005 * This file is part of the Granite Data Services Platform. 006 * 007 * Granite Data Services is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * Granite Data Services is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 015 * General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 020 * USA, or see <http://www.gnu.org/licenses/>. 021 */ 022package org.granite.messaging.amf.types; 023 024import java.io.Externalizable; 025import java.lang.reflect.Type; 026import java.util.Collection; 027import java.util.Map; 028 029import org.granite.messaging.amf.io.util.Property; 030import org.granite.util.TypeUtil; 031 032/** 033 * @author Franck WOLFF 034 */ 035public class AMFSpecialValueFactory { 036 037 protected final AMFVectorObjectAliaser vectorObjectAlias; 038 039 public AMFSpecialValueFactory() { 040 this(null); 041 } 042 043 public AMFSpecialValueFactory(AMFVectorObjectAliaser vectorObjectAlias) { 044 this.vectorObjectAlias = (vectorObjectAlias != null ? vectorObjectAlias : new AMFBasicVectorObjectAliaser()); 045 } 046 047 public Object createSpecialValue(Property property, Object o) { 048 if (o != null && !(o instanceof Externalizable)) { 049 if (o instanceof Collection || (o.getClass().isArray() && o.getClass().getComponentType() != Byte.TYPE)) { 050 if (property.isAnnotationPresent(AMFVectorInt.class)) 051 return new AMFVectorIntValue(o, property.getAnnotation(AMFVectorInt.class).fixed()); 052 if (property.isAnnotationPresent(AMFVectorNumber.class)) 053 return new AMFVectorNumberValue(o, property.getAnnotation(AMFVectorNumber.class).fixed()); 054 if (property.isAnnotationPresent(AMFVectorUint.class)) 055 return new AMFVectorUintValue(o, property.getAnnotation(AMFVectorUint.class).fixed()); 056 if (property.isAnnotationPresent(AMFVectorObject.class)) { 057 AMFVectorObject annotation = property.getAnnotation(AMFVectorObject.class); 058 String type = annotation.type(); 059 if (type == null || type.length() == 0) { 060 Type propertyType = property.getType(); 061 Class<?> componentClass = TypeUtil.componentClassOfType(propertyType); 062 type = vectorObjectAlias.aliasFor(componentClass); 063 } 064 return new AMFVectorObjectValue(o, type, annotation.fixed()); 065 } 066 } 067 else if (o instanceof Map && property.isAnnotationPresent(AMFDictionary.class)) 068 return new AMFDictionaryValue((Map<?, ?>)o, property.getAnnotation(AMFDictionary.class).weakKeys()); 069 } 070 071 return o; 072 } 073}