Author: tchemit Date: 2011-02-01 18:43:17 +0100 (Tue, 01 Feb 2011) New Revision: 2188 Url: http://nuiton.org/repositories/revision/jaxx/2188 Log: Optimize all the generation code at last... Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/DefaultJAXXBindingWriter.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/SimpleJAXXObjectBindingWriter.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/css/StylesheetHelper.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/AbstractFinalizer.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/JAXXCompilerFinalizer.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaElementFactory.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFile.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFileGenerator.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultComponentHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JSpinnerHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTextComponentHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java trunk/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/CompiledObject.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -35,7 +35,6 @@ import org.apache.commons.lang.StringUtils; import java.awt.Container; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -474,10 +473,10 @@ protected String getInitializationCode(EventHandler handler, JAXXCompiler compiler) { MethodDescriptor addMethod = handler.getAddMethod(); ClassDescriptor listenerClass = addMethod.getParameterTypes()[0]; - compiler.addImport(listenerClass.getName()); + String type = compiler.getImportManager().getType(listenerClass.getName()); //TC-20091026 use 'this' instead of root object javaCode //TC-20091105 JAXXUtil.getEventListener is generic, no more need cast and use simple name - return getJavaCode() + '.' + addMethod.getName() + "(JAXXUtil.getEventListener(" + listenerClass.getSimpleName() + ".class, " + + return getJavaCode() + '.' + addMethod.getName() + "(JAXXUtil.getEventListener(" + type + ".class, " + TypeManager.getJavaCode(handler.getListenerMethod().getName()) + ", this, " + TypeManager.getJavaCode(compiler.getEventHandlerMethodName(handler)) + "));" + JAXXCompiler.getLineSeparator(); } @@ -565,25 +564,6 @@ return properties; } - // TODO: remove this temporary method and complete switchover to MethodDescriptors - - public void addEventHandler(String eventId, - Method addMethod, - Method listenerMethod, - String code, - JAXXCompiler compiler) { - try { - ClassDescriptor descriptor = ClassDescriptorHelper.getClassDescriptor(getObjectClass().getName()); - String listenerClassName = addMethod.getParameterTypes()[0].getName(); - ClassDescriptor listenerDescriptor = ClassDescriptorHelper.getClassDescriptor(listenerClassName); - MethodDescriptor addMethodDescriptor = descriptor.getMethodDescriptor(addMethod.getName(), listenerDescriptor); - MethodDescriptor listenerMethodDescriptor = listenerDescriptor.getMethodDescriptor(listenerMethod.getName(), ClassDescriptorHelper.getClassDescriptor(listenerMethod.getParameterTypes()[0].getName())); - addEventHandler(eventId, addMethodDescriptor, listenerMethodDescriptor, code, compiler); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - /** * Adds an event listener to this object. The generated code will appear * in the initialization block. @@ -694,7 +674,7 @@ return "< " + result.substring(2) + " >"; } - public void setGenericTypes(String[] genericTypes) { + public void setGenericTypes(String... genericTypes) { if (genericTypes == null) { this.genericTypes = null; return; Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -46,7 +46,6 @@ import jaxx.runtime.JAXXObjectDescriptor; import jaxx.runtime.css.Rule; import jaxx.runtime.css.Stylesheet; -import org.apache.commons.collections.BeanMap; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -290,6 +289,13 @@ */ protected boolean identCssFound; + /** + * A flag to know if SwingUtil msut be imported. + * + * @since 2.4 + */ + protected boolean needSwingUtil; + public static final String[] EMPTY_STRING_ARRAY = new String[0]; public JAXXCompiler() { @@ -472,7 +478,7 @@ methodDescriptor = new MethodDescriptor( "set" + capitalizeName, Modifier.PUBLIC, - "void", + JAXXCompilerFinalizer.TYPE_VOID, new String[]{fullClassName}, classLoader ); @@ -1567,6 +1573,30 @@ String simpleClassName = getOutputClassName().substring(dotPos + 1); CompiledObject compiledObject = getRootObject(); + String genericType = getGenericType(); + if (StringUtils.isNotEmpty(genericType)) { + + // add the generic type to the root object + + // generictype can be on form E extends XXX + //keep only the first thing... + StringBuilder sb = new StringBuilder(); + String[] allTypes = JavaGeneratorUtil.splitFqnList(genericType, ','); + for (String type : allTypes) { + int anExtends = type.indexOf("extends"); + if (anExtends > -1) { + type = type.substring(0, anExtends - 1).trim(); + } + sb.append(", ").append(type); + } + String finalType; + if (allTypes.length > 0) { + finalType = sb.substring(2); + } else { + finalType = sb.toString(); + } + compiledObject.setGenericTypes(finalType); + } // finalize all objects via their decorator for (CompiledObject object : getObjects().values()) { @@ -1882,4 +1912,12 @@ public ImportsManager getImportManager() { return getJavaFile().getImportManager(); } + + public boolean isNeedSwingUtil() { + return needSwingUtil; + } + + public void setNeedSwingUtil(boolean needSwingUtil) { + this.needSwingUtil = needSwingUtil; + } } Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/DataSource.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -29,8 +29,9 @@ import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; import jaxx.compiler.UnsupportedAttributeException; -import jaxx.compiler.finalizers.AbstractFinalizer; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaElementFactory; +import jaxx.compiler.java.JavaFileGenerator; import jaxx.compiler.java.JavaMethod; import jaxx.compiler.java.parser.JavaParser; import jaxx.compiler.java.parser.JavaParserConstants; @@ -672,11 +673,13 @@ ClassDescriptor eventClass = DefaultObjectHandler.getEventClass(eventInfo.getListenerClass()); String type = compiler.getImportManager().getType(JAXXCompiler.getCanonicalName(eventClass)); if (!methodExists) { + String code = JavaFileGenerator.addDebugLoggerInvocation(compiler, "event"); + code += "propertyChange(null);"; JavaMethod method = JavaElementFactory.newMethod( Modifier.PUBLIC, - AbstractFinalizer.TYPE_VOID, + JAXXCompilerFinalizer.TYPE_VOID, methodName, - "propertyChange(null);", + code, false, JavaElementFactory.newArgument(type, "event")); methods.add(method); @@ -685,12 +688,13 @@ result.append("$bindingSources.put(\"").append(code).append("\", ").append(code).append(");").append(JAXXCompiler.getLineSeparator()); //TC-20091105 JAXXUtil.getEventListener is generic, no more need cast and use simple listener name ClassDescriptor listenerClass = eventInfo.getListenerClass(); - compiler.addImport(listenerClass.getName()); + String listenerType = compiler.getImportManager().getType(listenerClass.getName()); + String jaxxUtilPrefix = compiler.getImportManager().getType(JAXXUtil.class); result.append(code); result.append('.'); result.append(eventInfo.getAddMethod()); - result.append("( JAXXUtil.getEventListener("); - result.append(listenerClass.getSimpleName()); + result.append("( ").append(jaxxUtilPrefix).append(".getEventListener("); + result.append(listenerType); result.append(".class, "); result.append("this"); result.append(", "); @@ -702,7 +706,7 @@ handler, objectCode, "get" + StringUtils.capitalize(eventInfo.getModelName()), - JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this" + ", " + constantId + ")", + jaxxUtilPrefix + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this" + ", " + constantId + ")", compiler ); result.append(addCode); @@ -767,14 +771,16 @@ boolean methodExists = hasMethod(methodName); if (!methodExists) { ClassDescriptor eventClass = DefaultObjectHandler.getEventClass(eventInfo.getListenerClass()); - compiler.addImport(eventClass.getName()); + String type = compiler.getImportManager().getType(JAXXCompiler.getCanonicalName(eventClass)); + String code = JavaFileGenerator.addDebugLoggerInvocation(compiler, "event"); + code += "propertyChange(null);"; JavaMethod method = JavaElementFactory.newMethod( Modifier.PUBLIC, - "void", + JAXXCompilerFinalizer.TYPE_VOID, methodName, - "propertyChange(null);", + code, false, - JavaElementFactory.newArgument(JAXXCompiler.getCanonicalName(eventClass), "event")); + JavaElementFactory.newArgument(type, "event")); methods.add(method); } try { @@ -783,6 +789,7 @@ String modelType = compiler.getImportManager().getType(modelClassName); String code = objectCode + (eventInfo.getModelName() != null ? "." + modelMemberName + "()" : ""); String eol = JAXXCompiler.getLineSeparator(); + String jaxxUtilPrefix = compiler.getImportManager().getType(JAXXUtil.class); result.append(modelType).append(" $target = (").append(modelType).append(") $bindingSources.remove(\"").append(code).append("\");").append(eol); //TC-20091105 test if $target is not null result.append("if ($target != null) {").append(eol); @@ -791,7 +798,7 @@ String listenerType = compiler.getImportManager().getType(listenerClass.getName()); result.append(" $target."); result.append(eventInfo.getRemoveMethod()); - result.append("( JAXXUtil.getEventListener("); + result.append("( ").append(jaxxUtilPrefix).append(".getEventListener("); result.append(listenerType); result.append(".class, "); result.append("this"); @@ -802,7 +809,7 @@ result.append("}").append(eol); if (eventInfo.getModelName() != null) { result.append(getRemoveMemberListenerCode(handler, objectCode, "get" + StringUtils.capitalize(eventInfo.getModelName()), - JAXXUtil.class.getSimpleName() + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this, " + constantId + ")", + jaxxUtilPrefix + ".getDataBindingUpdateListener(" + compiler.getOutputClassName() + ".this, " + constantId + ")", compiler)); } return result.toString(); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/DefaultJAXXBindingWriter.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/DefaultJAXXBindingWriter.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/DefaultJAXXBindingWriter.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -27,8 +27,8 @@ import jaxx.compiler.JAXXCompiler; import jaxx.compiler.binding.DataBinding; import jaxx.compiler.binding.DataListener; -import jaxx.compiler.finalizers.AbstractFinalizer; import jaxx.compiler.finalizers.DefaultFinalizer; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaElementFactory; import jaxx.compiler.java.JavaFileGenerator; import jaxx.compiler.java.JavaMethod; @@ -97,21 +97,21 @@ List<JavaMethod> bMethods = binding.getMethods(); bMethods.add(0, JavaElementFactory.newMethod( PUBLIC, - AbstractFinalizer.TYPE_VOID, + JAXXCompilerFinalizer.TYPE_VOID, DefaultFinalizer.METHOD_NAME_REMOVE_DATA_BINDING, removeBuffer.toString(), true) ); bMethods.add(0, JavaElementFactory.newMethod( PUBLIC, - AbstractFinalizer.TYPE_VOID, + JAXXCompilerFinalizer.TYPE_VOID, DefaultFinalizer.METHOD_NAME_PROCESS_DATA_BINDING, binding.getProcessDataBinding(), true) ); bMethods.add(0, JavaElementFactory.newMethod( PUBLIC, - AbstractFinalizer.TYPE_VOID, + JAXXCompilerFinalizer.TYPE_VOID, DefaultFinalizer.METHOD_NAME_APPLY_DATA_BINDING, addBuffer.toString(), true) Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/SimpleJAXXObjectBindingWriter.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/SimpleJAXXObjectBindingWriter.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/binding/writers/SimpleJAXXObjectBindingWriter.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -27,8 +27,8 @@ import jaxx.compiler.binding.DataBinding; import jaxx.compiler.binding.DataListener; import jaxx.compiler.binding.JavaParserUtil; -import jaxx.compiler.finalizers.AbstractFinalizer; import jaxx.compiler.finalizers.DefaultFinalizer; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaElementFactory; import jaxx.compiler.java.JavaFileGenerator; import jaxx.compiler.java.JavaMethod; @@ -98,7 +98,7 @@ JavaMethod method = JavaElementFactory.newMethod( Modifier.PUBLIC, - AbstractFinalizer.TYPE_VOID, + JAXXCompilerFinalizer.TYPE_VOID, DefaultFinalizer.METHOD_NAME_PROCESS_DATA_BINDING, binding.getProcessDataBinding(), true Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/css/StylesheetHelper.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/css/StylesheetHelper.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/css/StylesheetHelper.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -47,6 +47,7 @@ import jaxx.runtime.css.Stylesheet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.eugene.java.extension.ImportsManager; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -358,13 +359,18 @@ String eol = JAXXCompiler.getLineSeparator(); DataBindingHelper bindingHelper = compiler.getBindingHelper(); + String pseudoClassesPrefix = null; + String dataBindingPrefix = null; + ImportsManager importManager = compiler.getImportManager(); + if (!properties.isEmpty()) { - compiler.getImportManager().addImport(Pseudoclasses.class); - compiler.getImportManager().addImport(jaxx.runtime.css.DataBinding.class); + pseudoClassesPrefix = importManager.getType(Pseudoclasses.class); + dataBindingPrefix = importManager.getType(jaxx.runtime.css.DataBinding.class); } - String outputClassName = compiler.getImportManager().getType(compiler.getOutputClassName()); - + String outputClassName = + importManager.getType(compiler.getOutputClassName()); + for (Map.Entry<String, String> e : properties.entrySet()) { String property = e.getKey(); ClassDescriptor type = handler.getPropertyType(object, @@ -378,9 +384,11 @@ String dataBindingCode = DataBindingHelper.processDataBindings(e.getValue()); String valueCode; + String simpleType = importManager.getType(JAXXCompiler.getCanonicalName(type)); + if (dataBindingCode != null) { String code = object.getId() + "." + property + "." + priority; - valueCode = "new " + jaxx.runtime.css.DataBinding.class.getSimpleName() + "(" + + valueCode = "new " + dataBindingPrefix + "(" + TypeManager.getJavaCode(code) + ")"; DataBinding binding = new DataBinding( code, @@ -388,7 +396,8 @@ handler.getSetPropertyCode( object.getJavaCode(), property, - "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBindingCode, + "(" + simpleType + ") " + dataBindingCode, +// "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBindingCode, compiler ), false @@ -417,7 +426,7 @@ } buffer.append("value = "); - buffer.append(Pseudoclasses.class.getSimpleName()); + buffer.append(pseudoClassesPrefix); buffer.append(".applyProperty("); buffer.append(outputClassName); buffer.append(".this, "); @@ -427,7 +436,7 @@ buffer.append(", "); buffer.append(valueCode); buffer.append(", "); - buffer.append(Pseudoclasses.class.getSimpleName()); + buffer.append(pseudoClassesPrefix); buffer.append(".wrap("); buffer.append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler)); buffer.append("), "); @@ -436,11 +445,10 @@ buffer.append(eol); buffer.append("if (!(value instanceof "); - buffer.append(jaxx.runtime.css.DataBinding.class.getSimpleName()); + buffer.append(dataBindingPrefix); buffer.append(")) {"); buffer.append(eol); - String simpleType = compiler.getImportManager().getType(JAXXCompiler.getCanonicalName(type)); String unwrappedValue = unwrap(type, "value"); buffer.append(" "); buffer.append(handler.getSetPropertyCode(object.getJavaCode(), property, "(" + simpleType + ") " + unwrappedValue, compiler)); @@ -463,6 +471,7 @@ for (Map.Entry<String, String> e : properties.entrySet()) { String property = e.getKey(); ClassDescriptor type = handler.getPropertyType(object, property, compiler); + String simpleType = importManager.getType(JAXXCompiler.getCanonicalName(type)); if (log.isDebugEnabled()) { log.debug("will test if databinding : [" + e.getValue() + "] type=" + type); } @@ -470,14 +479,14 @@ String valueCode; if (dataBindingCode != null) { String code = object.getId() + "." + property + "." + priority; - valueCode = "new " + jaxx.runtime.css.DataBinding.class.getSimpleName() + "(" + TypeManager.getJavaCode(code) + ")"; + valueCode = "new " + dataBindingPrefix + "(" + TypeManager.getJavaCode(code) + ")"; DataBinding binding = new DataBinding( code, dataBindingCode, handler.getSetPropertyCode( object.getJavaCode(), property, - "(" + JAXXCompiler.getCanonicalName(type) + ") " + dataBindingCode, + "(" + simpleType + ") " + dataBindingCode, compiler ), false @@ -485,7 +494,10 @@ bindingHelper.registerDataBinding(binding); } else { try { - Class<?> typeClass = type != null ? ClassDescriptorHelper.getClass(type.getName(), type.getClassLoader()) : null; + Class<?> typeClass = + type != null ? + ClassDescriptorHelper.getClass(type.getName(), type.getClassLoader()) : + null; valueCode = TypeManager.getJavaCode(TypeManager.convertFromString(e.getValue(), typeClass)); } catch (ClassNotFoundException ex) { compiler.reportError("could not find class " + type.getName()); @@ -496,7 +508,7 @@ buffer.append("Object "); valueDeclared = true; } - buffer.append("value = ").append(Pseudoclasses.class.getSimpleName()).append(".removeProperty("); + buffer.append("value = ").append(pseudoClassesPrefix).append(".removeProperty("); buffer.append(outputClassName); buffer.append(".this, "); @@ -505,7 +517,7 @@ buffer.append(TypeManager.getJavaCode(property)); buffer.append(", "); buffer.append(valueCode); - buffer.append(", ").append(Pseudoclasses.class.getSimpleName()).append(".wrap("); + buffer.append(", ").append(pseudoClassesPrefix).append(".wrap("); buffer.append(handler.getGetPropertyCode(object.getJavaCode(), property, compiler) @@ -516,11 +528,11 @@ buffer.append(eol); buffer.append("if (!(value instanceof "); - buffer.append(jaxx.runtime.css.DataBinding.class.getSimpleName()); + buffer.append(dataBindingPrefix); buffer.append(")) {"); buffer.append(eol); - String simpleType = compiler.getImportManager().getType(JAXXCompiler.getCanonicalName(type)); +// String simpleType = importManager.getType(JAXXCompiler.getCanonicalName(type)); String unwrappedValue = unwrap(type, "value"); buffer.append(" "); buffer.append(handler.getSetPropertyCode( Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -29,12 +29,14 @@ import jaxx.compiler.CompiledObjectDecorator; import jaxx.compiler.CompilerException; import jaxx.compiler.JAXXCompiler; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaElementFactory; import jaxx.compiler.java.JavaField; import jaxx.compiler.java.JavaFile; import jaxx.compiler.java.JavaMethod; import jaxx.compiler.script.ScriptInitializer; import jaxx.compiler.types.TypeManager; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -112,12 +114,17 @@ int access = id.startsWith("$") ? Modifier.PRIVATE : Modifier.PROTECTED; if (root.equals(object)) { + + // add the generic type if required + String type = className + root.getGenericTypes(); + JavaField field = JavaElementFactory.newField(access, - className, + type, id, false, "this" ); + javaFile.addSimpleField(field); } else { @@ -144,7 +151,7 @@ JavaMethod javaMethod = JavaElementFactory.newMethod( Modifier.PROTECTED, - "void", + JAXXCompilerFinalizer.TYPE_VOID, object.getCreationMethodName(), code, override @@ -193,8 +200,10 @@ // on special init, use constructor String canonicalName = JAXXCompiler.getCanonicalName(object); - init.append("new ").append(canonicalName).append("("); + String impl = compiler.getImportManager().getType(canonicalName); + init.append("new ").append(impl).append("("); + if (constructorParams != null) { init.append(constructorParams); } @@ -223,7 +232,7 @@ } String initCode = object.getInitializationCode(compiler); - if (initCode != null && initCode.length() > 0) { + if (StringUtils.isNotEmpty(initCode)) { result.append(eol).append(initCode); } @@ -274,7 +283,7 @@ " return;" + eol + "}" + eol + additionCode; javaFile.addMethod(JavaElementFactory.newMethod( Modifier.PROTECTED, - "void", + JAXXCompilerFinalizer.TYPE_VOID, object.getAdditionMethodName(), additionCode, false) Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/decorators/HelpRootCompiledObjectDecorator.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -28,10 +28,12 @@ import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerConfiguration; import jaxx.compiler.JAXXCompiler; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaElementFactory; import jaxx.compiler.java.JavaFile; import jaxx.runtime.swing.help.JAXXHelpUI; +import java.awt.Component; import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.Iterator; @@ -84,7 +86,7 @@ packageName, className, fullClassName) - ; + ; CompilerConfiguration options = compiler.getConfiguration(); if (options.isGenerateHelp()) { @@ -92,28 +94,27 @@ // add JAXXHelpUI interface Class<?> validatorInterface = JAXXHelpUI.class; String helpBrokerFQN = getBrokerFQN(compiler); - javaFile.addInterface( - JAXXCompiler.getCanonicalName(validatorInterface) + "<" + - helpBrokerFQN + ">"); + javaFile.addInterface(validatorInterface.getName() + + "<" + helpBrokerFQN + ">"); javaFile.addMethod(JavaElementFactory.newMethod( Modifier.PUBLIC, - "void", + JAXXCompilerFinalizer.TYPE_VOID, "registerHelpId", "broker.installUI(component, helpId);", true, newArgument(helpBrokerFQN, "broker"), - newArgument("java.awt.Component", "component"), - newArgument("String", "helpId")) + newArgument(Component.class.getName(), "component"), + newArgument(JAXXCompilerFinalizer.TYPE_STRING, "helpId")) ); javaFile.addMethod(JavaElementFactory.newMethod( Modifier.PUBLIC, - "void", + JAXXCompilerFinalizer.TYPE_VOID, "showHelp", "getBroker().showHelp(this, helpId);", true, - newArgument("String", "helpId")) + newArgument(JAXXCompilerFinalizer.TYPE_STRING, "helpId")) ); StringBuilder buffer = new StringBuilder(); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/AbstractFinalizer.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/AbstractFinalizer.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/AbstractFinalizer.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -15,14 +15,6 @@ */ public abstract class AbstractFinalizer implements JAXXCompilerFinalizer { - public static final String TYPE_STRING = "String"; - - public static final String TYPE_VOID = "void"; - - public static final String TYPE_BOOLEAN = "boolean"; - - public static final String TYPE_OBJECT = "Object"; - /** * Clones the given {@code field} and adds it to the {@code file} as a * property via the method {@link JavaFile#addField(JavaField)}. Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -53,15 +53,17 @@ import jaxx.runtime.JAXXUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.java.extension.ImportsManager; import java.awt.Container; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.TreeMap; import static java.lang.reflect.Modifier.FINAL; import static java.lang.reflect.Modifier.PRIVATE; @@ -149,10 +151,11 @@ */ protected static final JavaField ACTIVE_BINDINGS_FIELD = newField( PROTECTED, - "java.util.List<" + TYPE_OBJECT + ">", + List.class.getName() + "<" + TYPE_OBJECT + ">", FIELD_NAME_$ACTIVE_BINDINGS, false, - "new java.util.ArrayList<" + TYPE_OBJECT + ">()" + "new %s<" + TYPE_OBJECT + ">()", + ArrayList.class.getName() ); /** @@ -160,10 +163,11 @@ */ protected static final JavaField BINDING_SOURCES_FIELD = newField( PROTECTED, - "java.util.Map<" + TYPE_STRING + ", " + TYPE_OBJECT + ">", + Map.class.getName() + "<" + TYPE_STRING + ", " + TYPE_OBJECT + ">", FIELD_NAME_$BINDING_SOURCES, false, - "new java.util.HashMap<" + TYPE_STRING + ", " + TYPE_OBJECT + ">()" + "new %s<" + TYPE_STRING + ", " + TYPE_OBJECT + ">()", + HashMap.class.getName() ); /** @@ -171,10 +175,11 @@ */ protected static final JavaField OBJECT_MAP_FIELD = newField( PROTECTED, - "java.util.Map<" + TYPE_STRING + ", " + TYPE_OBJECT + ">", + Map.class.getName() + "<" + TYPE_STRING + ", " + TYPE_OBJECT + ">", FIELD_NAME_$OBJECT_MAP, true, - "new java.util.HashMap<" + TYPE_STRING + ", " + TYPE_OBJECT + ">()" + "new %s<" + TYPE_STRING + ", " + TYPE_OBJECT + ">()", + HashMap.class.getName() ); /** @@ -203,9 +208,10 @@ */ protected static final JavaField PREVIOUS_VALUES_FIELD = newField( PROTECTED, - "java.util.Map<?,?>", FIELD_NAME_$PREVIOUS_VALUES, + Map.class.getName() + "<?,?>", FIELD_NAME_$PREVIOUS_VALUES, false, - "new java.util.HashMap<" + TYPE_OBJECT + ", " + TYPE_OBJECT + ">()" + "new %s<" + TYPE_OBJECT + ", " + TYPE_OBJECT + ">()", + HashMap.class.getName() ); /** @@ -213,10 +219,12 @@ */ protected static final JavaField BINDINGS_FIELD = newField( PROTECTED | FINAL, - "java.util.Map<" + TYPE_STRING + ", " + JAXXBinding.class.getName() + ">", + Map.class.getName() + "<" + TYPE_STRING + ", " + JAXXBinding.class.getName() + ">", FIELD_NAME_$BINDINGS, false, - "new java.util.TreeMap<" + TYPE_STRING + ", JAXXBinding>()" + "new %s<" + TYPE_STRING + ", %s>()", + TreeMap.class.getName(), + JAXXBinding.class.getName() ); /** @@ -310,7 +318,8 @@ "getParentContainer", "return SwingUtil.getParentContainer(source, clazz);", true, - newArgument("Object", "source"), newArgument("Class<O>", "clazz") + newArgument(TYPE_OBJECT, "source"), + newArgument("Class<O>", "clazz") ); /** @@ -367,7 +376,7 @@ METHOD_NAME_REGISTER_DATA_BINDING, FIELD_NAME_$BINDINGS + ".put(binding.getId(), binding);", true, - newArgument(JAXXBinding.class.getSimpleName(), "binding") + newArgument(JAXXBinding.class.getName(), "binding") ); /** @@ -375,7 +384,7 @@ */ protected static final JavaMethod GET_DATA_BINDING_METHOD = newMethod( PUBLIC, - JAXXBinding.class.getSimpleName() + "[]", + JAXXBinding.class.getName() + "[]", "getDataBindings", "return " + FIELD_NAME_$BINDINGS + ".values().toArray(new " + JAXXBinding.class.getSimpleName() + "[" + FIELD_NAME_$BINDINGS + ".size()]);", true @@ -542,10 +551,10 @@ // add JAXXObject support addField(javaFile, OBJECT_MAP_FIELD); - javaFile.addMethod(GET_OBJECT_BY_ID_METHOD); addSimpleField(javaFile, BINDING_SOURCES_FIELD); addSimpleField(javaFile, ACTIVE_BINDINGS_FIELD); addSimpleField(javaFile, BINDINGS_FIELD); + javaFile.addMethod(GET_OBJECT_BY_ID_METHOD); javaFile.addMethod(REGISTER_DATA_BINDING_METHOD); javaFile.addMethod(GET_DATA_BINDING_METHOD); @@ -600,7 +609,7 @@ } } if (!overrideContextInitialized) { - addSimpleField(javaFile, CONTEXT_INITIALIZED); + //addSimpleField(javaFile, CONTEXT_INITIALIZED); } JavaField descriptorField = createJAXXObjectDescriptorField(compiler, javaFile); @@ -676,7 +685,7 @@ int nbBindings = bindings.length; boolean hasDataBindings = nbBindings > 0; - javaFile.addMethod(createInitializer(compiler, nbBindings)); + javaFile.addMethod(createInitializer(compiler, nbBindings, overrideContextInitialized)); addMethod(javaFile, GET_JAXX_OBJECT_DESCRIPTOR_METHOD); @@ -864,8 +873,6 @@ protected void addEventHandlers(JAXXCompiler compiler, JavaFile javaFile) { - ImportsManager importManager = javaFile.getImportManager(); - for (Map.Entry<String, Map<ClassDescriptor, List<EventHandler>>> e1 : compiler.getEventHandlers().entrySet()) { // outer loop is iterating over different objects (well, technically, different Java expressions) @@ -878,24 +885,30 @@ String methodName = compiler.getEventHandlerMethodName(handler); MethodDescriptor listenerMethod = handler.getListenerMethod(); if (listenerMethod.getParameterTypes().length != 1) { - throw new CompilerException("Expected event handler " + listenerMethod.getName() + " of class " + handler.getListenerClass() + " to have exactly one argument"); + throw new CompilerException( + "Expected event handler " + + listenerMethod.getName() + " of class " + + handler.getListenerClass() + + " to have exactly one argument" + ); } - ClassDescriptor eventType = listenerMethod.getParameterTypes()[0]; + ClassDescriptor eventType = + listenerMethod.getParameterTypes()[0]; - String type = importManager.getType( - JAXXCompiler.getCanonicalName(eventType)); - JavaArgument argument = JavaElementFactory.newArgument( - type, + JAXXCompiler.getCanonicalName(eventType), "event" ); + + String body = JavaFileGenerator.addDebugLoggerInvocation(compiler, "event"); + body += handler.getJavaCode(); javaFile.addMethod(JavaElementFactory.newMethod( PUBLIC, TYPE_VOID, methodName, - handler.getJavaCode(), + body, false, argument) ); @@ -916,9 +929,9 @@ code.append(");"); code.append(eol); } else { - if (superclassIsJAXXObject) { - code.append(" super();").append(eol); - } +// if (superclassIsJAXXObject) { +// code.append(" super();").append(eol); +// } } code.append(METHOD_NAME_$INITIALIZE + "();"); code.append(eol); @@ -953,7 +966,8 @@ } } if (!superclassIsJAXXObject) { - code.append(JAXXUtil.class.getSimpleName()); + String prefix = compiler.getImportManager().getType(JAXXUtil.class); + code.append(prefix); code.append(".initContext(this, " + PARAMETER_NAME_PARENT_CONTEXT + ");"); code.append(eol); } @@ -973,29 +987,26 @@ } public JavaMethod createInitializer(JAXXCompiler compiler, - int nbBindings) throws CompilerException { + int nbBindings, + boolean overrideContextInitialized) throws CompilerException { String eol = JAXXCompiler.getLineSeparator(); StringBuffer code = new StringBuffer(); CompiledObject root = compiler.getRootObject(); - code.append("if (" + FIELD_NAME_ALL_COMPONENTS_CREATED + " || !" + FIELD_NAME_CONTEXT_INITIALIZED + ") {"); + code.append("if (" + FIELD_NAME_ALL_COMPONENTS_CREATED); + if (overrideContextInitialized) { + code.append("|| !" + FIELD_NAME_CONTEXT_INITIALIZED); + } + code.append(") {"); code.append(eol); code.append(" return;").append(eol); code.append("}").append(eol); -// // register bindings before anything else -// if (nbBindings > 0) { -// // ajout invocation a la methode d'enregistrement des bindings -// code.append("// registers ").append(nbBindings).append(" data bindings").append(eol); -// code.append(METHOD_NAME_$REGISTER_DEFAULT_BINDINGS + "();").append(eol); -// } -// String dataBindingsCode = createRegisterDefaultBindingsMethod(compiler); -// if (dataBindingsCode != null && !dataBindingsCode.isEmpty()) { -// code.append(dataBindingsCode).append(eol); -// } - //TODO-TC20091025 we should remove this if no used anywhere + code.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + code.append(FIELD_NAME_$OBJECT_MAP + ".put("); - code.append(TypeManager.getJavaCode(root.getId())); - code.append(", this);"); - code.append(eol); + String rootId = root.getId(); + code.append(TypeManager.getJavaCode(rootId)); +// code.append(", this);"); + code.append(", ").append(rootId).append(");").append(eol); Iterator<CompiledObject> i = compiler.getObjectCreationOrder(); boolean lastWasMethodCall = false; @@ -1049,6 +1060,7 @@ code.append(FIELD_NAME_ALL_COMPONENTS_CREATED + " = true;"); String eol = JAXXCompiler.getLineSeparator(); code.append(eol); + code.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); for (CompiledObject object : compiler.getObjects().values()) { CompiledObjectDecorator decorator = object.getDecorator(); code.append(decorator.createCompleteSetupMethod(compiler, Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/JAXXCompilerFinalizer.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/JAXXCompilerFinalizer.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/JAXXCompilerFinalizer.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -38,6 +38,14 @@ */ public interface JAXXCompilerFinalizer { + String TYPE_STRING = "String"; + + String TYPE_VOID = "void"; + + String TYPE_BOOLEAN = "boolean"; + + String TYPE_OBJECT = "Object"; + /** * Test if the finalizer must be apply on the given {@code compiler}. * Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/ValidatorFinalizer.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -124,7 +124,7 @@ compiler.getJavaFile().addMethod(JavaElementFactory.newMethod( Modifier.PUBLIC, - AbstractFinalizer.TYPE_VOID, + TYPE_VOID, "registerValidatorFields", VALIDATOR_UTIL_PREFIX + "installFields(this);", true) @@ -184,7 +184,7 @@ initializer, true, JavaElementFactory.newArgument( - AbstractFinalizer.TYPE_STRING, "validatorId")) + TYPE_STRING, "validatorId")) ); } Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaElementFactory.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaElementFactory.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaElementFactory.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -46,12 +46,14 @@ String returnType, String name, boolean override, - String initializer) { + String initializer, + String... initializerTypes) { return new JavaField(modifiers, returnType, name, override, - initializer + initializer, + initializerTypes ); } @@ -97,7 +99,8 @@ field.getType(), field.getName(), field.isOverride(), - field.getInitializer()); + field.getInitializer(), + field.getInitializerTypes()); } public static JavaMethod cloneMethod(JavaMethod method) { Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -46,6 +46,14 @@ /** initializer of field (can be null) */ private String initializer; + /** + * Types to apply to the initializer to try use simple type names. + * + * @since 2.4 + */ + private String[] initializerTypes; + + /** flag to known where a field overrides a super-field */ private boolean override; @@ -73,20 +81,23 @@ * 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 {@code true} if method should be marked as overriden - * @param initializer the initial value of the field, 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 {@code true} if method should be marked as overriden + * @param initializer the initial value of the field, as it would appear in Java source code + * @param initializerTypes initializer types to use */ JavaField(int modifiers, String type, String name, boolean override, - String initializer) { + String initializer, + String... initializerTypes) { super(modifiers, name); this.type = type; this.initializer = initializer; + this.initializerTypes = initializerTypes; this.override = override; } @@ -107,6 +118,14 @@ return initializer; } + public String[] getInitializerTypes() { + return initializerTypes; + } + + public boolean hasInitializerTypes() { + return initializerTypes != null && initializerTypes.length > 0; + } + @Override public int compareTo(JavaField o) { return JavaElementComparator.compare(this, o); @@ -122,6 +141,10 @@ this.type = type; } + public void setInitializer(String initializer) { + this.initializer = initializer; + } + public enum FieldOrder { staticsBean(Modifier.STATIC | Modifier.PUBLIC, Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFile.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFile.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFile.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -25,6 +25,7 @@ package jaxx.compiler.java; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.types.TypeManager; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -345,8 +346,13 @@ // add full javabean support accessor + mutator + constant with // name of property to make it easier to use // compute the property constant - String constantId = TypeManager.convertVariableNameToConstantName("property" + capitalizedName); - addSimpleField(JavaElementFactory.newField(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL, String.class.getSimpleName(), constantId, false, "\"" + id + "\"")); + String constantId = TypeManager.convertVariableNameToConstantName( + "property" + capitalizedName); + addSimpleField(JavaElementFactory.newField( + Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL, + String.class.getSimpleName(), + constantId, false, "\"" + id + "\"") + ); if (Boolean.class.getSimpleName().equals(field.getType())) { String content = String.format(BOOLEAN_GETTER_PATTERN, id); @@ -363,7 +369,7 @@ JavaArgument arg = JavaElementFactory.newArgument(field.getType(), id); JavaMethod method = JavaElementFactory.newMethod( Modifier.PUBLIC, - "void", + JAXXCompilerFinalizer.TYPE_VOID, "set" + capitalizedName, content, field.isOverride(), @@ -381,8 +387,16 @@ String type = importManager.getType(fieldType); field.setType(type); } catch (Exception e) { - log.error("Could not determine simple name of field [" + field.getName() + "] type " + fieldType); + log.error("Could not determine simple name of field [" + + field.getName() + "] type " + fieldType); } + if (field.hasInitializerTypes()) { + String code = simplifyCode(field.getInitializer(), field.getInitializerTypes()); + if (log.isDebugEnabled()) { + log.debug("Use simplify text : "+code); + } + field.setInitializer(code); + } fields.add(field); } @@ -402,6 +416,34 @@ rawBodyCode.append(bodyCode); } + /** + * Try to use a simple type fro the given {@code type} and apply it on the + * given {@code pattern}. + * <p/> + * Example : + * <pre> + * type = java.io.File, pattern = new %s(""); + * returns : new File("") or new java.io.File("") if importManager can + * not import java.io.File + * </pre> + * + * @param types the types to simplify + * @param pattern the pattern where to apply simple types + * @return the input pattern with most simplest types + * @since 2.4 + */ + public String simplifyCode(String pattern, + String... types) { + String[] simpleTypes = new String[types.length]; + for (int i = 0; i < types.length; i++) { + String type = types[i]; + String simpleType = importManager.getType(type); + simpleTypes[i] = simpleType; + } + String format = String.format(pattern, (Object[]) simpleTypes); + return format; + } + public void clear() { importManager.clearImports(); if (interfaces != null) { @@ -421,11 +463,4 @@ } } -// public void addInterface(String canonicalName) { -// if (interfaces == null || !interfaces.contains(canonicalName)) { -// getInterfaces().add(canonicalName); -// } -// } - - } Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFileGenerator.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFileGenerator.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaFileGenerator.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -81,6 +81,23 @@ this.verbose = verbose && log.isDebugEnabled(); } + public static String addDebugLoggerInvocation(JAXXCompiler compiler, + String call) { + String eol = JAXXCompiler.getLineSeparator(); + StringBuilder builder = new StringBuilder(); + if (!compiler.getConfiguration().isAddLogger()) { + return ""; + } else { + builder.append("if (log.isDebugEnabled()) {"); + builder.append(eol); + builder.append(" log.debug(").append(call).append(");"); + builder.append(eol); + builder.append("}"); + builder.append(eol); + } + return builder.toString(); + } + public String generateImport(String anImport) { return "import " + anImport + ';' + eol; } Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultComponentHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultComponentHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultComponentHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -222,19 +222,20 @@ return id + ".setLocation(" + id + ".getX(), " + valueCode + ");"; } if (WIDTH_ATTRIBUTE.equals(name)) { + compiler.setNeedSwingUtil(true); // need to optimize case when both width and height are being assigned return SwingUtil.class.getSimpleName() + ".setComponentWidth(" + id + "," + valueCode + ");"; } if (HEIGHT_ATTRIBUTE.equals(name)) { + compiler.setNeedSwingUtil(true); return SwingUtil.class.getSimpleName() + ".setComponentHeight(" + id + "," + valueCode + ");"; } if (FONT_FACE_ATTRIBUTE.equals(name)) { - compiler.addImport(Font.class); return "if (" + id + ".getFont() != null) {\n " + id + ".setFont(new Font(" + valueCode + ", " + id + ".getFont().getStyle(), " + id + ".getFont().getSize()));\n}"; } if (FONT_SIZE_ATTRIBUTE.equals(name)) { - compiler.addImport(Font.class); - return "if (" + id + ".getFont() != null) {\n " + id + ".setFont(" + id + ".getFont().deriveFont((float) " + valueCode + "));\n}"; + return "if (" + id + ".getFont() != null) {\n " + id + ".setFont(" + id + ".getFont().deriveFont(" + valueCode + "));\n}"; +// return "if (" + id + ".getFont() != null) {\n " + id + ".setFont(" + id + ".getFont().deriveFont((float) " + valueCode + "));\n}"; } if (FONT_WEIGHT_ATTRIBUTE.equals(name)) { if (valueCode.equals("\"bold\"")) { @@ -288,7 +289,11 @@ } @Override - public void setAttribute(CompiledObject object, String propertyName, String stringValue, boolean inline, JAXXCompiler compiler) { + public void setAttribute(CompiledObject object, + String propertyName, + String stringValue, + boolean inline, + JAXXCompiler compiler) { if (propertyName.startsWith("_")) { // client property @@ -311,6 +316,7 @@ if (!(stringValue.startsWith("{") || stringValue.endsWith("}"))) { // this is a customized icon, add the icon creation code if (compiler.getConfiguration().isUseUIManagerForIcon()) { + compiler.setNeedSwingUtil(true); stringValue = "{" + SwingUtil.class.getSimpleName() + ".getUIManagerIcon(\"" + stringValue + "\")}"; } else { stringValue = "{" + SwingUtil.class.getSimpleName() + ".createImageIcon(\"" + stringValue + "\")}"; @@ -325,6 +331,7 @@ } propertyName = ICON_ATTRIBUTE; if (compiler.getConfiguration().isUseUIManagerForIcon()) { + compiler.setNeedSwingUtil(true); stringValue = "{" + SwingUtil.class.getSimpleName() + ".getUIManagerActionIcon(\"" + stringValue + "\")}"; } else { stringValue = "{" + SwingUtil.class.getSimpleName() + ".createActionIcon(\"" + stringValue + "\")}"; Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/DefaultObjectHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -45,6 +45,7 @@ import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXObjectDescriptor; import jaxx.runtime.css.Stylesheet; +import org.apache.commons.lang.StringUtils; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -473,7 +474,7 @@ compiler.checkOverride(object); String constructorParams = tag.getAttribute(CONSTRUCTOR_PARAMS_ATTRIBUTE); - if (constructorParams != null && constructorParams.length() > 0) { + if (StringUtils.isNotEmpty(constructorParams)) { object.setConstructorParams( compiler.getScriptManager().trimScript(constructorParams)); } @@ -745,26 +746,6 @@ return 0; } -// public String getApplyPropertyOrDataBindingCode(CompiledObject object, String propertyName, String stringValue, JAXXCompiler compiler) { -// ClassDescriptor type = getPropertyType(object, propertyName, compiler); -// String binding = compiler.processDataBindings(stringValue); -// if (binding != null) { -// return ""; -// } -// try { -// Class<?> typeClass = type != null ? ClassDescriptorHelper.getClass(type.getName(), type.getClassLoader()) : null; -// Object value = convertFromString(propertyName, stringValue, typeClass); -// 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) { -// compiler.reportError("could not convert literal string '" + stringValue + "' to type " + type.getName()); -// } catch (ClassNotFoundException e) { -// compiler.reportError("could not find class " + type.getName()); -// } -// return ""; -// } - /** * Set a single property on an object. The value may be either a simple value or contain data binding expressions. * Simple values are first converted to the property's type using {@link #convertFromString}. @@ -972,10 +953,10 @@ String name, String value, JAXXCompiler compiler) { - JAXXEventSetDescriptor JAXXEventSetDescriptor = events.get(name); - if (JAXXEventSetDescriptor != null) { + JAXXEventSetDescriptor descriptorSet = events.get(name); + if (descriptorSet != null) { MethodDescriptor[] listenerMethods = - JAXXEventSetDescriptor.getListenerMethods(); + descriptorSet.getListenerMethods(); MethodDescriptor listenerMethod = null; for (MethodDescriptor listenerMethod1 : listenerMethods) { if (listenerMethod1.getName().equals(name)) { @@ -990,7 +971,7 @@ value = compiler.preprocessScript(value); object.addEventHandler( name, - JAXXEventSetDescriptor.getAddListenerMethod(), + descriptorSet.getAddListenerMethod(), listenerMethod, value, compiler Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JSpinnerHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JSpinnerHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JSpinnerHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -25,8 +25,8 @@ package jaxx.compiler.tags.swing; +import jaxx.compiler.CompiledObject; import jaxx.compiler.CompilerException; -import jaxx.compiler.CompiledObject; import jaxx.compiler.JAXXCompiler; import jaxx.compiler.reflect.ClassDescriptor; import jaxx.compiler.reflect.ClassDescriptorHelper; @@ -34,12 +34,15 @@ import org.w3c.dom.Element; import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeListener; public class JSpinnerHandler extends DefaultComponentHandler { public static String MINIMUM_PROPERTY = "minimum"; + public static String MAXIMUM_PROPERTY = "maximum"; + public static String VALUE_PROPERTY = "value"; public JSpinnerHandler(ClassDescriptor beanClass) { @@ -50,7 +53,9 @@ public static class CompiledSpinner extends CompiledObject { Integer minimum; + Integer maximum; + Integer value; public CompiledSpinner(String id, ClassDescriptor objectClass, JAXXCompiler compiler) throws CompilerException { @@ -72,7 +77,7 @@ @Override public ClassDescriptor getPropertyType(CompiledObject object, String propertyName, JAXXCompiler compiler) throws CompilerException { if (propertyName.equals(MINIMUM_PROPERTY) || propertyName.equals(MAXIMUM_PROPERTY) || - propertyName.equals(VALUE_PROPERTY)) { + propertyName.equals(VALUE_PROPERTY)) { return ClassDescriptorHelper.getClassDescriptor(Integer.class); } return super.getPropertyType(object, propertyName, compiler); @@ -94,7 +99,9 @@ @Override protected void closeComponent(CompiledObject object, Element tag, JAXXCompiler compiler) throws CompilerException { CompiledSpinner spinner = (CompiledSpinner) object; - if (spinner.minimum != null || spinner.maximum != null || spinner.value != null) { + if (spinner.minimum != null || + spinner.maximum != null || + spinner.value != null) { if (spinner.getConstructorParams() != null) { compiler.reportError("constructorParams and minimum/maximum may not both be specified for the same JSpinner"); } @@ -107,7 +114,9 @@ if (spinner.value == null) { spinner.value = spinner.minimum; } - spinner.setConstructorParams("new SpinnerNumberModel(" + spinner.value + ", " + spinner.minimum + ", " + spinner.maximum + ", 1)"); + String type = compiler.getImportManager().getType(SpinnerNumberModel.class); + + spinner.setConstructorParams("new " + type + "(" + spinner.value + ", " + spinner.minimum + ", " + spinner.maximum + ", 1)"); } super.closeComponent(object, tag, compiler); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTabbedPaneHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -34,6 +34,7 @@ import jaxx.compiler.tags.DefaultComponentHandler; import jaxx.compiler.types.TypeManager; import jaxx.runtime.swing.TabInfo; +import jaxx.runtime.swing.TabInfoPropertyChangeListener; import javax.swing.Icon; import javax.swing.JTabbedPane; @@ -82,7 +83,8 @@ } int tabIndex = ++tabCount - 1; - appendAdditionCode(tabInfo.getId() + ".addPropertyChangeListener(new jaxx.runtime.swing.TabInfoPropertyChangeListener(" + getId() + ", " + tabIndex + "));"); + String type = compiler.getImportManager().getType(TabInfoPropertyChangeListener.class); + appendAdditionCode(tabInfo.getId() + ".addPropertyChangeListener(new " + type + "(" + getId() + ", " + tabIndex + "));"); String title = tabInfo.getTitle(); if (title != null) { Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTextComponentHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTextComponentHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/JTextComponentHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -89,8 +89,8 @@ String valueCode, JAXXCompiler compiler) throws CompilerException { if (name.equals(ATTRIBUTE_TEXT)) { - compiler.addImport(SwingUtil.class); - return SwingUtil.class.getSimpleName() + ".setText(" + + String prefix = compiler.getImportManager().getType(SwingUtil.class); + return prefix + ".setText(" + id + ", " + valueCode + ");" + JAXXCompiler.getLineSeparator(); } Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/swing/TableHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -101,8 +101,6 @@ tableConstraints.gridx = -1; tableConstraints.gridy = -1; tableConstraints.insets = DEFAULT_INSETS; - compiler.addImport(GridBagConstraints.class.getName()); - compiler.addImport(Insets.class.getName()); } @Override @@ -131,6 +129,9 @@ super.addChild(child, TypeManager.getJavaCode(c), compiler); emptyCell = false; + + compiler.addImport(GridBagConstraints.class); + compiler.addImport(Insets.class); } public GridBagConstraints getTableConstraints() { Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tags/validator/BeanValidatorHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -466,10 +466,11 @@ ); withError = true; } else { + String prefix = compiler.getImportManager().getType(uiClazz.getName()); String code = handler.getSetPropertyCode( getJavaCode(), UI_CLASS_ATTRIBUTE, - uiClazz.getName() + ".class", + prefix + ".class", compiler ); appendAdditionCode(code); @@ -624,7 +625,9 @@ } } - String code = SwingValidatorUtil.class.getName() + + String prefix = compiler.getImportManager().getType(SwingValidatorUtil.class); + + String code = prefix + ".registerErrorListMouseListener(" + errorList + ");"; appendAdditionCode(code); @@ -651,7 +654,9 @@ } } - String code = SwingValidatorUtil.class.getName() + + String prefix = compiler.getImportManager().getType(SwingValidatorUtil.class); + + String code = prefix + ".registerErrorTableMouseListener(" + errorTable + ");"; appendAdditionCode(code); @@ -751,8 +756,9 @@ String constructorParams = beanClassName + ".class, " + TypeManager.getJavaCode(contextName); // setConstructorParams(constructorParams); + String prefix = compiler.getImportManager().getType(SwingValidatorUtil.class); setInitializer( - SwingValidatorUtil.class.getSimpleName() + ".newValidator(" + constructorParams + ")" + prefix + ".newValidator(" + constructorParams + ")" ); // add generic type to validator Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tasks/GenerateTask.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -104,7 +104,8 @@ // optimize imports List<String> imports = optimizeImports( javaFile, - packageName); + packageName, + compiler.isNeedSwingUtil()); String packageToExclude = packageName + ".*"; @@ -124,7 +125,9 @@ compiler.generate(generator); } - public List<String> optimizeImports(JavaFile f, String packageName) { + public List<String> optimizeImports(JavaFile f, + String packageName, + boolean needSwingUtil) { ImportsManager importsManager = f.getImportManager(); @@ -174,7 +177,12 @@ // make sure this imports where done // importsManager.addImport(Container.class); importsManager.addImport(JAXXUtil.class); - importsManager.addImport(SwingUtil.class); + if (!f.isSuperclassIsJAXXObject() || needSwingUtil) { + + // while implementing JAXXObject contract we sure need the + // SwingUtil class + importsManager.addImport(SwingUtil.class); + } // importsManager.addImport(List.class); // importsManager.addImport(Map.class); Modified: trunk/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java =================================================================== --- trunk/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java 2011-01-31 17:54:12 UTC (rev 2187) +++ trunk/jaxx-compiler/src/main/java/jaxx/compiler/tools/jaxxcapture/handlers/ObjectHandler.java 2011-02-01 17:43:17 UTC (rev 2188) @@ -26,6 +26,7 @@ package jaxx.compiler.tools.jaxxcapture.handlers; import jaxx.compiler.JAXXCompiler; +import jaxx.compiler.finalizers.JAXXCompilerFinalizer; import jaxx.compiler.java.JavaFileGenerator; import jaxx.compiler.tools.jaxxcapture.CapturedObject; import jaxx.compiler.tools.jaxxcapture.ContextNode; @@ -46,6 +47,8 @@ public class ObjectHandler { private static int count; + public static final String ATTRIBUTE_PROPERTY = "property"; + protected CapturedObject createCapturedObject(String className, JAXXCapture capture) { return new CapturedObject(this, className, capture); } @@ -59,7 +62,7 @@ Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element innerTag = (Element) child; - if (innerTag.getTagName().equals("void")) { + if (innerTag.getTagName().equals(JAXXCompilerFinalizer.TYPE_VOID)) { result = true; } evaluate(innerTag, context, capture); @@ -80,7 +83,7 @@ } assert contextObject != null; - String property = tag.getAttribute("property"); + String property = tag.getAttribute(ATTRIBUTE_PROPERTY); if (!property.equals("actionCommand")) { // filter out actionCommand due to screwiness in XMLEncoder's handling of it Object current = context.peek(); PropertyNode newContext = new PropertyNode(property); @@ -173,8 +176,8 @@ } else { currentNode.addArgument(capture.processObject(tag, context)); } - } else if (tagName.equals("void")) { - String property = tag.getAttribute("property"); + } else if (tagName.equals(JAXXCompilerFinalizer.TYPE_VOID)) { + String property = tag.getAttribute(ATTRIBUTE_PROPERTY); if (property.length() > 0) { evaluateProperty(tag, context, capture); } else { @@ -227,7 +230,7 @@ Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) child; - if (element.getTagName().equals("void") && element.getAttribute("property").equals("name")) { + if (element.getTagName().equals(JAXXCompilerFinalizer.TYPE_VOID) && element.getAttribute(ATTRIBUTE_PROPERTY).equals("name")) { evaluate(element, context, capture); String name = capturedObject.getProperty("name"); if (name != null && !capture.getCapturedObjects().containsKey(name)) { @@ -243,7 +246,7 @@ Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) child; - if (!element.getTagName().equals("void") || !element.getAttribute("property").equals("name")) { + if (!JAXXCompilerFinalizer.TYPE_VOID.equals(element.getTagName()) || !element.getAttribute(ATTRIBUTE_PROPERTY).equals("name")) { evaluate(element, context, capture); } }