/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.xml.ws.typeprovider; import gw.fs.IFile; import gw.internal.xml.ws.WsdlSoapHeaders; import gw.internal.xml.xsd.typeprovider.XmlSchemaIndex; import gw.internal.xml.xsd.typeprovider.XmlTypeData; import gw.internal.xml.xsd.typeprovider.schema.WsdlPort; import gw.internal.xml.xsd.typeprovider.schema.WsdlService; import gw.internal.xml.xsd.typeprovider.schema.XmlSchemaElement; import gw.lang.reflect.*; import gw.lang.reflect.java.IJavaClassInfo; import gw.lang.reflect.java.IJavaType; import gw.lang.reflect.java.JavaTypes; import gw.xml.XmlElement; import java.util.*; // Intentionally not named WsdlSoapHeadersTypeData to avoid the ClassName/ClassNameTypeData pattern (explicit type data) public class WsdlSoapHeadersTypeDataClass extends XmlTypeData implements IWsdlSoapHeadersTypeData { private final String _typeName; private WsdlPort _preferredPort; private final List<XmlSchemaElement> _headerElements; public WsdlSoapHeadersTypeDataClass( String typeName, WsdlPort preferredPort, Wsdl wsdl, WsdlService service, IFile resourceFile, boolean service1, List<XmlSchemaElement> headerElements ) { _typeName = typeName; _preferredPort = preferredPort; _headerElements = headerElements; } @Override public String getName() { return _typeName; } @Override public List<? extends IPropertyInfo> getDeclaredProperties() { List<IPropertyInfo> ret = new ArrayList<IPropertyInfo>(); Set<String> usedPropertyNames = new HashSet<String>(); for ( XmlSchemaElement headerElement : _headerElements ) { final String propertyName = XmlSchemaIndex.makeUniquePropertyName( usedPropertyNames, headerElement.getName(), XmlSchemaIndex.NormalizationMode.PROPERCASE ); ret.add( new PropertyInfoBuilder() .withName( propertyName ) .withType( XmlSchemaIndex.getGosuTypeBySchemaObject( headerElement ) ) .withReadable( true ) .withWritable( true ) .withAccessor( new IPropertyAccessor() { @Override public Object getValue( Object ctx ) { WsdlSoapHeaders soapHeaders = (WsdlSoapHeaders) ctx; return soapHeaders.get( propertyName ); } @Override public void setValue( Object ctx, Object value ) { WsdlSoapHeaders soapHeaders = (WsdlSoapHeaders) ctx; soapHeaders.set( propertyName, (XmlElement) value ); } } ).build( this ) ); } return ret; } @Override public List<? extends IMethodInfo> getDeclaredMethods() { return Collections.emptyList(); } @Override public List<? extends IConstructorInfo> getDeclaredConstructors() { return Collections.singletonList( new ConstructorInfoBuilder() .withConstructorHandler( new IConstructorHandler() { @Override public Object newInstance( Object... args ) { return new WsdlSoapHeaders( getType() ); } } ) .build( this ) ); } @Override public boolean isFinal() { return true; } @Override public boolean isEnum() { return false; } @Override public IType getSuperType() { return JavaTypes.OBJECT(); } @Override public boolean prefixSuperProperties() { return true; } @Override public long getFingerprint() { return 0; // TODO } @Override public Class getBackingClass() { return WsdlSoapHeaders.class; } @Override public IJavaClassInfo getBackingClassInfo() { return JavaTypes.getSystemType(WsdlSoapHeaders.class).getBackingClassInfo(); } @Override public XmlSchemaIndex<?> getSchemaIndex() { return _preferredPort.getSchemaIndex(); } }