| /* |
| * 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()]); |
| } |
| } |