de.knightsoftnet.validators.rebind.AbstractCreator.java Source code

Java tutorial

Introduction

Here is the source code for de.knightsoftnet.validators.rebind.AbstractCreator.java

Source

/*
 * Copyright 2010 Google Inc. Copyright 2016 Manfred Tremmel
 *
 * 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 de.knightsoftnet.validators.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 org.apache.commons.lang3.StringUtils;

import java.io.PrintWriter;

/**
 * Abstract Class for Creating source files.
 * <p>
 * This class is not thread safe.
 * </p>
 */
public abstract class AbstractCreator extends AbstractSourceCreator {

    final GeneratorContext context;

    final TreeLogger logger;

    final JClassType validatorType;

    final BeanHelperCache cache;

    AbstractCreator(final GeneratorContext context, final TreeLogger logger, final JClassType validatorType,
            final BeanHelperCache cache) {
        super();
        this.context = context;
        this.logger = branch(logger, "Creating " + validatorType);
        this.validatorType = validatorType;
        this.cache = cache;
    }

    /**
     * create logger.
     *
     * @return qualified name
     * @throws UnableToCompleteException if fails
     */
    public final String create() throws UnableToCompleteException {
        final SourceWriter sourceWriter = this.getSourceWriter(this.logger, this.context);
        if (sourceWriter != null) {
            this.writeClassBody(sourceWriter);
            sourceWriter.commit(this.logger);
        }
        return this.getQualifiedName();
    }

    protected void addImports(final ClassSourceFileComposerFactory composerFactory, final Class<?>... imports) {
        for (final Class<?> imp : imports) {
            composerFactory.addImport(imp.getCanonicalName());
        }
    }

    protected abstract void compose(ClassSourceFileComposerFactory composerFactory);

    protected BeanHelper createBeanHelper(final Class<?> clazz) throws UnableToCompleteException {
        return this.cache.createHelper(clazz, this.logger, this.context);
    }

    protected BeanHelper createBeanHelper(final JClassType jtype) throws UnableToCompleteException {
        return this.cache.createHelper(jtype, this.logger, this.context);
    }

    protected final String getPackage() {
        final JPackage serviceIntfPkg = this.validatorType.getPackage();
        return serviceIntfPkg == null ? "" : serviceIntfPkg.getName();
    }

    protected String getSimpleName() {
        final int length = this.getPackage().length();
        final String rawName = this.validatorType.getQualifiedSourceName().substring(length == 0 ? 0 : length + 1);
        return rawName.replace('.', '_') + "Impl";
    }

    protected abstract void writeClassBody(SourceWriter sourceWriter) throws UnableToCompleteException;

    private String getQualifiedName() {
        final String packageName = this.getPackage();
        return (StringUtils.isEmpty(packageName) ? StringUtils.EMPTY : packageName + ".") + this.getSimpleName();
    }

    private SourceWriter getSourceWriter(final TreeLogger logger, final GeneratorContext ctx) {
        final String packageName = this.getPackage();
        final String simpleName = this.getSimpleName();
        final PrintWriter printWriter = ctx.tryCreate(logger, packageName, simpleName);
        if (printWriter == null) {
            return null;
        }

        final ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName,
                simpleName);
        this.compose(composerFactory);
        return composerFactory.createSourceWriter(ctx, printWriter);
    }
}