package com.basistech.rnm.index.ws.impl;

import java.util.List;

import javax.xml.namespace.QName;

import org.codehaus.xfire.aegis.type.Type;
import org.codehaus.xfire.aegis.type.XMLTypeCreator;
import org.codehaus.xfire.aegis.type.basic.BeanType;
import org.codehaus.xfire.aegis.type.basic.XMLBeanTypeInfo;
import org.codehaus.xfire.util.NamespaceHelper;
import org.jdom.Element;

public class XMLTypeCreatorWithNamespacePrefix extends XMLTypeCreator {

    public XMLTypeCreatorWithNamespacePrefix() {
    }

    @Override
    public Type createDefaultType(TypeClassInfo info) {
        Element mapping = findMapping(info.getTypeClass());
        List mappings = findMappings(info.getTypeClass());

        if (mapping != null || mappings.size() > 0 )
        {
            String defaultPrefix = null;
            String typeNameAtt = null;
            if (mapping != null) typeNameAtt = mapping.getAttributeValue("name");
            
            
            String extensibleElements = null;
            if (mapping != null) extensibleElements = mapping.getAttributeValue("extensibleElements");
            
            String extensibleAttributes = null;
            if (mapping != null) extensibleAttributes = mapping.getAttributeValue("extensibleAttributes");
            
            String defaultNS = NamespaceHelper.makeNamespaceFromClassName(info.getTypeClass().getName(), "http");
            QName name = null;
            if (typeNameAtt != null)
            {
                name = NamespaceHelper.createQName(mapping, typeNameAtt, defaultNS);
                defaultPrefix = name.getPrefix();
                defaultNS = name.getNamespaceURI();
            }
            
            XMLBeanTypeInfo btinfo = new XMLBeanTypeInfoWithNamespacePrefix(info.getTypeClass(), 
                                                         mappings,
                                                         defaultNS,
                                                         defaultPrefix);
            btinfo.setTypeMapping(getTypeMapping());
            btinfo.setDefaultMinOccurs(getConfiguration().getDefaultMinOccurs());
            btinfo.setDefaultNillable( getConfiguration().isDefaultNillable() );

            if ( extensibleElements != null ) btinfo.setExtensibleElements( Boolean.valueOf( extensibleElements ).booleanValue() );
            else btinfo.setExtensibleElements(getConfiguration().isDefaultExtensibleElements());
            
            if ( extensibleAttributes != null ) btinfo.setExtensibleAttributes( Boolean.valueOf( extensibleAttributes ).booleanValue() );
            else btinfo.setExtensibleAttributes(getConfiguration().isDefaultExtensibleAttributes());
            
            BeanType type = new BeanType(btinfo);
            
            if (name == null) name = createQName(info.getTypeClass());
            
            type.setSchemaType(name);
            
            type.setTypeClass(info.getTypeClass());
            type.setTypeMapping(getTypeMapping());

            return type;
        }
        else
        {
            return nextCreator.createDefaultType(info);
        }
    }

}
