From e017835bea0a0f3b911355a82ea55cd54d713dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Wed, 19 Dec 2012 19:55:50 +0200 Subject: [PATCH] move common code to superclass --- .../codegen/AbstractEvaluatorFactory.java | 38 +++++++++++++++++++ .../mysema/codegen/ECJEvaluatorFactory.java | 28 ++------------ .../com/mysema/codegen/EvaluatorFactory.java | 1 - .../mysema/codegen/JDKEvaluatorFactory.java | 26 +------------ 4 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/mysema/codegen/AbstractEvaluatorFactory.java b/src/main/java/com/mysema/codegen/AbstractEvaluatorFactory.java index 80fa46fb0..b70279bd2 100644 --- a/src/main/java/com/mysema/codegen/AbstractEvaluatorFactory.java +++ b/src/main/java/com/mysema/codegen/AbstractEvaluatorFactory.java @@ -14,14 +14,18 @@ package com.mysema.codegen; import java.io.IOException; +import java.io.StringWriter; import java.lang.reflect.Method; import java.util.Collection; import java.util.Map; import java.util.WeakHashMap; import com.mysema.codegen.model.ClassType; +import com.mysema.codegen.model.Parameter; +import com.mysema.codegen.model.SimpleType; import com.mysema.codegen.model.Type; import com.mysema.codegen.model.TypeCategory; +import com.mysema.codegen.support.ClassUtils; /** * @author tiwe @@ -44,6 +48,40 @@ public abstract class AbstractEvaluatorFactory implements EvaluatorFactory { */ protected abstract void compile(String source, ClassType projection, String[] names, Type[] types, String id, Map constants) throws IOException; + + /** + * @param source + * @param projectionType + * @param names + * @param types + * @param id + * @param constants + * @return + * @throws IOException + */ + protected String createSource(String source, ClassType projectionType, String[] names, + Type[] types, String id, Map constants) throws IOException { + // create source + StringWriter writer = new StringWriter(); + JavaWriter javaw = new JavaWriter(writer); + SimpleType idType = new SimpleType(id, "", id); + javaw.beginClass(idType, null); + Parameter[] params = new Parameter[names.length + constants.size()]; + for (int i = 0; i < names.length; i++) { + params[i] = new Parameter(names[i], types[i]); + } + int i = names.length; + for (Map.Entry entry : constants.entrySet()) { + Type type = new ClassType(TypeCategory.SIMPLE, ClassUtils.normalize(entry.getValue().getClass())); + params[i++] = new Parameter(entry.getKey(), type); + } + + javaw.beginStaticMethod(projectionType, "eval", params); + javaw.append(source); + javaw.end(); + javaw.end(); + return writer.toString(); + } @Override diff --git a/src/main/java/com/mysema/codegen/ECJEvaluatorFactory.java b/src/main/java/com/mysema/codegen/ECJEvaluatorFactory.java index f29c62c53..852362979 100644 --- a/src/main/java/com/mysema/codegen/ECJEvaluatorFactory.java +++ b/src/main/java/com/mysema/codegen/ECJEvaluatorFactory.java @@ -16,7 +16,6 @@ package com.mysema.codegen; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.StringWriter; import java.nio.charset.Charset; import java.util.List; import java.util.Locale; @@ -50,11 +49,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.ByteStreams; import com.mysema.codegen.model.ClassType; -import com.mysema.codegen.model.Parameter; -import com.mysema.codegen.model.SimpleType; import com.mysema.codegen.model.Type; -import com.mysema.codegen.model.TypeCategory; -import com.mysema.codegen.support.ClassUtils; /** * EvaluatorFactory is a factory implementation for creating Evaluator instances @@ -95,28 +90,11 @@ public class ECJEvaluatorFactory extends AbstractEvaluatorFactory { protected void compile(String source, ClassType projectionType, String[] names, Type[] types, String id, Map constants) throws IOException { // create source - StringWriter writer = new StringWriter(); - JavaWriter javaw = new JavaWriter(writer); - SimpleType idType = new SimpleType(id, "", id); - javaw.beginClass(idType, null); - Parameter[] params = new Parameter[names.length + constants.size()]; - for (int i = 0; i < names.length; i++) { - params[i] = new Parameter(names[i], types[i]); - } - int i = names.length; - for (Map.Entry entry : constants.entrySet()) { - Type type = new ClassType(TypeCategory.SIMPLE, ClassUtils.normalize(entry.getValue().getClass())); - params[i++] = new Parameter(entry.getKey(), type); - } - - javaw.beginStaticMethod(projectionType, "eval", params); - javaw.append(source); - javaw.end(); - javaw.end(); + source = createSource(source, projectionType, names, types, id, constants); // compile - final char[] targetContents = writer.toString().toCharArray(); - final String targetName = idType.getFullName(); + final char[] targetContents = source.toCharArray(); + final String targetName = id; final ICompilationUnit[] targetCompilationUnits = new ICompilationUnit[] { new ICompilationUnit() { @Override public char[] getContents() { diff --git a/src/main/java/com/mysema/codegen/EvaluatorFactory.java b/src/main/java/com/mysema/codegen/EvaluatorFactory.java index feed0b462..58c2d30df 100644 --- a/src/main/java/com/mysema/codegen/EvaluatorFactory.java +++ b/src/main/java/com/mysema/codegen/EvaluatorFactory.java @@ -50,7 +50,6 @@ public interface EvaluatorFactory { * @param constants * @return */ - @SuppressWarnings(value = "unchecked") Evaluator createEvaluator(String source, ClassType projection, String[] names, Type[] types, Class[] classes, Map constants); diff --git a/src/main/java/com/mysema/codegen/JDKEvaluatorFactory.java b/src/main/java/com/mysema/codegen/JDKEvaluatorFactory.java index fcee46f61..e4f099b1f 100644 --- a/src/main/java/com/mysema/codegen/JDKEvaluatorFactory.java +++ b/src/main/java/com/mysema/codegen/JDKEvaluatorFactory.java @@ -29,11 +29,7 @@ import javax.tools.StandardLocation; import javax.tools.ToolProvider; import com.mysema.codegen.model.ClassType; -import com.mysema.codegen.model.Parameter; -import com.mysema.codegen.model.SimpleType; import com.mysema.codegen.model.Type; -import com.mysema.codegen.model.TypeCategory; -import com.mysema.codegen.support.ClassUtils; /** * JDKEvaluatorFactory is a factory implementation for creating Evaluator instances @@ -66,27 +62,10 @@ public class JDKEvaluatorFactory extends AbstractEvaluatorFactory { protected void compile(String source, ClassType projectionType, String[] names, Type[] types, String id, Map constants) throws IOException { // create source - StringWriter writer = new StringWriter(); - JavaWriter javaw = new JavaWriter(writer); - SimpleType idType = new SimpleType(id, "", id); - javaw.beginClass(idType, null); - Parameter[] params = new Parameter[names.length + constants.size()]; - for (int i = 0; i < names.length; i++) { - params[i] = new Parameter(names[i], types[i]); - } - int i = names.length; - for (Map.Entry entry : constants.entrySet()) { - Type type = new ClassType(TypeCategory.SIMPLE, ClassUtils.normalize(entry.getValue().getClass())); - params[i++] = new Parameter(entry.getKey(), type); - } - - javaw.beginStaticMethod(projectionType, "eval", params); - javaw.append(source); - javaw.end(); - javaw.end(); + source = createSource(source, projectionType, names, types, id, constants); // compile - SimpleJavaFileObject javaFileObject = new MemSourceFileObject(id, writer.toString()); + SimpleJavaFileObject javaFileObject = new MemSourceFileObject(id, source); Writer out = new StringWriter(); CompilationTask task = compiler.getTask(out, fileManager, null, compilationOptions, null, @@ -94,7 +73,6 @@ public class JDKEvaluatorFactory extends AbstractEvaluatorFactory { if (!task.call().booleanValue()) { throw new CodegenException("Compilation of " + source + " failed.\n" + out.toString()); } - } }