Example usage for com.google.gwt.core.ext GeneratorContext tryCreateResource

List of usage examples for com.google.gwt.core.ext GeneratorContext tryCreateResource

Introduction

In this page you can find the example usage for com.google.gwt.core.ext GeneratorContext tryCreateResource.

Prototype

OutputStream tryCreateResource(TreeLogger logger, String partialPath) throws UnableToCompleteException;

Source Link

Document

Attempts to get an OutputStream so that the caller can write file contents into the named file underneath the compilation output directory.

Usage

From source file:com.chrome.gwt.linker.ComponentGenerator.java

License:Apache License

private static void emitComponentPage(TreeLogger logger, GeneratorContext context, String name, String path)
        throws UnableToCompleteException {
    final OutputStream stream = context.tryCreateResource(logger, path);
    if (stream != null) {
        final PrintWriter writer = new PrintWriter(new OutputStreamWriter(stream));
        writer.println("<html>");
        writer.println("<head></head>");
        writer.println("<body>");
        writer.println("  <script>");
        writer.println("  window.onload = function() {");
        writer.println("    var views = chrome.self.getViews();");
        writer.println("    views[0][\"" + name + "\"](window);");
        writer.println("  };");
        writer.println("  </script>");
        writer.println("</body>");
        writer.println("</html>");
        writer.close();//from w  ww .j a  v a 2  s .c o m
        context.commitResource(logger, stream);
    }
}

From source file:com.chrome.gwt.linker.ExtensionGenerator.java

License:Apache License

private static IconInfo[] createIconResources(TreeLogger logger, GeneratorContext context, JClassType userType,
        String[] icons) throws UnableToCompleteException {
    final IconInfo[] result = new IconInfo[icons.length];
    for (int i = 0, n = icons.length; i < n; ++i) {
        final String icon = icons[i];

        // Open a stream for the icon resource.
        InputStream iconStream = ExtensionGenerator.class.getClassLoader()
                .getResourceAsStream(getResourcePath(userType, icon));
        if (iconStream == null) {
            logger.log(TreeLogger.ERROR, "Resource not found on classpath: " + icon);
            throw new UnableToCompleteException();
        }/*from w  ww.ja  v  a  2 s . c om*/

        try {
            // Read the icon's byte data and decode it to determine the size.
            final byte[] iconData = getBytesFromStream(iconStream);
            assert iconData != null;
            final String strongname = Util.computeStrongName(iconData) + getIconExtension(icon);
            result[i] = new IconInfo(strongname, getImageSize(iconData));

            // Write the icon's bytes into GWT resource.
            try {
                final OutputStream resStream = context.tryCreateResource(logger, strongname);
                if (resStream != null) {
                    resStream.write(iconData);
                    context.commitResource(logger, resStream);
                }
            } catch (IOException e) {
                logger.log(TreeLogger.ERROR, "Unable to write resource: " + icon, e);
                throw new UnableToCompleteException();
            }

        } catch (IOException e) {
            logger.log(TreeLogger.ERROR, "Unable to read image: " + icon, e);
            throw new UnableToCompleteException();
        }
    }

    return result;
}

From source file:com.eleven.rebind.SkinBundleBuilder.java

License:Apache License

