| /* |
| * Copyright 2010 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.validation.rebind; |
| |
| import com.google.gwt.core.ext.GeneratorContext; |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.UnableToCompleteException; |
| import com.google.gwt.core.ext.typeinfo.JClassType; |
| import com.google.gwt.core.ext.typeinfo.JPackage; |
| import com.google.gwt.user.rebind.AbstractSourceCreator; |
| import com.google.gwt.user.rebind.ClassSourceFileComposerFactory; |
| import com.google.gwt.user.rebind.SourceWriter; |
| |
| import java.io.PrintWriter; |
| |
| /** |
| * Abstract Class for Creating source files. |
| * <p> |
| * This class is not thread safe. |
| */ |
| public abstract class AbstractCreator extends AbstractSourceCreator { |
| |
| final GeneratorContext context; |
| |
| final TreeLogger logger; |
| |
| final JClassType validatorType; |
| |
| final BeanHelperCache cache; |
| |
| AbstractCreator(GeneratorContext context, TreeLogger logger, |
| JClassType validatorType, BeanHelperCache cache) { |
| this.context = context; |
| this.logger = branch(logger, "Creating " + validatorType); |
| this.validatorType = validatorType; |
| this.cache = cache; |
| } |
| |
| public final String create() throws UnableToCompleteException { |
| SourceWriter sourceWriter = getSourceWriter(logger, context); |
| if (sourceWriter != null) { |
| writeClassBody(sourceWriter); |
| sourceWriter.commit(logger); |
| } |
| return getQualifiedName(); |
| } |
| |
| protected void addImports(ClassSourceFileComposerFactory composerFactory, |
| Class<?>... imports) { |
| for (Class<?> imp : imports) { |
| composerFactory.addImport(imp.getCanonicalName()); |
| } |
| } |
| |
| protected abstract void compose(ClassSourceFileComposerFactory composerFactory); |
| |
| protected BeanHelper createBeanHelper(Class<?> clazz) |
| throws UnableToCompleteException { |
| return cache.createHelper(clazz, logger, context); |
| } |
| |
| protected BeanHelper createBeanHelper(JClassType jType) |
| throws UnableToCompleteException { |
| return cache.createHelper(jType, logger, context); |
| } |
| |
| protected final String getPackage() { |
| JPackage serviceIntfPkg = validatorType.getPackage(); |
| return serviceIntfPkg == null ? "" : serviceIntfPkg.getName(); |
| } |
| |
| protected String getSimpleName() { |
| final int length = getPackage().length(); |
| final String rawName = validatorType.getQualifiedSourceName().substring( |
| length == 0 ? 0 : length + 1); |
| return rawName.replace('.', '_') + "Impl"; |
| } |
| |
| protected abstract void writeClassBody(SourceWriter sourceWriter) |
| throws UnableToCompleteException; |
| |
| private String getQualifiedName() { |
| String packageName = getPackage(); |
| return (packageName == "" ? "" : packageName + ".") + getSimpleName(); |
| } |
| |
| private SourceWriter getSourceWriter(TreeLogger logger, GeneratorContext ctx) { |
| String packageName = getPackage(); |
| String simpleName = getSimpleName(); |
| PrintWriter printWriter = ctx.tryCreate(logger, packageName, simpleName); |
| if (printWriter == null) { |
| return null; |
| } |
| |
| ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory( |
| packageName, simpleName); |
| compose(composerFactory); |
| return composerFactory.createSourceWriter(ctx, printWriter); |
| } |
| } |