@Override public String generate(final TreeLogger logger, final GeneratorContext context, String typeName) throws UnableToCompleteException { return startAsyncGeneratorsAndWaitFor(JaxrsProxyLoader.class, context, logger, packageName, className); }
@Override protected String generate(final TreeLogger logger, final GeneratorContext context) { ClassStructureBuilder<?> classBuilder = ClassBuilder.implement(JaxrsProxyLoader.class); MethodBlockBuilder<?> loadProxies = classBuilder.publicMethod(void.class, "loadProxies"); final InterceptorProvider interceptorProvider = getInterceptorProvider(context); final Multimap<MetaClass, MetaClass> exceptionMappers = getClientExceptionMappers(context); Collection<MetaClass> remotes = ClassScanner.getTypesAnnotatedWith(Path.class, RebindUtils.findTranslatablePackages(context), context); addCacheRelevantClasses(remotes); for (MetaClass remote : remotes) { if (remote.isInterface()) { // create the remote proxy for this interface ClassStructureBuilder<?> remoteProxy = new JaxrsProxyGenerator(remote, context, interceptorProvider, exceptionMappers).generate(); loadProxies.append(new InnerClass(remoteProxy.getClassDefinition())); // create the proxy provider Statement proxyProvider = ObjectBuilder.newInstanceOf(ProxyProvider.class) .extend() .publicOverridesMethod("getProxy") .append(Stmt.nestedCall(Stmt.newObject(remoteProxy.getClassDefinition())).returnValue()) .finish() .finish(); // create the call that registers the proxy provided for the generated proxy loadProxies.append(Stmt.invokeStatic(RemoteServiceProxyFactory.class, "addRemoteProxy", remote, proxyProvider)); } } classBuilder = (ClassStructureBuilder<?>) loadProxies.finish(); return classBuilder.toJavaString(); }
/** * Returns an {@link InterceptorProvider} that can be used to retrieve interceptors for the remote * interface/method. */ private InterceptorProvider getInterceptorProvider(final GeneratorContext context) { final Collection<MetaClass> featureInterceptors = ClassScanner.getTypesAnnotatedWith(FeatureInterceptor.class, RebindUtils.findTranslatablePackages(context), context); addCacheRelevantClasses(featureInterceptors); final Collection<MetaClass> standaloneInterceptors = ClassScanner.getTypesAnnotatedWith(InterceptsRemoteCall.class, RebindUtils.findTranslatablePackages(context), context); addCacheRelevantClasses(standaloneInterceptors); return new InterceptorProvider(featureInterceptors, standaloneInterceptors); }