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(); }
@Override public String getName() { return p.getName(); }
@Override public String getName() { return p.getName(); }
@Override public String getName() { return p.getName(); }
@Override public String getName() { return p.getName(); }
@Override public String toString() { final StringBuilder buf = new StringBuilder("("); for (int i = 0; i < parameters.size(); i++) { buf.append(parameters.get(i).getType().getFullyQualifiedName()) .append(' ').append(parameters.get(i).getName()); if (i + 1 < parameters.size()) { buf.append(", "); } } return buf.append(")").toString(); }
@Override public String toString() { final StringBuilder buf = new StringBuilder("("); for (int i = 0; i < parameters.size(); i++) { buf.append(parameters.get(i).getType().getFullyQualifiedName()) .append(' ').append(parameters.get(i).getName()); if (i + 1 < parameters.size()) { buf.append(", "); } } return buf.append(")").toString(); }
public static DefParameters from(final MetaMethod method, final Parameter... parms) { final List<Parameter> parameters = new ArrayList<Parameter>(); int i = 0; for (final MetaParameter parm : method.getParameters()) { parameters.add(Parameter.of(parm.getType(), parms[i].getName(), parms[i++].isFinal())); } return new DefParameters(parameters); }
public static DefParameters from(final MetaMethod method, final Parameter... parms) { final List<Parameter> parameters = new ArrayList<Parameter>(); int i = 0; for (final MetaParameter parm : method.getParameters()) { parameters.add(Parameter.of(parm.getType(), parms[i].getName(), parms[i++].isFinal())); } return new DefParameters(parameters); }
@Override public String toJavaString() { if (generatedCache != null) return generatedCache; final Context context = Context.create(declaringClass.getContext()); defParameters.getParameters().stream().forEach(p -> context.addVariable(Variable.create(p.getName(), p.getType()))); final StringBuilder build = new StringBuilder(512); if (constructorComment != null) { build.append(new Comment(constructorComment).generate(null)).append('\n'); } return generatedCache = build.append(scope.getCanonicalName()) .append(" ") .append(declaringClass.getName()) .append(defParameters.generate(context)) .append(" {\n").append(body.generate(context)).append("\n}\n") .toString(); }
@Override public AnonymousClassStructureBuilder callback(final Statement statement) { addCallable(context -> { final Context subContext = Context.create(context); parameters.getParameters() .forEach(p -> subContext.addVariable(Variable.create(p.getName(), p.getType()))); final StringBuilder buf = new StringBuilder(256); final String returnType = getClassReference(method.getReturnType(), context); buf.append("public ").append(returnType) .append(" ") .append(method.getName()) .append(parameters.generate(context)).append(" {\n"); if (statement != null) { buf.append(statement.generate(subContext)).append("\n"); } buf.append("}\n"); return buf.toString(); }); return AnonymousClassStructureBuilderImpl.this; }
@Override public String toJavaString() { if (generatedCache != null) return generatedCache; final Context context = Context.create(declaringClass.getContext()); defParameters.getParameters().stream().forEach(p -> context.addVariable(Variable.create(p.getName(), p.getType()))); final StringBuilder build = new StringBuilder(512); if (constructorComment != null) { build.append(new Comment(constructorComment).generate(null)).append('\n'); } return generatedCache = build.append(scope.getCanonicalName()) .append(" ") .append(declaringClass.getName()) .append(defParameters.generate(context)) .append(" {\n").append(body.generate(context)).append("\n}\n") .toString(); }
@Override public AnonymousClassStructureBuilder callback(final Statement statement) { addCallable(context -> { final Context subContext = Context.create(context); parameters.getParameters() .forEach(p -> subContext.addVariable(Variable.create(p.getName(), p.getType()))); final StringBuilder buf = new StringBuilder(256); final String returnType = getClassReference(method.getReturnType(), context); buf.append("public ").append(returnType) .append(" ") .append(method.getName()) .append(parameters.generate(context)).append(" {\n"); if (statement != null) { buf.append(statement.generate(subContext)).append("\n"); } buf.append("}\n"); return buf.toString(); }); return AnonymousClassStructureBuilderImpl.this; }
context.addVariable(Variable.create(p.getName(), p.getType()));
public static Statement marshal(final Statement statement, final String contentType) { if (statement instanceof Parameter) { final Parameter param = (Parameter) statement; return marshal(param.getType(), Variable.get(param.getName()), contentType); } return marshal(statement.getType(), statement, contentType); }
public JaxrsProxyMethodGenerator(final MetaClass remote, final ClassStructureBuilder<?> classBuilder, final JaxrsResourceMethod resourceMethod, final InterceptorProvider interceptorProvider, final GeneratorContext context) { this.remote = remote; this.declaringClass = classBuilder.getClassDefinition(); this.resourceMethod = resourceMethod; this.interceptorProvider = interceptorProvider; this.context = context; final Parameter[] parms = DefParameters.from(resourceMethod.getMethod()).getParameters().toArray(new Parameter[0]); final Parameter[] finalParms = new Parameter[parms.length]; parameters = new ArrayList<>(); for (int i = 0; i < parms.length; i++) { finalParms[i] = Parameter.of(parms[i].getType(), parms[i].getName(), true); parameters.add(Stmt.loadVariable(parms[i].getName())); } this.methodBlock = classBuilder.publicMethod(resourceMethod.getMethod().getReturnType(), resourceMethod.getMethod().getName(), finalParms); }
@Override public String generate(Context context) { if (param instanceof Parameter) { return Stmt.castTo(PathSegmentImpl.class, Stmt.loadVariable(((Parameter) param).getName())) .invoke("getEncodedPathWithParameters").generate(context); } else { return Stmt.castTo(PathSegmentImpl.class, param).invoke("getEncodedPathWithParameters").generate(context); } }
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(); }
@Override public void makeConstructorAccessible(final ClassStructureBuilder<?> classBuilder, final MetaConstructor constructor) { final DefParameters methodDefParms = DefParameters.from(constructor); final String cachedMethod = initCachedMethod(classBuilder, constructor); final Object[] args = new Object[methodDefParms.getParameters().size()]; int i = 0; for (final Parameter p : methodDefParms.getParameters()) { args[i++] = Refs.get(p.getName()); } final BlockBuilder<? extends ClassStructureBuilder> body = classBuilder.publicMethod(constructor.getReturnType(), PrivateAccessUtil.getPrivateMethodName(constructor)) .parameters(methodDefParms) .modifiers(Modifier.Static) .body(); final Statement tryBuilder = Stmt.try_() .append( Stmt.nestedCall( Stmt.castTo(constructor.getReturnType(), Stmt.loadVariable(cachedMethod).invoke("newInstance", (Object) args))).returnValue()) .finish() .catch_(Throwable.class, "e") .append(Stmt.loadVariable("e").invoke("printStackTrace")) .append(Stmt.throw_(RuntimeException.class, Refs.get("e"))) .finish(); body.append(tryBuilder).finish(); }
@Override public void makeConstructorAccessible(final ClassStructureBuilder<?> classBuilder, final MetaConstructor constructor) { final DefParameters methodDefParms = DefParameters.from(constructor); final String cachedMethod = initCachedMethod(classBuilder, constructor); final Object[] args = new Object[methodDefParms.getParameters().size()]; int i = 0; for (final Parameter p : methodDefParms.getParameters()) { args[i++] = Refs.get(p.getName()); } final BlockBuilder<? extends ClassStructureBuilder> body = classBuilder.publicMethod(constructor.getReturnType(), PrivateAccessUtil.getPrivateMethodName(constructor)) .parameters(methodDefParms) .modifiers(Modifier.Static) .body(); final Statement tryBuilder = Stmt.try_() .append( Stmt.nestedCall( Stmt.castTo(constructor.getReturnType(), Stmt.loadVariable(cachedMethod).invoke("newInstance", (Object) args))).returnValue()) .finish() .catch_(Throwable.class, "e") .append(Stmt.loadVariable("e").invoke("printStackTrace")) .append(Stmt.throw_(RuntimeException.class, Refs.get("e"))) .finish(); body.append(tryBuilder).finish(); }