/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import java.util.ArrayList;
import java.util.List;
import gw.lang.reflect.IType;
import gw.lang.reflect.gs.IGosuObject;
import gw.lang.reflect.IEnumValue;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.java.IJavaClassInfo;
import gw.lang.reflect.java.IJavaEnumType;
import gw.util.GosuObjectUtil;
/**
* Provides an implementation of IEnumeratedType for java enums
*/
public class JavaEnumType extends JavaType implements IJavaEnumTypeInternal, IJavaEnumType
{
private List<IEnumValue> _enumVals;
public JavaEnumType( Class cls, DefaultTypeLoader loader )
{
super( cls, loader );
}
public JavaEnumType(IJavaClassInfo cls, DefaultTypeLoader loader) {
super(cls, loader);
}
public IType getEnumType()
{
return TypeSystem.getOrCreateTypeReference( this );
}
public List<String> getEnumConstants()
{
List<String> enumConstants = new ArrayList<String>();
for( IEnumValue v : getEnumValues() )
{
enumConstants.add( v.getCode() );
}
return enumConstants;
}
public List<IEnumValue> getEnumValues()
{
if( _enumVals != null )
{
return _enumVals;
}
ArrayList<IEnumValue> values = new ArrayList<IEnumValue>();
Object[] enumConstants = getBackingClassInfo().getEnumConstants();
for( Object enumConstant : enumConstants )
{
if( enumConstant instanceof IEnumValue )
{
values.add( (IEnumValue)enumConstant );
}
else if( enumConstant instanceof Enum )
{
Enum e = (Enum)enumConstant;
values.add( new EnumAdapter( e ) );
}
}
return _enumVals = values;
}
public IEnumValue getEnumValue( String strName )
{
for( IEnumValue val : getEnumValues() )
{
if( GosuObjectUtil.equals( val.getCode(), strName ) )
{
return val;
}
}
return null;
}
private class EnumAdapter implements IEnumValue, IGosuObject
{
private Enum _enum;
public EnumAdapter( Enum e )
{
_enum = e;
}
public String getCode()
{
return _enum.name();
}
public Object getValue()
{
return _enum;
}
public int getOrdinal()
{
return _enum.ordinal();
}
public String getDisplayName()
{
return getCode();
}
public IType getIntrinsicType()
{
return TypeSystem.getOrCreateTypeReference( JavaEnumType.this );
}
}
}