org.broadleafcommerce.openadmin.generator.FactoryGenerator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of broadleaf-open-admin-platform Show documentation
Show all versions of broadleaf-open-admin-platform Show documentation
BroadleafCommerce Open Admin Platform
/*
* Copyright 2008-2012 the original author or authors.
*
* 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 org.broadleafcommerce.openadmin.generator;
import com.google.gwt.core.ext.Generator;
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.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import java.io.PrintWriter;
/**
*
* @author jfischer
*
*/
public class FactoryGenerator extends Generator {
public static final String INSTANTIABLE_TYPE = "org.broadleafcommerce.openadmin.client.reflection.Instantiable";
public static final String VALIDATOR_TYPE = "com.smartgwt.client.widgets.form.validator.Validator";
public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
logger.log(TreeLogger.INFO, "Generating source for " + typeName, null);
TypeOracle typeOracle = context.getTypeOracle();
JClassType clazz = typeOracle.findType(typeName);
if (clazz == null) {
logger.log(TreeLogger.ERROR, "Unable to find metadata for type '"
+ typeName + "'", null);
throw new UnableToCompleteException();
}
try {
logger.log(TreeLogger.INFO, "Generating source for " + clazz.getQualifiedSourceName(), null);
JClassType[] reflectableTypes = {typeOracle.getType(INSTANTIABLE_TYPE)};
JClassType[] validatorTypes = {typeOracle.getType(VALIDATOR_TYPE)};
SourceWriter sourceWriter = getSourceWriter(clazz, context, logger);
if (sourceWriter != null) {
sourceWriter.println("public java.lang.Object newInstance(String className) {");
for (JClassType validatorType : validatorTypes) {
JClassType[] types = typeOracle.getTypes();
int count = 0;
for (int i = 0; i < types.length; i++) {
if (types[i].isInterface() == null
&& !types[i].isAbstract()
&& types[i].isAssignableTo(validatorType)) {
logger.log(TreeLogger.INFO, "Emitting instantiation code for: " + types[i].getQualifiedSourceName(), null);
if (count == 0) {
sourceWriter.println(" if(\""
+ types[i].getQualifiedSourceName()
+ "\".equals(className)) {"
+ " return new "
+ types[i].getQualifiedSourceName() + "();"
+ "}");
} else {
sourceWriter.println(" else if(\""
+ types[i].getQualifiedSourceName()
+ "\".equals(className)) {"
+ " return new "
+ types[i].getQualifiedSourceName() + "();"
+ "}");
}
count++;
}
}
}
sourceWriter.println("return null;");
sourceWriter.println("}");
sourceWriter.println("public void createAsync(final String className, final AsyncClient asyncClient) {");
for (JClassType reflectableType : reflectableTypes) {
JClassType[] types = typeOracle.getTypes();
int count = 0;
for (int i = 0; i < types.length; i++) {
if (types[i].isInterface() == null
&& !types[i].isAbstract()
&& types[i].isAssignableTo(reflectableType)) {
logger.log(TreeLogger.INFO, "Emitting async instantiation code for: " + types[i].getQualifiedSourceName(), null);
if (count == 0) {
sourceWriter.println(" if(\""
+ types[i].getQualifiedSourceName()
+ "\".equals(className)) {"
+ "com.google.gwt.core.client.GWT.runAsync(new com.google.gwt.core.client.RunAsyncCallback() {"
+ "public void onFailure(Throwable err) {"
+ "asyncClient.onUnavailable();"
+ "}"
+ "public void onSuccess() {"
+ "asyncClient.onSuccess(new "
+ types[i].getQualifiedSourceName() + "());"
+ "}});}");
} else {
sourceWriter.println(" else if(\""
+ types[i].getQualifiedSourceName()
+ "\".equals(className)) {"
+ "com.google.gwt.core.client.GWT.runAsync(new com.google.gwt.core.client.RunAsyncCallback() {"
+ "public void onFailure(Throwable err) {"
+ "asyncClient.onUnavailable();"
+ "}"
+ "public void onSuccess() {"
+ "asyncClient.onSuccess(new "
+ types[i].getQualifiedSourceName() + "());"
+ "}});}");
}
count++;
}
}
}
sourceWriter.println("}");
sourceWriter.commit(logger);
logger.log(TreeLogger.INFO, "Done Generating source for "
+ clazz.getName(), null);
}
return clazz.getQualifiedSourceName() + "Wrapper";
} catch (NotFoundException e) {
e.printStackTrace();
throw new UnableToCompleteException();
}
}
public SourceWriter getSourceWriter(JClassType classType, GeneratorContext context, TreeLogger logger) {
String packageName = classType.getPackage().getName();
String simpleName = classType.getSimpleSourceName() + "Wrapper";
ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(packageName, simpleName);
composer.addImplementedInterface("org.broadleafcommerce.openadmin.client.reflection.Factory");
PrintWriter printWriter = context.tryCreate(logger, packageName, simpleName);
if (printWriter == null) {
return null;
} else {
SourceWriter sw = composer.createSourceWriter(context, printWriter);
return sw;
}
}
}