Example usage for com.google.gwt.dev.cfg ModuleDef getEntryPointTypeNames

List of usage examples for com.google.gwt.dev.cfg ModuleDef getEntryPointTypeNames

Introduction

In this page you can find the example usage for com.google.gwt.dev.cfg ModuleDef getEntryPointTypeNames.

Prototype

public synchronized String[] getEntryPointTypeNames() 

Source Link

Usage

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;
}