/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.transform.expression; import gw.config.CommonServices; import gw.internal.gosu.parser.expressions.ObjectLiteralExpression; import gw.lang.ir.IRExpression; import gw.internal.gosu.ir.transform.ExpressionTransformer; import gw.internal.gosu.ir.transform.TopLevelTransformationContext; import gw.lang.parser.HashedObjectLiteral; import gw.lang.reflect.IType; import gw.lang.reflect.TypeSystem; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** */ public class ObjectLiteralExpressionTransformer extends AbstractExpressionTransformer<ObjectLiteralExpression> { public static final List<ObjectLiteralExpression> QUERY_EXPRESSIONS = Collections.synchronizedList( new ArrayList<ObjectLiteralExpression>() ); public static IRExpression compile( TopLevelTransformationContext cc, ObjectLiteralExpression expr ) { ObjectLiteralExpressionTransformer compiler = new ObjectLiteralExpressionTransformer( cc, expr ); return compiler.compile(); } private ObjectLiteralExpressionTransformer( TopLevelTransformationContext cc, ObjectLiteralExpression expr ) { super( cc, expr ); } protected IRExpression compile_impl() { IRExpression typeArg = pushType( _expr().getType() ); IRExpression idValueArg = ExpressionTransformer.compile( _expr().getArgs()[0], _cc() ); idValueArg = boxValue( _expr().getArgs()[0].getType(), idValueArg ); return checkCast( _expr().getType(), callStaticMethod( ObjectLiteralExpressionTransformer.class, "getObjectFromTypeAndId", new Class[]{IType.class, Object.class}, exprList( typeArg, idValueArg ) ) ); } public static Object getObjectFromTypeAndId( IType type, Object idValue ) { String strLocalOrPublicId = CommonServices.getCoercionManager().makeStringFrom( idValue ); long lId = 0; try { lId = Long.parseLong( strLocalOrPublicId ); } catch( NumberFormatException nfe ) { try { lId = CommonServices.getEntityAccess().getHashedEntityId( strLocalOrPublicId, type ); } catch( Exception e ) { throw new RuntimeException( "No entity with id, " + strLocalOrPublicId + ", found for ObjectLiteral of type, " + TypeSystem.getUnqualifiedClassName( type ) ); } } HashedObjectLiteral objectLiteral = new HashedObjectLiteral( type, lId ); return CommonServices.getCoercionManager().convertValue( objectLiteral, objectLiteral.getAssignableClass() ); } }