This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository jaxx. See https://gitlab.nuiton.org/nuiton/jaxx.git commit c606feb3463f00b7993d4cb490885b4ea3132011 Author: Tony CHEMIT <chemit@codelutin.com> Date: Fri Dec 30 08:40:36 2016 +0100 Improve initialization of generated UI (fixes #4101) --- .../src/main/java/jaxx/compiler/JAXXCompiler.java | 15 +- .../decorators/DefaultCompiledObjectDecorator.java | 5 +- .../jaxx/compiler/finalizers/DefaultFinalizer.java | 660 +++++++++------------ .../main/java/jaxx/compiler/java/JavaField.java | 4 +- .../main/java/jaxx/compiler/java/JavaMethod.java | 12 +- .../java/jaxx/compiler/java/JavaMethodTest.java | 8 +- 6 files changed, 285 insertions(+), 419 deletions(-) diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java index 3c9ef45..b12e9a1 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/JAXXCompiler.java @@ -764,14 +764,12 @@ public class JAXXCompiler { throw new RuntimeException("Coul not find class ",e); } - String methodName = "createHandler"; - JavaField field = JavaElementFactory.newField( - Modifier.PROTECTED | Modifier.FINAL, + Modifier.PROTECTED, handler, DefaultObjectHandler.HANDLER_ATTRIBUTE, !addField, - methodName + "()"); + null); if (addField) { @@ -786,15 +784,6 @@ public class JAXXCompiler { true); } - String handlerType = getImportedType(handler); - JavaMethod method = JavaElementFactory.newMethod( - Modifier.PROTECTED, - handlerType, - methodName, - "return new " + handlerType + "();", - !addField); - javaFile.addMethod(method); - } compileSecondPass(document.getDocumentElement()); } 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 81861ff..86f2fb8 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/decorators/DefaultCompiledObjectDecorator.java @@ -120,7 +120,7 @@ public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator { type, id, false, - "this" + null ); javaFile.addSimpleField(field); @@ -277,8 +277,7 @@ public class DefaultCompiledObjectDecorator implements CompiledObjectDecorator { String additionCode = object.getAdditionCode(); if (additionCode.length() > 0) { code.append(object.getAdditionMethodName()).append("();").append(eol); - additionCode = "if (!allComponentsCreated) {" + eol + - " return;" + eol + "}" + eol + additionCode; +// additionCode = "if (!allComponentsCreated) {" + eol + " return;" + eol + "}" + eol + additionCode; javaFile.addMethod(JavaElementFactory.newMethod( Modifier.PROTECTED, JAXXCompilerFinalizer.TYPE_VOID, diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java b/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java index 50f1a54..afcc93f 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/finalizers/DefaultFinalizer.java @@ -48,7 +48,6 @@ import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXObjectDescriptor; import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -96,10 +95,6 @@ public class DefaultFinalizer extends AbstractFinalizer { public static final String FIELD_NAME_$ACTIVE_BINDINGS = "$activeBindings"; - public static final String FIELD_NAME_ALL_COMPONENTS_CREATED = "allComponentsCreated"; - - public static final String FIELD_NAME_CONTEXT_INITIALIZED = "contextInitialized"; - public static final String FIELD_NAME_$PREVIOUS_VALUES = "$previousValues"; public static final String FIELD_NAME_$BINDINGS = "$bindings"; @@ -114,8 +109,6 @@ public class DefaultFinalizer extends AbstractFinalizer { public static final String METHOD_NAME_$GET_JAXXOBJECT_DESCRIPTOR = "$getJAXXObjectDescriptor"; - public static final String METHOD_NAME_$REGISTER_DEFAULT_BINDINGS = "$registerDefaultBindings"; - public static final String METHOD_NAME_REGISTER_DATA_BINDING = "registerDataBinding"; public static final String METHOD_NAME_REMOVE_DATA_BINDING = "removeDataBinding"; @@ -129,10 +122,12 @@ public class DefaultFinalizer extends AbstractFinalizer { public static final String METHOD_NAME_$GET_PROPERTY_CHANGE_SUPPORT = "$getPropertyChangeSupport"; public static final String METHOD_NAME_$INITIALIZE = "$initialize"; - - public static final String METHOD_NAME_$COMPLETE_SETUP = "$completeSetup"; - - public static final String METHOD_NAME_$AFTER_COMPLETE_SETUP = "$afterCompleteSetup"; + public static final String METHOD_NAME_$INITIALIZE_01_CREATE_COMPONENTS = "$initialize_01_createComponents"; + public static final String METHOD_NAME_$INITIALIZE_02_REGISTER_DATA_BINDINGS = "$initialize_02_registerDataBindings"; + public static final String METHOD_NAME_$INITIALIZE_03_FINALIZE_CREATE_COMPONENTS = "$initialize_03_finalizeCreateComponents"; + public static final String METHOD_NAME_$INITIALIZE_04_APPLY_DATA_BINDINGS = "$initialize_04_applyDataBindings"; + public static final String METHOD_NAME_$INITIALIZE_05_SET_PROPERTIES = "$initialize_05_setProperties"; + public static final String METHOD_NAME_$INITIALIZE_06_FINALIZE_INITIALIZE = "$initialize_06_finalizeInitialize"; /** serialVersionUID field */ @@ -183,27 +178,6 @@ public class DefaultFinalizer extends AbstractFinalizer { /** * */ - protected static final JavaField ALL_COMPONENTS_CREATED_FIELD = newField( - PRIVATE, - TYPE_BOOLEAN, - FIELD_NAME_ALL_COMPONENTS_CREATED, - false - ); - - /** - * - */ - protected static final JavaField CONTEXT_INITIALIZED = newField( - PRIVATE, - TYPE_BOOLEAN, - FIELD_NAME_CONTEXT_INITIALIZED, - false, - "true" - ); - - /** - * - */ protected static final JavaField PREVIOUS_VALUES_FIELD = newField( PROTECTED, Map.class.getName() + "<?,?>", FIELD_NAME_$PREVIOUS_VALUES, @@ -350,7 +324,7 @@ public class DefaultFinalizer extends AbstractFinalizer { JAXXObjectDescriptor.class.getName(), METHOD_NAME_$GET_JAXXOBJECT_DESCRIPTOR, "return %s.decodeCompressedJAXXObjectDescriptor(" + - FIELD_NAME_$JAXX_OBJECT_DESCRIPTOR + ");", + FIELD_NAME_$JAXX_OBJECT_DESCRIPTOR + ");", false ); @@ -438,8 +412,8 @@ public class DefaultFinalizer extends AbstractFinalizer { PropertyChangeSupport.class.getName(), METHOD_NAME_$GET_PROPERTY_CHANGE_SUPPORT, "if (" + FIELD_NAME_$PROPERTY_CHANGE_SUPPORT + " == null)\n" + - " " + FIELD_NAME_$PROPERTY_CHANGE_SUPPORT + " = new PropertyChangeSupport(this);\n" + - "return " + FIELD_NAME_$PROPERTY_CHANGE_SUPPORT + ";", + " " + FIELD_NAME_$PROPERTY_CHANGE_SUPPORT + " = new PropertyChangeSupport(this);\n" + + "return " + FIELD_NAME_$PROPERTY_CHANGE_SUPPORT + ";", false ); @@ -493,8 +467,6 @@ public class DefaultFinalizer extends AbstractFinalizer { newArgument(PropertyChangeListener.class.getName(), "listener") ); - private static final String PARAMETER_NAME_PARENT_CONTEXT = "parentContext"; - public static final String METHOD_NAME$BEFORE_INIT = "beforeInit"; private static final String METHOD_NAME$AFTER_INIT = "afterInit"; @@ -514,7 +486,7 @@ public class DefaultFinalizer extends AbstractFinalizer { String className) throws ClassNotFoundException { String fullClassName = packageName != null ? - packageName + "." + className : className; + packageName + "." + className : className; if (root == null) { throw new CompilerException("root tag can not be null"); } @@ -552,28 +524,25 @@ public class DefaultFinalizer extends AbstractFinalizer { addJAXXObjectSupport(compiler, root, javaFile); addSimpleField(javaFile, SERIAL_VERSION_UID_FIELD); - addSimpleField(javaFile, ALL_COMPONENTS_CREATED_FIELD); addJAXXObjectDescriptorField(compiler, javaFile); - addMethod(javaFile, - GET_JAXX_OBJECT_DESCRIPTOR_METHOD, - JAXXUtil.class.getName() - ); + addMethod(javaFile, GET_JAXX_OBJECT_DESCRIPTOR_METHOD, JAXXUtil.class.getName()); addPreviousValuesField(compiler, javaFile, root); -// addConstructors(compiler, javaFile, className); - DataBinding[] bindings = compiler.getBindingHelper().getDataBindings(); - addInitializerMethod(compiler, javaFile, bindings.length); + addInitializerMethod(compiler, javaFile); + addInitialize_01_createComponents(compiler, javaFile); + addInitialize_02_registerDataBindings(compiler, javaFile); + addInitialize_03_finalizeCreateComponents(compiler, javaFile); + addInitialize_04_applyDataBindings(compiler, javaFile); + addInitialize_05_setProperties(compiler, javaFile); + addInitialize_06_finalizeInitialize(compiler, javaFile); javaFile.addBodyCode(compiler.getBodyCode().toString()); addDataBindings(compiler, javaFile, bindings); - - addCompleteSetupMethod(compiler, javaFile); - addEventHandlers(compiler, javaFile); } @@ -586,18 +555,10 @@ public class DefaultFinalizer extends AbstractFinalizer { return; } - // create the $registerDefaultBindings method - - for (JAXXBindingWriter<?> writer : bindingWriters) { - writer.reset(); - } - addRegisteredDefaultBindingsMethod(compiler, javaFile); - // add import on each type of JAXXBinding used - for (JAXXBindingWriter<?> writer : bindingWriters) { if (writer.isUsed()) { - compiler.getJavaFile().addImport(writer.getType()); + javaFile.addImport(writer.getType()); } } @@ -610,53 +571,15 @@ public class DefaultFinalizer extends AbstractFinalizer { // add the data binding constant Id compiler.addSimpleField(newField( - (constantId.startsWith("BINDING_$") ? PRIVATE : PUBLIC) | FINAL | STATIC, - TYPE_STRING, - constantId, - false, - TypeManager.getJavaCode(binding.getRealId())) + (constantId.startsWith("BINDING_$") ? PRIVATE : PUBLIC) | FINAL | STATIC, + TYPE_STRING, + constantId, + false, + TypeManager.getJavaCode(binding.getRealId())) ); } } - protected void addConstructors(JAXXCompiler compiler, - JavaFile javaFile, - String className) { - - boolean superclassIsJAXXObject = javaFile.isSuperclassIsJAXXObject(); - - //TC 20090228 - only generate constructors if not done in scripts - boolean constructorDetected = false; - MethodDescriptor[] methods = compiler.getScriptMethods(); - for (MethodDescriptor m : methods) { - try { - m.getReturnType(); - if (className.equals(m.getName())) { - constructorDetected = true; - break; - } - } catch (Exception e) { - log.warn("could not find return type " + m); - } - } - if (!constructorDetected) { - - //creates default constructors - - JavaMethod constructor = createConstructor(compiler, - className, - superclassIsJAXXObject - ); - javaFile.addMethod(constructor); - constructor = createConstructorWithInitialContext( - compiler, - className, - superclassIsJAXXObject - ); - javaFile.addMethod(constructor); - } - } - protected void addJAXXObjectSupport(JAXXCompiler compiler, CompiledObject root, JavaFile javaFile) { @@ -694,11 +617,11 @@ public class DefaultFinalizer extends AbstractFinalizer { javaFile.getImportedType(jaxxContextImplementorClass); javaFile.addField(newField( - PROTECTED | FINAL, - JAXXContext.class.getName(), - FIELD_NAME_DELEGATE_CONTEXT, - true, - "new " + type + "()") + PROTECTED | FINAL, + JAXXContext.class.getName(), + FIELD_NAME_DELEGATE_CONTEXT, + true, + "new " + type + "()") ); javaFile.addImport(Container.class); @@ -711,8 +634,6 @@ public class DefaultFinalizer extends AbstractFinalizer { javaFile.addMethod(REMOVE_CONTEXT_VALUE_NAMED_METHOD); addMethod(javaFile, GET_PARENT_CONTAINER_METHOD, SwingUtil.class.getName()); addMethod(javaFile, GET_PARENT_CONTAINER_MORE_METHOD, SwingUtil.class.getName()); -// javaFile.addMethod(GET_PARENT_CONTAINER_METHOD); -// javaFile.addMethod(GET_PARENT_CONTAINER_MORE_METHOD); // PropertyChangeSupport addPropertyChangeSupport(root, javaFile); @@ -725,15 +646,13 @@ public class DefaultFinalizer extends AbstractFinalizer { protected void addLoggerSupport(JAXXCompiler compiler, JavaFile javaFile, String className) { if (compiler.getConfiguration().isAddLogger()) { -// javaFile.addImport(LogFactory.class); - javaFile.addSimpleField(newField( - PRIVATE | STATIC | FINAL, - Log.class.getName(), - "log", - false, - "%s.getLog(" + className + ".class)", - LogFactory.class.getName() + PRIVATE | STATIC | FINAL, + Log.class.getName(), + "log", + false, + "%s.getLog(" + className + ".class)", + LogFactory.class.getName() ) ); } @@ -741,7 +660,7 @@ public class DefaultFinalizer extends AbstractFinalizer { protected final JAXXBindingWriter<?>[] bindingWriters = new JAXXBindingWriter[]{new SimpleJAXXObjectBindingWriter(), - new DefaultJAXXBindingWriter() + new DefaultJAXXBindingWriter() }; /*---------------------------------------------------------------------------------*/ @@ -779,11 +698,11 @@ public class DefaultFinalizer extends AbstractFinalizer { for (int i = 0; i < data.length(); i += sizeLimit) { String name = FIELD_NAME_$JAXX_OBJECT_DESCRIPTOR + i; javaFile.addField(newField( - PRIVATE | STATIC, - TYPE_STRING, - name, - false, - TypeManager.getJavaCode(data.substring(i, Math.min(i + sizeLimit, data.length())))) + PRIVATE | STATIC, + TYPE_STRING, + name, + false, + TypeManager.getJavaCode(data.substring(i, Math.min(i + sizeLimit, data.length())))) ); if (initializer.length() > 0) { initializer.append(" + "); @@ -837,7 +756,7 @@ public class DefaultFinalizer extends AbstractFinalizer { } if (needField && log.isDebugEnabled()) { log.debug("no " + PREVIOUS_VALUES_FIELD.getName() + - " field in super class"); + " field in super class"); } } if (needField) { @@ -868,7 +787,7 @@ public class DefaultFinalizer extends AbstractFinalizer { } int modifiers = firePropertyChange != null ? - firePropertyChange.getModifiers() : 0; + firePropertyChange.getModifiers() : 0; if (isPublic(modifiers)) { // we have all the support we need return; @@ -890,37 +809,212 @@ public class DefaultFinalizer extends AbstractFinalizer { } } - protected JavaMethod addRegisteredDefaultBindingsMethod(JAXXCompiler compiler, - JavaFile javaFile) { - DataBinding[] bindings = compiler.getBindingHelper().getDataBindings(); - StringBuilder initCode = new StringBuilder(); + protected void addInitialize_01_createComponents(JAXXCompiler compiler, JavaFile javaFile) { + StringBuilder body = new StringBuilder(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + String eol = JAXXCompiler.getLineSeparator(); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_01_CREATE_COMPONENTS)).append(eol); + } + + CompiledObject root = compiler.getRootObject(); + + String rootId = root.getId(); + body.append(FIELD_NAME_$OBJECT_MAP + ".put(").append(TypeManager.getJavaCode(rootId)).append(", ").append(rootId).append(");").append(eol); + + Iterator<CompiledObject> i = compiler.getObjectCreationOrder(); + boolean lastWasMethodCall = false; + //TODO-TC20091025 should do init of root first ? +// root.getDecorator().createInitializer(compiler, root, root, code, lastWasMethodCall); + while (i.hasNext()) { + CompiledObject object = i.next(); + if (object == root) { + continue; + } + CompiledObjectDecorator decorator = object.getDecorator(); + lastWasMethodCall = decorator.createInitializer(compiler, + root, + object, + body, + lastWasMethodCall + ); + } + root.getDecorator().createInitializer(compiler, + root, + root, + body, + lastWasMethodCall + ); + if (compiler.getInitializer().length() > 0) { + body.append(compiler.getInitializer()); + } + JavaMethod method = newMethod(PROTECTED, + TYPE_VOID, + METHOD_NAME_$INITIALIZE_01_CREATE_COMPONENTS, + body.toString(), + javaFile.isSuperclassIsJAXXObject() + ); + javaFile.addMethod(method); + } + protected void addInitialize_02_registerDataBindings(JAXXCompiler compiler, JavaFile javaFile) { + StringBuilder body = new StringBuilder(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); String eol = JAXXCompiler.getLineSeparator(); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_02_REGISTER_DATA_BINDINGS)).append(eol); + } JavaFileGenerator generator = new JavaFileGenerator(eol, true); //TODO use optimized writer for simple cases - initCode.append("// register "); - initCode.append(bindings.length); - initCode.append(" data bindings"); - initCode.append(eol); + for (JAXXBindingWriter<?> writer : bindingWriters) { + writer.reset(); + } + + // add import on each type of JAXXBinding used + + for (JAXXBindingWriter<?> writer : bindingWriters) { + if (writer.isUsed()) { + compiler.getJavaFile().addImport(writer.getType()); + } + } + + DataBinding[] bindings = compiler.getBindingHelper().getDataBindings(); + body.append("// register "); + body.append(bindings.length); + body.append(" data bindings"); + body.append(eol); for (DataBinding binding : bindings) { for (JAXXBindingWriter<?> writer : bindingWriters) { if (writer.accept(binding)) { - writer.write(binding, generator, initCode); + writer.write(binding, generator, body); break; } } } - JavaMethod method = newMethod(PRIVATE, + JavaMethod method = newMethod(PROTECTED, TYPE_VOID, - METHOD_NAME_$REGISTER_DEFAULT_BINDINGS, - initCode.toString(), - false + METHOD_NAME_$INITIALIZE_02_REGISTER_DATA_BINDINGS, + body.toString(), + javaFile.isSuperclassIsJAXXObject() + ); + javaFile.addMethod(method); + } + + protected void addInitialize_03_finalizeCreateComponents(JAXXCompiler compiler, JavaFile javaFile) { + + StringBuilder body = new StringBuilder(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + String eol = JAXXCompiler.getLineSeparator(); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_03_FINALIZE_CREATE_COMPONENTS)).append(eol); + } + for (CompiledObject object : compiler.getObjects().values()) { + CompiledObjectDecorator decorator = object.getDecorator(); + body.append(decorator.createCompleteSetupMethod(compiler, + object, + javaFile) + ); + } + JavaMethod method = newMethod(PROTECTED, + TYPE_VOID, + METHOD_NAME_$INITIALIZE_03_FINALIZE_CREATE_COMPONENTS, + body.toString(), + javaFile.isSuperclassIsJAXXObject() + ); + javaFile.addMethod(method); + } + + protected void addInitialize_04_applyDataBindings(JAXXCompiler compiler, JavaFile javaFile) { + StringBuilder body = new StringBuilder(); + String eol = JAXXCompiler.getLineSeparator(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_04_APPLY_DATA_BINDINGS)).append(eol); + } + DataBinding[] bindings = compiler.getBindingHelper().getDataBindings(); + if (bindings.length > 0) { + + body.append(eol); + body.append("// apply "); + body.append(bindings.length); + body.append(" data bindings"); + body.append(eol); + body.append(JAXXUtil.class.getSimpleName()); + body.append("." + METHOD_NAME_APPLY_DATA_BINDING + "(this, " + FIELD_NAME_$BINDINGS + ".keySet());"); + body.append(eol); + + } + JavaMethod method = newMethod(PROTECTED, + TYPE_VOID, + METHOD_NAME_$INITIALIZE_04_APPLY_DATA_BINDINGS, + body.toString(), + javaFile.isSuperclassIsJAXXObject() + ); + javaFile.addMethod(method); + } + + protected void addInitialize_05_setProperties(JAXXCompiler compiler, JavaFile javaFile) { + StringBuilder body = new StringBuilder(); + String eol = JAXXCompiler.getLineSeparator(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_05_SET_PROPERTIES)).append(eol); + } + DataBinding[] bindings = compiler.getBindingHelper().getSimpleBindings(); + if (bindings.length > 0) { + + StringBuilder initCode = new StringBuilder(); + + for (DataBinding binding : bindings) { + + String binding1 = binding.getInitDataBinding(); + if (binding1 != null && !binding1.trim().isEmpty()) { + initCode.append(binding1); + } + } + + if (initCode.length() > 0) { + + body.append(eol); + body.append("// apply "); + body.append(bindings.length); + body.append(" property setters"); + body.append(eol); + body.append(initCode.toString().trim()); + + } + } + + if (compiler.getLateInitializer().length() > 0) { + body.append("// late initializer").append(eol); + body.append(compiler.getLateInitializer()).append(eol); + } + JavaMethod method = newMethod(PROTECTED, + TYPE_VOID, + METHOD_NAME_$INITIALIZE_05_SET_PROPERTIES, + body.toString(), + javaFile.isSuperclassIsJAXXObject() + ); + javaFile.addMethod(method); + } + + protected void addInitialize_06_finalizeInitialize(JAXXCompiler compiler, JavaFile javaFile) { + StringBuilder body = new StringBuilder(); + body.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + String eol = JAXXCompiler.getLineSeparator(); + if (javaFile.isSuperclassIsJAXXObject()) { + body.append(String.format("super.%s();", METHOD_NAME_$INITIALIZE_06_FINALIZE_INITIALIZE)).append(eol); + } + JavaMethod method = newMethod(PROTECTED, + TYPE_VOID, + METHOD_NAME_$INITIALIZE_06_FINALIZE_INITIALIZE, + body.toString(), + javaFile.isSuperclassIsJAXXObject() ); javaFile.addMethod(method); - return method; } protected void addEventHandlers(JAXXCompiler compiler, @@ -940,9 +1034,9 @@ public class DefaultFinalizer extends AbstractFinalizer { if (listenerMethod.getParameterTypes().length != 1) { throw new CompilerException( "Expected event handler " + - listenerMethod.getName() + " of class " + - handler.getListenerClass() + - " to have exactly one argument" + listenerMethod.getName() + " of class " + + handler.getListenerClass() + + " to have exactly one argument" ); } @@ -958,290 +1052,72 @@ public class DefaultFinalizer extends AbstractFinalizer { String body = JavaFileGenerator.addDebugLoggerInvocation(compiler, "event"); body += handler.getJavaCode(); javaFile.addMethod(JavaElementFactory.newMethod( - PUBLIC, - TYPE_VOID, - methodName, - body, - false, - argument) + PUBLIC, + TYPE_VOID, + methodName, + body, + false, + argument) ); } } } } - protected JavaMethod createConstructor(JAXXCompiler compiler, - String className, - boolean superclassIsJAXXObject) throws CompilerException { - StringBuilder code = new StringBuilder(); - String constructorParams = compiler.getRootObject().getConstructorParams(); - String eol = JAXXCompiler.getLineSeparator(); - if (constructorParams != null) { - code.append(" super("); - code.append(constructorParams); - code.append(");"); - code.append(eol); - } else { -// if (superclassIsJAXXObject) { -// code.append(" super();").append(eol); -// } - } - code.append(METHOD_NAME_$INITIALIZE + "();"); - code.append(eol); - return JavaElementFactory.newMethod(PUBLIC, - null, - className, - code.toString(), - false - ); - } - - protected JavaMethod createConstructorWithInitialContext(JAXXCompiler compiler, - String className, - boolean superclassIsJAXXObject) throws CompilerException { - StringBuilder code = new StringBuilder(); - String constructorParams = compiler.getRootObject().getConstructorParams(); - String eol = JAXXCompiler.getLineSeparator(); - String realConstructorParams = ""; - if (superclassIsJAXXObject) { - realConstructorParams = PARAMETER_NAME_PARENT_CONTEXT; - } - if (constructorParams != null) { - - if (superclassIsJAXXObject) { - realConstructorParams += " ,"; - } - realConstructorParams += constructorParams; - } - - realConstructorParams = realConstructorParams.trim(); - - if (StringUtils.isNotEmpty(realConstructorParams)) { - - // add a super invocation - code.append(" super("); - code.append(realConstructorParams); - code.append(");"); - code.append(eol); - } - - -// if (constructorParams != null) { -// if (superclassIsJAXXObject) { -// //TODO-TC20091127 This MUST be a convention in JAXX : all specialized constructor must a second -// //TODO constructor with extra first parameter as parentContext -// constructorParams = PARAMETER_NAME_PARENT_CONTEXT + ", " + constructorParams; -// } -// code.append(" super("); -// code.append(constructorParams); -// code.append(");"); -// code.append(eol); -// } else { -// if (superclassIsJAXXObject) { -// code.append(" super(" + PARAMETER_NAME_PARENT_CONTEXT); -// code.append(");"); -// code.append(eol); -// } -// } - if (!superclassIsJAXXObject) { - String prefix = compiler.getImportedType(JAXXUtil.class); - code.append(prefix); - code.append(".initContext(this, " + PARAMETER_NAME_PARENT_CONTEXT + ");"); - code.append(eol); - } - code.append(METHOD_NAME_$INITIALIZE + "();"); - code.append(eol); - JavaArgument argument = JavaElementFactory.newArgument( - JAXXContext.class.getName(), - PARAMETER_NAME_PARENT_CONTEXT - ); - return JavaElementFactory.newMethod(PUBLIC, - null, - className, - code.toString(), - false, - argument - ); - } - - public JavaMethod addInitializerMethod(JAXXCompiler compiler, - JavaFile javaFile, - int nbBindings) throws CompilerException { - - boolean overrideContextInitialized = - compiler.containsScriptField(FIELD_NAME_CONTEXT_INITIALIZED); + public JavaMethod addInitializerMethod(JAXXCompiler compiler, JavaFile javaFile) { String eol = JAXXCompiler.getLineSeparator(); StringBuilder code = new StringBuilder(); - CompiledObject root = compiler.getRootObject(); - 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); code.append(JavaFileGenerator.addDebugLoggerInvocation(compiler, "this")); + code.append(compiler.getRootObject().getId()).append(" = this;").append(eol); + boolean useHandler = compiler.isUseHandler(); if (useHandler) { + String handler = compiler.getUiHandler(); + String handlerType = compiler.getImportedType(handler); + code.append("handler = new ").append(handlerType).append("();").append(eol); code.append("handler." + METHOD_NAME$BEFORE_INIT + "(this);").append(eol); } - code.append(FIELD_NAME_$OBJECT_MAP + ".put("); - 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; - //TODO-TC20091025 should do init of root first ? -// root.getDecorator().createInitializer(compiler, root, root, code, lastWasMethodCall); - while (i.hasNext()) { - CompiledObject object = i.next(); - if (object == root) { - continue; - } - CompiledObjectDecorator decorator = object.getDecorator(); - lastWasMethodCall = decorator.createInitializer(compiler, - root, - object, - code, - lastWasMethodCall - ); - } - root.getDecorator().createInitializer(compiler, - root, - root, - code, - lastWasMethodCall - ); - if (compiler.getInitializer().length() > 0) { - code.append(compiler.getInitializer()); - } - // register bindings before anything else - if (nbBindings > 0) { - // ajout invocation a la methode d'enregistrement des bindings - code.append("// registers "); - code.append(nbBindings); - code.append(" data bindings"); + if (javaFile.isSuperclassIsJAXXObject()) { + code.append("super." + METHOD_NAME_$INITIALIZE + "();").append(eol); + } else { + code.append(METHOD_NAME_$INITIALIZE_01_CREATE_COMPONENTS + "();"); + code.append(eol); + + code.append(METHOD_NAME_$INITIALIZE_02_REGISTER_DATA_BINDINGS + "();"); + code.append(eol); + + code.append(METHOD_NAME_$INITIALIZE_03_FINALIZE_CREATE_COMPONENTS + "();"); + code.append(eol); + + code.append(METHOD_NAME_$INITIALIZE_04_APPLY_DATA_BINDINGS + "();"); + code.append(eol); + code.append(METHOD_NAME_$INITIALIZE_05_SET_PROPERTIES + "();"); code.append(eol); - code.append(METHOD_NAME_$REGISTER_DEFAULT_BINDINGS + "();"); + code.append(METHOD_NAME_$INITIALIZE_06_FINALIZE_INITIALIZE + "();"); code.append(eol); } - code.append(METHOD_NAME_$COMPLETE_SETUP + "();"); - code.append(eol); if (useHandler) { code.append("handler." + METHOD_NAME$AFTER_INIT + "(this);").append(eol); } - JavaMethod method = JavaElementFactory.newMethod(PRIVATE, + JavaMethod method = JavaElementFactory.newMethod(PROTECTED, TYPE_VOID, METHOD_NAME_$INITIALIZE, code.toString(), - false + javaFile.isSuperclassIsJAXXObject() ); javaFile.addMethod(method); return method; } - protected JavaMethod addCompleteSetupMethod(JAXXCompiler compiler, - JavaFile javaFile) { - StringBuilder code = new StringBuilder(); - 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, - object, - javaFile) - ); - } - String simpleBindingsCode = createInitBindingsCode(compiler); - if (simpleBindingsCode != null && !simpleBindingsCode.isEmpty()) { - code.append(simpleBindingsCode).append(eol); - } - - if (compiler.getLateInitializer().length() > 0) { - code.append("// late initializer").append(eol); - code.append(compiler.getLateInitializer()).append(eol); - } - //TC-20090313 add an extra method after complete setup - MethodDescriptor method = - compiler.getScriptMethod(METHOD_NAME_$AFTER_COMPLETE_SETUP); - - if (method != null) { - if (compiler.isUseHandler()) { - - compiler.reportWarning("Should not use deprecated api $afterCompleteSetup, prefer declare a 'handler' attribute on root object."); - - } - code.append(METHOD_NAME_$AFTER_COMPLETE_SETUP + "();").append(eol); - } - JavaMethod javaMethod = JavaElementFactory.newMethod(PRIVATE, - TYPE_VOID, - METHOD_NAME_$COMPLETE_SETUP, - code.toString(), - false - ); - javaFile.addMethod(javaMethod); - return javaMethod; - } - - protected String createInitBindingsCode(JAXXCompiler compiler) { - String eol = JAXXCompiler.getLineSeparator(); - DataBinding[] bindings; - - StringBuilder result = new StringBuilder(); - - bindings = compiler.getBindingHelper().getDataBindings(); - if (bindings.length > 0) { - - result.append(eol); - result.append("// apply "); - result.append(bindings.length); - result.append(" data bindings"); - result.append(eol); - result.append(JAXXUtil.class.getSimpleName()); - result.append("." + METHOD_NAME_APPLY_DATA_BINDING + "(this, " + FIELD_NAME_$BINDINGS + ".keySet());"); - result.append(eol); - - } - bindings = compiler.getBindingHelper().getSimpleBindings(); - if (bindings.length > 0) { - - StringBuilder initCode = new StringBuilder(); - - for (DataBinding binding : bindings) { - - String binding1 = binding.getInitDataBinding(); - if (binding1 != null && !binding1.trim().isEmpty()) { - initCode.append(binding1); - } - } - - if (initCode.length() > 0) { - - result.append(eol); - result.append("// apply "); - result.append(bindings.length); - result.append(" property setters"); - result.append(eol); - result.append(initCode.toString().trim()); - - } - } - return result.toString(); - } - protected JavaMethod createApplyDataBindingMethod() { StringBuilder buffer = new StringBuilder(); String eol = JAXXCompiler.getLineSeparator(); - buffer.append("if (" + FIELD_NAME_ALL_COMPONENTS_CREATED + " && " + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); + buffer.append("if (" + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); buffer.append(eol); buffer.append(" getDataBinding(" + PARAMETER_NAME_$BINDING + ")." + METHOD_NAME_APPLY_DATA_BINDING + "();"); buffer.append(eol); @@ -1262,7 +1138,7 @@ public class DefaultFinalizer extends AbstractFinalizer { StringBuilder buffer = new StringBuilder(); String eol = JAXXCompiler.getLineSeparator(); - buffer.append("if (" + FIELD_NAME_ALL_COMPONENTS_CREATED + " && " + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); + buffer.append("if (" + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); buffer.append(eol); buffer.append(" getDataBinding(" + PARAMETER_NAME_$BINDING + ")." + METHOD_NAME_REMOVE_DATA_BINDING + "();"); buffer.append(eol); @@ -1293,7 +1169,7 @@ public class DefaultFinalizer extends AbstractFinalizer { code.append(FIELD_NAME_$ACTIVE_BINDINGS + ".add(" + PARAMETER_NAME_$BINDING + ");"); code.append(eol); code.append("try {").append(eol); - code.append(" if (" + FIELD_NAME_ALL_COMPONENTS_CREATED + " && " + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); + code.append(" if (" + FIELD_NAME_$BINDINGS + ".containsKey(" + PARAMETER_NAME_$BINDING + ")) {"); code.append(eol); code.append(" getDataBinding(" + PARAMETER_NAME_$BINDING + ")." + METHOD_NAME_PROCESS_DATA_BINDING + "();"); code.append(eol); diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java b/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java index 54eea64..3c64027 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaField.java @@ -182,9 +182,7 @@ public class JavaField extends JavaElement implements Comparable<JavaField> { "$objectMap", "$activeBindings", "$bindings", - "$propertyChangeSupport", - "allComponentsCreated", - "contextInitialized"); + "$propertyChangeSupport"); @Override public boolean accept(JavaField field) { diff --git a/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java b/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java index ef3583b..4896759 100644 --- a/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java +++ b/jaxx-compiler/src/main/java/jaxx/compiler/java/JavaMethod.java @@ -232,11 +232,15 @@ public class JavaMethod extends JavaElement implements Comparable<JavaMethod> { method.getName().startsWith("add"); } }, - internalMethod(Modifier.PRIVATE, "Internal jaxx methods") { + internalMethod(Modifier.PROTECTED, "Internal jaxx methods") { private final List<String> methods = Arrays.asList( - "$completeSetup", - "$registerDefaultBindings", - "$initialize"); + "$initialize", + "$initialize_01_createComponents", + "$initialize_02_registerDataBindings", + "$initialize_03_finalizeCreateComponents", + "$initialize_04_applyDataBindings", + "$initialize_05_setProperties", + "$initialize_06_finalizeInitialize"); @Override public boolean accept(JavaMethod method) { diff --git a/jaxx-compiler/src/test/java/jaxx/compiler/java/JavaMethodTest.java b/jaxx-compiler/src/test/java/jaxx/compiler/java/JavaMethodTest.java index 5ab4b8b..60801bb 100644 --- a/jaxx-compiler/src/test/java/jaxx/compiler/java/JavaMethodTest.java +++ b/jaxx-compiler/src/test/java/jaxx/compiler/java/JavaMethodTest.java @@ -71,15 +71,15 @@ public class JavaMethodTest { constants = JavaMethod.getMethodOrderScope(allConstants, Modifier.PROTECTED); - Assert.assertEquals(3, constants.size()); + Assert.assertEquals(4, constants.size()); Assert.assertTrue(constants.contains(MethodOrder.protectedGetters)); Assert.assertTrue(constants.contains(MethodOrder.protecteds)); Assert.assertTrue(constants.contains(MethodOrder.createMethod)); - + Assert.assertTrue(constants.contains(MethodOrder.internalMethod)); constants = JavaMethod.getMethodOrderScope(allConstants, Modifier.PRIVATE); - Assert.assertEquals(4, constants.size()); - Assert.assertTrue(constants.contains(MethodOrder.internalMethod)); + Assert.assertEquals(3, constants.size()); + Assert.assertTrue(constants.contains(MethodOrder.createMethod)); Assert.assertTrue(constants.contains(MethodOrder.packageLocal)); Assert.assertTrue(constants.contains(MethodOrder.privates)); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.