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 MetaParameter[] getParameters() { final List<Parameter> parameters = defParameters.getParameters(); if (parameters != null) { final List<MetaParameter> metaParameterList = new ArrayList<MetaParameter>();
@Override public MetaParameter[] getParameters() { final List<Parameter> parameters = defParameters.getParameters(); if (parameters != null) { final List<MetaParameter> metaParameterList = new ArrayList<MetaParameter>();
for (final Parameter p : defParameters.getParameters()) {
for (final Parameter p : defParameters.getParameters()) {
public static JaxrsResourceMethodParameters fromMethod(MetaMethod method) { final List<Parameter> defParams = DefParameters.from(method).getParameters(); return fromMethod(method, defParams); }
@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 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 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; }
public static JaxrsResourceMethodParameters fromMethod(MetaMethod method, String parameterArrayVarName) { final List<Statement> params = new ArrayList<Statement>(); final Parameter[] defParms = DefParameters.from(method).getParameters().toArray(new Parameter[0]); for (int i = 0; i < defParms.length; i++) { final MetaClass type = defParms[i].getType().asBoxed(); final Statement s = Cast.to(type, Stmt.loadVariable(parameterArrayVarName, i)); params.add(new Statement() { @Override public String generate(Context context) { return s.generate(context); } @Override public MetaClass getType() { return type; } }); } return fromMethod(method, params); }
final Context context = Context.create(declaringClass.getContext()); for (final Parameter p : defParameters.getParameters()) { context.addVariable(Variable.create(p.getName(), p.getType()));
final Context context = Context.create(declaringClass.getContext()); for (final Parameter p : defParameters.getParameters()) { context.addVariable(Variable.create(p.getName(), p.getType()));
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); }
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 makeMethodAccessible(final ClassStructureBuilder<?> classBuilder, final MetaMethod method, final Modifier[] modifiers) { final MetaMethod erasedMethod = method.getDeclaringClass().getErased().getDeclaredMethod(method.getName(), getErasedParamterTypes(method)); final List<Parameter> wrapperDefParms = new ArrayList<Parameter>(); if (!erasedMethod.isStatic()) { wrapperDefParms.add(Parameter.of(erasedMethod.getDeclaringClass().getErased(), "instance")); } final List<Parameter> methodDefParms = DefParameters.from(erasedMethod).getParameters(); wrapperDefParms.addAll(methodDefParms); Annotation[] annotations = NO_ANNOTATIONS; for (MetaParameter p : erasedMethod.getParameters()) { if (p.getType().getCanonicalName().equals("long")) { annotations = new Annotation[] { UNSAFE_NATIVE_LONG_ANNOTATION }; } } if (erasedMethod.getReturnType().getCanonicalName().equals("long")) { annotations = new Annotation[] { UNSAFE_NATIVE_LONG_ANNOTATION }; } classBuilder.publicMethod(erasedMethod.getReturnType(), PrivateAccessUtil.getPrivateMethodName(method)) .annotatedWith(annotations) .parameters(DefParameters.fromParameters(wrapperDefParms)) .modifiers(appendJsni(modifiers)) .body() ._(StringStatement.of(JSNIUtil.methodAccess(erasedMethod))) .finish(); }
@Override public void makeMethodAccessible(final ClassStructureBuilder<?> classBuilder, final MetaMethod method, final Modifier[] modifiers) { final MetaMethod erasedMethod = method.getDeclaringClass().getErased().getDeclaredMethod(method.getName(), getErasedParamterTypes(method)); final List<Parameter> wrapperDefParms = new ArrayList<Parameter>(); if (!erasedMethod.isStatic()) { wrapperDefParms.add(Parameter.of(erasedMethod.getDeclaringClass().getErased(), "instance")); } final List<Parameter> methodDefParms = DefParameters.from(erasedMethod).getParameters(); wrapperDefParms.addAll(methodDefParms); Annotation[] annotations = NO_ANNOTATIONS; for (MetaParameter p : erasedMethod.getParameters()) { if (p.getType().getCanonicalName().equals("long")) { annotations = new Annotation[] { UNSAFE_NATIVE_LONG_ANNOTATION }; } } if (erasedMethod.getReturnType().getCanonicalName().equals("long")) { annotations = new Annotation[] { UNSAFE_NATIVE_LONG_ANNOTATION }; } classBuilder.publicMethod(erasedMethod.getReturnType(), PrivateAccessUtil.getPrivateMethodName(method)) .annotatedWith(annotations) .parameters(DefParameters.fromParameters(wrapperDefParms)) .modifiers(appendJsni(modifiers)) .body() ._(StringStatement.of(JSNIUtil.methodAccess(erasedMethod))) .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(); }
final List<Parameter> methodDefParms = DefParameters.from(method).getParameters(); wrapperDefParms.addAll(methodDefParms);