List of usage examples for com.google.gwt.dev.cfg ModuleDef getEntryPointTypeNames
public synchronized String[] getEntryPointTypeNames()
From source file:gwt.ns.webworker.rebind.WorkerFactoryGenerator.java
License:Apache License
@Override public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException { TypeOracle typeOracle = context.getTypeOracle(); // find type, subinterface of WorkerFactory JClassType sourceType = typeOracle.findType(typeName); if (sourceType == null) { logger.log(TreeLogger.ERROR, "Could not find type " + typeName); throw new UnableToCompleteException(); }/*from w ww .j a v a 2s . c o m*/ // name of class to be String genName = sourceType.getSimpleSourceName() + "Impl" + getSourceSuffix(); String pkgName = sourceType.getPackage().getName(); String fullName = pkgName + "." + genName; PrintWriter out = context.tryCreate(logger, pkgName, genName); // finished if already generated if (out != null) { // retrieve name of Worker module from annotation WorkerModuleDef workerDef = sourceType.getAnnotation(WorkerModuleDef.class); if (workerDef == null) { logger.log(TreeLogger.ERROR, "WorkerFactory declaration must be " + "annotated with module name."); throw new UnableToCompleteException(); } String moduleName = workerDef.value(); // better way? should be cached after first load (in this process) ModuleDef modDef; try { modDef = ModuleDefLoader.loadFromClassPath(logger, moduleName, true); } catch (UnableToCompleteException e) { logger.log(TreeLogger.ERROR, "An attempt to load the Worker module annotated, \"" + moduleName + "\", failed. See preceeding error."); throw e; } // basic module validity check: one entry point extending valid // Worker entry point class. // checked here so as to fail as soon as possible // only one entrypoint is supported for now String[] entryPoints = modDef.getEntryPointTypeNames(); if (entryPoints.length < 1) { logger.log(TreeLogger.ERROR, "Worker defined in " + moduleName + " must have an entry point specified."); throw new UnableToCompleteException(); } else if (entryPoints.length > 1) { logger.log(TreeLogger.ERROR, "Only a single entry point is currently supported. " + moduleName + " appears to define more than one:"); for (String enPoint : entryPoints) logger.log(TreeLogger.ERROR, "EntryPoint: " + enPoint); throw new UnableToCompleteException(); } // check to make sure entrypoint is worker compatible JClassType workerEntryType = typeOracle.findType(entryPoints[0]); JClassType superEntryType = typeOracle.findType(WorkerEntryPoint.class.getCanonicalName()); if (!workerEntryType.isAssignableTo(superEntryType)) { logger.log(TreeLogger.ERROR, "Worker EntryPoint " + workerEntryType.getName() + " must be assignable to " + superEntryType.getName()); throw new UnableToCompleteException(); } // generate WebWorker factory generateWorkerFactory(logger, context, sourceType, genName, out, modDef, workerEntryType); } return fullName; }