/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.xsd.typeprovider;
import gw.lang.parser.GosuParserFactory;
import gw.lang.parser.IExpression;
import gw.lang.parser.IGosuParser;
import gw.lang.parser.TypelessScriptPartId;
import gw.lang.reflect.IAnnotationInfo;
import gw.lang.reflect.IBlockType;
import gw.lang.reflect.IConstructorInfo;
import gw.lang.reflect.IFeatureInfo;
import gw.lang.reflect.IParameterInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.ITypeInfo;
import gw.lang.reflect.java.GosuTypes;
import gw.lang.reflect.java.JavaTypes;
/**
*
*/
class XmlSchemaAutocreateAnnotationData implements IAnnotationInfo {
private final IType _concreteType;
private final IFeatureInfo _container;
public XmlSchemaAutocreateAnnotationData( IType concreteType, IFeatureInfo container ) {
_concreteType = concreteType;
_container = container;
}
@Override
public Object getInstance() {
ITypeInfo autocreateTypeInfo = GosuTypes.AUTOCREATE().getTypeInfo();
if ( _concreteType != null && JavaTypes.LIST().isAssignableFrom( _concreteType ) ) {
for ( IConstructorInfo constructor : autocreateTypeInfo.getConstructors()) {
IParameterInfo[] constructorParams = constructor.getParameters();
if (constructorParams.length > 0 && constructorParams[0].getFeatureType() instanceof IBlockType ) {
try {
IGosuParser parser = GosuParserFactory.createParser( "\\ -> new java.util.ArrayList()" );
IExpression expr = parser.parseExp( new TypelessScriptPartId( "Xml Schema autocreate block" ) );
Object block = expr.evaluate();
return constructor.getConstructor().newInstance(block);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return autocreateTypeInfo.getConstructor().getConstructor().newInstance();
}
@Override
public Object getFieldValue(String field) {
throw new RuntimeException("Not supported yet");
}
@Override
public IType getType() {
return GosuTypes.AUTOCREATE();
}
@Override
public String getName() {
return GosuTypes.AUTOCREATE().getName();
}
@Override
public String getDescription() {
return "";
}
@Override
public IType getOwnersType() {
return _container.getOwnersType();
}
}