public String writeBundledImage(final TreeLogger logger, final GeneratorContext context)
        throws UnableToCompleteException {

    // Create the bundled image from all of the constituent images.
    BufferedImage bundledImage = drawBundledImage();

    // Write the bundled image into a byte array, so that we can compute
    // its strong name.
    byte[] imageBytes;

    try {//from  w w w  .j  a v a  2s .c o m
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        ImageIO.write(bundledImage, BUNDLE_FILE_TYPE, byteOutputStream);
        imageBytes = byteOutputStream.toByteArray();
    } catch (IOException e) {
        logger.log(TreeLogger.ERROR, "Unable to generate file name for image bundle file", null);
        throw new UnableToCompleteException();
    }

    // Compute the file name. The strong name is generated from the bytes of
    // the bundled image. The '.cache' part indicates that it can be
    // permanently cached.
    String bundleFileName = Util.computeStrongName(imageBytes) + ".cache." + BUNDLE_FILE_TYPE;

    // Try and write the file to disk. If a file with bundleFileName already
    // exists, then the file will not be written.
    OutputStream outStream = context.tryCreateResource(logger, bundleFileName);

    if (outStream != null) {
        try {
            // Write the image bytes from the byte array to the pending
            // stream.
            outStream.write(imageBytes);

            // Commit the stream.
            context.commitResource(logger, outStream);

        } catch (IOException e) {
            logger.log(TreeLogger.ERROR, "Failed while writing", e);
            throw new UnableToCompleteException();
        }
    } else
        logger.log(TreeLogger.TRACE, "Generated image bundle file already exists; no need to rewrite it.",
                null);

    return bundleFileName;
}

From source file:com.msco.mil.server.com.sencha.gxt.explorer.rebind.SampleGenerator.java

License:sencha.com license

private void writeFileToHtml(TreeLogger l, GeneratorContext ctx, String path) throws UnableToCompleteException {
    Resource file = ctx.getResourcesOracle().getResourceMap().get(path);
    if (file == null) {
        l.log(Type.ERROR, "File cannot be found.");
        throw new UnableToCompleteException();
    }/* w ww . ja v  a2 s  .c  om*/
    OutputStream stream = ctx.tryCreateResource(l, "code/" + path.replace('/', '.') + ".html");
    if (stream == null) {
        // file already exists for this compile
        return;
    }
    try {
        InputStream input = file.openContents();
        byte[] bytes = new byte[input.available()];
        input.read(bytes);
        input.close();

        // Write out the HTML file
        // TODO change this header
        stream.write(javaHeader.getBytes());
        stream.write(bytes);
        stream.write(footer.getBytes());

        stream.close();

    } catch (Exception e) {
        l.log(Type.ERROR, "An error occured writing out a file into html", e);
        throw new UnableToCompleteException();
    }

    ctx.commitResource(l, stream);
}

From source file:com.msco.mil.server.com.sencha.gxt.explorer.rebind.SampleGenerator.java

License:sencha.com license

/**
 * Writes out the given class/interface to an HTML file, using the current
 * header/footer strings//  ww  w  .j a  v a 2s. co  m
 * 
 * @param l
 * @param ctx
 * @param type
 * @throws UnableToCompleteException
 */
private void writeTypeToHtml(TreeLogger l, GeneratorContext ctx, JClassType type)
        throws UnableToCompleteException {
    assert type.isClassOrInterface() != null : "Can only generate source for classes or interfaces";
    OutputStream stream = ctx.tryCreateResource(l, "code/" + type.getQualifiedSourceName() + ".html");
    if (stream == null) {
        // file already exists for this compile
        return;
    }

    try {
        String name = type.getQualifiedSourceName().replace('.', '/') + ".java";
        l.log(Type.DEBUG, "Reading from " + name);

        InputStream input = sourceOracle.getResourceMap().get(name).openContents();
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));

        // Write out the HTML file
        stream.write(javaHeader.getBytes());
        String line;
        boolean skip = false;
        while (null != (line = reader.readLine())) {
            if (line.startsWith("@Detail") || line.startsWith("@Example.Detail")) {
                skip = true;
            } else if (skip) {
                if (line.startsWith("public")) {
                    skip = false;
                }
            }
            if (!skip) {
                stream.write(line.getBytes());
                stream.write('\n');
            }
        }
        stream.write(footer.getBytes());

        stream.close();
    } catch (Exception e) {
        l.log(Type.ERROR, "Error occured writing out a java file into html", e);
        throw new UnableToCompleteException();
    }

    ctx.commitResource(l, stream);
}

From source file:de.csenk.gwt.ws.rebind.filter.serialization.GWTSerializerGenerator.java

License:Open Source License

/**
 * @param serializerLogger/*w ww  . ja va  2  s  . co m*/
 * @param context
 * @param serializerInterface
 * @return
 */
private String createSerializer(TreeLogger serializerLogger, GeneratorContext context,
        JClassType serializerInterface) throws UnableToCompleteException {
    TypeOracle typeOracle = context.getTypeOracle();
    SourceWriter sourceWriter = getSourceWriter(serializerLogger, context, serializerInterface);
    if (sourceWriter == null)
        return getImplementationQualifiedName(serializerInterface);

    // TODO gwtws: validate serializerInterface

    final PropertyOracle propertyOracle = context.getPropertyOracle();

    // Load the blacklist/whitelist
    TypeFilter blacklistTypeFilter = new BlacklistTypeFilter(serializerLogger, propertyOracle);

    // Determine the set of serializable types
    SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new SerializableTypeOracleBuilder(
            serializerLogger, propertyOracle, typeOracle);
    typesSentFromBrowserBuilder.setTypeFilter(blacklistTypeFilter);
    SerializableTypeOracleBuilder typesSentToBrowserBuilder = new SerializableTypeOracleBuilder(
            serializerLogger, propertyOracle, typeOracle);
    typesSentToBrowserBuilder.setTypeFilter(blacklistTypeFilter);

    addRoots(serializerLogger, typeOracle, typesSentFromBrowserBuilder, typesSentToBrowserBuilder,
            serializerInterface);

    // TODO gwtws: Type name ellision?

    // Create a resource file to receive all of the serialization
    // information
    // computed by STOB and mark it as private so it does not end up in the
    // output.
    OutputStream pathInfo = context.tryCreateResource(serializerLogger,
            serializerInterface.getQualifiedSourceName() + ".rpc.log");
    PrintWriter writer = null;
    SerializableTypeOracle typesSentFromBrowser;
    SerializableTypeOracle typesSentToBrowser;
    try {
        writer = new PrintWriter(pathInfo);

        typesSentFromBrowserBuilder.setLogOutputStream(pathInfo);
        typesSentToBrowserBuilder.setLogOutputStream(pathInfo);

        writer.write("====================================\n");
        writer.write("Types potentially sent from browser:\n");
        writer.write("====================================\n\n");
        writer.flush();
        typesSentFromBrowser = typesSentFromBrowserBuilder.build(serializerLogger);

        writer.write("===================================\n");
        writer.write("Types potentially sent from server:\n");
        writer.write("===================================\n\n");
        writer.flush();
        typesSentToBrowser = typesSentToBrowserBuilder.build(serializerLogger);

        if (pathInfo != null) {
            context.commitResource(serializerLogger, pathInfo).setPrivate(true);
        }
    } finally {
        if (writer != null) {
            writer.close();
        }
    }

    Map<JType, String> typeStrings = generateTypeHandlers(serializerLogger, context, typesSentFromBrowser,
            typesSentToBrowser, serializerInterface);

    String serializationPolicyStrongName = writeSerializationPolicyFile(serializerLogger, context,
            typesSentFromBrowser, typesSentToBrowser, typeStrings, serializerInterface);

    String serializerInterfaceName = TypeOracleMediator.computeBinaryClassName(serializerInterface);
    generateFields(sourceWriter, typesSentFromBrowser, serializationPolicyStrongName, serializerInterfaceName,
            serializerInterface);

    generateContructor(sourceWriter, serializerInterface, typeStrings);

    sourceWriter.commit(serializerLogger);
    return getImplementationQualifiedName(serializerInterface);
}

From source file:de.csenk.gwt.ws.rebind.filter.serialization.GWTSerializerGenerator.java

License:Open Source License

/**
 * @param serializerLogger/*  w w w  . jav a 2s .c om*/
 * @param context
 * @param typesSentFromBrowser
 * @param typesSentToBrowser
 * @param typeStrings
 * @return
 */
private String writeSerializationPolicyFile(TreeLogger logger, GeneratorContext ctx,
        SerializableTypeOracle serializationSto, SerializableTypeOracle deserializationSto,
        Map<JType, String> typeStrings, JClassType serializerInterface) throws UnableToCompleteException {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(baos,
                SerializationPolicyLoader.SERIALIZATION_POLICY_FILE_ENCODING);
        TypeOracle oracle = ctx.getTypeOracle();
        PrintWriter pw = new PrintWriter(osw);

        JType[] serializableTypes = unionOfTypeArrays(serializationSto.getSerializableTypes(),
                deserializationSto.getSerializableTypes(), new JType[] { serializerInterface });

        for (int i = 0; i < serializableTypes.length; ++i) {
            JType type = serializableTypes[i];
            String binaryTypeName = TypeOracleMediator.computeBinaryClassName(type);
            pw.print(binaryTypeName);
            pw.print(", " + Boolean.toString(deserializationSto.isSerializable(type)));
            pw.print(", " + Boolean.toString(deserializationSto.maybeInstantiated(type)));
            pw.print(", " + Boolean.toString(serializationSto.isSerializable(type)));
            pw.print(", " + Boolean.toString(serializationSto.maybeInstantiated(type)));
            pw.print(", " + typeStrings.get(type));

            /*
             * Include the serialization signature to bump the RPC file name
             * if obfuscated identifiers are used.
             */
            pw.print(", " + SerializationUtils.getSerializationSignature(oracle, type));
            pw.print('\n');

            /*
             * Emit client-side field information for classes that may be
             * enhanced on the server. Each line consists of a
             * comma-separated list containing the keyword '@ClientFields',
             * the class name, and a list of all potentially serializable
             * client-visible fields.
             */
            if ((type instanceof JClassType) && ((JClassType) type).isEnhanced()) {
                JField[] fields = ((JClassType) type).getFields();
                JField[] rpcFields = new JField[fields.length];
                int numRpcFields = 0;
                for (JField f : fields) {
                    if (f.isTransient() || f.isStatic() || f.isFinal()) {
                        continue;
                    }
                    rpcFields[numRpcFields++] = f;
                }

                pw.print(SerializationPolicyLoader.CLIENT_FIELDS_KEYWORD);
                pw.print(',');
                pw.print(binaryTypeName);
                for (int idx = 0; idx < numRpcFields; idx++) {
                    pw.print(',');
                    pw.print(rpcFields[idx].getName());
                }
                pw.print('\n');
            }
        }

        // Closes the wrapped streams.
        pw.close();

        byte[] serializationPolicyFileContents = baos.toByteArray();
        String serializationPolicyName = Util.computeStrongName(serializationPolicyFileContents);

        String serializationPolicyFileName = SerializationPolicyLoader
                .getSerializationPolicyFileName(serializationPolicyName);
        OutputStream os = ctx.tryCreateResource(logger, serializationPolicyFileName);
        if (os != null) {
            os.write(serializationPolicyFileContents);
            GeneratedResource resource = ctx.commitResource(logger, os);

            /*
             * Record which proxy class created the resource. A manifest
             * will be emitted by the RpcPolicyManifestLinker.
             */
            ctx.commitArtifact(logger,
                    new RpcPolicyFileArtifact(serializerInterface.getQualifiedSourceName(), resource));
        } else {
            logger.log(TreeLogger.TRACE, "SerializationPolicy file for RemoteService '"
                    + serializerInterface.getQualifiedSourceName() + "' already exists; no need to rewrite it.",
                    null);
        }

        return serializationPolicyName;
    } catch (UnsupportedEncodingException e) {
        logger.log(TreeLogger.ERROR,
                SerializationPolicyLoader.SERIALIZATION_POLICY_FILE_ENCODING + " is not supported", e);
        throw new UnableToCompleteException();
    } catch (IOException e) {
        logger.log(TreeLogger.ERROR, null, e);
        throw new UnableToCompleteException();
    }
}

From source file:net.zschech.gwt.comet.rebind.CometSerializerGenerator.java

License:Apache License

@Override
public RebindResult generateIncrementally(TreeLogger logger, GeneratorContext context, String typeName)
        throws UnableToCompleteException {

    TypeOracle typeOracle = context.getTypeOracle();

    // Create the CometSerializer impl
    String packageName = "comet";
    String className = typeName.replace('.', '_') + "Impl";
    PrintWriter printWriter = context.tryCreate(logger, packageName, className);

    if (printWriter != null) {

        try {//from  ww  w .  j  a  v a2s  .  c om
            JClassType type = typeOracle.getType(typeName);
            SerialTypes annotation = type.getAnnotation(SerialTypes.class);
            if (annotation == null) {
                logger.log(TreeLogger.ERROR, "No SerialTypes annotation on CometSerializer type: " + typeName);
                throw new UnableToCompleteException();
            }

            SerializableTypeOracleBuilder typesSentToBrowserBuilder = new SerializableTypeOracleBuilder(logger,
                    context.getPropertyOracle(), context);
            SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new SerializableTypeOracleBuilder(
                    logger, context.getPropertyOracle(), context);

            for (Class<? extends Serializable> serializable : annotation.value()) {
                int rank = 0;
                if (serializable.isArray()) {
                    while (serializable.isArray()) {
                        serializable = (Class<? extends Serializable>) serializable.getComponentType();
                        rank++;
                    }
                }

                JType resolvedType = typeOracle.getType(serializable.getCanonicalName());
                while (rank > 0) {
                    resolvedType = typeOracle.getArrayType(resolvedType);
                    rank--;
                }

                typesSentToBrowserBuilder.addRootType(logger, resolvedType);
            }

            OutputStream pathInfo = context.tryCreateResource(logger, typeName + ".rpc.log");
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(pathInfo));
            writer.write("====================================\n");
            writer.write("Types potentially sent from browser:\n");
            writer.write("====================================\n\n");
            writer.flush();

            typesSentToBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentFromBrowser = typesSentFromBrowserBuilder.build(logger);

            writer.write("===================================\n");
            writer.write("Types potentially sent from server:\n");
            writer.write("===================================\n\n");
            writer.flush();
            typesSentFromBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentToBrowser = typesSentToBrowserBuilder.build(logger);

            writer.close();

            if (pathInfo != null) {
                context.commitResource(logger, pathInfo).setPrivate(true);
            }

            // Create the serializer
            String modifiedTypeName = typeName.replace('.', '_') + "Serializer";
            TypeSerializerCreator tsc = new TypeSerializerCreator(logger, typesSentFromBrowser,
                    typesSentToBrowser, context, "comet." + modifiedTypeName, modifiedTypeName);
            String realize = tsc.realize(logger);

            // Create the CometSerializer impl
            ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName,
                    className);

            composerFactory.addImport(Serializer.class.getName());
            composerFactory.addImport(SerialMode.class.getName());

            composerFactory.setSuperclass(typeName);
            // TODO is the SERIALIZER required for DE RPC?
            SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
            sourceWriter.print("private Serializer SERIALIZER = new " + realize + "();");
            sourceWriter.print("protected Serializer getSerializer() {return SERIALIZER;}");
            sourceWriter
                    .print("public SerialMode getMode() {return SerialMode." + annotation.mode().name() + ";}");
            sourceWriter.commit(logger);

            if (annotation.mode() == SerialMode.DE_RPC) {
                RpcDataArtifact data = new RpcDataArtifact(type.getQualifiedSourceName());
                for (JType t : typesSentToBrowser.getSerializableTypes()) {
                    if (!(t instanceof JClassType)) {
                        continue;
                    }
                    JField[] serializableFields = SerializationUtils
                            .getSerializableFields(context.getTypeOracle(), (JClassType) t);

                    List<String> names = Lists.create();
                    for (int i = 0, j = serializableFields.length; i < j; i++) {
                        names = Lists.add(names, serializableFields[i].getName());
                    }

                    data.setFields(SerializationUtils.getRpcTypeName(t), names);
                }

                context.commitArtifact(logger, data);
            }
        } catch (NotFoundException e) {
            logger.log(TreeLogger.ERROR, "", e);
            throw new UnableToCompleteException();
        }
    }

    return new RebindResult(RebindMode.USE_PARTIAL_CACHED, packageName + '.' + className);
}

From source file:org.atmosphere.extensions.gwtwrapper.rebind.SerializerGenerator.java

License:Apache License

@Override
public RebindResult generateIncrementally(TreeLogger logger, GeneratorContext context, String typeName)
        throws UnableToCompleteException {

    TypeOracle typeOracle = context.getTypeOracle();

    // Create the CometSerializer impl
    String packageName = "comet";
    String className = typeName.replace('.', '_') + "Impl";
    PrintWriter printWriter = context.tryCreate(logger, packageName, className);

    if (printWriter != null) {

        try {/*from  w w  w  .j  av a  2s.  c  o m*/
            JClassType type = typeOracle.getType(typeName);
            GwtSerialTypes annotation = type.getAnnotation(GwtSerialTypes.class);
            if (annotation == null) {
                logger.log(TreeLogger.ERROR, "No SerialTypes annotation on CometSerializer type: " + typeName);
                throw new UnableToCompleteException();
            }

            SerializableTypeOracleBuilder typesSentToBrowserBuilder = new SerializableTypeOracleBuilder(logger,
                    context.getPropertyOracle(), context);
            SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new SerializableTypeOracleBuilder(
                    logger, context.getPropertyOracle(), context);

            List<Class<?>> serializableTypes = new ArrayList();
            Collections.addAll(serializableTypes, annotation.value());
            for (Class<?> serializable : serializableTypes) {
                int rank = 0;
                if (serializable.isArray()) {
                    while (serializable.isArray()) {
                        serializable = (Class<?>) serializable.getComponentType();
                        rank++;
                    }
                }

                JType resolvedType = typeOracle.getType(serializable.getCanonicalName());
                while (rank > 0) {
                    resolvedType = typeOracle.getArrayType(resolvedType);
                    rank--;
                }

                typesSentToBrowserBuilder.addRootType(logger, resolvedType);
                typesSentFromBrowserBuilder.addRootType(logger, resolvedType);
            }

            // Create a resource file to receive all of the serialization information
            // computed by STOB and mark it as private so it does not end up in the
            // output.
            OutputStream pathInfo = context.tryCreateResource(logger, typeName + ".rpc.log");
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(pathInfo));
            writer.write("====================================\n");
            writer.write("Types potentially sent from server:\n");
            writer.write("====================================\n\n");
            writer.flush();

            typesSentToBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentToBrowser = typesSentToBrowserBuilder.build(logger);

            writer.write("===================================\n");
            writer.write("Types potentially sent from browser:\n");
            writer.write("===================================\n\n");
            writer.flush();
            typesSentFromBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentFromBrowser = typesSentFromBrowserBuilder.build(logger);

            writer.close();

            if (pathInfo != null) {
                context.commitResource(logger, pathInfo).setPrivate(true);
            }

            // Create the serializer
            final String modifiedTypeName = typeName.replace('.', '_');
            TypeSerializerCreator tsc = new TypeSerializerCreator(logger, typesSentFromBrowser,
                    typesSentToBrowser, context, "comet." + modifiedTypeName, modifiedTypeName);
            String realize = tsc.realize(logger);

            // Create the CometSerializer impl
            ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName,
                    className);

            composerFactory.addImport(Serializer.class.getName());
            composerFactory.addImport(SerializationException.class.getName());
            composerFactory.addImport(Serializable.class.getName());

            composerFactory.setSuperclass(typeName);
            // TODO is the SERIALIZER required for DE RPC?
            SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
            sourceWriter.print("private Serializer SERIALIZER = new " + realize + "();");
            sourceWriter.print("protected Serializer getRPCSerializer() {return SERIALIZER;}");
            sourceWriter.commit(logger);

        } catch (NotFoundException e) {
            logger.log(TreeLogger.ERROR, "", e);
            throw new UnableToCompleteException();
        }
    }

    return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING, packageName + '.' + className);
}

From source file:org.atmosphere.gwt20.rebind.SerializerGenerator.java

License:Apache License

@Override
public RebindResult generateIncrementally(TreeLogger logger, GeneratorContext context, String typeName)
        throws UnableToCompleteException {

    TypeOracle typeOracle = context.getTypeOracle();

    // Create the CometSerializer impl
    String packageName = "comet";
    String className = typeName.replace('.', '_') + "Impl";
    PrintWriter printWriter = context.tryCreate(logger, packageName, className);

    if (printWriter != null) {

        try {/*w  w w .ja v a  2  s. com*/
            JClassType type = typeOracle.getType(typeName);
            GwtRpcSerialTypes annotation = type.getAnnotation(GwtRpcSerialTypes.class);
            if (annotation == null) {
                logger.log(TreeLogger.ERROR, "No SerialTypes annotation on CometSerializer type: " + typeName);
                throw new UnableToCompleteException();
            }

            SerializableTypeOracleBuilder typesSentToBrowserBuilder = new SerializableTypeOracleBuilder(logger,
                    context.getPropertyOracle(), context);
            SerializableTypeOracleBuilder typesSentFromBrowserBuilder = new SerializableTypeOracleBuilder(
                    logger, context.getPropertyOracle(), context);

            List<Class<?>> serializableTypes = new ArrayList();
            Collections.addAll(serializableTypes, annotation.value());
            for (Class<?> serializable : serializableTypes) {
                int rank = 0;
                if (serializable.isArray()) {
                    while (serializable.isArray()) {
                        serializable = (Class<?>) serializable.getComponentType();
                        rank++;
                    }
                }

                JType resolvedType = typeOracle.getType(serializable.getCanonicalName());
                while (rank > 0) {
                    resolvedType = typeOracle.getArrayType(resolvedType);
                    rank--;
                }

                typesSentToBrowserBuilder.addRootType(logger, resolvedType);
                typesSentFromBrowserBuilder.addRootType(logger, resolvedType);
            }

            // Create a resource file to receive all of the serialization information
            // computed by STOB and mark it as private so it does not end up in the
            // output.
            OutputStream pathInfo = context.tryCreateResource(logger, typeName + ".rpc.log");
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(pathInfo));
            writer.write("====================================\n");
            writer.write("Types potentially sent from server:\n");
            writer.write("====================================\n\n");
            writer.flush();

            typesSentToBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentToBrowser = typesSentToBrowserBuilder.build(logger);

            writer.write("===================================\n");
            writer.write("Types potentially sent from browser:\n");
            writer.write("===================================\n\n");
            writer.flush();
            typesSentFromBrowserBuilder.setLogOutputWriter(writer);
            SerializableTypeOracle typesSentFromBrowser = typesSentFromBrowserBuilder.build(logger);

            writer.close();

            if (pathInfo != null) {
                context.commitResource(logger, pathInfo).setPrivate(true);
            }

            // Create the serializer
            final String modifiedTypeName = typeName.replace('.', '_');
            TypeSerializerCreator tsc = new TypeSerializerCreator(logger, typesSentFromBrowser,
                    typesSentToBrowser, context, "comet." + modifiedTypeName, modifiedTypeName);
            String realize = tsc.realize(logger);

            // Create the CometSerializer impl
            ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName,
                    className);

            composerFactory.addImport(Serializer.class.getName());
            composerFactory.addImport(SerializationException.class.getName());
            composerFactory.addImport(Serializable.class.getName());

            composerFactory.setSuperclass(typeName);
            SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
            sourceWriter.print("private Serializer SERIALIZER = new " + realize + "();");
            sourceWriter.print("protected Serializer getRPCSerializer() {return SERIALIZER;}");
            sourceWriter.commit(logger);

        } catch (NotFoundException e) {
            logger.log(TreeLogger.ERROR, "", e);
            throw new UnableToCompleteException();
        }
    }

    return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING, packageName + '.' + className);
}