List of usage examples for com.google.gwt.user.rebind SourceWriter outdent
void outdent();
From source file:xapi.dev.generators.SyncInjectionGenerator.java
License:Open Source License
/** * @throws ClassNotFoundException//from w w w. ja v a2 s . co m */ public static RebindResult execImpl(TreeLogger logger, GeneratorContext context, JClassType type) throws ClassNotFoundException { PlatformSet allowed = CurrentGwtPlatform.getPlatforms(context); JClassType targetType = type; String simpleName = "SingletonFor_" + type.getSimpleSourceName(); SingletonOverride winningOverride = null; JClassType winningType = null; boolean trace = logger.isLoggable(Type.TRACE); for (JClassType subtype : type.getSubtypes()) { if (winningType == null) { SingletonDefault singletonDefault = subtype.getAnnotation(SingletonDefault.class); if (singletonDefault != null) { if (allowed.isAllowedType(subtype)) winningType = subtype; continue; } } SingletonOverride override = subtype.getAnnotation(SingletonOverride.class); if (override != null) { if (trace) logger.log(Type.DEBUG, "Got subtype " + subtype + " : " + " - prodMode: " + context.isProdMode()); if (allowed.isAllowedType(subtype)) { if (winningOverride != null) { if (winningOverride.priority() > override.priority()) continue; } winningOverride = override; winningType = subtype; } } } if (winningType == null) { winningType = targetType;//no matches, resort to instantiate the class sent. //TODO sanity check here } if (trace) X_Log.info("Singleton Injection Winner: " + winningType.getName()); String packageName = type.getPackage().getName(); ensureProviderClass(logger, packageName, type.getSimpleSourceName(), type.getQualifiedSourceName(), SourceUtil.toSourceName(winningType.getQualifiedSourceName()), context); packageName = packageName + ".impl"; PrintWriter printWriter = context.tryCreate(logger, packageName, simpleName); if (printWriter == null) { return new RebindResult(RebindMode.USE_EXISTING, packageName + "." + simpleName); } ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(packageName, simpleName); composer.setSuperclass(SingletonInitializer.class.getName() + "<" + type.getQualifiedSourceName() + ">"); composer.addImport(ReceivesValue.class.getName()); SourceWriter sw = composer.createSourceWriter(context, printWriter); sw.println(); //TODO: also check if compile is set to async = false //if async is already generated when this singleton access occurs, //but we haven't yet injected the callback which accesses the global singleton, //we'll have to route our get() through the existing async callback block //to prevents code splitting from falling apart. This will, at worst, //cause providers to return null until the service is actually initialized. if (context.isProdMode() && isAsyncProvided(logger, packageName, type.getSimpleSourceName(), context) && !isCallbackInjected(logger, packageName, type.getSimpleSourceName(), context)) { //this edge case happens when a service is accessed synchronously //inside of its own asynchronous callback //TODO use GWT's AsyncProxy class to queue up requests... logger.log(Type.WARN, "Generating interim singleton provider"); sw.indent(); sw.println("private static " + type.getQualifiedSourceName() + " value = null;"); sw.println("@Override"); sw.println("public final " + type.getQualifiedSourceName() + " initialValue(){"); sw.indent(); sw.println("if (value!=null)return value;"); sw.println(packageName + "." + InjectionUtils.generatedAsyncProviderName(type.getSimpleSourceName())); sw.indent(); sw.print(".request(new ReceivesValue<"); sw.println(type.getQualifiedSourceName() + ">(){"); sw.indent(); sw.println("@Override"); sw.print("public void set("); sw.println(type.getQualifiedSourceName() + " x){"); sw.indent(); sw.println("value=x;"); sw.outdent(); sw.println("}"); sw.outdent(); sw.println("});"); sw.outdent(); sw.println("return value;"); } else { //all non-prod or non-async providers can safely access the singleton directly sw.println("@Override"); sw.println("public final " + type.getQualifiedSourceName() + " initialValue(){"); sw.indent(); //normal operation; just wrap the static final singleton provider. sw.print("return " + type.getPackage().getName() + "." + InjectionUtils.generatedProviderName(type.getSimpleSourceName())); sw.println(".theProvider.get();"); } sw.outdent(); sw.println("}"); sw.println(); sw.commit(logger); //TODO: implement caching once this code is finalized return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING, packageName + "." + simpleName); }