com.google.gwt.user.rebind.ClassSourceFileComposerFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.user.rebind.ClassSourceFileComposerFactory.java

Source

/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.user.rebind;

import com.google.gwt.core.ext.GeneratorContext;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Factory clas to create <code>ClassSourceFileComposer</code> instances.
 * 
 */
public class ClassSourceFileComposerFactory {
    /**
     * Represents a java source file category. Right now support interface and
     * class, later should support abstract class, static class, etc.
     */
    public static class JavaSourceCategory extends Enum {
        /**
         * This type is a class.
         */
        public static final JavaSourceCategory CLASS;

        /**
         * This type is a interface.
         */
        public static final JavaSourceCategory INTERFACE;
        static Map<String, Enum> pool = new HashMap<String, Enum>();

        static {
            CLASS = new JavaSourceCategory("class");
            INTERFACE = new JavaSourceCategory("interface");
        }

        public static JavaSourceCategory require(String key) {
            return (JavaSourceCategory) Enum.require(key, pool);
        }

        protected JavaSourceCategory(String key) {
            super(key, pool);
        }
    }

    private List<String> annotations = new ArrayList<String>();

    private JavaSourceCategory classCategory = JavaSourceCategory.CLASS;

    private String classComment;

    private String className;

    private Set<String> imports = new LinkedHashSet<String>();

    private Set<String> interfaceNames = new LinkedHashSet<String>();

    private String packageName;

    private String superClassName;

    public ClassSourceFileComposerFactory(String packageName, String className) {
        this.packageName = packageName;
        this.className = className;
    }

    public void addAnnotationDeclaration(String declaration) {
        annotations.add(declaration);
    }

    public void addImplementedInterface(String intfName) {
        interfaceNames.add(intfName);
    }

    public void addImport(String typeName) {
        imports.add(typeName);
    }

    /**
     * Creates an implementation of {@link SourceWriter} that can be used to write
     * the innards of a class. Note that the subsequent changes to this factory do
     * not affect the returned instance.
     * 
     * @throws RuntimeException If the settings on this factory are inconsistent
     *           or invalid
     */
    public SourceWriter createSourceWriter(GeneratorContext ctx, PrintWriter printWriter) {
        return new ClassSourceFileComposer(ctx, printWriter, getCreatedPackage(), getAnnotationDeclarations(),
                getCreatedClassShortName(), getSuperclassName(), getInterfaceNames(), getImports(), classCategory,
                classComment);
    }

    /**
     * Creates an implementation of {@link SourceWriter} that can be used to write
     * the innards of a class. Note that the subsequent changes to this factory do
     * not affect the returned instance.
     * 
     * @param printWriter underlying writer
     * @return the source writer
     * @throws RuntimeException If the settings on this factory are inconsistent
     *           or invalid
     */
    public SourceWriter createSourceWriter(PrintWriter printWriter) {
        return new ClassSourceFileComposer(null, printWriter, getCreatedPackage(), getAnnotationDeclarations(),
                getCreatedClassShortName(), getSuperclassName(), getInterfaceNames(), getImports(), classCategory,
                classComment);
    }

    public String[] getAnnotationDeclarations() {
        return annotations.toArray(new String[annotations.size()]);
    }

    public String getCreatedClassName() {
        return getCreatedPackage() + "." + getCreatedClassShortName();
    }

    public String getCreatedClassShortName() {
        return className;
    }

    public String getCreatedPackage() {
        return packageName;
    }

    public String[] getInterfaceNames() {
        return interfaceNames.toArray(new String[interfaceNames.size()]);
    }

    public String getSuperclassName() {
        return superClassName;
    }

    /**
     * This class is an interface.
     */
    public void makeInterface() {
        classCategory = JavaSourceCategory.INTERFACE;
    }

    /**
     * Sets the java doc comment for <code>this</code>.
     * 
     * @param comment java doc comment.
     */
    public void setJavaDocCommentForClass(String comment) {
        classComment = comment;
    }

    public void setSuperclass(String superclassName) {
        superClassName = superclassName;
    }

    private String[] getImports() {
        return imports.toArray(new String[imports.size()]);
    }
}