⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstracttypecreator.java

📁 Xfire文件 用于开发web service 的一个开源工具 很好用的
💻 JAVA
字号:
package org.codehaus.xfire.aegis.type;import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Collection;import java.util.Map;import javax.xml.namespace.QName;import org.codehaus.xfire.XFireRuntimeException;import org.codehaus.xfire.aegis.Holder;import org.codehaus.xfire.aegis.type.basic.ArrayType;import org.codehaus.xfire.aegis.type.basic.HolderType;import org.codehaus.xfire.aegis.type.basic.ObjectType;import org.codehaus.xfire.aegis.type.collection.CollectionType;import org.codehaus.xfire.aegis.type.collection.MapType;import org.codehaus.xfire.util.NamespaceHelper;import org.codehaus.xfire.util.ServiceUtils;/** * @author Hani Suleiman Date: Jun 14, 2005 Time: 11:59:57 PM */public abstract class AbstractTypeCreator    implements TypeCreator{    protected TypeMapping tm;    protected AbstractTypeCreator nextCreator;    private Configuration typeConfiguration;	private TypeCreator parent;        public TypeMapping getTypeMapping()    {        return tm;    }        public TypeCreator getTopCreator() {    	TypeCreator top = this;    	TypeCreator next = top;    	while (next != null) {    		top = next;    		next = top.getParent();    	}    	return top;	}        public TypeCreator getParent() {		return parent;	}	public void setParent(TypeCreator parent) {		this.parent = parent;	}	public void setTypeMapping(TypeMapping typeMapping)    {        this.tm = typeMapping;        if (nextCreator != null)            nextCreator.setTypeMapping(tm);    }    public void setNextCreator(AbstractTypeCreator creator)    {        this.nextCreator = creator;        nextCreator.parent = this;    }    protected TypeClassInfo createClassInfo(Field f)    {        TypeClassInfo info = createBasicClassInfo(f.getType());        info.setDescription("field " + f.getName() + " in  " + f.getDeclaringClass());        return info;    }    public TypeClassInfo createBasicClassInfo(Class typeClass)    {        TypeClassInfo info = new TypeClassInfo();        info.setDescription("class '" + typeClass.getName() + '\'');        info.setTypeClass(typeClass);        return info;    }    public Type createTypeForClass(TypeClassInfo info)    {        Class javaType = info.getTypeClass();        Type result = null;        boolean newType = true;                if (info.getType() != null)        {            result = createUserType(info);        }        else if (isHolder(javaType))        {            result = createHolderType(info);        }        else if (isArray(javaType))        {            result = createArrayType(info);        }        else if (isMap(javaType))        {            result = createMapType(info);        }        else if (isCollection(javaType))        {            result = createCollectionType(info);        }        else if (isEnum(javaType))        {            result = createEnumType(info);        }        else        {            Type type = getTypeMapping().getType(javaType);            if (type == null)            {                type = createDefaultType(info);            }            else            {                newType = false;            }                        result = type;        }                if (newType && !getConfiguration().isDefaultNillable())            result.setNillable(false);                return result;    }    protected boolean isHolder(Class javaType)    {        return javaType.equals(Holder.class);    }    protected Type createHolderType(TypeClassInfo info)    {        if (info.getGenericType() == null)        {            throw new UnsupportedOperationException("To use holder types "                    + "you must have an XML descriptor declaring the component type.");        }        Class heldCls = (Class) info.getGenericType();        info.setTypeClass(heldCls);        Type delegate = createType(heldCls);        HolderType type = new HolderType(delegate);        return type;    }    protected boolean isArray(Class javaType)    {        return javaType.isArray() && !javaType.equals(byte[].class);    }    protected Type createUserType(TypeClassInfo info)    {        try        {            Type type = (Type) info.getType().newInstance();            QName name = info.getTypeName();            if (name == null)                name = createQName(info.getTypeClass());            type.setSchemaType(name);            type.setTypeClass(info.getTypeClass());            type.setTypeMapping(getTypeMapping());            return type;        }        catch (InstantiationException e)        {            throw new XFireRuntimeException("Couldn't instantiate type classs "                    + info.getType().getName(), e);        }        catch (IllegalAccessException e)        {            throw new XFireRuntimeException("Couldn't access type classs "                    + info.getType().getName(), e);        }    }    protected Type createArrayType(TypeClassInfo info)    {        ArrayType type = new ArrayType();        type.setTypeMapping(getTypeMapping());        type.setTypeClass(info.getTypeClass());        type.setSchemaType(createCollectionQName(info, type.getComponentType()));                if (info.getMinOccurs() != -1) type.setMinOccurs(info.getMinOccurs());        if (info.getMaxOccurs() != -1) type.setMaxOccurs(info.getMaxOccurs());                type.setFlat(info.isFlat());                return type;    }        protected QName createQName(Class javaType)    {        String clsName = javaType.getName();        String ns = NamespaceHelper.makeNamespaceFromClassName(clsName, "http");        String localName = ServiceUtils.makeServiceNameFromClassName(javaType);        return new QName(ns, localName);    }    protected boolean isCollection(Class javaType)    {        return Collection.class.isAssignableFrom(javaType);    }    protected Type createCollectionTypeFromGeneric(TypeClassInfo info)    {        Type component = getOrCreateGenericType(info);                CollectionType type = new CollectionType(component);        type.setTypeMapping(getTypeMapping());        QName name = info.getTypeName();        if (name == null)            name = createCollectionQName(info, component);                type.setSchemaType(name);        type.setTypeClass(info.getTypeClass());                if (info.getMinOccurs() != -1) type.setMinOccurs(info.getMinOccurs());        if (info.getMaxOccurs() != -1) type.setMaxOccurs(info.getMaxOccurs());                type.setFlat(info.isFlat());                return type;    }    protected Type getOrCreateGenericType(TypeClassInfo info)    {        return createObjectType();    }    protected Type getOrCreateMapKeyType(TypeClassInfo info)    {        return createObjectType();    }    private Type createObjectType()    {        ObjectType type = new ObjectType();        type.setSchemaType(DefaultTypeMappingRegistry.XSD_ANY);        type.setTypeClass(Object.class);        type.setTypeMapping(getTypeMapping());        return type;    }    protected Type getOrCreateMapValueType(TypeClassInfo info)    {        return createObjectType();    }        protected Type createMapType(TypeClassInfo info, Type keyType, Type valueType)    {        QName schemaType = createMapQName(info, keyType, valueType);        MapType type = new MapType(schemaType, keyType, valueType);        type.setTypeMapping(getTypeMapping());        type.setTypeClass(info.getTypeClass());        return type;    }    protected Type createMapType(TypeClassInfo info)    {        Type keyType = getOrCreateMapKeyType(info);        Type valueType = getOrCreateMapValueType(info);        return createMapType(info, keyType, valueType);    }    protected QName createMapQName(TypeClassInfo info, Type keyType, Type valueType)    {        String name = keyType.getSchemaType().getLocalPart() + '2'                + valueType.getSchemaType().getLocalPart() + "Map";        // TODO: Get namespace from XML?        return new QName(tm.getEncodingStyleURI(), name);    }    protected boolean isMap(Class javaType)    {        return Map.class.isAssignableFrom(javaType);    }    public abstract TypeClassInfo createClassInfo(PropertyDescriptor pd);    protected boolean isEnum(Class javaType)    {        return false;    }    public Type createEnumType(TypeClassInfo info)    {        return null;    }    public abstract Type createCollectionType(TypeClassInfo info);    public abstract Type createDefaultType(TypeClassInfo info);    protected QName createCollectionQName(TypeClassInfo info, Type type)    {        String ns;        if (type.isComplex())        {            ns = type.getSchemaType().getNamespaceURI();        }        else        {            ns = tm.getEncodingStyleURI();        }        String first = type.getSchemaType().getLocalPart().substring(0, 1);        String last = type.getSchemaType().getLocalPart().substring(1);        String localName = "ArrayOf" + first.toUpperCase() + last;        return new QName(ns, localName);    }    public abstract TypeClassInfo createClassInfo(Method m, int index);    /**     * Create a Type for a Method parameter.     *      * @param m     *            the method to create a type for     * @param index     *            The parameter index. If the index is less than zero, the     *            return type is used.     */    public Type createType(Method m, int index)    {        TypeClassInfo info = createClassInfo(m, index);        info.setDescription((index == -1 ? "return type" : "parameter " + index) + " of method "                + m.getName() + " in " + m.getDeclaringClass());        return createTypeForClass(info);    }        public QName getElementName(Method m, int index)    {        TypeClassInfo info = createClassInfo(m, index);                return info.getMappedName();    }    /**     * Create type information for a PropertyDescriptor.     *      * @param pd     *            the propertydescriptor     */    public Type createType(PropertyDescriptor pd)    {        TypeClassInfo info = createClassInfo(pd);        info.setDescription("property " + pd.getName());        return createTypeForClass(info);    }    /**     * Create type information for a <code>Field</code>.     *      * @param f     *            the field to create a type from     */    public Type createType(Field f)    {        TypeClassInfo info = createClassInfo(f);        info.setDescription("field " + f.getName() + " in " + f.getDeclaringClass());        return createTypeForClass(info);    }    public Type createType(Class clazz)    {        TypeClassInfo info = createBasicClassInfo(clazz);        info.setDescription(clazz.toString());        return createTypeForClass(info);    }    public Configuration getConfiguration()    {        return typeConfiguration;    }    public void setConfiguration(Configuration typeConfiguration)    {        this.typeConfiguration = typeConfiguration;    }        public static class TypeClassInfo    {        Class typeClass;        Object[] annotations;        Object genericType;        Object keyType;        QName mappedName;        QName typeName;        Class type;        String description;        long minOccurs = -1;        long maxOccurs = -1;        boolean flat = false;                public String getDescription()        {            return description;        }        public void setDescription(String description)        {            this.description = description;        }        public Object[] getAnnotations()        {            return annotations;        }        public void setAnnotations(Object[] annotations)        {            this.annotations = annotations;        }        public Object getGenericType()        {            return genericType;        }        public void setGenericType(Object genericType)        {            this.genericType = genericType;        }        public Object getKeyType()        {            return keyType;        }        public void setKeyType(Object keyType)        {            this.keyType = keyType;        }        public Class getTypeClass()        {            return typeClass;        }        public void setTypeClass(Class typeClass)        {            this.typeClass = typeClass;        }        public QName getTypeName()        {            return typeName;        }        public void setTypeName(QName name)        {            this.typeName = name;        }        public Class getType()        {            return type;        }        public void setType(Class type)        {            this.type = type;        }        public QName getMappedName()        {            return mappedName;        }        public void setMappedName(QName mappedName)        {            this.mappedName = mappedName;        }        public long getMaxOccurs()        {            return maxOccurs;        }        public void setMaxOccurs(long maxOccurs)        {            this.maxOccurs = maxOccurs;        }        public long getMinOccurs()        {            return minOccurs;        }        public void setMinOccurs(long minOccurs)        {            this.minOccurs = minOccurs;        }        public boolean isFlat()        {            return flat;        }        public void setFlat(boolean flat)        {            this.flat = flat;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -