private void generateMethod(ClassStructureBuilder<?> classBuilder, MetaMethod method) { final List<Class<?>> interceptors = interceptorProvider.getInterceptors(remote, method); final boolean intercepted = !interceptors.isEmpty(); final Parameter[] parms = DefParameters.from(method).getParameters().toArray(new Parameter[0]); final Parameter[] finalParms = new Parameter[parms.length]; final List<Statement> parmVars = new ArrayList<Statement>(); for (int i = 0; i < parms.length; i++) { finalParms[i] = Parameter.of(parms[i].getType().getErased(), parms[i].getName(), true); parmVars.add(Stmt.loadVariable(parms[i].getName())); } final Statement parameters = (intercepted) ? new StringStatement("getParameters()", MetaClassFactory.get(Object[].class)) : Stmt.newArray(Object.class).initialize(parmVars.toArray()); final BlockBuilder<?> methodBlock = classBuilder.publicMethod(method.getReturnType().getErased(), method.getName(), finalParms); if (intercepted) { methodBlock.append(generateInterceptorLogic(classBuilder, method, generateRequest(classBuilder, method, parameters, true), parmVars, interceptors)); } else { methodBlock.append(generateRequest(classBuilder, method, parameters, false)); } final Statement returnStmt = ProxyUtil.generateProxyMethodReturnStatement(method); if (returnStmt != null) { methodBlock.append(returnStmt); } methodBlock.finish(); }
public static AbstractStatementBuilder getAnnotationArrayStmt(final org.jboss.errai.ioc.rebind.ioc.graph.api.Qualifier qualifier) { return newArray(Annotation.class).initialize(qualifier.stream().map(AbstractBodyGenerator::annotationLiteral).toArray()); }
public static AbstractStatementBuilder getAssignableTypesArrayStmt(final Injectable injectable) { final Object[] assignableTypes = injectable.getAnnotatedObject() .flatMap(annotated -> Optional.ofNullable(annotated.getAnnotation(Typed.class))) .map(typedAnno -> typedAnno.value()) // Ensure that Object is an assignable type .map(beanTypes -> { if (Arrays.stream(beanTypes).anyMatch(type -> Object.class.equals(type))) { return (Object[]) beanTypes; } else { final Class<?>[] copyWithObject = Arrays.copyOf(beanTypes, beanTypes.length+1); copyWithObject[beanTypes.length] = Object.class; return (Object[]) copyWithObject; } }) .orElseGet(() -> getAllAssignableTypes(injectable.getInjectedType()).stream().filter(MetaClass::isPublic).toArray()); return newArray(Class.class).initialize(assignableTypes); }
private Statement generateInterceptorLogic(ClassStructureBuilder<?> classBuilder, MetaMethod method, Statement requestLogic, List<Statement> parmVars, List<Class<?>> interceptors) { final Statement callContext = ProxyUtil.generateProxyMethodCallContext(context, RemoteCallContext.class, classBuilder.getClassDefinition(), method, requestLogic, interceptors).finish(); return Stmt.try_() .append( Stmt.declareVariable(CallContextStatus.class).asFinal().named("status").initializeWith( Stmt.newObject(CallContextStatus.class).withParameters(interceptors.toArray()))) .append( Stmt.declareVariable(RemoteCallContext.class).asFinal().named("callContext") .initializeWith(callContext)) .append( Stmt.loadVariable("callContext").invoke("setParameters", Stmt.newArray(Object.class).initialize(parmVars.toArray()))) .append( Stmt.loadVariable("callContext").invoke("proceed")) .finish() .catch_(Throwable.class, "throwable") .append( If.cond(Bool.notEquals(Stmt.loadVariable("errorCallback"), Stmt.loadLiteral(null))) .append( If.cond(Stmt.loadVariable("errorCallback").invoke("error", Stmt.load(null), Variable.get("throwable"))) .append(Stmt.loadVariable("this").invoke("invokeDefaultErrorHandlers", Variable.get("throwable"))) .finish() ).finish() .else_() .append(Stmt.loadVariable("this").invoke("invokeDefaultErrorHandlers", Variable.get("throwable"))) .finish()) .finish(); }
private void generateMethod(ClassStructureBuilder<?> classBuilder, MetaMethod method) { final List<Class<?>> interceptors = interceptorProvider.getInterceptors(remote, method); final boolean intercepted = !interceptors.isEmpty(); final Parameter[] parms = DefParameters.from(method).getParameters().toArray(new Parameter[0]); final Parameter[] finalParms = new Parameter[parms.length]; final List<Statement> parmVars = new ArrayList<Statement>(); for (int i = 0; i < parms.length; i++) { finalParms[i] = Parameter.of(parms[i].getType().getErased(), parms[i].getName(), true); parmVars.add(Stmt.loadVariable(parms[i].getName())); } final Statement parameters = (intercepted) ? new StringStatement("getParameters()", MetaClassFactory.get(Object[].class)) : Stmt.newArray(Object.class).initialize(parmVars.toArray()); final BlockBuilder<?> methodBlock = classBuilder.publicMethod(method.getReturnType().getErased(), method.getName(), finalParms); if (intercepted) { methodBlock.append(generateInterceptorLogic(classBuilder, method, generateRequest(classBuilder, method, parameters, true), parmVars, interceptors)); } else { methodBlock.append(generateRequest(classBuilder, method, parameters, false)); } final Statement returnStmt = ProxyUtil.generateProxyMethodReturnStatement(method); if (returnStmt != null) { methodBlock.append(returnStmt); } methodBlock.finish(); }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeTwoDimensionalArray() { final String s = StatementBuilder.create().newArray(Integer.class) .initialize(new Integer[][] { { 1, 2 }, { 3, 4 } }) .toJavaString(); assertEquals("Failed to generate two dimensional array", "new Integer[][] { { 1, 2 }, { 3, 4 } }", s); }
@Test public void testCreateAndInitializeArray() { final String s = StatementBuilder.create().newArray(String.class).initialize("1", "2").toJavaString(); assertEquals("Failed to generate 1-dimensional String array", "new String[] { \"1\", \"2\" }", s); }
@Test public void testCreateAndInitializeArrayWithInvalidInitialization() { try { StatementBuilder.create().newArray(Annotation.class) .initialize("1", "2") .toJavaString(); fail("Expected InvalidTypeException"); } catch (InvalidTypeException oose) { // expected } }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeTwoDimensionalObjectArrayWithIntegers() { final String s = StatementBuilder.create().newArray(Object.class) .initialize(new Object[][] { { 1, 2 } }) .toJavaString(); assertEquals("Failed to generate two dimensional array", "new Object[][] { { 1, 2 } }", s); }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeTwoDimensionalArrayWithSingleValue() { final String s = StatementBuilder.create().newArray(Integer.class) .initialize(new Object[][] { { 1, 2 } }) .toJavaString(); assertEquals("Failed to generate two dimensional array", "new Integer[][] { { 1, 2 } }", s); }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeThreeDimensionalArray() { final String s = StatementBuilder.create().newArray(String.class) .initialize(new String[][][] { { { "1", "2" }, { "a", "b" } }, { { "3", "4" }, { "b", "c" } } }) .toJavaString(); assertEquals("Failed to generate three dimensional array", "new String[][][] { { { \"1\", \"2\" }, { \"a\", \"b\" } }, { { \"3\", \"4\" }, { \"b\", \"c\" } } }", s); }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeTwoDimensionalArrayWithStatementsAndLiterals() { final String s = StatementBuilder.create().newArray(String.class) .initialize(new Object[][] { { StatementBuilder.create().invokeStatic(Integer.class, "toString", 1), "2" }, { StatementBuilder.create().invokeStatic(Integer.class, "toString", 3), "4" } }) .toJavaString(); assertEquals("Failed to generate two dimensional array using statements and objects", "new String[][] { { Integer.toString(1), \"2\" }," + " { Integer.toString(3), \"4\" } }", s); }
@Test @SuppressWarnings(value = { "all" }) public void testCreateAndInitializeTwoDimensionalArrayWithStatements() { final String s = StatementBuilder.create().newArray(String.class) .initialize(new Statement[][] { { StatementBuilder.create().invokeStatic(Integer.class, "toString", 1), StatementBuilder.create().invokeStatic(Integer.class, "toString", 2) }, { StatementBuilder.create().invokeStatic(Integer.class, "toString", 3), StatementBuilder.create().invokeStatic(Integer.class, "toString", 4) } }) .toJavaString(); assertEquals("Failed to generate two dimensional array using statements", "new String[][] { { Integer.toString(1), Integer.toString(2) }, " + "{ Integer.toString(3), Integer.toString(4) } }", s); }
/** * Returns a statement that evaluates to a new instance of the TypedQueryFactory implementation. */ public Statement generate(Context context) { // anonQueryClassBuilder comes out as a statement that looks like this: // new ErraiTypedQuery(entityManager, actualResultType, parameters) { // public void matches(JSONObject object) { ... } // public void sort(List<T> resultList) { ... } // } AnonymousClassStructureBuilder anonQueryClassBuilder = ObjectBuilder.newInstanceOf(ErraiTypedQuery.class, context).extend( Stmt.loadVariable("entityManager"), Stmt.loadVariable("actualResultType"), Stmt.loadVariable("parameters")); appendMatchesMethod(anonQueryClassBuilder); appendComparatorMethod(anonQueryClassBuilder, context); AnonymousClassStructureBuilder factoryBuilder = ObjectBuilder.newInstanceOf(TypedQueryFactory.class, context).extend( Stmt.loadLiteral(resultType), Stmt.newArray(ErraiParameter.class).initialize((Object[]) generateQueryParamArray())); BlockBuilder<AnonymousClassStructureBuilder> createQueryMethod = factoryBuilder.protectedMethod( TypedQuery.class, "createQuery", Parameter.finalOf(ErraiEntityManager.class, "entityManager")) .body(); createQueryMethod.append(Stmt.nestedCall(anonQueryClassBuilder.finish()).returnValue()); createQueryMethod.finish(); return factoryBuilder.finish(); }
private Statement generateInterceptorLogic(ClassStructureBuilder<?> classBuilder, MetaMethod method, Statement requestLogic, List<Statement> parmVars, List<Class<?>> interceptors) { final Statement callContext = ProxyUtil.generateProxyMethodCallContext(context, RemoteCallContext.class, classBuilder.getClassDefinition(), method, requestLogic, interceptors).finish(); return Stmt.try_() .append( Stmt.declareVariable(CallContextStatus.class).asFinal().named("status").initializeWith( Stmt.newObject(CallContextStatus.class).withParameters(interceptors.toArray()))) .append( Stmt.declareVariable(RemoteCallContext.class).asFinal().named("callContext") .initializeWith(callContext)) .append( Stmt.loadVariable("callContext").invoke("setParameters", Stmt.newArray(Object.class).initialize(parmVars.toArray()))) .append( Stmt.loadVariable("callContext").invoke("proceed")) .finish() .catch_(Throwable.class, "throwable") .append( If.cond(Bool.notEquals(Stmt.loadVariable("errorCallback"), Stmt.loadLiteral(null))) .append( If.cond(Stmt.loadVariable("errorCallback").invoke("error", Stmt.load(null), Variable.get("throwable"))) .append(Stmt.loadVariable("this").invoke("invokeDefaultErrorHandlers", Variable.get("throwable"))) .finish() ).finish() .else_() .append(Stmt.loadVariable("this").invoke("invokeDefaultErrorHandlers", Variable.get("throwable"))) .finish()) .finish(); }
.append( Stmt.loadVariable("callContext").invoke("setParameters", Stmt.newArray(Object.class).initialize(parameters.toArray()))) .append( Stmt.loadVariable("callContext").invoke("proceed"))
.initialize(annotation1, annotation2) .toJavaString();