/*
* Copyright 2010 Gal Dolber.
*
* 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.guit.rebind.common;
import com.google.gwt.core.ext.BadPropertyValueException;
import com.google.gwt.core.ext.CachedPropertyInformation;
import com.google.gwt.core.ext.ConfigurationProperty;
import com.google.gwt.core.ext.Generator;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.IncrementalGenerator;
import com.google.gwt.core.ext.PropertyOracle;
import com.google.gwt.core.ext.RebindMode;
import com.google.gwt.core.ext.RebindResult;
import com.google.gwt.core.ext.SelectionProperty;
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.core.ext.typeinfo.TypeOracle;
import com.google.gwt.dev.resource.ResourceOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import com.google.gwt.user.rebind.rpc.CachedRpcTypeInformation;
import java.io.PrintWriter;
public abstract class AbstractGenerator extends IncrementalGenerator {
protected TreeLogger logger;
protected GeneratorContext context;
protected JClassType baseClass;
protected TypeOracle typeOracle;
protected ResourceOracle resourceOracle;
protected PropertyOracle propertiesOracle;
protected String postfix = "Impl";
protected String generatedPackage;
protected String implName;
protected String typeName;
protected String createdClassName;
protected String implementationPostfix = "Impl";
protected ClassSourceFileComposerFactory createComposer()
throws UnableToCompleteException {
return new ClassSourceFileComposerFactory(generatedPackage, implName);
}
protected PrintWriter createPrintWriter() throws UnableToCompleteException {
return context.tryCreate(logger, generatedPackage, implName);
}
protected void error(String message, Object... params)
throws UnableToCompleteException {
logger.log(TreeLogger.ERROR, String.format(message, params));
throw new UnableToCompleteException();
}
protected Class<?> findClass(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
return null;
}
}
public ConfigurationProperty findConfigurationProperty(String propertyName) {
try {
return propertiesOracle.getConfigurationProperty(propertyName);
} catch (BadPropertyValueException e) {
return null;
}
}
public SelectionProperty findSelectionProperty(String propertyName) {
try {
return propertiesOracle.getSelectionProperty(logger, propertyName);
} catch (BadPropertyValueException e) {
return null;
}
}
protected abstract void generate(SourceWriter writer)
throws UnableToCompleteException;
@Override
public RebindResult generateIncrementally(TreeLogger logger,
GeneratorContext context, String typeName)
throws UnableToCompleteException {
saveVariables(logger, context, typeName);
baseClass = getType(typeName);
generatedPackage = baseClass.getPackage().getName();
implName = baseClass.getSimpleSourceName() + implementationPostfix;
implName = processImplName(implName);
JClassType enclosingType = baseClass.getEnclosingType();
if (enclosingType != null) {
implName = enclosingType.getSimpleSourceName() + implName;
}
RebindMode rebindMode = context.isGeneratorResultCachingEnabled() ? rebindMode() : RebindMode.USE_ALL_NEW_WITH_NO_CACHING;
if (rebindMode.equals(RebindMode.USE_ALL_CACHED) || rebindMode.equals(RebindMode.USE_EXISTING)) {
return new RebindResult(rebindMode, generatedPackage + "." + implName);
}
ClassSourceFileComposerFactory composer = createComposer();
processComposer(composer);
createdClassName = composer.getCreatedClassName();
PrintWriter printWriter = createPrintWriter();
if (printWriter != null) {
SourceWriter writer = composer.createSourceWriter(context, printWriter);
generate(writer);
writer.commit(logger);
}
RebindResult result = new RebindResult(rebindMode, composer.getCreatedClassName());
saveClientData(result);
return result;
}
protected RebindMode rebindMode() {
return RebindMode.USE_ALL_NEW_WITH_NO_CACHING;
}
protected void saveClientData(RebindResult result) {
}
protected String processImplName(String implName) {
SelectionProperty s = findSelectionProperty("ui.xml.prefix");
String prefix = s.getCurrentValue();
return prefix + implName;
}
public ConfigurationProperty getConfigurationProperty(String propertyName) {
try {
return propertiesOracle.getConfigurationProperty(propertyName);
} catch (BadPropertyValueException e) {
throw new IllegalStateException(e);
}
}
protected JPackage getPackage(String pkgName) {
return typeOracle.findPackage(pkgName);
}
protected JClassType getType(String typeName) {
return typeOracle.findType(typeName);
}
protected <T> T newInstance(Class<? extends T> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
return null;
} catch (IllegalAccessException e) {
return null;
}
}
protected abstract void processComposer(
ClassSourceFileComposerFactory composer);
protected void saveVariables(TreeLogger logger, GeneratorContext context,
String typeName) {
this.logger = logger;
this.context = context;
this.typeName = typeName;
typeOracle = context.getTypeOracle();
resourceOracle = context.getResourcesOracle();
propertiesOracle = context.getPropertyOracle();
}
protected void warn(String message, Object... params) {
logger.log(TreeLogger.WARN, String.format(message, params));
}
public TreeLogger getLogger() {
return logger;
}
@Override
public long getVersionId() {
return 1L;
}
}