This is an automated email from the git hooks/post-receive script. New commit to annotated tag v2.0.0-beta-1 in repository jaxx. See https://gitlab.nuiton.org/nuiton/jaxx.git commit 1a7edadc94dddc6f49b61c6e29834545e8454aa5 Author: Tony Chemit <chemit@codelutin.com> Date: Sat Oct 24 11:31:57 2009 +0000 - Evolution #100: amélioration du design du compilateur - Evolution #99: Améliorer le code généré - Evolution #98: les objets JAXX sont serializable --- .../main/java/jaxx/compiler/CompiledObject.java | 5 +- .../src/main/java/jaxx/compiler/DataBinding.java | 6 +- .../src/main/java/jaxx/compiler/DataSource.java | 17 +- .../src/main/java/jaxx/compiler/JAXXCompiler.java | 181 ++++++---- .../{JAXXCompilerLaunchor.java => JAXXEngine.java} | 397 ++++++++++++++------- .../src/main/java/jaxx/compiler/JAXXProfile.java | 2 +- .../src/main/java/jaxx/compiler/JavaField.java | 182 ---------- .../main/java/jaxx/compiler/StylesheetHelper.java | 17 +- .../decorators/BoxedCompiledObjectDecorator.java | 7 +- .../decorators/CompiledObjectDecorator.java | 4 +- .../decorators/CompiledObjectDecoratorManager.java | 59 --- .../decorators/DefaultCompiledObjectDecorator.java | 62 ++-- .../HelpRootCompiledObjectDecorator.java | 23 +- .../java/jaxx/compiler/generators/Generator.java | 2 +- .../jaxx/compiler/generators/GeneratorManager.java | 42 --- .../compiler/generators/JAXXObjectGenerator.java | 363 ++++++++----------- .../jaxx/compiler/generators/SwingGenerator.java | 9 +- .../compiler/generators/ValidatorGenerator.java | 26 +- .../java/jaxx/compiler/{ => io}/JavaArgument.java | 18 +- .../main/java/jaxx/compiler/io/JavaElement.java | 79 ++++ .../src/main/java/jaxx/compiler/io/JavaField.java | 100 ++++++ .../java/jaxx/compiler/io/JavaFieldComparator.java | 72 ++++ .../main/java/jaxx/compiler/{ => io}/JavaFile.java | 194 ++++------ .../java/jaxx/compiler/{ => io}/JavaMethod.java | 238 +++--------- .../jaxx/compiler/io/JavaMethodComparator.java | 72 ++++ .../compiler/reflect/ClassDescriptorLoader.java | 10 +- .../java/jaxx/compiler/reflect/JavaFileParser.java | 4 +- .../java/jaxx/compiler/spi/DefaultInitializer.java | 67 ---- .../jaxx/compiler/tags/DefaultObjectHandler.java | 25 +- .../main/java/jaxx/compiler/tags/TagManager.java | 14 +- .../compiler/tags/swing/ApplicationHandler.java | 2 +- .../compiler/tags/swing/JAXXComboBoxHandler.java | 3 +- .../jaxx/compiler/tags/swing/JAXXListHandler.java | 3 +- .../jaxx/compiler/tags/swing/JAXXTreeHandler.java | 3 +- .../compiler/tags/swing/JRadioButtonHandler.java | 3 +- .../compiler/tags/swing/JTabbedPaneHandler.java | 13 +- .../java/jaxx/compiler/tags/swing/TabHandler.java | 25 +- .../jaxx/compiler/tags/swing/TableHandler.java | 3 +- .../tags/validator/BeanValidatorHandler.java | 24 +- .../java/jaxx/compiler/tools/PrintTagInfo.java | 4 +- .../tools/jaxxcapture/handlers/ObjectHandler.java | 6 +- ...axx.compiler.decorators.CompiledObjectDecorator | 3 + .../services/jaxx.compiler.types.TypeConverter | 5 + .../test/java/jaxx/compiler/JavaMethodTest.java | 4 +- .../java/jaxx/compiler/tags/TagManagerTest.java | 6 +- 45 files changed, 1130 insertions(+), 1274 deletions(-) diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java b/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java index ec1ff95..04fd2de 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java @@ -11,7 +11,6 @@ import jaxx.compiler.reflect.MethodDescriptor; import jaxx.compiler.tags.DefaultComponentHandler; import jaxx.compiler.tags.TagHandler; import jaxx.compiler.tags.TagManager; -import jaxx.compiler.types.TypeManager; import java.awt.Container; import java.lang.reflect.Method; @@ -389,8 +388,8 @@ public class CompiledObject { ClassDescriptor listenerClass = addMethod.getParameterTypes()[0]; return getJavaCode() + '.' + addMethod.getName() + "((" + JAXXCompiler.getCanonicalName(listenerClass) + ") jaxx.runtime.Util.getEventListener(" + JAXXCompiler.getCanonicalName(listenerClass) + ".class, " + - TypeManager.getJavaCode(handler.getListenerMethod().getName()) + ", " + compiler.getRootObject().getJavaCode() + ", " + - TypeManager.getJavaCode(compiler.getEventHandlerMethodName(handler)) + "));" + JAXXCompiler.getLineSeparator(); + compiler.getJavaCode(handler.getListenerMethod().getName()) + ", " + compiler.getRootObject().getJavaCode() + ", " + + compiler.getJavaCode(compiler.getEventHandlerMethodName(handler)) + "));" + JAXXCompiler.getLineSeparator(); } /** diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/DataBinding.java b/jaxx-compiler/src/main/java/jaxx/compiler/DataBinding.java index 99518c0..4de7fef 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/DataBinding.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/DataBinding.java @@ -4,8 +4,6 @@ */ package jaxx.compiler; -import jaxx.compiler.types.TypeManager; - /** * Represents a data binding in a JAXX file. <code>DataBinding</code> uses {@link DataSource} to * track changes to a source expression and update the destination. @@ -55,7 +53,7 @@ public class DataBinding { */ public boolean compile(boolean quickNoDependencies) throws CompilerException { // DataSource.compile handles all of the listener additions - boolean result = dataSource.compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + TypeManager.getJavaCode(id) + ")"); + boolean result = dataSource.compile("new jaxx.runtime.DataBindingListener(" + compiler.getRootObject().getJavaCode() + ", " + compiler.getJavaCode(id) + ")"); if (!result && quickNoDependencies) { if (!dest.endsWith(".layout")) // layout is specially handled early in the chain @@ -69,7 +67,7 @@ public class DataBinding { } else { compiler.appendProcessDataBinding(" "); } - compiler.appendProcessDataBinding("if (" + TypeManager.getJavaCode(id) + ".equals($dest)) {" + JAXXCompiler.getLineSeparator()); + compiler.appendProcessDataBinding("if (" + compiler.getJavaCode(id) + ".equals($dest)) {" + JAXXCompiler.getLineSeparator()); String objectCode = dataSource.getObjectCode(); if (objectCode != null) { compiler.appendProcessDataBinding(" if (" + objectCode + " != null) {" + JAXXCompiler.getLineSeparator()); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/DataSource.java b/jaxx-compiler/src/main/java/jaxx/compiler/DataSource.java index 6fb37d8..fab9b08 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/DataSource.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/DataSource.java @@ -4,6 +4,7 @@ */ package jaxx.compiler; +import jaxx.compiler.io.JavaField; import jaxx.compiler.parser.java.JavaParser; import jaxx.compiler.parser.java.JavaParserConstants; import jaxx.compiler.parser.java.JavaParserTreeConstants; @@ -99,7 +100,7 @@ public class DataSource { if (dependencySymbols.size() > 0) { //TC 20081108 prefer add a real JavaField instead of raw code //compiler.appendBodyCode("private PropertyChangeListener " + id + " = " + propertyChangeListenerCode + ";\n"); - compiler.addSimpleField(new JavaField(Modifier.PRIVATE, PropertyChangeListener.class.getName(), autoId, propertyChangeListenerCode)); + compiler.addSimpleField(new JavaField(Modifier.PRIVATE, PropertyChangeListener.class.getName(), autoId,false, propertyChangeListenerCode)); } compileListeners(); @@ -390,8 +391,9 @@ public class DataSource { this.objectCode = objectCode; if (!dependencySymbols.contains(dependencySymbol)) { dependencySymbols.add(dependencySymbol); + String eol = JAXXCompiler.getLineSeparator(); if (objectCode != null) { - addListenerCode.append("if (").append(objectCode).append(" != null) {").append(JAXXCompiler.getLineSeparator()); + addListenerCode.append("if (").append(objectCode).append(" != null) {").append(eol); addListenerCode.append(" "); } addListenerCode.append(" ").append(addCode); @@ -400,7 +402,7 @@ public class DataSource { } if (objectCode != null) { - removeListenerCode.append("if (").append(objectCode).append(" != null) {").append(JAXXCompiler.getLineSeparator()); + removeListenerCode.append("if (").append(objectCode).append(" != null) {").append(eol); removeListenerCode.append(" "); } removeListenerCode.append(" ").append(removeCode); @@ -412,12 +414,13 @@ public class DataSource { private void compileListeners() { String javaCodeId = TypeManager.getJavaCode(id); + String eol = JAXXCompiler.getLineSeparator(); if (addListenerCode.length() > 0) { if (compiler.haveApplyDataBinding()) { compiler.appendApplyDataBinding(" else "); } - compiler.appendApplyDataBinding("if (" + javaCodeId + ".equals($binding)) {" + JAXXCompiler.getLineSeparator()); - compiler.appendApplyDataBinding(" " + addListenerCode + JAXXCompiler.getLineSeparator()); + compiler.appendApplyDataBinding("if (" + javaCodeId + ".equals($binding)) {" + eol); + compiler.appendApplyDataBinding(" " + addListenerCode + eol); compiler.appendApplyDataBinding("}"); //if (compiler.applyDataBinding.length() > 0) // compiler.applyDataBinding.append("else "); @@ -430,8 +433,8 @@ public class DataSource { if (compiler.haveRemoveDataBinding()) { compiler.appendRemoveDataBinding(" else "); } - compiler.appendRemoveDataBinding("if (" + javaCodeId + ".equals($binding)) {" + JAXXCompiler.getLineSeparator()); - compiler.appendRemoveDataBinding(" " + removeListenerCode + JAXXCompiler.getLineSeparator()); + compiler.appendRemoveDataBinding("if (" + javaCodeId + ".equals($binding)) {" + eol); + compiler.appendRemoveDataBinding(" " + removeListenerCode + eol); compiler.appendRemoveDataBinding("}"); //if (compiler.removeDataBinding.length() > 0) // compiler.removeDataBinding.append("else "); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java index 23bd95e..d704851 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java @@ -4,8 +4,10 @@ */ package jaxx.compiler; +import jaxx.compiler.io.JavaMethod; +import jaxx.compiler.io.JavaField; +import jaxx.compiler.io.JavaFile; import jaxx.compiler.decorators.CompiledObjectDecorator; -import jaxx.compiler.decorators.CompiledObjectDecoratorManager; import jaxx.compiler.generators.Generator; import jaxx.compiler.parser.java.ParseException; import jaxx.compiler.reflect.ClassDescriptor; @@ -63,6 +65,7 @@ import java.util.Set; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; +import jaxx.compiler.types.TypeManager; /** * Compiles JAXX files into Java classes. @@ -71,7 +74,9 @@ import java.util.regex.Pattern; */ public class JAXXCompiler { - /** log */ + /** + * Logger + */ protected static final Log log = LogFactory.getLog(JAXXCompiler.class); /** * True to throw exceptions when we encounter unresolvable classes, false to ignore. @@ -96,10 +101,10 @@ public class JAXXCompiler { * The unique object handler used in first pass */ protected final DefaultObjectHandler firstPassClassTagHandler; - /** - * list of static imports - */ - protected List<String> staticImports = new ArrayList<String>(); +// /** +// * list of static imports +// */ +// protected List<String> staticImports = new ArrayList<String>(); /*---------------------------------------------------------------------------------*/ /*-- compiler fields --------------------------------------------------------------*/ @@ -273,15 +278,53 @@ public class JAXXCompiler { * default decodator to use if none specified */ protected CompiledObjectDecorator defaultDecorator; + /** + * engine which references this compiler (can be null if compiler is standalone) + */ + protected final JAXXEngine engine; /*---------------------------------------------------------------------------------*/ /*-- Constructor methods ----------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/ - protected JAXXCompiler(ClassLoader classLoader) { - +// protected JAXXCompiler(ClassLoader classLoader) { +// +// this.firstPassClassTagHandler = new DefaultObjectHandler(ClassDescriptorLoader.getClassDescriptor(Object.class)); +// this.configuration = new DefaultCompilerConfiguration(); +// this.classLoader = classLoader; +//// this.staticImports = Arrays.asList(new String[]{ +//// "java.awt.*", +//// "java.awt.event.*", +//// "java.beans.*", +//// "java.io.*", +//// "java.lang.*", +//// "java.util.*", +//// "javax.swing.*", +//// "javax.swing.border.*", +//// "javax.swing.event.*", +//// "jaxx.runtime.swing.JAXXButtonGroup", +//// "jaxx.runtime.swing.HBox", +//// "jaxx.runtime.swing.VBox", +//// "jaxx.runtime.swing.Table", +//// "static org.nuiton.i18n.I18n._", +//// "static jaxx.runtime.Util.createImageIcon" +//// }); +// addImport("java.lang.*"); +// } + /** + * Creates a new JAXXCompiler. + * + * @param engine engine which use the compiler (could be null if not attach to any engine) + * @param baseDir classpath location + * @param src location of file to compile + * @param outputClassName the out file name + * @param configuration configuration to pass to javac + * @param defaultImports list of default imports to add to java files + */ + public JAXXCompiler(JAXXEngine engine, File baseDir, File src, String outputClassName, CompilerConfiguration configuration, List<String> defaultImports) { + this.engine = engine; + this.baseDir = baseDir; + this.src = src; this.firstPassClassTagHandler = new DefaultObjectHandler(ClassDescriptorLoader.getClassDescriptor(Object.class)); - this.configuration = new DefaultCompilerConfiguration(); - this.classLoader = classLoader; // this.staticImports = Arrays.asList(new String[]{ // "java.awt.*", // "java.awt.event.*", @@ -299,55 +342,29 @@ public class JAXXCompiler { // "static org.nuiton.i18n.I18n._", // "static jaxx.runtime.Util.createImageIcon" // }); - addImport("java.lang.*"); - } - - /** - * Creates a new JAXXCompiler. - * - * @param baseDir classpath location - * @param src location of file to compile - * @param outputClassName the out file name - * @param configuration configuration to pass to javac - */ - public JAXXCompiler(File baseDir, File src, String outputClassName, CompilerConfiguration configuration) { - this.baseDir = baseDir; - this.src = src; - this.firstPassClassTagHandler = new DefaultObjectHandler(ClassDescriptorLoader.getClassDescriptor(Object.class)); - this.staticImports = Arrays.asList(new String[]{ - "java.awt.*", - "java.awt.event.*", - "java.beans.*", - "java.io.*", - "java.lang.*", - "java.util.*", - "javax.swing.*", - "javax.swing.border.*", - "javax.swing.event.*", - "jaxx.runtime.swing.JAXXButtonGroup", - "jaxx.runtime.swing.HBox", - "jaxx.runtime.swing.VBox", - "jaxx.runtime.swing.Table", - "static org.nuiton.i18n.I18n._", - "static jaxx.runtime.Util.createImageIcon" - }); sourceFiles.push(src); this.outputClassName = outputClassName; this.configuration = configuration; - addImport(outputClassName.substring(0, outputClassName.lastIndexOf(".") + 1) + "*"); - for (Object staticImport : staticImports) { - addImport((String) staticImport); - } - // add extra imports from configuration - if (configuration.getExtraImports() != null) { - for (String extraImport : configuration.getExtraImports()) { - addImport(extraImport); + if (outputClassName != null) { + addImport(outputClassName.substring(0, outputClassName.lastIndexOf(".") + 1) + "*"); + } + if (defaultImports != null) { + for (Object staticImport : defaultImports) { + addImport((String) staticImport); } } - defaultDecorator = CompiledObjectDecoratorManager.getDecorator(configuration.getDefaultDecoratorClass()); - if (defaultDecorator == null) { - log.error("could not find default decorator : " + configuration.getDefaultDecoratorClass()); - throw new IllegalArgumentException("could not find default decorator : " + configuration.getDefaultDecoratorClass()); + if (configuration != null) { + // add extra imports from configuration + if (configuration.getExtraImports() != null) { + for (String extraImport : configuration.getExtraImports()) { + addImport(extraImport); + } + } + defaultDecorator = engine.getDecorator(configuration.getDefaultDecoratorClass()); + if (defaultDecorator == null) { + log.error("could not find default decorator : " + configuration.getDefaultDecoratorClass()); + throw new IllegalArgumentException("could not find default decorator : " + configuration.getDefaultDecoratorClass()); + } } } @@ -547,7 +564,7 @@ public class JAXXCompiler { } public void registerCompiledObject(CompiledObject object) { - assert JAXXCompilerLaunchor.get().symbolTables.values().contains(symbolTable) : "attempting to register CompiledObject before pass 1 is complete"; + assert engine.symbolTables.values().contains(symbolTable) : "attempting to register CompiledObject before pass 1 is complete"; if (root == null) { root = object; } @@ -569,7 +586,7 @@ public class JAXXCompiler { public CompiledObject getCompiledObject(String id) { runInitializers(); - assert JAXXCompilerLaunchor.get().symbolTables.values().contains(symbolTable) : "attempting to retrieve CompiledObject before pass 1 is complete"; + assert engine.symbolTables.values().contains(symbolTable) : "attempting to retrieve CompiledObject before pass 1 is complete"; return objects.get(id); } @@ -600,6 +617,16 @@ public class JAXXCompiler { } } + public String getJavaCode(Object object) { + String result = TypeManager.getJavaCode(object); + return result; + } + + public Object convertFromString(String string, Class<?> type) { + Object result = TypeManager.convertFromString(string, type); + return result; + } + /*---------------------------------------------------------------------------------*/ /*-- DataBinding methods ----------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/ @@ -798,7 +825,10 @@ public class JAXXCompiler { System.err.print(":" + ((sourceFiles.size() == 1) ? Integer.parseInt(lineNumber) + lineOffset : lineOffset + 1)); } System.err.println(": Warning: " + warning); - JAXXCompilerLaunchor.get().warningCount++; + if (engine != null) { + engine.warningCount++; + } +// JAXXEngine.get().warningCount++; } public void reportError(String error) { @@ -862,7 +892,10 @@ public class JAXXCompiler { System.err.print(":" + lineNumber); } System.err.println(": " + error); - JAXXCompilerLaunchor.get().errorCount++; + if (engine != null) { + engine.errorCount++; + } +// JAXXEngine.get().errorCount++; failed = true; } @@ -968,20 +1001,6 @@ public class JAXXCompiler { classLoader = configuration.getClassLoader(); } else { throw new NullPointerException("compiler configuration requires a classLoader! :\n" + configuration); -// String classPath = configuration.getClassPath(); -// if (classPath == null) { -// classPath = "."; -// } -// String[] paths = classPath.split(File.pathSeparator); -// URL[] urls = new URL[paths.length]; -// for (int i = 0; i < paths.length; i++) { -// try { -// urls[i] = new File(paths[i]).toURI().toURL(); -// } catch (MalformedURLException e) { -// throw new RuntimeException(e); -// } -// } -// classLoader = new URLClassLoader(urls, getClass().getClassLoader()); } } @@ -1153,7 +1172,8 @@ public class JAXXCompiler { public void addDependencyClass(String className) { - if (!JAXXCompilerLaunchor.get().jaxxFileClassNames.contains(className)) { +// if (!JAXXEngine.get().jaxxFileClassNames.contains(className)) { + if (!engine.jaxxFileClassNames.contains(className)) { URL jaxxURL = getClassLoader().getResource(className.replace('.', '/') + ".jaxx"); URL classURL = getClassLoader().getResource(className.replace('.', '/') + ".class"); if (jaxxURL != null && classURL != null) { @@ -1178,11 +1198,14 @@ public class JAXXCompiler { assert jaxxFile.getName().equalsIgnoreCase(className.substring(className.lastIndexOf(".") + 1) + ".jaxx") : "expecting file name to match " + className + ", but found " + jaxxFile.getName(); if (jaxxFile.getName().equals(className.substring(className.lastIndexOf(".") + 1) + ".jaxx")) { // check case match - if (JAXXCompilerLaunchor.get().currentPass != JAXXCompilerLaunchor.LifeCycle.compile_first_pass) { +// if (JAXXEngine.get().currentPass != JAXXEngine.LifeCycle.compile_first_pass) { + if (engine.currentPass != JAXXEngine.LifeCycle.compile_first_pass) { throw new AssertionError("Internal error: adding dependency class " + className + " during second compilation pass"); } - JAXXCompilerLaunchor.get().jaxxFileClassNames.add(className); - JAXXCompilerLaunchor.get().jaxxFiles.add(jaxxFile); +// JAXXEngine.get().jaxxFileClassNames.add(className); +// JAXXEngine.get().jaxxFiles.add(jaxxFile); + engine.jaxxFileClassNames.add(className); + engine.jaxxFiles.add(jaxxFile); } } } @@ -1406,7 +1429,7 @@ public class JAXXCompiler { for (Generator generator : generatorIterator) { generator.prepareJavaFile(compiledObject, this, javaFile, packageName, simpleClassName); } - out.println(javaFile.toString(getLineSeparator())); + out.println(javaFile.toString()); out.close(); } catch (RuntimeException e) { // file could not be generated, so delete it... @@ -1601,4 +1624,8 @@ public class JAXXCompiler { throw new RuntimeException(ex); } } + + public JAXXEngine getEngine() { + return engine; + } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompilerLaunchor.java b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java similarity index 51% rename from jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompilerLaunchor.java rename to jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java index a8a9043..6d08798 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompilerLaunchor.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXEngine.java @@ -14,13 +14,19 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ServiceLoader; -import jaxx.compiler.generators.GeneratorManager; +import java.util.TreeMap; +import jaxx.compiler.decorators.CompiledObjectDecorator; -/** @author chemit */ -public class JAXXCompilerLaunchor { +/** + * @author chemit + * @since 2.0.0 was previously JAXXCompilerLaunchor + */ +public class JAXXEngine { - /** log */ - protected static final Log log = LogFactory.getLog(JAXXCompilerLaunchor.class); + /** + * Logger + */ + protected static final Log log = LogFactory.getLog(JAXXEngine.class); protected enum LifeCycle { @@ -32,14 +38,14 @@ public class JAXXCompilerLaunchor { profile_pass // state when profile } /** shared instance of unique launchor at a givne time. */ - protected static JAXXCompilerLaunchor singleton; + protected static JAXXEngine singleton; /** * Create a new empty launchor and set it as current launchor accessible via method {@link #get()} * * @return the new instanciated launchor */ - public static synchronized JAXXCompilerLaunchor newLaunchor() { + public static synchronized JAXXEngine newLaunchor() { return newLaunchor((File[]) null, null, null); } @@ -55,7 +61,7 @@ public class JAXXCompilerLaunchor { * @param configuration the compiler configuration to use * @return the new instanciated launchor */ - public static synchronized JAXXCompilerLaunchor newLaunchor(File base, String[] relativePaths, CompilerConfiguration configuration) { + public static synchronized JAXXEngine newLaunchor(File base, String[] relativePaths, CompilerConfiguration configuration) { File[] files = new File[relativePaths.length]; String[] classNames = new String[relativePaths.length]; for (int i = 0; i < files.length; i++) { @@ -80,11 +86,11 @@ public class JAXXCompilerLaunchor { * @param configuration the compiler configuration to use * @return the new instanciated launchor */ - public static synchronized JAXXCompilerLaunchor newLaunchor(File[] files, String[] classNames, CompilerConfiguration configuration) { + public static synchronized JAXXEngine newLaunchor(File[] files, String[] classNames, CompilerConfiguration configuration) { if (singleton != null) { singleton.reset(); } - singleton = new JAXXCompilerLaunchor(files, classNames, configuration); + singleton = new JAXXEngine(files, classNames, configuration); return singleton; } @@ -92,7 +98,7 @@ public class JAXXCompilerLaunchor { * @return the current launchor * @throws NullPointerException if no launchor was registred via a <code>newLaunchor-like</code> method. */ - public static JAXXCompilerLaunchor get() throws NullPointerException { + public static JAXXEngine get() throws NullPointerException { if (singleton == null) { throw new NullPointerException("no launchor was registred via newLaunchor method"); } @@ -123,27 +129,64 @@ public class JAXXCompilerLaunchor { initializer.initialize(); } } - /** configuration of the launchor and underlines compilers */ + /** + * configuration of the launchor and underlines compilers + */ protected CompilerConfiguration configuration; - /** original list of files to compile */ + /** + * original list of files to compile + */ protected final File[] files; - /** original list of classes to compile */ + /** + * original list of classes to compile + */ protected final String[] classNames; - /** Files to be treated while compilation. */ + /** + * Files to be treated while compilation. + */ protected List<File> jaxxFiles = new ArrayList<File>(); - /** Class names corresponding to the files in the jaxxFiles list. */ + /** + * Class names corresponding to the files in the jaxxFiles list. + */ protected List<String> jaxxFileClassNames = new ArrayList<String>(); - /** Maps the names of classes being compiled to the compiler instance handling the compilation. */ + /** + * Maps the names of classes being compiled to the compiler instance handling the compilation. + */ protected Map<String, JAXXCompiler> compilers = new HashMap<String, JAXXCompiler>(); - /** Maps the names of classes being compiled to their symbol tables (created after the first compiler pass). */ + /** + * Maps the names of classes being compiled to their symbol tables (created after the first compiler pass). + */ protected Map<File, SymbolTable> symbolTables = new HashMap<File, SymbolTable>(); + /** + * + */ protected LifeCycle currentPass; + /** + * + */ protected int errorCount; + /** + * + */ protected int warningCount; + /** + * number of registred compiler + */ protected int compilerCount; + /** + * profile attached to the engine (can be null) + */ protected JAXXProfile profiler; + /** + * decorators available in engine + */ + protected Map<String, CompiledObjectDecorator> decorators; + /** + * generators available in engine + */ + protected List<Generator> generators; - protected JAXXCompilerLaunchor(File[] files, String[] classNames, CompilerConfiguration options) { + protected JAXXEngine(File[] files, String[] classNames, CompilerConfiguration options) { this.configuration = options == null ? new DefaultCompilerConfiguration() : options; this.files = files; this.classNames = classNames; @@ -156,7 +199,9 @@ public class JAXXCompilerLaunchor { } public void init() { - // forces static initializer to run if it hasn't yet + compilerCount = 0; + jaxxFiles.addAll(Arrays.asList(files)); + jaxxFileClassNames.addAll(Arrays.asList(classNames)); } /** Resets all state in preparation for a new compilation session. */ @@ -168,6 +213,15 @@ public class JAXXCompilerLaunchor { compilers.clear(); if (profiler != null) { profiler.clear(); + profiler = null; + } + if (decorators != null) { + decorators.clear(); + decorators = null; + } + if (generators != null) { + generators.clear(); + generators = null; } } @@ -175,24 +229,24 @@ public class JAXXCompilerLaunchor { return "2.0.0"; } - /** - * Creates a dummy Compiler for use in unit testing. - * - * @return the compiler - */ - public static JAXXCompiler createDummyCompiler() { - return createDummyCompiler(JAXXCompiler.class.getClassLoader()); - } - +// /** +// * Creates a dummy Compiler for use in unit testing. +// * +// * @return the compiler +// */ +// public static JAXXCompiler createDummyCompiler() { +// return createDummyCompiler(JAXXCompiler.class.getClassLoader()); +// } /** * Creates a dummy Compiler for use in unit testing. * * @param classLoader class loader to use * @return the compiler */ - public static JAXXCompiler createDummyCompiler(ClassLoader classLoader) { - return new JAXXCompiler(classLoader) { - }; + public static JAXXCompiler createDummyCompiler(final ClassLoader classLoader) { + JAXXCompiler compiler = new JAXXCompiler(null, null, null, null, null, null); + compiler.classLoader = classLoader; + return compiler; } /** @@ -201,7 +255,7 @@ public class JAXXCompilerLaunchor { * different compiler instance. */ public JAXXCompiler getJAXXCompiler(String className) { - return compilers != null ? compilers.get(className) : null; + return compilers == null ? null : compilers.get(className); } /** @@ -226,16 +280,53 @@ public class JAXXCompilerLaunchor { return System.getProperty("line.separator", "\n"); } + public CompiledObjectDecorator getDecorator(String name) { + CompiledObjectDecorator decorator = getDecorators().get(name); + if (decorator == null) { + throw new IllegalArgumentException("could not find decorator with key " + name + " (known decorators : " + getDecorators().keySet()); + } + return decorator; + } + + public CompiledObjectDecorator getDecorator(Class<?> type) { + for (CompiledObjectDecorator decorator : getDecorators().values()) { + if (type == decorator.getClass()) { + return decorator; + } + } + return null; + } + + protected synchronized Map<String, CompiledObjectDecorator> getDecorators() { + if (decorators == null) { + decorators = new TreeMap<String, CompiledObjectDecorator>(); + // load decorators + ServiceLoader<CompiledObjectDecorator> loader = ServiceLoader.load(CompiledObjectDecorator.class); + for (CompiledObjectDecorator c : loader) { + decorators.put(c.getName(), c); + } + } + return decorators; + } + + public List<Generator> getGenerators() { + if (generators == null) { + generators = new ArrayList<Generator>(); + for (Generator generator : ServiceLoader.load(Generator.class)) { + generators.add(generator); + } + } + return generators; + } + /** * Compiled a set of files. * * @return <code>true</code> if compilation succeeds, <code>false</code> otherwise */ public synchronized boolean compile() { - //reset(); // just to be safe... - compilerCount = 0; - jaxxFiles.addAll(Arrays.asList(files)); - jaxxFileClassNames.addAll(Arrays.asList(classNames)); + + init(); try { boolean success = true; @@ -243,115 +334,28 @@ public class JAXXCompilerLaunchor { if (!nextStep(LifeCycle.compile_first_pass, success)) { return false; } - boolean compiled; - do { - compiled = false; - assert jaxxFiles.size() == jaxxFileClassNames.size(); - java.util.Iterator<File> filesIterator = new ArrayList<File>(jaxxFiles).iterator(); // clone it so it can safely be modified while we're iterating - java.util.Iterator<String> classNamesIterator = new ArrayList<String>(jaxxFileClassNames).iterator(); - while (filesIterator.hasNext()) { - File file = filesIterator.next(); - String className = classNamesIterator.next(); - if (log.isDebugEnabled()) { - log.debug("compile first pass for " + className); - } - if (symbolTables.get(file) == null) { - compiled = true; - if (compilers.containsKey(className)) { - throw new CompilerException("Internal error: " + className + " is already being compiled, attempting to compile it again"); - } - - File destDir = configuration.getTargetDirectory(); - if (destDir != null) { - int dotPos = className.lastIndexOf("."); - if (dotPos != -1) { - destDir = new File(destDir, className.substring(0, dotPos).replace('.', File.separatorChar)); - } - if (!destDir.exists() && !destDir.mkdirs()) { - log.warn("could not create directory " + destDir); - continue; - } - } else { - //destDir = file.getParentFile(); - } - JAXXCompiler compiler = newCompiler(file.getParentFile(), file, className); - addProfileTime(compiler, currentPass.name() + "_start"); - compilers.put(className, compiler); - compiler.compileFirstPass(); - addProfileTime(compiler, currentPass.name() + "_end"); - assert !symbolTables.values().contains(compiler.getSymbolTable()) : "symbolTable is already registered"; - symbolTables.put(file, compiler.getSymbolTable()); - if (compiler.isFailed()) { - success = false; - } - } - } - - } while (compiled); + success = firstPass(); // pass 2 if (!nextStep(LifeCycle.compile_second_pass, success)) { return false; } - assert jaxxFiles.size() == jaxxFileClassNames.size(); - List<File> jaxxFilesClone = new ArrayList<File>(jaxxFiles); - for (String className : jaxxFileClassNames) { - JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during second pass"); - addProfileTime(compiler, currentPass.name() + "_start"); - if (log.isDebugEnabled()) { - log.debug("runInitializers for " + className); - } - if (!compiler.isFailed()) { - compiler.runInitializers(); - } - if (log.isDebugEnabled()) { - log.debug("compile second pass for " + className); - } - compiler.compileSecondPass(); - addProfileTime(compiler, currentPass.name() + "_end"); - if (log.isDebugEnabled()) { - log.debug("done with result [" + !compiler.isFailed() + "] for " + className); - } - if (compiler.isFailed()) { - success = false; - } - } - if (!jaxxFilesClone.equals(jaxxFiles)) { - throw new AssertionError("Internal error: compilation set altered during pass 2 (was " + jaxxFilesClone + ", modified to " + jaxxFiles + ")"); - } + success = secondPass(); // stylesheet application if (!nextStep(LifeCycle.stylesheet_pass, success)) { return false; } assert jaxxFiles.size() == jaxxFileClassNames.size(); - for (String className : jaxxFileClassNames) { - JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during stylesheet application"); - addProfileTime(compiler, currentPass.name() + "_start"); - compiler.applyStylesheets(); - addProfileTime(compiler, currentPass.name() + "_end"); - if (compiler.isFailed()) { - success = false; - } - } + success = applyCss(); // code generation if (!nextStep(LifeCycle.generate_pass, success)) { return false; } assert jaxxFiles.size() == jaxxFileClassNames.size(); - List<Generator> generators = GeneratorManager.getGenerators(); - for (String className : jaxxFileClassNames) { - JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during code generation"); - addProfileTime(compiler, currentPass.name() + "_start"); - compiler.generateCode(generators); - addProfileTime(compiler, currentPass.name() + "_end"); - //compiler.generateCode(); - if (compiler.isFailed()) { - success = false; - } - } + success = generate(); if (configuration.isProfile()) { // profile pass (only if succes compile) @@ -381,6 +385,116 @@ public class JAXXCompilerLaunchor { } } + protected boolean firstPass() throws Exception { + boolean success = true; + boolean compiled; + do { + compiled = false; + assert jaxxFiles.size() == jaxxFileClassNames.size(); + java.util.Iterator<File> filesIterator = new ArrayList<File>(jaxxFiles).iterator(); // clone it so it can safely be modified while we're iterating + java.util.Iterator<String> classNamesIterator = new ArrayList<String>(jaxxFileClassNames).iterator(); + while (filesIterator.hasNext()) { + File file = filesIterator.next(); + String className = classNamesIterator.next(); + if (log.isDebugEnabled()) { + log.debug("compile first pass for " + className); + } + if (symbolTables.get(file) == null) { + compiled = true; + if (compilers.containsKey(className)) { + throw new CompilerException("Internal error: " + className + " is already being compiled, attempting to compile it again"); + } + + File destDir = configuration.getTargetDirectory(); + if (destDir != null) { + int dotPos = className.lastIndexOf("."); + if (dotPos != -1) { + destDir = new File(destDir, className.substring(0, dotPos).replace('.', File.separatorChar)); + } + if (!destDir.exists() && !destDir.mkdirs()) { + log.warn("could not create directory " + destDir); + continue; + } + } else { + //destDir = file.getParentFile(); + } + JAXXCompiler compiler = newCompiler(file.getParentFile(), file, className); + addProfileTime(compiler, currentPass.name() + "_start"); + compilers.put(className, compiler); + compiler.compileFirstPass(); + addProfileTime(compiler, currentPass.name() + "_end"); + assert !symbolTables.values().contains(compiler.getSymbolTable()) : "symbolTable is already registered"; + symbolTables.put(file, compiler.getSymbolTable()); + if (compiler.isFailed()) { + success = false; + } + } + } + + } while (compiled); + return success; + } + + protected boolean secondPass() throws Exception { + boolean success = true; + List<File> jaxxFilesClone = new ArrayList<File>(jaxxFiles); + for (String className : jaxxFileClassNames) { + JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during second pass"); + addProfileTime(compiler, currentPass.name() + "_start"); + if (log.isDebugEnabled()) { + log.debug("runInitializers for " + className); + } + if (!compiler.isFailed()) { + compiler.runInitializers(); + } + if (log.isDebugEnabled()) { + log.debug("compile second pass for " + className); + } + compiler.compileSecondPass(); + addProfileTime(compiler, currentPass.name() + "_end"); + if (log.isDebugEnabled()) { + log.debug("done with result [" + !compiler.isFailed() + "] for " + className); + } + if (compiler.isFailed()) { + success = false; + } + } + if (!jaxxFilesClone.equals(jaxxFiles)) { + throw new AssertionError("Internal error: compilation set altered during pass 2 (was " + jaxxFilesClone + ", modified to " + jaxxFiles + ")"); + } + return success; + } + + protected boolean applyCss() throws Exception { + boolean success = true; + + for (String className : jaxxFileClassNames) { + JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during stylesheet application"); + addProfileTime(compiler, currentPass.name() + "_start"); + compiler.applyStylesheets(); + addProfileTime(compiler, currentPass.name() + "_end"); + if (compiler.isFailed()) { + success = false; + } + } + return success; + } + + protected boolean generate() throws Exception { + boolean success = true; + List<Generator> gens = getGenerators(); + for (String className : jaxxFileClassNames) { + JAXXCompiler compiler = getCompiler(className, "Internal error: could not find compiler for " + className + " during code generation"); + addProfileTime(compiler, currentPass.name() + "_start"); + compiler.generateCode(gens); + addProfileTime(compiler, currentPass.name() + "_end"); + if (compiler.isFailed()) { + success = false; + } + } + return success; + } + public int getCompilerCount() { return compilerCount; } @@ -416,14 +530,29 @@ public class JAXXCompilerLaunchor { } protected JAXXCompiler newCompiler(File parentFile, File file, String className) throws InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException { - Constructor<? extends JAXXCompiler> cons = configuration.getCompilerClass().getConstructor(File.class, File.class, String.class, CompilerConfiguration.class); - return cons.newInstance(parentFile, file, className, configuration); + Constructor<? extends JAXXCompiler> cons = configuration.getCompilerClass().getConstructor(JAXXEngine.class, File.class, File.class, String.class, CompilerConfiguration.class, List.class); + return cons.newInstance(this, parentFile, file, className, configuration, Arrays.asList(new String[]{ + "java.awt.*", + "java.awt.event.*", + "java.beans.*", + "java.io.*", + "java.lang.*", + "java.util.*", + "javax.swing.*", + "javax.swing.border.*", + "javax.swing.event.*", + "jaxx.runtime.swing.JAXXButtonGroup", + "jaxx.runtime.swing.HBox", + "jaxx.runtime.swing.VBox", + "jaxx.runtime.swing.Table", + "static org.nuiton.i18n.I18n._", + "static jaxx.runtime.Util.createImageIcon" + })); } - public static void addProfileTime(JAXXCompiler compiler, String key) { - JAXXProfile p = JAXXCompilerLaunchor.get().profiler; - if (p != null) { - p.addTime(compiler, key); + public void addProfileTime(JAXXCompiler compiler, String key) { + if (profiler != null) { + profiler.addTime(compiler, key); } } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXProfile.java b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXProfile.java index 0ed1f68..054d851 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXProfile.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXProfile.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; -import jaxx.compiler.JAXXCompilerLaunchor.LifeCycle; +import jaxx.compiler.JAXXEngine.LifeCycle; import org.nuiton.util.StringUtil; /** diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JavaField.java b/jaxx-compiler/src/main/java/jaxx/compiler/JavaField.java deleted file mode 100644 index f597b09..0000000 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JavaField.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2006 Ethan Nicholas. All rights reserved. - * Use is subject to license terms. - */ -package jaxx.compiler; - -import java.lang.reflect.Modifier; -import java.util.Comparator; - -/** - * Represents a field in a Java source file being generated for output. <code>JavaFields</code> are created - * and added to a {@link JavaFile}, which can then output Java source code. - */ -public class JavaField implements Comparable<JavaField> { - - private int modifiers; - private String type; - private String name; - private String initializer; - - /** - * Constructs a new <code>JavaField</code>. The <code>modifiers</code> parameter is a bit mask of the - * constants from {@link java.lang.reflect.Modifier}, and the <code>type</code> of the field should be - * represented as it would appear in Java source code. - * - * @param modifiers the modifier keywords that should appear as part of the field's declaration - * @param type the type of the field as it would appear in Java source code - * @param name the field's name - */ - public JavaField(int modifiers, String type, String name) { - this(modifiers, type, name, null); - } - - /** - * Constructs a new <code>JavaField</code>. The <code>modifiers</code> parameter is a bit mask of the - * constants from <code>java.lang.reflect.Modifier</code>, and the <code>type</code> of the field should be - * represented as it would appear in Java source code. The <code>initializer</code> is the initial - * value of the field as it would appear in Java source code, or <code>null</code> to leave it at the - * default value. - * - * @param modifiers the modifier keywords that should appear as part of the field's declaration - * @param type the type of the field as it would appear in Java source code - * @param name the field's name - * @param initializer the initial value of the field, as it would appear in Java source code - */ - public JavaField(int modifiers, String type, String name, String initializer) { - this.modifiers = modifiers; - this.type = type; - this.name = name; - this.initializer = initializer; - } - - /** - * Returns a bit mask describing the modifier keywords which should appear as part of this field's - * declaration. See <code>java.lang.reflect.Modifier</code> for more information on decoding this - * field. - * - * @return the modifier bit mask - */ - public int getModifiers() { - return modifiers; - } - - /** - * Returns the field's name. - * - * @return the field's name - */ - public String getName() { - return name; - } - - /** - * Returns the field's type, as it would be represented in Java source code. - * - * @return the field's type - */ - public String getType() { - return type; - } - - /** - * Returns the Java source code for this field. - * - * @param lineSeparator line separator - * @return the Java source code for this field - */ - public String toString(String lineSeparator) { - StringBuffer result = new StringBuffer(); - result.append(JavaFile.getModifiersText(modifiers)); - result.append(type).append(' ').append(name); - if (initializer != null) { - result.append(" = ").append(initializer); - } - result.append(';').append(lineSeparator); - return result.toString(); - } - - @Override - public int compareTo(JavaField o) { - return COMPARATOR.compare(this, o); - } - public static final Comparator<JavaField> COMPARATOR = new Comparator<JavaField>() { - - @Override - public int compare(JavaField o1, JavaField o2) { - - int result; - if ((result = compareStatic(o1, o2)) != 0) { - return result; - } - - // data sources must be on the last after all other fields - if ((result = compareDataSource(o1, o2)) != 0) { - return result; - } - - // same static - if ((result = compareVisibility(o1, o2)) != 0) { - return result; - } - // same visibility, test name - return o1.name.compareTo(o2.name); - } - - public int compareStatic(JavaField o1, JavaField o2) { - // first comparator modifiers : static always before none static - if (Modifier.isStatic(o1.modifiers) && !Modifier.isStatic(o2.modifiers)) { - return -1; - } - if (!Modifier.isStatic(o1.modifiers) && Modifier.isStatic(o2.modifiers)) { - return 1; - } - return 0; - } - - public int compareDataSource(JavaField o1, JavaField o2) { - // first comparator modifiers : static always before none static - if (o1.name.startsWith("$DataSource") && !o2.name.startsWith("$DataSource")) { - return 1; - } - if (!o1.name.startsWith("$DataSource") && o2.name.startsWith("$DataSource")) { - return -1; - } - return 0; - } - - public int compareVisibility(JavaField o1, JavaField o2) { - // first comparator modifiers : static always before none static - if (!Modifier.isPublic(o1.modifiers) && Modifier.isPublic(o2.modifiers)) { - return 1; - } - - if (Modifier.isPublic(o1.modifiers) && !Modifier.isPublic(o2.modifiers)) { - return -1; - } - - if (Modifier.isProtected(o1.modifiers) && !Modifier.isProtected(o2.modifiers)) { - return -1; - } - if (!Modifier.isProtected(o1.modifiers) && Modifier.isProtected(o2.modifiers)) { - return 1; - } - - if (Modifier.isPrivate(o1.modifiers) && !Modifier.isPrivate(o2.modifiers)) { - return -1; - } - if (!Modifier.isPrivate(o1.modifiers) && Modifier.isPrivate(o2.modifiers)) { - return 1; - } - return 0; - } - }; - - public static JavaField newField(int modifiers, String returnType, String name) { - return newField(modifiers, returnType, name, null); - } - - public static JavaField newField(int modifiers, String returnType, String name, String initializer) { - return new JavaField(modifiers, returnType, name, initializer); - } -} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/StylesheetHelper.java b/jaxx-compiler/src/main/java/jaxx/compiler/StylesheetHelper.java index 96de766..813876d 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/StylesheetHelper.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/StylesheetHelper.java @@ -11,7 +11,6 @@ import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.reflect.MethodDescriptor; import jaxx.compiler.tags.DefaultObjectHandler; import jaxx.compiler.tags.TagManager; -import jaxx.compiler.types.TypeManager; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -119,7 +118,7 @@ public class StylesheetHelper { pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim(); pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode()); String dest = object.getId() + ".style." + pseudoClass + ".add"; - String destCode = TypeManager.getJavaCode(dest); + String destCode = compiler.getJavaCode(dest); if (compiler.haveProcessDataBinding()) { compiler.appendProcessDataBinding("else "); } @@ -229,7 +228,7 @@ public class StylesheetHelper { pseudoClass = pseudoClass.substring(1, pseudoClass.length() - 1).trim(); pseudoClass = replaceObjectReferences(pseudoClass, object.getJavaCode()); String dest = object.getId() + ".style." + pseudoClass + ".remove"; - String destCode = TypeManager.getJavaCode(dest); + String destCode = compiler.getJavaCode(dest); if (compiler.haveProcessDataBinding()) { compiler.appendProcessDataBinding("else "); } @@ -383,13 +382,13 @@ public class StylesheetHelper { String dataBinding = compiler.processDataBindings(e.getValue(), type); String valueCode; if (dataBinding != null) { - valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")"; + valueCode = "new jaxx.runtime.css.DataBinding(" + compiler.getJavaCode(object.getId() + "." + property + "." + priority) + ")"; new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false); } else { try { Class<?> typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null; - valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass)); + valueCode = compiler.getJavaCode(compiler.convertFromString(e.getValue(), typeClass)); } catch (ClassNotFoundException ex) { compiler.reportError("could not find class " + type.getName()); return; @@ -399,7 +398,7 @@ public class StylesheetHelper { buffer.append("java.lang.Object "); valueDeclared = true; } - buffer.append("value = jaxx.runtime.css.Pseudoclasses.applyProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator()); + buffer.append("value = jaxx.runtime.css.Pseudoclasses.applyProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(compiler.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator()); buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompiler.getLineSeparator()); String unwrappedValue = unwrap(type, "value"); buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) + @@ -431,13 +430,13 @@ public class StylesheetHelper { String dataBinding = compiler.processDataBindings(e.getValue(), type); String valueCode; if (dataBinding != null) { - valueCode = "new jaxx.runtime.css.DataBinding(" + TypeManager.getJavaCode(object.getId() + "." + property + "." + priority) + ")"; + valueCode = "new jaxx.runtime.css.DataBinding(" + compiler.getJavaCode(object.getId() + "." + property + "." + priority) + ")"; new DataBinding(dataBinding, object.getId() + "." + property + "." + priority, handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBinding, compiler), compiler).compile(false); } else { try { Class<?> typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null; - valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass)); + valueCode = compiler.getJavaCode(compiler.convertFromString(e.getValue(), typeClass)); } catch (ClassNotFoundException ex) { compiler.reportError("could not find class " + type.getName()); return; @@ -447,7 +446,7 @@ public class StylesheetHelper { buffer.append("java.lang.Object "); valueDeclared = true; } - buffer.append("value = jaxx.runtime.css.Pseudoclasses.removeProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(TypeManager.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator()); + buffer.append("value = jaxx.runtime.css.Pseudoclasses.removeProperty(").append(compiler.getOutputClassName()).append(".this, ").append(object.getJavaCode()).append(", ").append(compiler.getJavaCode(property)).append(", ").append(valueCode).append(", jaxx.runtime.css.Pseudoclasses.wrap(").append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)).append("), ").append(priority).append(");").append(JAXXCompiler.getLineSeparator()); buffer.append("if (!(value instanceof jaxx.runtime.css.DataBinding)) {").append(JAXXCompiler.getLineSeparator()); String unwrappedValue = unwrap(type, "value"); buffer.append(" ").append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + JAXXCompiler.getCanonicalName(type) + diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java index abd81f0..ac76eab 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/BoxedCompiledObjectDecorator.java @@ -3,7 +3,7 @@ package jaxx.compiler.decorators; import jaxx.compiler.CompiledObject; import jaxx.compiler.CompiledObject.ChildRef; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaFile; +import jaxx.compiler.io.JavaFile; import jaxx.runtime.SwingUtil; /** @@ -16,6 +16,11 @@ import jaxx.runtime.SwingUtil; public class BoxedCompiledObjectDecorator extends DefaultCompiledObjectDecorator { @Override + public String getName() { + return "boxed"; + } + + @Override public void finalizeCompiler(JAXXCompiler compiler, CompiledObject root, CompiledObject object, JavaFile javaFile, String packageName, String className, String fullClassName) { CompiledObject parent = object.getParent(); for (ChildRef child : parent.getChilds()) { diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecorator.java b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecorator.java index f698e94..a5b36ca 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecorator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecorator.java @@ -3,7 +3,7 @@ package jaxx.compiler.decorators; import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaFile; +import jaxx.compiler.io.JavaFile; /** * @@ -16,6 +16,8 @@ import jaxx.compiler.JavaFile; */ public interface CompiledObjectDecorator { + String getName(); + String createCompleteSetupMethod(JAXXCompiler compiler, CompiledObject object, JavaFile javaFile, StringBuffer initDataBindings); boolean createInitializer(JAXXCompiler compiler, CompiledObject root, CompiledObject object, StringBuffer code, boolean lastWasMethodCall); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecoratorManager.java b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecoratorManager.java deleted file mode 100644 index 1fcfe4d..0000000 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/CompiledObjectDecoratorManager.java +++ /dev/null @@ -1,59 +0,0 @@ -package jaxx.compiler.decorators; - -import java.util.Map; -import java.util.TreeMap; - -/** - * - * @author chemit - * @since 2.0.0 - */ -public class CompiledObjectDecoratorManager { - - protected static Map<String, CompiledObjectDecorator> cache; - - public static void registerDecorator(String key, Class<? extends CompiledObjectDecorator> klass) { - synchronized (getCache()) { - if (getCache().containsKey(key)) { - throw new IllegalArgumentException("the decorator with key [" + key + "] is already registred! use another key name"); - } - try { - getCache().put(key, klass.newInstance()); - } catch (InstantiationException ex) { - throw new IllegalArgumentException("could not create decorator " + klass + " for reason " + ex.getMessage(), ex); - } catch (IllegalAccessException ex) { - throw new IllegalArgumentException("could not create decorator " + klass + " for reason " + ex.getMessage(), ex); - } - } - } - - public static CompiledObjectDecorator getDecorator(String name) { - CompiledObjectDecorator decorator = getCache().get(name); - if (decorator == null) { - throw new IllegalArgumentException("could not find decorator with key " + name + " (known decorators : " + getCache().keySet()); - } - return decorator; - } - - public static CompiledObjectDecorator getDecorator(Class<?> type) { - for (CompiledObjectDecorator decorator : getCache().values()) { - if (type == decorator.getClass()) { - return decorator; - } - } - return null; - } - - protected static synchronized Map<String, CompiledObjectDecorator> getCache() { - if (cache == null) { - cache = new TreeMap<String, CompiledObjectDecorator>(); - } - return cache; - } - - public static void reset() { - if (cache != null) { - cache.clear(); - } - } -} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java index 57ff26f..fe91b1c 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java @@ -3,11 +3,10 @@ package jaxx.compiler.decorators; import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaField; -import jaxx.compiler.JavaFile; -import jaxx.compiler.JavaMethod; +import jaxx.compiler.io.JavaField; +import jaxx.compiler.io.JavaFile; +import jaxx.compiler.io.JavaMethod; import jaxx.compiler.ScriptInitializer; -import jaxx.compiler.types.TypeManager; import java.lang.reflect.Modifier; import java.util.Map.Entry; @@ -21,21 +20,27 @@ import java.util.Map.Entry; public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator { @Override + public String getName() { + return "default"; + } + + @Override public void finalizeCompiler(JAXXCompiler compiler, CompiledObject root, CompiledObject object, JavaFile javaFile, String packageName, String className, String fullClassName) { if (!object.isOverride() && !(object instanceof ScriptInitializer)) { String id = object.getId(); int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED; if (object == root) { - javaFile.addField(new JavaField(access, fullClassName, id, "this")); + javaFile.addField(new JavaField(access, className, id, false, "this")); +// javaFile.addField(new JavaField(access, fullClassName, id, false, "this")); } else { //TC -20081017 can have generic on compiled Object - javaFile.addField(JavaField.newField(access, JAXXCompiler.getCanonicalName(object), id), object.isJavaBean()); + javaFile.addField(JavaField.newField(access, JAXXCompiler.getCanonicalName(object), id, object.isOverride()), object.isJavaBean()); } } if (!compiler.inlineCreation(object) && object != root) { - javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object))); + javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object), object.isOverride())); } } @@ -45,29 +50,35 @@ public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator { return object.getInitializationCode(compiler); } StringBuffer result = new StringBuffer(); + String eol = JAXXCompiler.getLineSeparator(); if (object.isOverride() && object.getOverrideType() == object.getObjectClass()) { //TC-20090309 on utilise le super code quand l'objet est de meme type result.append("super.").append(object.getCreationMethodName()).append("();"); } else { - result.append(object.getId()); - result.append(" = "); + String init = object.getId() + " = "; +// result.append(object.getId()); +// result.append(" = "); if (object.isJavaBean() && object.getJavaBeanInitCode() != null) { - result.append(object.getJavaBeanInitCode()).append(";"); + init += object.getJavaBeanInitCode(); +// result.append(object.getJavaBeanInitCode()).append(";"); } else { String constructorParams = object.getConstructorParams(); + String canonicalName = JAXXCompiler.getCanonicalName(object); if (constructorParams != null) { //TC - 20081017 compiledObject can have generics - result.append(" new ").append(JAXXCompiler.getCanonicalName(object)).append("(").append(constructorParams).append(");"); - //result.append("(").append(getCanonicalName(object.getObjectClass())).append(") new ").append(getCanonicalName(object.getObjectClass())).append("(").append(constructorParams).append(");"); + init += "new " + canonicalName + "(" + constructorParams + ")"; +// result.append(" new ").append(canonicalName).append("(").append(constructorParams).append(");"); } else { //TC - 20081017 compiledObject can have generics - result.append("new ").append(JAXXCompiler.getCanonicalName(object)).append("();"); + init += "new " + canonicalName + "()"; +// result.append("new ").append(canonicalName).append("();"); } } - result.append(JAXXCompiler.getLineSeparator()); - result.append("$objectMap.put(").append(TypeManager.getJavaCode(object.getId())).append(", ").append(object.getId()).append(");"); + result.append(eol); + result.append("$objectMap.put(").append(compiler.getJavaCode(object.getId())).append(", ").append(init).append(");"); +// result.append("$objectMap.put(").append(TypeManager.getJavaCode(object.getId())).append(", ").append(object.getId()).append(");"); } - result.append(JAXXCompiler.getLineSeparator()); + result.append(eol); String initCode = object.getInitializationCode(compiler); if (initCode != null && initCode.length() > 0) { result.append(initCode); @@ -87,41 +98,42 @@ public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator { } } + String eol = JAXXCompiler.getLineSeparator(); //TC - 20081017 only generate the method if not empty ? if (object.getId().startsWith("$")) { - code.append(object.getAdditionCode()).append(JAXXCompiler.getLineSeparator()); + code.append(object.getAdditionCode()).append(eol); } else { String additionCode = object.getAdditionCode(); if (additionCode.length() > 0) { - code.append(object.getAdditionMethodName()).append("();").append(JAXXCompiler.getLineSeparator()); - additionCode = "if (!allComponentsCreated) {" + JAXXCompiler.getLineSeparator() + " return;" + JAXXCompiler.getLineSeparator() + "}" + JAXXCompiler.getLineSeparator() + additionCode; - javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getAdditionMethodName(), additionCode)); + code.append(object.getAdditionMethodName()).append("();").append(eol); + additionCode = "if (!allComponentsCreated) {" + eol + " return;" + eol + "}" + eol + additionCode; + javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getAdditionMethodName(), additionCode, false)); } } - //code.append(getLineSeparator()); return code.toString(); } @Override public boolean createInitializer(JAXXCompiler compiler, CompiledObject root, CompiledObject object, StringBuffer code, boolean lastWasMethodCall) { + String eol = JAXXCompiler.getLineSeparator(); if (object == root) { String rootCode = root.getInitializationCode(compiler); if (rootCode != null && rootCode.length() > 0) { code.append(rootCode); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } } else { if (!object.isOverride()) { if (compiler.inlineCreation(object)) { if (lastWasMethodCall) { lastWasMethodCall = false; - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } code.append(getCreationCode(compiler, object)); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } else { code.append(object.getCreationMethodName()).append("();"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); lastWasMethodCall = true; } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java index 44d7c99..35e7061 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java @@ -3,9 +3,9 @@ package jaxx.compiler.decorators; import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerConfiguration; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaArgument; -import jaxx.compiler.JavaFile; -import jaxx.compiler.JavaMethod; +import jaxx.compiler.io.JavaArgument; +import jaxx.compiler.io.JavaFile; +import jaxx.compiler.io.JavaMethod; import java.lang.reflect.Modifier; import java.util.Iterator; @@ -24,6 +24,11 @@ public class HelpRootCompiledObjectDecorator extends DefaultCompiledObjectDecora */ protected static Set<String> helpIds = new java.util.HashSet<String>(); + @Override + public String getName() { + return "help"; + } + protected String getBrokerFQN(JAXXCompiler compiler) { String helpBrokerFQN = compiler.getConfiguration().getHelpBrokerFQN(); return helpBrokerFQN; @@ -50,18 +55,18 @@ public class HelpRootCompiledObjectDecorator extends DefaultCompiledObjectDecora javaFile.addInterface(JAXXCompiler.getCanonicalName(validatorInterface) + "<" + helpBrokerFQN + ">"); javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC, "void", "registerHelpId", - "broker.installUI(component, helpId);", + "broker.installUI(component, helpId);",true, new JavaArgument(helpBrokerFQN, "broker"), new JavaArgument("Component", "component"), new JavaArgument("String", "helpId"))); javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC, "void", "showHelp", - "getBroker().showHelp(this, helpId);", + "getBroker().showHelp(this, helpId);",true, new JavaArgument("String", "helpId"))); StringBuilder buffer = new StringBuilder(); - String lineSeparator = JAXXCompiler.getLineSeparator(); + String eol = JAXXCompiler.getLineSeparator(); if (options.isGenerateHelp()) { @@ -72,7 +77,7 @@ public class HelpRootCompiledObjectDecorator extends DefaultCompiledObjectDecora CompiledObject o = itr.next(); String helpID = getHelpId(o); if (helpID != null) { - buffer.append(lineSeparator); + buffer.append(eol); // detects a helpId to register buffer.append("registerHelpId(_broker, " + o.getJavaCode() + ", " + helpID + ");"); //keep the helpID for helpSet generation @@ -84,8 +89,8 @@ public class HelpRootCompiledObjectDecorator extends DefaultCompiledObjectDecora StringBuilder extraCode = new StringBuilder(helpBrokerFQN).append(" _broker = getBroker();"); - buffer.append(lineSeparator).append("_broker.prepareUI(this);"); - buffer.append(lineSeparator); + buffer.append(eol).append("_broker.prepareUI(this);"); + buffer.append(eol); // add the calls compiler.appendLateInitializer(extraCode.toString()); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/generators/Generator.java b/jaxx-compiler/src/main/java/jaxx/compiler/generators/Generator.java index 5677672..1d9b00f 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/generators/Generator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/generators/Generator.java @@ -2,7 +2,7 @@ package jaxx.compiler.generators; import jaxx.compiler.CompiledObject; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaFile; +import jaxx.compiler.io.JavaFile; /** * TODO javadoc! diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/generators/GeneratorManager.java b/jaxx-compiler/src/main/java/jaxx/compiler/generators/GeneratorManager.java deleted file mode 100644 index 1a79d46..0000000 --- a/jaxx-compiler/src/main/java/jaxx/compiler/generators/GeneratorManager.java +++ /dev/null @@ -1,42 +0,0 @@ -package jaxx.compiler.generators; - -import java.util.ArrayList; -import java.util.List; -import java.util.ServiceLoader; - -/** - * - * @author chemit - * @since 2.0.0 - */ -public class GeneratorManager { - - protected static List<Generator> generators; - - public static List<Generator> getGenerators() { - if (generators == null) { - loadGenerators(); - } - return generators; - } - - public static void addGenerator(Generator g) { - getGenerators().add(g); - } - - public static void clear() { - if (generators != null) { - generators.clear(); - generators = null; - } - } - - protected static void loadGenerators() { - if (generators == null) { - generators = new ArrayList<Generator>(); - for (Generator generator : ServiceLoader.load(Generator.class)) { - generators.add(generator); - } - } - } -} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/generators/JAXXObjectGenerator.java b/jaxx-compiler/src/main/java/jaxx/compiler/generators/JAXXObjectGenerator.java index ff0eeeb..aded870 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/generators/JAXXObjectGenerator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/generators/JAXXObjectGenerator.java @@ -1,5 +1,9 @@ package jaxx.compiler.generators; +import jaxx.compiler.io.JavaMethod; +import jaxx.compiler.io.JavaArgument; +import jaxx.compiler.io.JavaField; +import jaxx.compiler.io.JavaFile; import jaxx.compiler.*; import jaxx.runtime.Base64Coder; import jaxx.compiler.CompilerException; @@ -8,7 +12,6 @@ import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.reflect.FieldDescriptor; import jaxx.compiler.reflect.MethodDescriptor; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXObjectDescriptor; import jaxx.runtime.JAXXContext; @@ -17,9 +20,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.IOException; -import java.lang.reflect.Modifier; -import static java.lang.reflect.Modifier.FINAL; -import static java.lang.reflect.Modifier.PROTECTED; +import static java.lang.reflect.Modifier.*; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -36,75 +37,77 @@ public class JAXXObjectGenerator implements Generator { /** log */ protected static final Log log = LogFactory.getLog(JAXXObjectGenerator.class); + protected static final JavaField SERIAL_VERSION_UID_FIELD = JavaField.newField(PRIVATE | STATIC | FINAL, + "long", "serialVersionUID", false, "1L"); protected static final JavaField ACTIVE_BINDINGS_FIELD = JavaField.newField(PROTECTED, - "java.util.List<Object>", "$activeBindings", "new ArrayList<Object>()"); + "java.util.List<Object>", "$activeBindings", false, "new ArrayList<Object>()"); protected static final JavaField BINDING_SOURCES_FIELD = JavaField.newField(PROTECTED, - "java.util.Map<String,Object>", "$bindingSources", "new HashMap<String,Object>()"); + "java.util.Map<String,Object>", "$bindingSources", false, "new HashMap<String,Object>()"); protected static final JavaField OBJECT_MAP_FIELD = JavaField.newField(PROTECTED, - "Map<String,Object>", "$objectMap", "new HashMap<String,Object>()"); - protected static final JavaField ALL_COMPONENTS_CREATED_FIELD = JavaField.newField(java.lang.reflect.Modifier.PRIVATE, - "boolean", "allComponentsCreated"); - protected static final JavaField CONTEXT_INITIALIZED = JavaField.newField(java.lang.reflect.Modifier.PRIVATE, - "boolean", "contextInitialized", "true"); - protected static final JavaField PREVIOUS_VALUES_FIELD = JavaField.newField(0, - "java.util.Map", "$previousValues", "new java.util.HashMap()"); + "Map<String,Object>", "$objectMap", true, "new HashMap<String,Object>()"); + protected static final JavaField ALL_COMPONENTS_CREATED_FIELD = JavaField.newField(PRIVATE, + "boolean", "allComponentsCreated", false); + protected static final JavaField CONTEXT_INITIALIZED = JavaField.newField(PRIVATE, + "boolean", "contextInitialized", false, "true"); + protected static final JavaField PREVIOUS_VALUES_FIELD = JavaField.newField(PROTECTED, + "java.util.Map<?,?>", "$previousValues", false, "new java.util.HashMap<Object,Object>()"); protected static final JavaField DELEGATE_CONTEXT_FIELD = JavaField.newField(PROTECTED, - JAXXContext.class.getName(), "delegateContext"); + JAXXContext.class.getName(), "delegateContext", true); protected static final JavaField PROPERTY_CHANGE_SUPPORT_FIELD = JavaField.newField(0, - "java.beans.PropertyChangeSupport", "$propertyChangeSupport"); - protected static final JavaMethod GET_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> T", "getContextValue", - "return delegateContext.getContextValue(clazz, null);", + "java.beans.PropertyChangeSupport", "$propertyChangeSupport", false); + protected static final JavaMethod GET_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(PUBLIC, "<T> T", "getContextValue", + "return delegateContext.getContextValue(clazz, null);", true, new JavaArgument("Class<T>", "clazz")); - protected static final JavaMethod GET_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> T", "getContextValue", - "return delegateContext.getContextValue(clazz, name);", + protected static final JavaMethod GET_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "<T> T", "getContextValue", + "return delegateContext.getContextValue(clazz, name);", true, new JavaArgument("Class<T>", "clazz"), new JavaArgument("String", "name")); - protected static final JavaMethod SET_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> void", "setContextValue", - "delegateContext.setContextValue(o, name);", + protected static final JavaMethod SET_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "<T> void", "setContextValue", + "delegateContext.setContextValue(o, name);", true, new JavaArgument("T", "o"), new JavaArgument("String", "name")); - protected static final JavaMethod SET_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> void", "setContextValue", - "delegateContext.setContextValue(o, null);", + protected static final JavaMethod SET_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(PUBLIC, "<T> void", "setContextValue", + "delegateContext.setContextValue(o, null);", true, new JavaArgument("T", "o")); - protected static final JavaMethod REMOVE_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> void", "removeContextValue", - "delegateContext.removeContextValue(clazz, name);", + protected static final JavaMethod REMOVE_CONTEXT_VALUE_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "<T> void", "removeContextValue", + "delegateContext.removeContextValue(clazz, name);", true, new JavaArgument("Class<T>", "clazz"), new JavaArgument("String", "name")); - protected static final JavaMethod REMOVE_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<T> void", "removeContextValue", - "delegateContext.removeContextValue(clazz, null);", + protected static final JavaMethod REMOVE_CONTEXT_VALUE_METHOD = JavaMethod.newMethod(PUBLIC, "<T> void", "removeContextValue", + "delegateContext.removeContextValue(clazz, null);", true, new JavaArgument("Class<T>", "clazz")); - protected static final JavaMethod GET_PARENT_CONTAINER_MORE_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<O extends Container> O", "getParentContainer", - "return delegateContext.getParentContainer(source, clazz);", + protected static final JavaMethod GET_PARENT_CONTAINER_MORE_METHOD = JavaMethod.newMethod(PUBLIC, "<O extends Container> O", "getParentContainer", + "return delegateContext.getParentContainer(source, clazz);", true, new JavaArgument("Object", "source"), new JavaArgument("Class<O>", "clazz")); - protected static final JavaMethod GET_PARENT_CONTAINER_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "<O extends Container> O", "getParentContainer", - "return delegateContext.getParentContainer(clazz);", + protected static final JavaMethod GET_PARENT_CONTAINER_METHOD = JavaMethod.newMethod(PUBLIC, "<O extends Container> O", "getParentContainer", + "return delegateContext.getParentContainer(clazz);", true, new JavaArgument("Class<O>", "clazz")); - protected static final JavaMethod GET_OBJECT_BY_ID_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "java.lang.Object", "getObjectById", - "return $objectMap.get(id);", + protected static final JavaMethod GET_OBJECT_BY_ID_METHOD = JavaMethod.newMethod(PUBLIC, "java.lang.Object", "getObjectById", + "return $objectMap.get(id);", true, new JavaArgument("String", "id")); - protected static final JavaMethod GET_JAXX_OBJECT_DESCRIPTOR_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC | java.lang.reflect.Modifier.STATIC, "jaxx.runtime.JAXXObjectDescriptor", "$getJAXXObjectDescriptor", - "return jaxx.runtime.Util.decodeCompressedJAXXObjectDescriptor($jaxxObjectDescriptor);"); - protected static final JavaMethod PROCESS_DATA_BINDING_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "processDataBinding", - "processDataBinding(dest, false);", + protected static final JavaMethod GET_JAXX_OBJECT_DESCRIPTOR_METHOD = JavaMethod.newMethod(PUBLIC | STATIC, "jaxx.runtime.JAXXObjectDescriptor", "$getJAXXObjectDescriptor", + "return jaxx.runtime.Util.decodeCompressedJAXXObjectDescriptor($jaxxObjectDescriptor);", false); + protected static final JavaMethod PROCESS_DATA_BINDING_METHOD = JavaMethod.newMethod(PUBLIC, "void", "processDataBinding", + "processDataBinding(dest, false);", true, new JavaArgument("String", "dest")); - protected static final JavaMethod FIRE_PROPERTY_CHANGE_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "firePropertyChange", - "super.firePropertyChange(propertyName, oldValue, newValue);", + protected static final JavaMethod FIRE_PROPERTY_CHANGE_METHOD = JavaMethod.newMethod(PUBLIC, "void", "firePropertyChange", + "super.firePropertyChange(propertyName, oldValue, newValue);", true, new JavaArgument("String", "propertyName"), new JavaArgument("Object", "oldValue"), new JavaArgument("Object", "newValue")); - protected static final JavaMethod FIRE_PROPERTY_CHANGE_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "firePropertyChange", - "$getPropertyChangeSupport().firePropertyChange(propertyName, oldValue, newValue);", + protected static final JavaMethod FIRE_PROPERTY_CHANGE_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "void", "firePropertyChange", + "$getPropertyChangeSupport().firePropertyChange(propertyName, oldValue, newValue);", true, new JavaArgument("String", "propertyName"), new JavaArgument("Object", "oldValue"), new JavaArgument("Object", "newValue")); protected static final JavaMethod GET_PROPERTY_CHANGE_SUPPORT_METHOD = JavaMethod.newMethod(0, "java.beans.PropertyChangeSupport", "$getPropertyChangeSupport", "if ($propertyChangeSupport == null)\n" + " $propertyChangeSupport = new PropertyChangeSupport(this);\n" + - "return $propertyChangeSupport;"); - protected static final JavaMethod ADD_PROPERTY_CHANGE_SUPPORT_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "addPropertyChangeListener", - "$getPropertyChangeSupport().addPropertyChangeListener(listener);", + "return $propertyChangeSupport;", false); + protected static final JavaMethod ADD_PROPERTY_CHANGE_SUPPORT_METHOD = JavaMethod.newMethod(PUBLIC, "void", "addPropertyChangeListener", + "$getPropertyChangeSupport().addPropertyChangeListener(listener);", true, new JavaArgument("java.beans.PropertyChangeListener", "listener")); - protected static final JavaMethod ADD_PROPERTY_CHANGE_SUPPORT_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "addPropertyChangeListener", - "$getPropertyChangeSupport().addPropertyChangeListener(property, listener);", + protected static final JavaMethod ADD_PROPERTY_CHANGE_SUPPORT_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "void", "addPropertyChangeListener", + "$getPropertyChangeSupport().addPropertyChangeListener(property, listener);", true, new JavaArgument("String", "property"), new JavaArgument("java.beans.PropertyChangeListener", "listener")); - protected static final JavaMethod REMOVE_PROPERTY_CHANGE_SUPPORT_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "removePropertyChangeListener", - "$getPropertyChangeSupport().removePropertyChangeListener(listener);", + protected static final JavaMethod REMOVE_PROPERTY_CHANGE_SUPPORT_METHOD = JavaMethod.newMethod(PUBLIC, "void", "removePropertyChangeListener", + "$getPropertyChangeSupport().removePropertyChangeListener(listener);", true, new JavaArgument("java.beans.PropertyChangeListener", "listener")); - protected static final JavaMethod REMOVE_PROPERTY_CHANGE_SUPPORT_NAMED_METHOD = JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, "void", "removePropertyChangeListener", - "$getPropertyChangeSupport().removePropertyChangeListener(property, listener);", + protected static final JavaMethod REMOVE_PROPERTY_CHANGE_SUPPORT_NAMED_METHOD = JavaMethod.newMethod(PUBLIC, "void", "removePropertyChangeListener", + "$getPropertyChangeSupport().removePropertyChangeListener(property, listener);", true, new JavaArgument("String", "property"), new JavaArgument("java.beans.PropertyChangeListener", "listener")); @Override @@ -117,8 +120,8 @@ public class JAXXObjectGenerator implements Generator { //Map<String, CompiledObject> objects = compiler.getObjects(); ClassDescriptor superclass = root.getObjectClass(); boolean superclassIsJAXXObject = ClassDescriptorLoader.getClassDescriptor(JAXXObject.class).isAssignableFrom(superclass); - javaFile.setModifiers(Modifier.PUBLIC); - javaFile.setClassName(fullClassName); + javaFile.setModifiers(PUBLIC); + javaFile.setName(fullClassName); javaFile.setSuperClass(JAXXCompiler.getCanonicalName(superclass)); javaFile.setSuperclassIsJAXXObject(superclassIsJAXXObject); @@ -130,27 +133,13 @@ public class JAXXObjectGenerator implements Generator { for (CompiledObject object : compiler.getObjects().values()) { CompiledObjectDecorator decorator = object.getDecorator(); decorator.finalizeCompiler(compiler, root, object, javaFile, packageName, className, fullClassName); - - /*if (!object.isOverride() && !(object instanceof ScriptInitializer)) { - String id = object.getId(); - int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED; - if (object == root) { - javaFile.addField(new JavaField(access, fullClassName, id, "this")); - } else { - //TC -20081017 can have generic on compiled Object - javaFile.addField(JavaField.newField(access, JAXXCompiler.getCanonicalName(object), id), object.isJavaBean()); - } - } - - if (!compiler.inlineCreation(object) && object != root) { - javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getCreationMethodName(), getCreationCode(compiler, object))); - }*/ } + String eol = JAXXCompiler.getLineSeparator(); // DataBinding for (DataBinding dataBinding : compiler.getDataBindings()) { if (dataBinding.compile(true)) { - compiler.getInitDataBindings().append("applyDataBinding(").append(TypeManager.getJavaCode(dataBinding.getId())).append(");").append(JAXXCompiler.getLineSeparator()); + compiler.getInitDataBindings().append("applyDataBinding(").append(compiler.getJavaCode(dataBinding.getId())).append(");").append(eol); } } @@ -158,27 +147,26 @@ public class JAXXObjectGenerator implements Generator { boolean hasBind = compiler.getApplyDataBinding().length() > 0; if (hasBind) { compiler.appendApplyDataBinding(" else {"); - compiler.appendApplyDataBinding(JAXXCompiler.getLineSeparator()); + compiler.appendApplyDataBinding(eol); compiler.appendApplyDataBinding(" "); } compiler.appendApplyDataBinding("super.applyDataBinding($binding);"); - compiler.appendApplyDataBinding(JAXXCompiler.getLineSeparator()); + compiler.appendApplyDataBinding(eol); if (hasBind) { compiler.appendApplyDataBinding(" return;"); - compiler.appendApplyDataBinding(JAXXCompiler.getLineSeparator()); + compiler.appendApplyDataBinding(eol); compiler.appendApplyDataBinding("}"); } - hasBind = compiler.getRemoveDataBinding().length() > 0; if (hasBind) { compiler.appendRemoveDataBinding(" else {"); - compiler.appendRemoveDataBinding(JAXXCompiler.getLineSeparator()); + compiler.appendRemoveDataBinding(eol); compiler.appendRemoveDataBinding(" "); } compiler.appendRemoveDataBinding("super.removeDataBinding($binding);"); - compiler.appendRemoveDataBinding(JAXXCompiler.getLineSeparator()); + compiler.appendRemoveDataBinding(eol); if (hasBind) { compiler.appendRemoveDataBinding("}"); @@ -191,7 +179,7 @@ public class JAXXObjectGenerator implements Generator { @Override public void prepareJavaFile(CompiledObject root, JAXXCompiler compiler, JavaFile javaFile, String packageName, String className) throws ClassNotFoundException { - String fullClassName = javaFile.getClassName(); + String fullClassName = javaFile.getName(); String jaxxContextImplementorClass = compiler.getConfiguration().getJaxxContextClass().getName(); boolean superclassIsJAXXObject = javaFile.isSuperclassIsJAXXObject(); @@ -200,7 +188,7 @@ public class JAXXObjectGenerator implements Generator { if (compiler.getConfiguration().isAddLogger()) { javaFile.addImport(Log.class); javaFile.addImport(LogFactory.class); - javaFile.addField(JavaField.newField(Modifier.PUBLIC + Modifier.STATIC + FINAL, "Log", "log", "LogFactory.getLog(" + fullClassName + ".class)")); + javaFile.addField(JavaField.newField(PUBLIC + STATIC + FINAL, "Log", "log", false, "LogFactory.getLog(" + fullClassName + ".class)")); } // JAXXObject @@ -210,7 +198,7 @@ public class JAXXObjectGenerator implements Generator { javaFile.addField(ACTIVE_BINDINGS_FIELD); // JAXXContext - javaFile.addField(JavaField.newField(PROTECTED | FINAL, JAXXContext.class.getName(), "delegateContext", "new " + jaxxContextImplementorClass + "(this);")); + javaFile.addField(JavaField.newField(PROTECTED | FINAL, JAXXContext.class.getName(), "delegateContext", true, "new " + jaxxContextImplementorClass + "(this);")); javaFile.addMethod(SET_CONTEXT_VALUE_METHOD); javaFile.addMethod(SET_CONTEXT_VALUE_NAMED_METHOD); javaFile.addMethod(GET_CONTEXT_VALUE_METHOD); @@ -226,8 +214,8 @@ public class JAXXObjectGenerator implements Generator { // DataBinding javaFile.addMethod(PROCESS_DATA_BINDING_METHOD); } - - javaFile.addField(ALL_COMPONENTS_CREATED_FIELD); + javaFile.addSimpleField(SERIAL_VERSION_UID_FIELD); + javaFile.addSimpleField(ALL_COMPONENTS_CREATED_FIELD); boolean overrideContextInitialized = false; FieldDescriptor[] scriptFields = compiler.getScriptFields(); for (FieldDescriptor f : scriptFields) { @@ -237,22 +225,38 @@ public class JAXXObjectGenerator implements Generator { } } if (!overrideContextInitialized) { - javaFile.addField(CONTEXT_INITIALIZED); + javaFile.addSimpleField(CONTEXT_INITIALIZED); } - javaFile.addField(createJAXXObjectDescriptorField(compiler, javaFile)); + javaFile.addSimpleField(createJAXXObjectDescriptorField(compiler, javaFile)); if (compiler.getStylesheet() != null) { - javaFile.addField(PREVIOUS_VALUES_FIELD); - } - /*for (CompiledObject object : compiler.getObjects().values()) { - List<CompiledObject.ChildRef> refList = object.getChilds(); - if (refList==null || refList.isEmpty()) { - continue; - } - for (ChildRef childRef : refList) { - childRef.addToAdditionCode(buffer); + boolean needField = true; + if (superclassIsJAXXObject) { + // check alreay exists on parent + ClassDescriptor superclass = root.getObjectClass(); + if (log.isDebugEnabled()) { + log.debug("superclass : " + superclass); + } + JAXXCompiler parentCompiler = compiler.getEngine().getJAXXCompiler(superclass.getName()); + if (parentCompiler != null) { + needField = parentCompiler.getStylesheet() == null; + } else { + try { + + superclass.getDeclaredFieldDescriptor(PREVIOUS_VALUES_FIELD.getName()); + needField = false; + } catch (NoSuchFieldException ex) { + // field not found + } + } + if (needField && log.isDebugEnabled()) { + log.debug("no " + PREVIOUS_VALUES_FIELD.getName() + " field in super class"); + } + } + if (needField) { + javaFile.addSimpleField(PREVIOUS_VALUES_FIELD); + } } - }*/ //TC 20090228 - only generate constructors if not done in scripts boolean constructorDetected = false; MethodDescriptor[] methods = compiler.getScriptMethods(); @@ -279,13 +283,13 @@ public class JAXXObjectGenerator implements Generator { javaFile.addMethod(createCompleteSetupMethod(compiler, javaFile, compiler.getInitDataBindings())); - - javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC, "void", "applyDataBinding", + javaFile.addMethod(JavaMethod.newMethod(PUBLIC, "void", "applyDataBinding", compiler.getApplyDataBinding().toString() + JAXXCompiler.getLineSeparator() + "processDataBinding($binding);", + true, new JavaArgument("String", "$binding"))); - javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC, "void", "removeDataBinding", - compiler.getRemoveDataBinding().toString(), new JavaArgument("String", "$binding"))); + javaFile.addMethod(JavaMethod.newMethod(PUBLIC, "void", "removeDataBinding", + compiler.getRemoveDataBinding().toString(), true, new JavaArgument("String", "$binding"))); javaFile.addMethod(createProcessDataBindingMethod(compiler, superclassIsJAXXObject)); @@ -315,19 +319,19 @@ public class JAXXObjectGenerator implements Generator { int sizeLimit = 65000; // constant strings are limited to 64K, and I'm not brave enough to push right up to the limit if (data.length() < sizeLimit) { - return JavaField.newField(Modifier.PRIVATE | Modifier.STATIC, "java.lang.String", "$jaxxObjectDescriptor", TypeManager.getJavaCode(data)); + return JavaField.newField(PRIVATE | STATIC, "java.lang.String", "$jaxxObjectDescriptor", false, compiler.getJavaCode(data)); } else { StringBuffer initializer = new StringBuffer(); for (int i = 0; i < data.length(); i += sizeLimit) { String name = "$jaxxObjectDescriptor" + i; - javaFile.addField(new JavaField(Modifier.PRIVATE | Modifier.STATIC, "java.lang.String", name, - TypeManager.getJavaCode(data.substring(i, Math.min(i + sizeLimit, data.length()))))); + javaFile.addField(new JavaField(PRIVATE | STATIC, "java.lang.String", name, false, + compiler.getJavaCode(data.substring(i, Math.min(i + sizeLimit, data.length()))))); if (initializer.length() > 0) { initializer.append(" + "); } initializer.append("String.valueOf(").append(name).append(")"); } - return JavaField.newField(Modifier.PRIVATE | Modifier.STATIC, "java.lang.String", "$jaxxObjectDescriptor", initializer.toString()); + return JavaField.newField(PRIVATE | STATIC | FINAL, "java.lang.String", "$jaxxObjectDescriptor", false, initializer.toString()); } } catch (IOException e) { throw new RuntimeException("Internal error: can't-happen error", e); @@ -352,10 +356,10 @@ public class JAXXObjectGenerator implements Generator { } int modifiers = firePropertyChange != null ? firePropertyChange.getModifiers() : 0; - if (Modifier.isPublic(modifiers)) { + if (isPublic(modifiers)) { // we have all the support we need } - if (Modifier.isProtected(modifiers)) { + if (isProtected(modifiers)) { // there is property change support but the firePropertyChange method is protected javaFile.addMethod(FIRE_PROPERTY_CHANGE_METHOD); } else { @@ -382,7 +386,7 @@ public class JAXXObjectGenerator implements Generator { if (listenerMethod.getParameterTypes().length != 1) { throw new CompilerException("Expected event handler " + listenerMethod.getName() + " of class " + handler.getListenerClass() + " to have exactly one argument"); } - javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC, "void", methodName, handler.getJavaCode(), + javaFile.addMethod(JavaMethod.newMethod(PUBLIC, "void", methodName, handler.getJavaCode(), false, new JavaArgument(JAXXCompiler.getCanonicalName(listenerMethod.getParameterTypes()[0]), "event"))); } } @@ -392,59 +396,51 @@ public class JAXXObjectGenerator implements Generator { protected JavaMethod createConstructor(JAXXCompiler compiler, String className, boolean superclassIsJAXXObject) throws CompilerException { StringBuffer code = new StringBuffer(); String constructorParams = compiler.getRootObject().getConstructorParams(); + String eol = JAXXCompiler.getLineSeparator(); if (constructorParams != null) { - code.append(" super(").append(constructorParams).append(");").append(JAXXCompiler.getLineSeparator()); + code.append(" super(").append(constructorParams).append(");").append(eol); } else { if (superclassIsJAXXObject) { - code.append(" super();").append(JAXXCompiler.getLineSeparator()); + code.append(" super();").append(eol); } } code.append("$initialize();"); - code.append(JAXXCompiler.getLineSeparator()); - return JavaMethod.newMethod(Modifier.PUBLIC, null, className, code.toString()); + code.append(eol); + return JavaMethod.newMethod(PUBLIC, null, className, code.toString(), false); } protected JavaMethod createConstructorWithInitialContext(JAXXCompiler compiler, String className, boolean superclassIsJAXXObject) throws CompilerException { StringBuffer code = new StringBuffer(); String constructorParams = compiler.getRootObject().getConstructorParams(); + String eol = JAXXCompiler.getLineSeparator(); if (constructorParams != null) { - code.append(" super(").append(constructorParams).append(");").append(JAXXCompiler.getLineSeparator()); + code.append(" super(").append(constructorParams).append(");").append(eol); } else { if (superclassIsJAXXObject) { - code.append(" super(parentContext);").append(JAXXCompiler.getLineSeparator()); + code.append(" super(parentContext);").append(eol); } } if (!superclassIsJAXXObject) { code.append(Util.class.getName() + ".initContext(this, parentContext);"); - code.append(JAXXCompiler.getLineSeparator()); - -// code.append("if (parentContext instanceof jaxx.runtime.context.JAXXInitialContext) {"); -// code.append(JAXXCompiler.getLineSeparator()); -// code.append(" ((jaxx.runtime.context.JAXXInitialContext)parentContext).to(this);"); -// code.append(JAXXCompiler.getLineSeparator()); -// code.append("} else {"); -// code.append(JAXXCompiler.getLineSeparator()); -// code.append(" setContextValue(parentContext);"); -// code.append(JAXXCompiler.getLineSeparator()); -// code.append("}"); -// code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } code.append("$initialize();"); - code.append(JAXXCompiler.getLineSeparator()); - return JavaMethod.newMethod(Modifier.PUBLIC, null, className, code.toString(), new JavaArgument(JAXXContext.class.getName(), "parentContext")); + code.append(eol); + return JavaMethod.newMethod(PUBLIC, null, className, code.toString(), false, new JavaArgument(JAXXContext.class.getName(), "parentContext")); } public JavaMethod createInitializer(JAXXCompiler compiler) throws CompilerException { + String eol = JAXXCompiler.getLineSeparator(); StringBuffer code = new StringBuffer(); CompiledObject root = compiler.getRootObject(); code.append("if (allComponentsCreated || !contextInitialized) {"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append(" return;"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append("}"); - code.append(JAXXCompiler.getLineSeparator()); - code.append("$objectMap.put(").append(TypeManager.getJavaCode(root.getId())).append(", this);"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); + code.append("$objectMap.put(").append(compiler.getJavaCode(root.getId())).append(", this);"); + code.append(eol); Iterator<CompiledObject> i = compiler.getObjectCreationOrder(); boolean lastWasMethodCall = false; @@ -455,150 +451,83 @@ public class JAXXObjectGenerator implements Generator { } CompiledObjectDecorator decorator = object.getDecorator(); lastWasMethodCall = decorator.createInitializer(compiler, root, object, code, lastWasMethodCall); - /*if (object != root && !object.isOverride()) { - if (compiler.inlineCreation(object)) { - if (lastWasMethodCall) { - lastWasMethodCall = false; - code.append(JAXXCompiler.getLineSeparator()); - } - code.append(getCreationCode(compiler, object)); - code.append(JAXXCompiler.getLineSeparator()); - } else { - code.append(object.getCreationMethodName()).append("();"); - code.append(JAXXCompiler.getLineSeparator()); - lastWasMethodCall = true; - } - }*/ } root.getDecorator().createInitializer(compiler, root, root, code, lastWasMethodCall); - /*String rootCode = root.getInitializationCode(compiler); - if (rootCode != null && rootCode.length() > 0) { - code.append(rootCode); - code.append(JAXXCompiler.getLineSeparator()); - }*/ - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); if (compiler.getInitializer().length() > 0) { code.append(compiler.getInitializer()); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } code.append("$completeSetup();"); - code.append(JAXXCompiler.getLineSeparator()); - return JavaMethod.newMethod(Modifier.PRIVATE, "void", "$initialize", code.toString()); + code.append(eol); + return JavaMethod.newMethod(PRIVATE, "void", "$initialize", code.toString(), false); } protected JavaMethod createCompleteSetupMethod(JAXXCompiler compiler, JavaFile javaFile, StringBuffer initDataBindings) { StringBuffer code = new StringBuffer(); code.append("allComponentsCreated = true;"); - code.append(JAXXCompiler.getLineSeparator()); + String eol = JAXXCompiler.getLineSeparator(); + code.append(eol); for (CompiledObject object : compiler.getObjects().values()) { CompiledObjectDecorator decorator = object.getDecorator(); code.append(decorator.createCompleteSetupMethod(compiler, object, javaFile, initDataBindings)); - - /*//TC - 20081017 only generate the method if not empty ? - if (object.getId().startsWith("$")) { - code.append(object.getAdditionCode()).append(JAXXCompiler.getLineSeparator()); - } else { - String additionCode = object.getAdditionCode(); - if (additionCode.length() > 0) { - code.append(object.getAdditionMethodName()).append("();").append(JAXXCompiler.getLineSeparator()); - additionCode = "if (!allComponentsCreated) {" + JAXXCompiler.getLineSeparator() + " return;" + JAXXCompiler.getLineSeparator() + "}" + JAXXCompiler.getLineSeparator() + additionCode; - javaFile.addMethod(JavaMethod.newMethod(Modifier.PROTECTED, "void", object.getAdditionMethodName(), additionCode)); - } - }*/ - //code.append(getLineSeparator()); } code.append(initDataBindings); if (compiler.getLateInitializer().length() > 0) { code.append(compiler.getLateInitializer()); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } //TC-20090313 add an extra method after complete setup MethodDescriptor method = compiler.getScriptMethod("$afterCompleteSetup"); if (method != null) { - code.append("$afterCompleteSetup();").append(JAXXCompiler.getLineSeparator()); + code.append("$afterCompleteSetup();").append(eol); } - return JavaMethod.newMethod(Modifier.PRIVATE, "void", "$completeSetup", code.toString()); + return JavaMethod.newMethod(PRIVATE, "void", "$completeSetup", code.toString(), false); } protected JavaMethod createProcessDataBindingMethod(JAXXCompiler compiler, boolean superclassIsJAXXObject) { StringBuffer code = new StringBuffer(); + String eol = JAXXCompiler.getLineSeparator(); //boolean superclassIsJAXXObject = ClassDescriptorLoader.getClassDescriptor(JAXXObject.class).isAssignableFrom(compiler.getRootObject().getObjectClass()); // the force parameter forces the update to happen even if it is already in activeBindings. This // is used on superclass invocations b/c by the time the call gets to the superclass, it is already // marked active and would otherwise be skipped if (compiler.getProcessDataBinding().length() > 0) { code.append(" if (!$force && $activeBindings.contains($dest)) { "); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append(" return;"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append("}"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append("$activeBindings.add($dest);"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append("try {"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); if (compiler.getProcessDataBinding().length() > 0) { code.append(compiler.getProcessDataBinding().toString()); //code.append(JAXXCompiler.getLineSeparator()); } if (superclassIsJAXXObject) { code.append(" else {"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append(" super.processDataBinding($dest, true);"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append(" }"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } code.append("} finally {"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append(" $activeBindings.remove($dest);"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); code.append("}"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } else if (superclassIsJAXXObject) { code.append("super.processDataBinding($dest, true);"); - code.append(JAXXCompiler.getLineSeparator()); + code.append(eol); } - return JavaMethod.newMethod(Modifier.PUBLIC, "void", "processDataBinding", code.toString(), + return JavaMethod.newMethod(PUBLIC, "void", "processDataBinding", code.toString(), superclassIsJAXXObject, new JavaArgument("String", "$dest"), new JavaArgument("boolean", "$force")); } - - /*---------------------------------------------------------------------------------*/ - /*-- Create methods code ----------------------------------------------------------*/ - /*---------------------------------------------------------------------------------*/ - - /* protected String getCreationCode(JAXXCompiler compiler, CompiledObject object) throws CompilerException { - if (object instanceof ScriptInitializer) { - return object.getInitializationCode(compiler); - } - CompiledObjectDecorator decorator = object.getDecorator(); - String result = decorator.getCreationCode(compiler, object); - return result;*/ - /*StringBuffer result = new StringBuffer(); - result.append(object.getId()); - result.append(" = "); - if (object.isJavaBean() && object.getJavaBeanInitCode() != null) { - result.append(object.getJavaBeanInitCode()).append(";"); - } else { - String constructorParams = object.getConstructorParams(); - if (constructorParams != null) { - //TC - 20081017 compiledObject can have generics - result.append(" new ").append(JAXXCompiler.getCanonicalName(object)).append("(").append(constructorParams).append(");"); - //result.append("(").append(getCanonicalName(object.getObjectClass())).append(") new ").append(getCanonicalName(object.getObjectClass())).append("(").append(constructorParams).append(");"); - } else { - //TC - 20081017 compiledObject can have generics - result.append("new ").append(JAXXCompiler.getCanonicalName(object)).append("();"); - } - } - result.append(JAXXCompiler.getLineSeparator()); - String initCode = object.getInitializationCode(compiler); - if (initCode != null && initCode.length() > 0) { - result.append(initCode); - } - result.append("$objectMap.put(").append(TypeManager.getJavaCode(object.getId())).append(", ").append(object.getId()).append(");"); - - return result.toString();*/ -// } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/generators/SwingGenerator.java b/jaxx-compiler/src/main/java/jaxx/compiler/generators/SwingGenerator.java index bf2a206..198b67e 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/generators/SwingGenerator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/generators/SwingGenerator.java @@ -1,5 +1,8 @@ package jaxx.compiler.generators; +import jaxx.compiler.io.JavaMethod; +import jaxx.compiler.io.JavaArgument; +import jaxx.compiler.io.JavaFile; import jaxx.compiler.*; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.runtime.swing.Application; @@ -19,8 +22,12 @@ public class SwingGenerator implements Generator { //TODO : move this to jaxx-compiler-swing generator if (ClassDescriptorLoader.getClassDescriptor(Application.class.getName()).isAssignableFrom(root.getObjectClass()) && !compiler.isMainDeclared()) { // TODO: check for existing main method first - javaFile.addMethod(JavaMethod.newMethod(Modifier.PUBLIC | Modifier.STATIC, "void", "main", + javaFile.addMethod(JavaMethod.newMethod( + Modifier.PUBLIC | Modifier.STATIC, + "void", + "main", "SwingUtilities.invokeLater(new Runnable() { public void run() { new " + className + "().setVisible(true); } });", + false, new JavaArgument("String[]", "arg"))); } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/generators/ValidatorGenerator.java b/jaxx-compiler/src/main/java/jaxx/compiler/generators/ValidatorGenerator.java index 0f8e3ec..8bd95a7 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/generators/ValidatorGenerator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/generators/ValidatorGenerator.java @@ -1,12 +1,15 @@ package jaxx.compiler.generators; +import jaxx.compiler.io.JavaMethod; +import jaxx.compiler.io.JavaArgument; +import jaxx.compiler.io.JavaField; +import jaxx.compiler.io.JavaFile; import jaxx.compiler.*; import jaxx.compiler.CompiledObject.ChildRef; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.validator.BeanValidatorHandler; import jaxx.compiler.tags.validator.BeanValidatorHandler.CompiledBeanValidator; -import jaxx.compiler.types.TypeManager; import java.util.List; import jaxx.runtime.SwingUtil; @@ -15,7 +18,7 @@ import jaxx.runtime.SwingUtil; public class ValidatorGenerator implements Generator { protected static final JavaField VALIDATOR_IDS_FIELD = JavaField.newField(java.lang.reflect.Modifier.PROTECTED, - "java.util.List<String>", "validatorIds", "new ArrayList<String>()"); + "java.util.List<String>", "validatorIds", true, "new ArrayList<String>()"); @Override public void finalizeCompiler(CompiledObject root, JAXXCompiler compiler, JavaFile javaFile, String packageName, String className) { @@ -39,19 +42,20 @@ public class ValidatorGenerator implements Generator { } } } + String eol = JAXXCompiler.getLineSeparator(); // register validator for (CompiledBeanValidator validator : BeanValidatorHandler.getValidators(compiler)) { - String id = TypeManager.getJavaCode(validator.getId()); + String id = compiler.getJavaCode(validator.getId()); compiler.appendLateInitializer("validatorIds.add(" + id + ");"); - compiler.appendLateInitializer(JAXXCompiler.getLineSeparator()); + compiler.appendLateInitializer(eol); compiler.appendLateInitializer("getValidator(" + id + ").installUIs();"); - compiler.appendLateInitializer(JAXXCompiler.getLineSeparator()); + compiler.appendLateInitializer(eol); compiler.appendLateInitializer("getValidator(" + id + ").reloadBean();"); //compiler.appendLateInitializer("getValidator(" + id + ").validate();"); - compiler.appendLateInitializer(JAXXCompiler.getLineSeparator()); + compiler.appendLateInitializer(eol); } compiler.appendLateInitializer("validatorIds = java.util.Collections.unmodifiableList(validatorIds);"); - compiler.appendLateInitializer(JAXXCompiler.getLineSeparator()); + compiler.appendLateInitializer(eol); } @Override @@ -81,8 +85,12 @@ public class ValidatorGenerator implements Generator { // implements JAXXValidator javaFile.addField(VALIDATOR_IDS_FIELD); - javaFile.addMethod(JavaMethod.newMethod(java.lang.reflect.Modifier.PUBLIC, validatorFQN + "<?>", "getValidator", - "return (" + validatorFQN + ") (validatorIds.contains(validatorId) ? getObjectById(validatorId) : null);", + javaFile.addMethod(JavaMethod.newMethod( + java.lang.reflect.Modifier.PUBLIC, + validatorFQN + "<?>", + "getValidator", + "return (" + validatorFQN + "<?>) (validatorIds.contains(validatorId) ? getObjectById(validatorId) : null);", + true, new JavaArgument("String", "validatorId"))); } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JavaArgument.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaArgument.java similarity index 84% rename from jaxx-compiler/src/main/java/jaxx/compiler/JavaArgument.java rename to jaxx-compiler/src/main/java/jaxx/compiler/io/JavaArgument.java index 139d70d..6a4665e 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JavaArgument.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaArgument.java @@ -2,16 +2,15 @@ * Copyright 2006 Ethan Nicholas. All rights reserved. * Use is subject to license terms. */ -package jaxx.compiler; +package jaxx.compiler.io; /** * Represents an argument to a <code>JavaMethod</code>. * * @see JavaMethod */ -public class JavaArgument { +public class JavaArgument extends JavaElement { - private String name; private String type; private boolean isFinal; @@ -36,21 +35,12 @@ public class JavaArgument { * @param isFinal <code>true</code> if the argument should be marked final */ public JavaArgument(String type, String name, boolean isFinal) { + super(0, name); this.type = type; - this.name = name; this.isFinal = isFinal; } /** - * Returns the argument's name. - * - * @return the name of the argument - */ - public String getName() { - return name; - } - - /** * Returns the argument's type as it would be represented in Java source code. * * @return the argument's type @@ -75,7 +65,7 @@ public class JavaArgument { */ @Override public String toString() { - String result = type + ' ' + name; + String result = type + ' ' + getName(); return isFinal ? "final " + result : result; } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaElement.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaElement.java new file mode 100644 index 0000000..d7ec97c --- /dev/null +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaElement.java @@ -0,0 +1,79 @@ +package jaxx.compiler.io; + +import java.lang.reflect.Modifier; +import java.util.Arrays; +import jaxx.compiler.JAXXCompiler; + +/** + * Base Java element + * @author chemit + * @since 2.0.0 + */ +public abstract class JavaElement { + + private String lineSeparator; + private String name; + private int modifiers; + + public JavaElement(int modifiers, String name) { + this.modifiers = modifiers; + this.name = name; + } + + public final int getModifiers() { + return modifiers; + } + + public final void setModifiers(int modifiers) { + this.modifiers = modifiers; + } + + public final String getName() { + return name; + } + + public final void setName(String className) { + this.name = className; + } + + public final String getModifiersText() { + if (modifiers == 0) { + return ""; + } else { + return Modifier.toString(modifiers) + ' '; + } + } + + public final String getLineSeparator() { + if (lineSeparator == null) { + lineSeparator = JAXXCompiler.getLineSeparator(); + } + return lineSeparator; + } + + public static String addIndentation(String source, int indentation, String lineSeparator) { + return indent(source, indentation, false, lineSeparator); + } + + public static String setIndentation(String source, int indentation, String lineSeparator) { + return indent(source, indentation, true, lineSeparator); + } + + public static String indent(String source, int indentation, boolean trim, String lineSeparator) { + if (trim) { + source = source.trim(); + } + char[] spaces = new char[indentation]; + Arrays.fill(spaces, ' '); + StringBuffer result = new StringBuffer(); + String[] lines = source.split(System.getProperty("line.separator") + "|\n"); + for (int i = 0; i < lines.length; i++) { + if (i > 0) { + result.append(lineSeparator); + } + result.append(spaces); + result.append(trim ? lines[i].trim() : lines[i]); + } + return result.toString(); + } +} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaField.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaField.java new file mode 100644 index 0000000..794b322 --- /dev/null +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaField.java @@ -0,0 +1,100 @@ +/* + * Copyright 2006 Ethan Nicholas. All rights reserved. + * Use is subject to license terms. + */ +package jaxx.compiler.io; + +import java.lang.reflect.Modifier; + +/** + * Represents a field in a Java source file being generated for output. <code>JavaFields</code> are created + * and added to a {@link JavaFile}, which can then output Java source code. + */ +public class JavaField extends JavaElement implements Comparable<JavaField> { + + private String type; + private String initializer; + private boolean override; + + /** + * Constructs a new <code>JavaField</code>. The <code>modifiers</code> parameter is a bit mask of the + * constants from {@link java.lang.reflect.Modifier}, and the <code>type</code> of the field should be + * represented as it would appear in Java source code. + * + * @param modifiers the modifier keywords that should appear as part of the field's declaration + * @param type the type of the field as it would appear in Java source code + * @param name the field's name + * @param override + */ + public JavaField(int modifiers, String type, String name, boolean override) { + this(modifiers, type, name, override, null); + } + + /** + * Constructs a new <code>JavaField</code>. The <code>modifiers</code> parameter is a bit mask of the + * constants from <code>java.lang.reflect.Modifier</code>, and the <code>type</code> of the field should be + * represented as it would appear in Java source code. The <code>initializer</code> is the initial + * value of the field as it would appear in Java source code, or <code>null</code> to leave it at the + * default value. + * + * @param modifiers the modifier keywords that should appear as part of the field's declaration + * @param type the type of the field as it would appear in Java source code + * @param name the field's name + * @param override + * @param initializer the initial value of the field, as it would appear in Java source code + */ + public JavaField(int modifiers, String type, String name, boolean override, String initializer) { + super(modifiers, name); + this.type = type; + this.initializer = initializer; + this.override = override; + } + + /** + * Returns the field's type, as it would be represented in Java source code. + * + * @return the field's type + */ + public String getType() { + return type; + } + + public boolean isOverride() { + return override; + } + + public void setOverride(boolean override) { + this.override = override; + } + + /** + * Returns the Java source code for this field. + * + * @return the Java source code for this field + */ + @Override + public String toString() { + String eol = getLineSeparator(); + StringBuffer result = new StringBuffer(); + result.append(getModifiersText()); + result.append(type).append(' ').append(getName()); + if (initializer != null) { + result.append(" = ").append(initializer); + } + result.append(';').append(eol); + return result.toString(); + } + + @Override + public int compareTo(JavaField o) { + return JavaFieldComparator.COMPARATOR.compare(this, o); + } + + public static JavaField newField(int modifiers, String returnType, String name, boolean override) { + return newField(modifiers, returnType, name, override, null); + } + + public static JavaField newField(int modifiers, String returnType, String name, boolean override, String initializer) { + return new JavaField(modifiers, returnType, name, override, initializer); + } +} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFieldComparator.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFieldComparator.java new file mode 100644 index 0000000..e7ce8bd --- /dev/null +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFieldComparator.java @@ -0,0 +1,72 @@ +package jaxx.compiler.io; + +import java.lang.reflect.Modifier; +import java.util.Comparator; + +class JavaFieldComparator implements Comparator<JavaField> { + + static final JavaFieldComparator COMPARATOR = new JavaFieldComparator(); + + @Override + public int compare(JavaField o1, JavaField o2) { + int result; + if ((result = compareStatic(o1, o2)) != 0) { + return result; + } + // data sources must be on the last after all other fields + if ((result = compareDataSource(o1, o2)) != 0) { + return result; + } + // same static + if ((result = compareVisibility(o1, o2)) != 0) { + return result; + } + // same visibility, test name + return o1.getName().compareTo(o2.getName()); + } + + public int compareStatic(JavaField o1, JavaField o2) { + // first comparator modifiers : static always before none static + if (Modifier.isStatic(o1.getModifiers()) && !Modifier.isStatic(o2.getModifiers())) { + return -1; + } + if (!Modifier.isStatic(o1.getModifiers()) && Modifier.isStatic(o2.getModifiers())) { + return 1; + } + return 0; + } + + public int compareDataSource(JavaField o1, JavaField o2) { + // first comparator modifiers : static always before none static + if (o1.getName().startsWith("$DataSource") && !o2.getName().startsWith("$DataSource")) { + return 1; + } + if (!o1.getName().startsWith("$DataSource") && o2.getName().startsWith("$DataSource")) { + return -1; + } + return 0; + } + + public int compareVisibility(JavaField o1, JavaField o2) { + // first comparator modifiers : static always before none static + if (!Modifier.isPublic(o1.getModifiers()) && Modifier.isPublic(o2.getModifiers())) { + return 1; + } + if (Modifier.isPublic(o1.getModifiers()) && !Modifier.isPublic(o2.getModifiers())) { + return -1; + } + if (Modifier.isProtected(o1.getModifiers()) && !Modifier.isProtected(o2.getModifiers())) { + return -1; + } + if (!Modifier.isProtected(o1.getModifiers()) && Modifier.isProtected(o2.getModifiers())) { + return 1; + } + if (Modifier.isPrivate(o1.getModifiers()) && !Modifier.isPrivate(o2.getModifiers())) { + return -1; + } + if (!Modifier.isPrivate(o1.getModifiers()) && Modifier.isPrivate(o2.getModifiers())) { + return 1; + } + return 0; + } +} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JavaFile.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFile.java similarity index 64% rename from jaxx-compiler/src/main/java/jaxx/compiler/JavaFile.java rename to jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFile.java index d072593..313d160 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JavaFile.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaFile.java @@ -2,28 +2,31 @@ * Copyright 2006 Ethan Nicholas. All rights reserved. * Use is subject to license terms. */ -package jaxx.compiler; +package jaxx.compiler.io; -import jaxx.compiler.JavaMethod.MethodOrder; +import jaxx.compiler.io.JavaMethod.MethodOrder; import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Arrays; import java.util.EnumMap; import java.util.List; import java.util.Map.Entry; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * A Java source file being generated for output. Once the class is completely initialized, use the * {@link #toString} method to generate source code for it. */ -public class JavaFile { +public class JavaFile extends JavaElement { + /** + * Logger + */ + static private final Log log = LogFactory.getLog(JavaFile.class); protected static final String GETTER_PATTERN = "return %1$s;"; protected static final String BOOLEAN_GETTER_PATTERN = "return %1$s !=null && %1$s;"; protected static final String SETTER_PATTERN = "%1$s oldValue = this.%2$s;\nthis.%2$s = newValue;\nfirePropertyChange(\"%2$s\", oldValue, newValue);"; - private int modifiers; - private String className; private List<String> imports = new ArrayList<String>(); private List<JavaField> fields = new ArrayList<JavaField>(); private List<JavaMethod> methods = new ArrayList<JavaMethod>(); @@ -37,6 +40,7 @@ public class JavaFile { private String superGenericType; public JavaFile() { + super(0, ""); } public JavaFile(int modifiers, String className, String superClass) { @@ -44,8 +48,7 @@ public class JavaFile { } public JavaFile(int modifiers, String className, String superClass, List<String> interfaces) { - this.modifiers = modifiers; - this.className = className; + super(modifiers, className); this.superClass = superClass; this.interfaces = interfaces; } @@ -62,22 +65,6 @@ public class JavaFile { return imports.toArray(new String[imports.size()]); } - public int getModifiers() { - return modifiers; - } - - public void setModifiers(int modifiers) { - this.modifiers = modifiers; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - public String getSuperClass() { return superClass; } @@ -121,17 +108,17 @@ public class JavaFile { String content = String.format(GETTER_PATTERN, id); addMethod(new JavaMethod( Modifier.isProtected(field.getModifiers()) ? Modifier.PUBLIC : Modifier.PROTECTED, - field.getType(), "get" + capitalizedName, null, null, content)); + field.getType(), "get" + capitalizedName, null, null, content, field.isOverride())); if (javaBean) { // add full javabean support if (Boolean.class.getName().equals(field.getType())) { content = String.format(BOOLEAN_GETTER_PATTERN, id); - addMethod(new JavaMethod(Modifier.PUBLIC, field.getType(), "is" + capitalizedName, null, null, content)); + addMethod(new JavaMethod(Modifier.PUBLIC, field.getType(), "is" + capitalizedName, null, null, content, field.isOverride())); } content = String.format(SETTER_PATTERN, field.getType(), id); JavaArgument arg = new JavaArgument(field.getType(), "newValue"); - addMethod(new JavaMethod(Modifier.PUBLIC, "void", "set" + capitalizedName, new JavaArgument[]{arg}, null, content)); + addMethod(new JavaMethod(Modifier.PUBLIC, "void", "set" + capitalizedName, new JavaArgument[]{arg}, null, content, field.isOverride())); } } @@ -143,85 +130,36 @@ public class JavaFile { return fields.toArray(new JavaField[fields.size()]); } - public static String addIndentation(String source, int indentation, String lineSeparator) { - return indent(source, indentation, false, lineSeparator); - } - - public static String setIndentation(String source, int indentation, String lineSeparator) { - return indent(source, indentation, true, lineSeparator); - } - - public static String indent(String source, int indentation, boolean trim, String lineSeparator) { - if (trim) { - source = source.trim(); - } - char[] spaces = new char[indentation]; - Arrays.fill(spaces, ' '); - StringBuffer result = new StringBuffer(); - String[] lines = source.split(System.getProperty("line.separator") + "|\n"); - for (int i = 0; i < lines.length; i++) { - if (i > 0) { - result.append(lineSeparator); - } - result.append(spaces); - result.append(trim ? lines[i].trim() : lines[i]); - } - return result.toString(); - } - public void addBodyCode(String bodyCode) { rawBodyCode.append(bodyCode); } - public String getClassBody(String lineSeparator) { + @Override + public String toString() { + String eol = getLineSeparator(); StringBuffer result = new StringBuffer(); - if (fields.size() > 0) { - java.util.Collections.sort(fields); // sort fields - - for (JavaField field : fields) { - result.append(addIndentation(field.toString(lineSeparator), 4, lineSeparator)); - result.append(lineSeparator); - } - - result.append(lineSeparator); + if (getName().indexOf(".") != -1) { + result.append("package ").append(getName().substring(0, getName().lastIndexOf("."))).append(";"); + result.append(eol); + result.append(eol); } - if (rawBodyCode.length() > 0) { - result.append(addIndentation("/* begin raw body code */\n", 4, lineSeparator)); - String s = rawBodyCode.toString(); - if (!s.startsWith(lineSeparator)) { - result.append(lineSeparator); + if (imports.size() > 0) { + for (String anImport : imports) { + result.append("import "); + result.append(anImport); + result.append(';'); + result.append(eol); } - result.append(addIndentation(s, 4, lineSeparator)); - result.append(lineSeparator); - result.append(addIndentation("/* end raw body code */", 4, lineSeparator)); - result.append(lineSeparator); - } - - for (JavaFile innerClass : innerClasses) { - result.append(addIndentation(innerClass.toString(), 4, lineSeparator)); - result.append(lineSeparator).append(lineSeparator); - } - - EnumMap<MethodOrder, List<JavaMethod>> map = JavaMethod.getSortedMethods(methods); - for (Entry<MethodOrder, List<JavaMethod>> entry : map.entrySet()) { - List<JavaMethod> list = entry.getValue(); - entry.getKey().generate(result, list, lineSeparator); - list.clear(); + result.append(eol); } - map.clear(); - return result.toString(); - } - - public String getClassDefinition(String lineSeparator) { - StringBuffer result = new StringBuffer(); - result.append(getModifiersText(modifiers)); + result.append(getModifiersText()); if (abstractClass) { result.append("abstract "); } result.append("class "); - result.append(className.substring(className.lastIndexOf(".") + 1)); + result.append(getName().substring(getName().lastIndexOf(".") + 1)); if (genericType != null) { result.append('<').append(genericType).append('>'); } @@ -240,45 +178,53 @@ public class JavaFile { } } result.append(" {"); - result.append(lineSeparator); - result.append(getClassBody(lineSeparator)); - result.append("}"); - return result.toString(); - } + result.append(eol); + if (fields.size() > 0) { + java.util.Collections.sort(fields); // sort fields - public static String getModifiersText(int modifiers) { - if (modifiers == 0) { - return ""; - } else { - return Modifier.toString(modifiers) + ' '; - } - } + for (JavaField field : fields) { + if (log.isDebugEnabled()) { + log.debug("generate field " + field); + } + result.append(addIndentation(field.toString(), 4, eol)); + result.append(eol); + } - /** - * Returns the Java source code for this class. - * - * @param lineSeparator line separator - * @return a complete Java file for this class - */ - public String toString(String lineSeparator) { - StringBuffer result = new StringBuffer(); - if (className.indexOf(".") != -1) { - result.append("package ").append(className.substring(0, className.lastIndexOf("."))).append(";"); - result.append(lineSeparator); - result.append(lineSeparator); + result.append(eol); } - if (imports.size() > 0) { - for (String anImport : imports) { - result.append("import "); - result.append(anImport); - result.append(';'); - result.append(lineSeparator); + if (rawBodyCode.length() > 0) { + result.append(addIndentation("/* begin raw body code */\n", 4, eol)); + String s = rawBodyCode.toString(); + if (!s.startsWith(eol)) { + result.append(eol); } - result.append(lineSeparator); + result.append(addIndentation(s, 4, eol)); + result.append(eol); + result.append(addIndentation("/* end raw body code */", 4, eol)); + result.append(eol); } - result.append(getClassDefinition(lineSeparator)); + for (JavaFile innerClass : innerClasses) { + result.append(addIndentation(innerClass.toString(), 4, eol)); + result.append(eol).append(eol); + } + + EnumMap<MethodOrder, List<JavaMethod>> map = JavaMethod.getSortedMethods(methods); + for (Entry<MethodOrder, List<JavaMethod>> entry : map.entrySet()) { + List<JavaMethod> list = entry.getValue(); + if (!list.isEmpty()) { + result.append(addIndentation(entry.getKey().getHeader(), 4, eol)); + result.append(eol).append(eol); + for (JavaMethod method : list) { + result.append(addIndentation(method.toString(), 4, eol)); + result.append(eol).append(eol); + } + } + list.clear(); + } + map.clear(); + result.append("}"); return result.toString(); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JavaMethod.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethod.java similarity index 59% rename from jaxx-compiler/src/main/java/jaxx/compiler/JavaMethod.java rename to jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethod.java index 0d8098e..a453547 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JavaMethod.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethod.java @@ -2,12 +2,11 @@ * Copyright 2006 Ethan Nicholas. All rights reserved. * Use is subject to license terms. */ -package jaxx.compiler; +package jaxx.compiler.io; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.EnumMap; import java.util.EnumSet; import java.util.Iterator; @@ -19,61 +18,16 @@ import java.util.List; * <code>JavaMethod</code> can represent a constructor -- constructors should be named after their containing * classes and have a return type of <code>null</code>. */ -public class JavaMethod implements Comparable<JavaMethod> { +public class JavaMethod extends JavaElement implements Comparable<JavaMethod> { - private int modifiers; private String returnType; - private String name; private JavaArgument[] arguments; private String[] exceptions; - private StringBuffer bodyCode; + private String body; + private boolean override; +// private StringBuffer bodyCode; /** - * Constructs a new no-argument <code>JavaMethod</code> which throws no checked exceptions. The - * <code>modifiers</code> parameter is a bit mask of the constants from {@link java.lang.reflect.Modifier}, - * and the <code>returnType</code> of the method should be represented as it would appear in Java source - * code (<code>null</code> for a constructor). The method body is initially empty. - * - * @param modifiers the modifier keywords that should appear as part of the method's declaration - * @param returnType the return type of the method as it would appear in Java source code - * @param name the method's name - * @see #appendBodyCode - */ - //public JavaMethod(int modifiers, String returnType, String name) { - // this(modifiers, returnType, name, null); - //} - /** - * Constructs a new <code>JavaMethod</code> which throws no checked exceptions. The <code>modifiers</code> - * parameter is a bit mask of the constants from {@link java.lang.reflect.Modifier}, and the - * <code>returnType</code> of the method should be represented as it would appear in Java source code - * (<code>null</code> for a constructor). The method body is initially empty. - * - * @param modifiers the modifier keywords that should appear as part of the method's declaration - * @param returnType the return type of the method as it would appear in Java source code - * @param name the method's name - * @param arguments the method's arguments - * @see #appendBodyCode - */ - //public JavaMethod(int modifiers, String returnType, String name, JavaArgument[] arguments) { - // this(modifiers, returnType, name, arguments, null); - //} - /** - * Constructs a new <code>JavaMethod</code>. The <code>modifiers</code> parameter is a bit mask of the - * constants from {@link java.lang.reflect.Modifier}, and the <code>returnType</code> and <code>exceptions</code> - * of the method should be represented as they would appear in Java source code (<code>null</code> for a - * constructor). The method body is initially empty. - * - * @param modifiers the modifier keywords that should appear as part of the method's declaration - * @param returnType the return type of the method as it would appear in Java source code - * @param name the method's name - * @param arguments the method's arguments - * @param exceptions a list of exceptions the methods can throw, as they would be represented in Java source code - * @see #appendBodyCode - */ - //public JavaMethod(int modifiers, String returnType, String name, JavaArgument[] arguments, String[] exceptions) { - // this(modifiers, returnType, name, arguments, exceptions, null); - //} - /** * Constructs a new <code>JavaMethod</code> containing the specified body code. The <code>modifiers</code> parameter * is a bit mask of the constants from {@link java.lang.reflect.Modifier}, and the <code>returnType</code> and * <code>exceptions</code> of the method should be represented as they would appear in Java source code (<code>null</code> @@ -85,25 +39,16 @@ public class JavaMethod implements Comparable<JavaMethod> { * @param arguments the method's arguments * @param exceptions a list of exceptions the methods can throw, as they would be represented in Java source code * @param bodyCode Java source code which should appear in the method body + * @param override flag with {@code true} value when the method overrides (or implements) a super class method */ - public JavaMethod(int modifiers, String returnType, String name, JavaArgument[] arguments, String[] exceptions, String bodyCode) { - this.modifiers = modifiers; + public JavaMethod(int modifiers, String returnType, String name, JavaArgument[] arguments, String[] exceptions, String bodyCode, boolean override) { + super(modifiers, name); this.returnType = returnType; - this.name = name; + this.override = override; this.arguments = arguments; this.exceptions = exceptions; - this.bodyCode = new StringBuffer(bodyCode != null ? bodyCode : ""); - } - - /** - * Returns a bit mask describing the modifier keywords which should appear as part of this method's - * declaration. See <code>java.lang.reflect.Modifier</code> for more information on decoding this - * field. - * - * @return the modifier bit mask - */ - public int getModifiers() { - return modifiers; + this.body = bodyCode == null ? "" : bodyCode; +// this.bodyCode = new StringBuffer(bodyCode != null ? bodyCode : ""); } /** @@ -116,15 +61,6 @@ public class JavaMethod implements Comparable<JavaMethod> { } /** - * Returns the method's name. - * - * @return the method's name - */ - public String getName() { - return name; - } - - /** * Returns a list of the method's arguments. * * @return the method's arguments @@ -142,45 +78,27 @@ public class JavaMethod implements Comparable<JavaMethod> { return exceptions; } - /** - * Returns the Java source code for the method's body. - * - * @return the method's body code - */ - public String getBodyCode() { - return bodyCode.toString(); + public boolean isOverride() { + return override; } - /** - * Appends additional code to the method's body. - * - * @param extraCode Java source code to append to the method's body - * @param lineSeparator line separator - */ - public void appendBodyCode(String extraCode, String lineSeparator) { - if (extraCode.length() == 0) { - return; - } - if (bodyCode.length() > 0 && !bodyCode.toString().endsWith(lineSeparator)) { - bodyCode.append(lineSeparator); - } - bodyCode.append(extraCode); + public void setOverride(boolean override) { + this.override = override; } - /** - * Returns the Java source code for this method. - * - * @param lineSeparator line separator - * @return the Java source code for this method - */ - public String toString(String lineSeparator) { + @Override + public String toString() { + String eol = getLineSeparator(); StringBuffer result = new StringBuffer(); - result.append(JavaFile.getModifiersText(modifiers)); + if (isOverride()) { + result.append("@Override").append(eol); + } + result.append(getModifiersText()); if (returnType != null) { result.append(returnType); result.append(' '); } - result.append(name); + result.append(getName()); result.append('('); if (arguments != null) { for (int i = 0; i < arguments.length; i++) { @@ -191,12 +109,12 @@ public class JavaMethod implements Comparable<JavaMethod> { } } result.append(") {"); - result.append(lineSeparator); - if (bodyCode != null) { - String formattedBodyCode = JavaFile.addIndentation(bodyCode.toString().trim(), 4, lineSeparator); + result.append(eol); + if (body != null) { + String formattedBodyCode = addIndentation(body.trim(), 4, eol); if (formattedBodyCode.length() > 0) { result.append(formattedBodyCode); - result.append(lineSeparator); + result.append(eol); } } result.append("}"); @@ -205,15 +123,15 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public int compareTo(JavaMethod o) { - return COMPARATOR.compare(this, o); + return JavaMethodComparator.COMPARATOR.compare(this, o); } - public static JavaMethod newMethod(int modifiers, String returnType, String name, String initializer, String[] exceptions, JavaArgument... arguments) { - return new JavaMethod(modifiers, returnType, name, arguments, exceptions, initializer); + public static JavaMethod newMethod(int modifiers, String returnType, String name, String initializer, boolean override, String[] exceptions, JavaArgument... arguments) { + return new JavaMethod(modifiers, returnType, name, arguments, exceptions, initializer, override); } - public static JavaMethod newMethod(int modifiers, String returnType, String name, String initializer, JavaArgument... arguments) { - return newMethod(modifiers, returnType, name, initializer, new String[0], arguments); + public static JavaMethod newMethod(int modifiers, String returnType, String name, String initializer, boolean override, JavaArgument... arguments) { + return newMethod(modifiers, returnType, name, initializer, override, new String[0], arguments); } public enum MethodOrder { @@ -239,7 +157,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return methods.contains(method.name); + return methods.contains(method.getName()); } }, JAXXContext(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -250,7 +168,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return methods.contains(method.name); + return methods.contains(method.getName()); } }, JAXXValidation(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -261,7 +179,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return methods.contains(method.name); + return methods.contains(method.getName()); } }, events(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -270,7 +188,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return (method.name.startsWith("do") && method.name.indexOf("__") > -1); + return (method.getName().startsWith("do") && method.getName().indexOf("__") > -1); } }, publicGetters(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -279,7 +197,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return (method.name.startsWith("get") || method.name.startsWith("is")); + return (method.getName().startsWith("get") || method.getName().startsWith("is")); } }, publicSetters(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -288,7 +206,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return (method.name.startsWith("set")); + return (method.getName().startsWith("set")); } }, otherPublic(Modifier.PUBLIC, "/*---------------------------------------------------------------------------------*/\n" + @@ -306,7 +224,7 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return (method.name.startsWith("get") || method.name.startsWith("is")); + return (method.getName().startsWith("get") || method.getName().startsWith("is")); } }, createMethod(Modifier.PROTECTED | Modifier.PRIVATE, "/*---------------------------------------------------------------------------------*/\n" + @@ -315,9 +233,9 @@ public class JavaMethod implements Comparable<JavaMethod> { @Override public boolean accept(JavaMethod method) { - return method.name.startsWith("create") || method.name.startsWith("add") || - method.name.equals("$completeSetup") || - method.name.equals("$initialize"); + return method.getName().startsWith("create") || method.getName().startsWith("add") || + method.getName().equals("$completeSetup") || + method.getName().equals("$initialize"); } }, protecteds(Modifier.PROTECTED, "/*---------------------------------------------------------------------------------*/\n" + @@ -369,18 +287,6 @@ public class JavaMethod implements Comparable<JavaMethod> { } throw new IllegalArgumentException("could not find a " + MethodOrder.class + " for method " + method); } - - public void generate(StringBuffer buffer, List<JavaMethod> methods, String lineSeparator) { - if (methods.isEmpty()) { - return; - } - buffer.append(JavaFile.addIndentation(header, 4, lineSeparator)); - buffer.append(lineSeparator).append(lineSeparator); - for (JavaMethod method : methods) { - buffer.append(JavaFile.addIndentation(method.toString(lineSeparator), 4, lineSeparator)); - buffer.append(lineSeparator).append(lineSeparator); - } - } } public static EnumMap<MethodOrder, List<JavaMethod>> getSortedMethods(List<JavaMethod> methods) { @@ -430,64 +336,4 @@ public class JavaMethod implements Comparable<JavaMethod> { } return constants; } - public static final Comparator<JavaMethod> COMPARATOR = new Comparator<JavaMethod>() { - - @Override - public int compare(JavaMethod o1, JavaMethod o2) { - - /*int result; - if ((result = compareStatic(o1, o2)) != 0) { - return result; - } - if ((result = compareConstructor(o1, o2)) != 0) { - return result; - } - if ((result = compareVisibility(o1, o2)) != 0) { - return result; - }*/ - return o1.name.compareTo(o2.name); - } - - public int compareStatic(JavaMethod o1, JavaMethod o2) { - if (Modifier.isStatic(o1.modifiers) && !Modifier.isStatic(o2.modifiers)) { - return -1; - } - if (!Modifier.isStatic(o1.modifiers) && Modifier.isStatic(o2.modifiers)) { - return 1; - } - return 0; - } - - public int compareConstructor(JavaMethod o1, JavaMethod o2) { - if (o1.returnType == null && o2.returnType != null) { - return -1; - } - if (o1.returnType != null && o2.returnType == null) { - return 1; - } - return 0; - } - - public int compareVisibility(JavaMethod o1, JavaMethod o2) { - if (Modifier.isPublic(o1.modifiers) && !Modifier.isPublic(o2.modifiers)) { - return -1; - } - if (!Modifier.isPublic(o1.modifiers) && Modifier.isPublic(o2.modifiers)) { - return 1; - } - if (Modifier.isProtected(o1.modifiers) && !Modifier.isProtected(o2.modifiers)) { - return -1; - } - if (!Modifier.isProtected(o1.modifiers) && Modifier.isProtected(o2.modifiers)) { - return 1; - } - if (Modifier.isPrivate(o1.modifiers) && !Modifier.isPrivate(o2.modifiers)) { - return -1; - } - if (!Modifier.isPrivate(o1.modifiers) && Modifier.isPrivate(o2.modifiers)) { - return 1; - } - return 0; - } - }; } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethodComparator.java b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethodComparator.java new file mode 100644 index 0000000..a320aca --- /dev/null +++ b/jaxx-compiler/src/main/java/jaxx/compiler/io/JavaMethodComparator.java @@ -0,0 +1,72 @@ +package jaxx.compiler.io; + +import java.lang.reflect.Modifier; +import java.util.Comparator; + +/** + * + * @author chemit + * @since 2.0.0 + */ +public class JavaMethodComparator implements Comparator<JavaMethod> { + + static final JavaMethodComparator COMPARATOR = new JavaMethodComparator(); + + @Override + public int compare(JavaMethod o1, JavaMethod o2) { + + /*int result; + if ((result = compareStatic(o1, o2)) != 0) { + return result; + } + if ((result = compareConstructor(o1, o2)) != 0) { + return result; + } + if ((result = compareVisibility(o1, o2)) != 0) { + return result; + }*/ + return o1.getName().compareTo(o2.getName()); + } + + public int compareStatic(JavaMethod o1, JavaMethod o2) { + if (Modifier.isStatic(o1.getModifiers()) && !Modifier.isStatic(o2.getModifiers())) { + return -1; + } + if (!Modifier.isStatic(o1.getModifiers()) && Modifier.isStatic(o2.getModifiers())) { + return 1; + } + return 0; + } + + public int compareConstructor(JavaMethod o1, JavaMethod o2) { + if (o1.getReturnType() == null && o2.getReturnType() != null) { + return -1; + } + if (o1.getReturnType() != null && o2.getReturnType() == null) { + return 1; + } + return 0; + } + + public int compareVisibility(JavaMethod o1, JavaMethod o2) { + if (Modifier.isPublic(o1.getModifiers()) && !Modifier.isPublic(o2.getModifiers())) { + return -1; + } + if (!Modifier.isPublic(o1.getModifiers()) && Modifier.isPublic(o2.getModifiers())) { + return 1; + } + if (Modifier.isProtected(o1.getModifiers()) && !Modifier.isProtected(o2.getModifiers())) { + return -1; + } + if (!Modifier.isProtected(o1.getModifiers()) && Modifier.isProtected(o2.getModifiers())) { + return 1; + } + if (Modifier.isPrivate(o1.getModifiers()) && !Modifier.isPrivate(o2.getModifiers())) { + return -1; + } + if (!Modifier.isPrivate(o1.getModifiers()) && Modifier.isPrivate(o2.getModifiers())) { + return 1; + } + return 0; + } +} diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptorLoader.java b/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptorLoader.java index 2abf7f6..f46d3b3 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptorLoader.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/reflect/ClassDescriptorLoader.java @@ -2,7 +2,7 @@ package jaxx.compiler.reflect; import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JAXXCompilerLaunchor; +import jaxx.compiler.JAXXEngine; import jaxx.compiler.SymbolTable; import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXObjectDescriptor; @@ -50,7 +50,7 @@ public class ClassDescriptorLoader { } // if (result == null) { - if (JAXXCompilerLaunchor.isRegistred() && JAXXCompilerLaunchor.get().getSymbolTable(className) != null) { + if (JAXXEngine.isRegistred() && JAXXEngine.get().getSymbolTable(className) != null) { result = createClassDescriptorFromSymbolTable(className, classLoader); } else { if (classLoader == null) { @@ -90,7 +90,7 @@ public class ClassDescriptorLoader { } } - if (jaxxLastModified != -1 && JAXXCompilerLaunchor.isRegistred() && JAXXCompilerLaunchor.get().getSymbolTable(className) == null) { + if (jaxxLastModified != -1 && JAXXEngine.isRegistred() && JAXXEngine.get().getSymbolTable(className) == null) { jaxxLastModified = -1; // file has been modified, but wasn't included in this } // compilation set so we don't have a symbol table @@ -303,8 +303,8 @@ public class ClassDescriptorLoader { } private static ClassDescriptor createClassDescriptorFromSymbolTable(String className, ClassLoader classLoader) throws ClassNotFoundException { - final JAXXCompiler compiler = JAXXCompilerLaunchor.get().getJAXXCompiler(className); - final SymbolTable symbolTable = JAXXCompilerLaunchor.get().getSymbolTable(className); + final JAXXCompiler compiler = JAXXEngine.get().getJAXXCompiler(className); + final SymbolTable symbolTable = JAXXEngine.get().getSymbolTable(className); if (symbolTable == null) { throw new CompilerException("Internal error: no symbol table was generated for class '" + className + "'"); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/reflect/JavaFileParser.java b/jaxx-compiler/src/main/java/jaxx/compiler/reflect/JavaFileParser.java index a91b3e4..73a57b8 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/reflect/JavaFileParser.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/reflect/JavaFileParser.java @@ -2,7 +2,7 @@ package jaxx.compiler.reflect; import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JAXXCompilerLaunchor; +import jaxx.compiler.JAXXEngine; import jaxx.compiler.parser.java.JavaParser; import jaxx.compiler.parser.java.JavaParserTreeConstants; import jaxx.compiler.parser.java.ParseException; @@ -31,7 +31,7 @@ public class JavaFileParser { private List<FieldDescriptor> fields = new ArrayList<FieldDescriptor>(); private JavaFileParser(ClassLoader classLoader) { - compiler = JAXXCompilerLaunchor.createDummyCompiler(classLoader); + compiler = JAXXEngine.createDummyCompiler(classLoader); } public static ClassDescriptor parseJavaFile(String displayName, Reader src, ClassLoader classLoader) throws ClassNotFoundException { diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/spi/DefaultInitializer.java b/jaxx-compiler/src/main/java/jaxx/compiler/spi/DefaultInitializer.java index f9b0231..6518319 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/spi/DefaultInitializer.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/spi/DefaultInitializer.java @@ -4,10 +4,7 @@ */ package jaxx.compiler.spi; -import java.awt.Color; import java.awt.Component; -import java.awt.GridBagConstraints; -import java.awt.Insets; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; @@ -35,18 +32,11 @@ import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.JWindow; -import javax.swing.KeyStroke; import javax.swing.text.JTextComponent; import jaxx.compiler.JAXXCompiler; import jaxx.compiler.beans.BeanInfoUtil; -import jaxx.compiler.decorators.BoxedCompiledObjectDecorator; -import jaxx.compiler.decorators.CompiledObjectDecorator; -import jaxx.compiler.decorators.CompiledObjectDecoratorManager; -import jaxx.compiler.decorators.DefaultCompiledObjectDecorator; -import jaxx.compiler.decorators.HelpRootCompiledObjectDecorator; - import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; @@ -87,14 +77,7 @@ import jaxx.compiler.tags.validator.BeanValidatorHandler; import jaxx.compiler.tags.validator.ExcludeFieldValidatorHandler; import jaxx.compiler.tags.validator.FieldValidatorHandler; -import jaxx.compiler.types.ColorConverter; -import jaxx.compiler.types.GridBagConstraintsConverter; -import jaxx.compiler.types.InsetsConverter; -import jaxx.compiler.types.KeyStrokeConverter; -import jaxx.compiler.types.PrimitiveConverter; -import jaxx.compiler.types.TypeConverter; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.Application; import jaxx.runtime.swing.JAXXButtonGroup; import jaxx.runtime.swing.JAXXComboBox; @@ -125,15 +108,6 @@ public class DefaultInitializer implements Initializer { JTextField.class, JTextPane.class); - - // - // Register decorators - // - - registerDecorator("default", DefaultCompiledObjectDecorator.class); - registerDecorator("boxed", BoxedCompiledObjectDecorator.class); - registerDecorator("help", HelpRootCompiledObjectDecorator.class); - // // Register tags // @@ -209,39 +183,8 @@ public class DefaultInitializer implements Initializer { registerBean(Table.class, TableHandler.class); registerBean(JAXXTab.class, JAXXTabHandler.class); - registerBean(SwingValidator.class, BeanValidatorHandler.class); - - - // - // Register converters - // - - PrimitiveConverter primitiveConverter = new PrimitiveConverter(); - registerTypeConverter(boolean.class, primitiveConverter); - registerTypeConverter(Boolean.class, primitiveConverter); - registerTypeConverter(byte.class, primitiveConverter); - registerTypeConverter(Byte.class, primitiveConverter); - registerTypeConverter(short.class, primitiveConverter); - registerTypeConverter(Short.class, primitiveConverter); - registerTypeConverter(int.class, primitiveConverter); - registerTypeConverter(Integer.class, primitiveConverter); - registerTypeConverter(long.class, primitiveConverter); - registerTypeConverter(Long.class, primitiveConverter); - registerTypeConverter(float.class, primitiveConverter); - registerTypeConverter(Float.class, primitiveConverter); - registerTypeConverter(double.class, primitiveConverter); - registerTypeConverter(Double.class, primitiveConverter); - registerTypeConverter(char.class, primitiveConverter); - registerTypeConverter(Character.class, primitiveConverter); - registerTypeConverter(String.class, primitiveConverter); - - registerTypeConverter(Color.class, new ColorConverter()); - registerTypeConverter(GridBagConstraints.class, new GridBagConstraintsConverter()); - registerTypeConverter(Insets.class, new InsetsConverter()); - registerTypeConverter(KeyStroke.class, new KeyStrokeConverter()); - } protected void registerBean(Class<?> beanClass, Class<? extends TagHandler> handlerClass) { @@ -252,16 +195,6 @@ public class DefaultInitializer implements Initializer { TagManager.registerTag(namespace, tagName, handler); } - protected void registerDecorator(String name, Class<? extends CompiledObjectDecorator> decoratorClass) { - - CompiledObjectDecoratorManager.registerDecorator(name, decoratorClass); - } - - protected void registerTypeConverter(Class<?> converterType, TypeConverter converter) { - - TypeManager.registerTypeConverter(converterType, converter); - } - protected void registerDefaultNamespace(String namespace, Class<?>... beanClass) { for (Class<?> c : beanClass) { diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java index 250e062..df12ba3 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java @@ -8,15 +8,14 @@ import jaxx.compiler.CompilerException; import jaxx.compiler.UnsupportedAttributeException; import jaxx.compiler.CompiledObject; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JavaArgument; -import jaxx.compiler.JavaMethod; +import jaxx.compiler.io.JavaArgument; +import jaxx.compiler.io.JavaMethod; import jaxx.compiler.StylesheetHelper; import jaxx.compiler.beans.JAXXBeanInfo; import jaxx.compiler.beans.JAXXEventSetDescriptor; import jaxx.compiler.beans.JAXXIntrospector; import jaxx.compiler.beans.JAXXPropertyDescriptor; import jaxx.compiler.decorators.CompiledObjectDecorator; -import jaxx.compiler.decorators.CompiledObjectDecoratorManager; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.reflect.FieldDescriptor; @@ -140,8 +139,6 @@ public class DefaultObjectHandler implements TagHandler { } /** - * Returns - * * @return the class which this <code>DefaultObjectHandler</code> supports. */ public ClassDescriptor getBeanClass() { @@ -286,11 +283,11 @@ public class DefaultObjectHandler implements TagHandler { if (!methodExists) { compiler.addMethodToJavaFile(new JavaMethod(Modifier.PUBLIC, "void", methodName, new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null, - propertyChangeListenerCode + ".propertyChange(null);")); + propertyChangeListenerCode + ".propertyChange(null);", false)); } String code = objectCode + (eventInfo.modelName != null ? ".get" + org.apache.commons.lang.StringUtils.capitalize(eventInfo.modelName) + "()" : ""); result.append("$bindingSources.put(\"").append(code).append("\", ").append(code).append(");").append(JAXXCompiler.getLineSeparator()); - result.append(code).append('.').append(eventInfo.addMethod).append("((").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(") jaxx.runtime.Util.getEventListener(").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(".class, ").append(compiler.getRootObject().getJavaCode()).append(", ").append(TypeManager.getJavaCode(methodName)).append("));\n"); + result.append(code).append('.').append(eventInfo.addMethod).append("((").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(") jaxx.runtime.Util.getEventListener(").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(".class, ").append(compiler.getRootObject().getJavaCode()).append(", ").append(compiler.getJavaCode(methodName)).append("));\n"); if (eventInfo.modelName != null) { result.append(getAddMemberListenerCode(objectCode, dataBinding, "get" + org.apache.commons.lang.StringUtils.capitalize(eventInfo.modelName), "jaxx.runtime.Util.getDataBindingUpdateListener(this , \"" + dataBinding + "\")", @@ -340,13 +337,13 @@ public class DefaultObjectHandler implements TagHandler { ClassDescriptor eventClass = getEventClass(eventInfo.listenerClass); compiler.addMethodToJavaFile(new JavaMethod(Modifier.PUBLIC, "void", methodName, new JavaArgument[]{new JavaArgument(JAXXCompiler.getCanonicalName(eventClass), "event")}, null, - propertyChangeListenerCode + ".propertyChange(null);")); + propertyChangeListenerCode + ".propertyChange(null);", false)); } try { String modelMemberName = eventInfo.modelName != null ? "get" + org.apache.commons.lang.StringUtils.capitalize(eventInfo.modelName) : null; String modelClassName = modelMemberName != null ? getBeanClass().getMethodDescriptor(modelMemberName).getReturnType().getName() : JAXXCompiler.getCanonicalName(getBeanClass()); String code = objectCode + (eventInfo.modelName != null ? "." + modelMemberName + "()" : ""); - result.append("((").append(modelClassName).append(") $bindingSources.remove(\"").append(code).append("\")).").append(eventInfo.removeMethod).append("((").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(") jaxx.runtime.Util.getEventListener(").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(".class, ").append(compiler.getRootObject().getJavaCode()).append(", ").append(TypeManager.getJavaCode(methodName)).append("));\n"); + result.append("((").append(modelClassName).append(") $bindingSources.remove(\"").append(code).append("\")).").append(eventInfo.removeMethod).append("((").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(") jaxx.runtime.Util.getEventListener(").append(JAXXCompiler.getCanonicalName(eventInfo.listenerClass)).append(".class, ").append(compiler.getRootObject().getJavaCode()).append(", ").append(compiler.getJavaCode(methodName)).append("));\n"); if (eventInfo.modelName != null) { result.append(getRemoveMemberListenerCode(objectCode, dataBinding, "get" + org.apache.commons.lang.StringUtils.capitalize(eventInfo.modelName), "jaxx.runtime.Util.getDataBindingUpdateListener(this, \"" + dataBinding + "\")", @@ -690,7 +687,7 @@ public class DefaultObjectHandler implements TagHandler { if (name.equals("decorator")) { if (!value.isEmpty()) { - CompiledObjectDecorator decorator = CompiledObjectDecoratorManager.getDecorator(value); + CompiledObjectDecorator decorator = compiler.getEngine().getDecorator(value); object.setDecorator(decorator); } continue; @@ -751,7 +748,7 @@ public class DefaultObjectHandler implements TagHandler { try { Class<?> typeClass = type != null ? ClassDescriptorLoader.getClass(type.getName(), type.getClassLoader()) : null; Object value = convertFromString(propertyName, stringValue, typeClass); - return getSetPropertyCode(object.getJavaCode(), propertyName, TypeManager.getJavaCode(value), compiler); + return getSetPropertyCode(object.getJavaCode(), propertyName, compiler.getJavaCode(value), compiler); } catch (NumberFormatException e) { compiler.reportError("could not convert literal string '" + stringValue + "' to type " + type.getName()); } catch (IllegalArgumentException e) { @@ -778,7 +775,7 @@ public class DefaultObjectHandler implements TagHandler { // check for data binding & remove if found JAXXObjectDescriptor jaxxObjectDescriptor = object.getObjectClass().getJAXXObjectDescriptor(); ComponentDescriptor root = jaxxObjectDescriptor.getComponentDescriptors()[0]; - object.appendInitializationCode(object.getJavaCode() + ".removeDataBinding(" + TypeManager.getJavaCode(root.getId() + "." + propertyName) + ");" + JAXXCompiler.getLineSeparator()); + object.appendInitializationCode(object.getJavaCode() + ".removeDataBinding(" + compiler.getJavaCode(root.getId() + "." + propertyName) + ");" + JAXXCompiler.getLineSeparator()); } object.addProperty(propertyName, stringValue); ClassDescriptor type = getPropertyType(object, propertyName, compiler); @@ -845,7 +842,7 @@ public class DefaultObjectHandler implements TagHandler { String id = isRoot ? object.getId() + ' ' + descriptor.getId() : "( " + object.getId() + " ) " + descriptor.getId(); CompiledObject child = new CompiledObject(id, "((" + JAXXCompiler.getCanonicalName(classDescriptor) + ") " + - object.getJavaCode() + ".getObjectById(" + TypeManager.getJavaCode(descriptor.getId()) + "))", + object.getJavaCode() + ".getObjectById(" + compiler.getJavaCode(descriptor.getId()) + "))", classDescriptor, compiler, true); @@ -983,7 +980,7 @@ public class DefaultObjectHandler implements TagHandler { * @throws CompilerException if a compilation error occurs */ public void setProperty(CompiledObject object, String name, Object value, JAXXCompiler compiler) { - object.appendInitializationCode(getSetPropertyCode(object.getJavaCodeForProperty(name), name, TypeManager.getJavaCode(value), compiler)); + object.appendInitializationCode(getSetPropertyCode(object.getJavaCodeForProperty(name), name, compiler.getJavaCode(value), compiler)); } /** diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/TagManager.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/TagManager.java index 85bdfa7..5d3f008 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/TagManager.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/TagManager.java @@ -5,7 +5,6 @@ package jaxx.compiler.tags; import jaxx.compiler.*; -import jaxx.compiler.decorators.CompiledObjectDecoratorManager; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import org.apache.commons.logging.Log; @@ -85,8 +84,7 @@ public class TagManager { registeredBeans.clear(); registeredTags.clear(); defaultNamespaces.clear(); - CompiledObjectDecoratorManager.reset(); - JAXXCompilerLaunchor.loadLibraries(verbose); + JAXXEngine.loadLibraries(verbose); } /** @@ -233,22 +231,24 @@ public class TagManager { } boolean found = false; + ClassLoader classLoader = compiler.getClassLoader(); try { - Class.forName(className, true, compiler.getClassLoader()); + Class.forName(className, true,classLoader); found = true; } catch (ClassNotFoundException e) { // ignore ? - } catch (NoClassDefFoundError e) { // we get this instead of ClassNotFoundException on case-insensitive file systems when + } catch (NoClassDefFoundError e) { + // we obtain this instead of ClassNotFoundException on case-insensitive file systems when // looking up a class with the wrong case } if (!found) { // couldn't find .class, check for .java - URL javaURL = compiler.getClassLoader().getResource(className.replace('.', '/') + ".java"); + URL javaURL = classLoader.getResource(className.replace('.', '/') + ".java"); found = javaURL != null; } if (!found) { // couldn't find .java, check for .jaxx - URL jaxxURL = compiler.getClassLoader().getResource(className.replace('.', '/') + ".jaxx"); + URL jaxxURL = classLoader.getResource(className.replace('.', '/') + ".jaxx"); found = jaxxURL != null; } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/ApplicationHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/ApplicationHandler.java index ba7a215..c95ea13 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/ApplicationHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/ApplicationHandler.java @@ -25,7 +25,7 @@ public class ApplicationHandler extends JWindowHandler { @Override public void setAttribute(CompiledObject object, String propertyName, String stringValue, boolean inline, JAXXCompiler compiler) throws CompilerException { if (propertyName.equals("lookAndFeel") && stringValue != null && !stringValue.trim().startsWith("{")) { - compiler.appendBodyCode("{ " + object.getJavaCode() + ".setLookAndFeel(" + TypeManager.getJavaCode(stringValue) + "); }" + JAXXCompiler.getLineSeparator()); + compiler.appendBodyCode("{ " + object.getJavaCode() + ".setLookAndFeel(" + compiler.getJavaCode(stringValue) + "); }" + JAXXCompiler.getLineSeparator()); } else { super.setAttribute(object, propertyName, stringValue, inline, compiler); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXComboBoxHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXComboBoxHandler.java index 29766a8..30e26ed 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXComboBoxHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXComboBoxHandler.java @@ -10,7 +10,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.JAXXComboBox; import jaxx.runtime.swing.Item; import org.w3c.dom.Element; @@ -49,7 +48,7 @@ public class JAXXComboBoxHandler extends DefaultComponentHandler { for (Item item : items) { String id = item.getId(); CompiledObject compiledItem = new CompiledObject(id, ClassDescriptorLoader.getClassDescriptor(Item.class), compiler); - compiledItem.setConstructorParams(TypeManager.getJavaCode(id) + ", " + TypeManager.getJavaCode(item.getLabel()) + ", " + TypeManager.getJavaCode(item.getValue()) + ", " + item.isSelected()); + compiledItem.setConstructorParams(compiler.getJavaCode(id) + ", " + compiler.getJavaCode(item.getLabel()) + ", " + compiler.getJavaCode(item.getValue()) + ", " + item.isSelected()); compiler.registerCompiledObject(compiledItem); list.appendAdditionCode(listName + ".add(" + id + ");"); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXListHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXListHandler.java index afe7e47..2bc7559 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXListHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXListHandler.java @@ -10,7 +10,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.JAXXList; import jaxx.runtime.swing.Item; import org.w3c.dom.Element; @@ -52,7 +51,7 @@ public class JAXXListHandler extends DefaultComponentHandler { for (Item item : items) { String id = item.getId(); CompiledObject compiledItem = new CompiledObject(id, ClassDescriptorLoader.getClassDescriptor(Item.class), compiler); - compiledItem.setConstructorParams(TypeManager.getJavaCode(id) + ", " + TypeManager.getJavaCode(item.getLabel()) + ", " + TypeManager.getJavaCode(item.getValue()) + ", " + item.isSelected()); + compiledItem.setConstructorParams(compiler.getJavaCode(id) + ", " + compiler.getJavaCode(item.getLabel()) + ", " + compiler.getJavaCode(item.getValue()) + ", " + item.isSelected()); compiler.registerCompiledObject(compiledItem); list.appendAdditionCode(listName + ".add(" + id + ");"); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXTreeHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXTreeHandler.java index 2059a0f..d1366e3 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXTreeHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JAXXTreeHandler.java @@ -10,7 +10,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.Item; import jaxx.runtime.swing.JAXXTree; import org.w3c.dom.Element; @@ -45,7 +44,7 @@ public class JAXXTreeHandler extends DefaultComponentHandler { for (Item item : items) { String id = item.getId(); CompiledObject compiledItem = new CompiledObject(id, ClassDescriptorLoader.getClassDescriptor(Item.class), compiler); - compiledItem.setConstructorParams(TypeManager.getJavaCode(id) + ", " + TypeManager.getJavaCode(item.getLabel()) + ", " + TypeManager.getJavaCode(item.getValue()) + ", " + item.isSelected()); + compiledItem.setConstructorParams(compiler.getJavaCode(id) + ", " + compiler.getJavaCode(item.getLabel()) + ", " + compiler.getJavaCode(item.getValue()) + ", " + item.isSelected()); compiler.registerCompiledObject(compiledItem); tree.appendAdditionCode(addMethod + "(" + id + ");"); createItems(tree, item.getChildren(), id + ".addChild", compiler); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JRadioButtonHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JRadioButtonHandler.java index 1f4f65b..04c69b9 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JRadioButtonHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JRadioButtonHandler.java @@ -11,7 +11,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.JAXXButtonGroup; import javax.swing.AbstractButton; @@ -53,7 +52,7 @@ public class JRadioButtonHandler extends DefaultComponentHandler { @Override public void setProperty(CompiledObject object, String name, Object value, JAXXCompiler compiler) { if (name.equals(BUTTON_GROUP_PROPERTY)) { - object.appendAdditionCode(getSetPropertyCode(object.getJavaCode(), name, TypeManager.getJavaCode(value), compiler)); + object.appendAdditionCode(getSetPropertyCode(object.getJavaCode(), name, compiler.getJavaCode(value), compiler)); } else { super.setProperty(object, name, value, compiler); } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java index 7fb3c96..0caa927 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java @@ -11,7 +11,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.TabInfo; import javax.swing.Icon; @@ -61,10 +60,10 @@ public class JTabbedPaneHandler extends DefaultComponentHandler { if (I18nHelper.isI18nAttribute("title")) { if (!title.startsWith("_(\"")) { // we did not have the invocation code, add it - title = I18nHelper.addI18nInvocation(getId(), "title", TypeManager.getJavaCode(title), compiler); + title = I18nHelper.addI18nInvocation(getId(), "title", compiler.getJavaCode(title), compiler); } } else { - title = TypeManager.getJavaCode(title); + title = compiler.getJavaCode(title); } appendAdditionCode(getId() + ".setTitleAt(" + tabIndex + ", " + title + ");"); } @@ -74,10 +73,10 @@ public class JTabbedPaneHandler extends DefaultComponentHandler { if (I18nHelper.isI18nAttribute("toolTipText")) { if (!toolTipText.startsWith("_(\"")) { // we did not have the invocation code, add it - toolTipText = I18nHelper.addI18nInvocation(getId(), "toolTipText", TypeManager.getJavaCode(toolTipText), compiler); + toolTipText = I18nHelper.addI18nInvocation(getId(), "toolTipText", compiler.getJavaCode(toolTipText), compiler); } } else { - toolTipText = TypeManager.getJavaCode(toolTipText); + toolTipText = compiler.getJavaCode(toolTipText); } appendAdditionCode(getId() + ".setToolTipTextAt(" + tabIndex + ", " + toolTipText + ");"); } @@ -89,12 +88,12 @@ public class JTabbedPaneHandler extends DefaultComponentHandler { Color foreground = tabInfo.getForeground(); if (foreground != null) { - appendAdditionCode(getId() + ".setForegroundAt(" + tabIndex + ", " + TypeManager.getJavaCode(foreground) + ");"); + appendAdditionCode(getId() + ".setForegroundAt(" + tabIndex + ", " + compiler.getJavaCode(foreground) + ");"); } Color background = tabInfo.getBackground(); if (background != null) { - appendAdditionCode(getId() + ".setBackgroundAt(" + tabIndex + ", " + TypeManager.getJavaCode(background) + ");"); + appendAdditionCode(getId() + ".setBackgroundAt(" + tabIndex + ", " + compiler.getJavaCode(background) + ");"); } int mnemonic = tabInfo.getMnemonic(); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TabHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TabHandler.java index fd463fa..7045341 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TabHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TabHandler.java @@ -10,7 +10,6 @@ import jaxx.compiler.I18nHelper; import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.TagHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.TabInfo; import org.w3c.dom.Attr; import org.w3c.dom.Element; @@ -64,7 +63,7 @@ public class TabHandler implements TagHandler { return; } - String valueCode = TypeManager.getJavaCode(value); + String valueCode = compiler.getJavaCode(value); // add i18n support if (I18nHelper.isI18nableAttribute(name, compiler)) { @@ -80,33 +79,33 @@ public class TabHandler implements TagHandler { compiledTabInfo.appendInitializationCode(id + ".setToolTipText(" + valueCode + ");"); //compiledTabInfo.appendInitializationCode(id + ".setToolTipText(" + TypeManager.getJavaCode(value) + ");"); } else if (name.equals("icon")) { - Icon icon = (Icon) TypeManager.convertFromString(value, Icon.class); + Icon icon = (Icon) compiler.convertFromString(value, Icon.class); tabInfo.setIcon(icon); - compiledTabInfo.appendInitializationCode(id + ".setIcon(" + TypeManager.getJavaCode(icon) + ");"); + compiledTabInfo.appendInitializationCode(id + ".setIcon(" + compiler.getJavaCode(icon) + ");"); } else if (name.equals("enabled")) { - boolean enabled = (Boolean) TypeManager.convertFromString(value, Boolean.class); + boolean enabled = (Boolean) compiler.convertFromString(value, Boolean.class); tabInfo.setEnabled(enabled); compiledTabInfo.appendInitializationCode(id + ".setEnabled(" + enabled + ");"); } else if (name.equals("disabledIcon")) { - Icon disabledIcon = (Icon) TypeManager.convertFromString(value, Icon.class); + Icon disabledIcon = (Icon) compiler.convertFromString(value, Icon.class); tabInfo.setDisabledIcon(disabledIcon); - compiledTabInfo.appendInitializationCode(id + ".setDisabledIcon(" + TypeManager.getJavaCode(disabledIcon) + ");"); + compiledTabInfo.appendInitializationCode(id + ".setDisabledIcon(" + compiler.getJavaCode(disabledIcon) + ");"); } else if (name.equals("mnemonic")) { - int mnemonic = (Character) TypeManager.convertFromString(value, char.class); + int mnemonic = (Character) compiler.convertFromString(value, char.class); tabInfo.setMnemonic(mnemonic); compiledTabInfo.appendInitializationCode(id + ".setMnemonic(" + mnemonic + ");"); } else if (name.equals("displayedMnemonicIndex")) { - int displayedMnemonicIndex = (Integer) TypeManager.convertFromString(value, int.class); + int displayedMnemonicIndex = (Integer) compiler.convertFromString(value, int.class); tabInfo.setDisplayedMnemonicIndex(displayedMnemonicIndex); compiledTabInfo.appendInitializationCode(id + ".setDisplayedMnemonicIndex(" + displayedMnemonicIndex + ");"); } else if (name.equals("foreground")) { - Color foreground = (Color) TypeManager.convertFromString(value, Color.class); + Color foreground = (Color) compiler.convertFromString(value, Color.class); tabInfo.setForeground(foreground); - compiledTabInfo.appendInitializationCode(id + ".setForeground(" + TypeManager.getJavaCode(foreground) + ");"); + compiledTabInfo.appendInitializationCode(id + ".setForeground(" + compiler.getJavaCode(foreground) + ");"); } else if (name.equals("background")) { - Color background = (Color) TypeManager.convertFromString(value, Color.class); + Color background = (Color) compiler.convertFromString(value, Color.class); tabInfo.setBackground(background); - compiledTabInfo.appendInitializationCode(id + ".setBackground(" + TypeManager.getJavaCode(background) + ");"); + compiledTabInfo.appendInitializationCode(id + ".setBackground(" + compiler.getJavaCode(background) + ");"); } else if (name.equals("id")) { // ignore, already handled } else { diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java index cccbaf5..5211116 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java @@ -11,7 +11,6 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import jaxx.compiler.tags.DefaultComponentHandler; -import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.Table; import java.awt.GridBagConstraints; @@ -77,7 +76,7 @@ public class TableHandler extends DefaultComponentHandler { rowSpans.set(x, c.gridheight); } - super.addChild(child, TypeManager.getJavaCode(c), compiler); + super.addChild(child, compiler.getJavaCode(c), compiler); emptyCell = false; } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java index f2ceeac..54a34a6 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java @@ -421,21 +421,6 @@ public class BeanValidatorHandler extends DefaultObjectHandler { } - /*protected boolean addContextName(BeanValidatorHandler handler, JAXXCompiler compiler) { - if (contextName != null) { - String code = handler.getSetPropertyCode(getJavaCode(), CONTEXT_NAME_ATTRIBUTE, TypeManager.getJavaCode(contextName), compiler); - appendAdditionCode(code); - } - return false; - }*/ - - /*protected boolean addScope(BeanValidatorHandler handler, JAXXCompiler compiler) { - if (scope != null) { - String code = handler.getSetPropertyCode(getJavaCode(), SCOPE_ATTRIBUTE, TypeManager.getJavaCode(scope), compiler); - appendAdditionCode(code); - } - return false; - }*/ protected boolean addParentValidator(Element tag, BeanValidatorHandler handler, JAXXCompiler compiler) { if (parentValidator != null) { String initializer; @@ -556,7 +541,7 @@ public class BeanValidatorHandler extends DefaultObjectHandler { String beanClassName = beanInfo.getJAXXBeanDescriptor().getClassDescriptor().getName(); // contextName must be in constructor to able to init validator with his correct contextName - setConstructorParams(beanClassName + ".class, " + TypeManager.getJavaCode(contextName)); + setConstructorParams(beanClassName + ".class, " + compiler.getJavaCode(contextName)); // add generic type to validator setGenericTypes(new String[]{beanClassName}); @@ -604,12 +589,7 @@ public class BeanValidatorHandler extends DefaultObjectHandler { // editor component not find on ui continue; } - /*if (compiler.isComponentUsedByValidator(component)) { - // component is already used by another validator - compiler.reportError("component '" + component + "' is already used by another validator."); - continue; - }*/ - String keyCode = TypeManager.getJavaCode(propertyName); + String keyCode = compiler.getJavaCode(propertyName); appendAdditionCode(getJavaCode() + ".setFieldRepresentation(" + keyCode + ", " + component + ");"); } } diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tools/PrintTagInfo.java b/jaxx-compiler/src/main/java/jaxx/compiler/tools/PrintTagInfo.java index 3df8286..13973e7 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tools/PrintTagInfo.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tools/PrintTagInfo.java @@ -2,7 +2,7 @@ package jaxx.compiler.tools; import jaxx.compiler.tags.*; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JAXXCompilerLaunchor; +import jaxx.compiler.JAXXEngine; import jaxx.compiler.beans.JAXXPropertyDescriptor; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; @@ -36,7 +36,7 @@ public class PrintTagInfo { } try { - JAXXCompilerLaunchor.loadLibraries(false); + JAXXEngine.loadLibraries(false); for (int i = toFile ? 1 : 0; i < arg.length; i++) { String className = arg[i]; treateClass(w, className); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java b/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java index 69e5710..7dbe946 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java @@ -1,6 +1,5 @@ package jaxx.compiler.tools.jaxxcapture.handlers; -import jaxx.compiler.JavaFile; import jaxx.compiler.JAXXCompiler; import jaxx.compiler.tools.jaxxcapture.CapturedObject; import jaxx.compiler.tools.jaxxcapture.ContextNode; @@ -17,6 +16,7 @@ import java.awt.Container; import java.lang.reflect.Field; import java.util.Map; import java.util.Stack; +import jaxx.compiler.io.JavaElement; public class ObjectHandler { private static int count; @@ -292,7 +292,7 @@ public class ObjectHandler { } result.append(" <script>"); result.append(lineSeparator); - result.append(JavaFile.indent(script, 4, false, lineSeparator)); + result.append(JavaElement.indent(script, 4, false, lineSeparator)); result.append(lineSeparator); result.append(" </script>"); result.append(lineSeparator); @@ -314,7 +314,7 @@ public class ObjectHandler { String lineSeparator = JAXXCompiler.getLineSeparator(); for (CapturedObject aChildren : children) { if (!aChildren.isInlineable()) { - result.append(JavaFile.indent(aChildren.getXML(capture), 2, false, lineSeparator)); + result.append(JavaElement.indent(aChildren.getXML(capture), 2, false, lineSeparator)); result.append(lineSeparator); } } diff --git a/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.decorators.CompiledObjectDecorator b/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.decorators.CompiledObjectDecorator new file mode 100644 index 0000000..55f046a --- /dev/null +++ b/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.decorators.CompiledObjectDecorator @@ -0,0 +1,3 @@ +jaxx.compiler.decorators.DefaultCompiledObjectDecorator +jaxx.compiler.decorators.BoxedCompiledObjectDecorator +jaxx.compiler.decorators.HelpRootCompiledObjectDecorator diff --git a/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.types.TypeConverter b/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.types.TypeConverter new file mode 100644 index 0000000..440367e --- /dev/null +++ b/jaxx-compiler/src/main/resources/META-INF/services/jaxx.compiler.types.TypeConverter @@ -0,0 +1,5 @@ +jaxx.compiler.types.ColorConverter +jaxx.compiler.types.GridBagConstraintsConverter +jaxx.compiler.types.InsetsConverter +jaxx.compiler.types.KeyStrokeConverter +jaxx.compiler.types.PrimitiveConverter diff --git a/jaxx-compiler/src/test/java/jaxx/compiler/JavaMethodTest.java b/jaxx-compiler/src/test/java/jaxx/compiler/JavaMethodTest.java index 94311a6..7d45659 100644 --- a/jaxx-compiler/src/test/java/jaxx/compiler/JavaMethodTest.java +++ b/jaxx-compiler/src/test/java/jaxx/compiler/JavaMethodTest.java @@ -1,7 +1,7 @@ package jaxx.compiler; -import jaxx.compiler.JavaMethod; -import jaxx.compiler.JavaMethod.MethodOrder; +import jaxx.compiler.io.JavaMethod; +import jaxx.compiler.io.JavaMethod.MethodOrder; import org.junit.Assert; import org.junit.Test; diff --git a/jaxx-compiler/src/test/java/jaxx/compiler/tags/TagManagerTest.java b/jaxx-compiler/src/test/java/jaxx/compiler/tags/TagManagerTest.java index f5b3818..878f1fe 100644 --- a/jaxx-compiler/src/test/java/jaxx/compiler/tags/TagManagerTest.java +++ b/jaxx-compiler/src/test/java/jaxx/compiler/tags/TagManagerTest.java @@ -1,7 +1,7 @@ package jaxx.compiler.tags; import jaxx.compiler.JAXXCompiler; -import jaxx.compiler.JAXXCompilerLaunchor; +import jaxx.compiler.JAXXEngine; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorLoader; import org.junit.Assert; @@ -36,8 +36,8 @@ public class TagManagerTest { @Before public void setUp() { - JAXXCompilerLaunchor.newLaunchor(); - compiler = JAXXCompilerLaunchor.createDummyCompiler(JAXXCompiler.class.getClassLoader()); + JAXXEngine.newLaunchor(); + compiler = JAXXEngine.createDummyCompiler(JAXXCompiler.class.getClassLoader()); // compiler = new JAXXCompiler(JAXXCompiler.class.getClassLoader()); compiler.addImport("javax.swing.*"); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.