diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/copyable/CopyablePlugin.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/copyable/CopyablePlugin.java index 8b6f236c..34376920 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/copyable/CopyablePlugin.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/copyable/CopyablePlugin.java @@ -23,7 +23,7 @@ import org.xml.sax.ErrorHandler; import com.sun.codemodel.JBlock; -import com.sun.codemodel.JClass; +//import com.sun.codemodel.JClass; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JConditional; import com.sun.codemodel.JDefinedClass; @@ -154,11 +154,9 @@ protected void processClassOutline(ClassOutline classOutline) { final JMethod newMethod = theClass.method(JMod.PUBLIC, theClass .owner().ref(Object.class), "createNewInstance"); - newMethod.annotate(Override.class); - { - final JBlock body = newMethod.body(); - body._return(JExpr._new(theClass)); - } + newMethod.annotate(Override.class); // DEMATIC + final JBlock body = newMethod.body(); + body._return(JExpr._new(theClass)); return newMethod; } else { return existingMethod; @@ -167,15 +165,12 @@ protected void processClassOutline(ClassOutline classOutline) { protected JMethod generateObject$clone(final ClassOutline classOutline, final JDefinedClass theClass) { - final JMethod clone = theClass.method(JMod.PUBLIC, theClass.owner() .ref(Object.class), "clone"); - clone.annotate(Override.class); - { - final JBlock body = clone.body(); - body._return(JExpr.invoke("copyTo").arg( - JExpr.invoke("createNewInstance"))); - } + clone.annotate(Override.class); // DEMATIC + final JBlock body = clone.body(); + body._return(JExpr.invoke("copyTo").arg( + JExpr.invoke("createNewInstance"))); return clone; } @@ -185,18 +180,17 @@ protected void processClassOutline(ClassOutline classOutline) { final JCodeModel codeModel = theClass.owner(); final JMethod copyTo$copyTo = theClass.method(JMod.PUBLIC, codeModel.ref(Object.class), "copyTo"); - copyTo$copyTo.annotate(Override.class); - { - final JVar target = copyTo$copyTo.param(Object.class, "target"); + copyTo$copyTo.annotate(Override.class); // DEMATIC + final JVar target = copyTo$copyTo.param(Object.class, "target"); - final JBlock body = copyTo$copyTo.body(); - final JVar copyStrategy = body.decl(JMod.FINAL, - codeModel.ref(CopyStrategy2.class), "strategy", - createCopyStrategy(codeModel)); + final JBlock body = copyTo$copyTo.body(); + final JVar copyStrategy = body.decl(JMod.FINAL, + codeModel.ref(CopyStrategy2.class), "strategy2", + createCopyStrategy(codeModel)); - body._return(JExpr.invoke("copyTo").arg(JExpr._null()).arg(target) - .arg(copyStrategy)); - } + body._return(JExpr.invoke("copyTo").arg(JExpr._null()).arg(target) + .arg(copyStrategy)); + return copyTo$copyTo; } @@ -207,137 +201,143 @@ protected void processClassOutline(ClassOutline classOutline) { final JMethod copyTo = theClass.method(JMod.PUBLIC, codeModel.ref(Object.class), "copyTo"); - copyTo.annotate(Override.class); - { - final JVar locator = copyTo.param(ObjectLocator.class, "locator"); - final JVar target = copyTo.param(Object.class, "target"); - final JVar copyStrategy = copyTo.param(CopyStrategy2.class, - "strategy"); - - final JBlock body = copyTo.body(); - - final JVar draftCopy; - if (!classOutline.target.isAbstract()) { - draftCopy = body.decl( - JMod.FINAL, - codeModel.ref(Object.class), - "draftCopy", - - JOp.cond(JOp.eq(target, JExpr._null()), - JExpr.invoke("createNewInstance"), target)); - } else { - body._if(JExpr._null().eq(target)) - ._then() - ._throw(JExpr - ._new(codeModel - .ref(IllegalArgumentException.class)) - .arg("Target argument must not be null for abstract copyable classes.")); - draftCopy = target; - } + copyTo.annotate(Override.class); // DEMATIC + final JVar locator = copyTo.param(ObjectLocator.class, "locator"); + final JVar target = copyTo.param(Object.class, "target"); + final JVar copyStrategy = copyTo.param(CopyStrategy2.class, + "strategy2"); + + final JBlock body = copyTo.body(); + + final JVar draftCopy; + if (!classOutline.target.isAbstract()) { + draftCopy = body.decl( + JMod.FINAL, + codeModel.ref(Object.class), + "draftCopy", - Boolean superClassImplementsCopyTo = StrategyClassUtils - .superClassImplements(classOutline, getIgnoring(), - CopyTo2.class); + JOp.cond(JOp.eq(target, JExpr._null()), + JExpr.invoke("createNewInstance"), target)); + } else { + body._if(JExpr._null().eq(target)) + ._then() + ._throw(JExpr + ._new(codeModel + .ref(IllegalArgumentException.class)) + .arg("Target argument must not be null for abstract copyable classes.")); + draftCopy = target; + } - if (superClassImplementsCopyTo == null) { + Boolean superClassImplementsCopyTo = StrategyClassUtils + .superClassImplements(classOutline, getIgnoring(), + CopyTo2.class); - } else if (superClassImplementsCopyTo.booleanValue()) { - body.invoke(JExpr._super(), "copyTo").arg(locator) - .arg(draftCopy).arg(copyStrategy); + if (superClassImplementsCopyTo == null) { - } else { + } else if (superClassImplementsCopyTo.booleanValue()) { + body.invoke(JExpr._super(), "copyTo").arg(locator) + .arg(draftCopy).arg(copyStrategy); - } + } else { - final FieldOutline[] declaredFields = FieldOutlineUtils.filter( - classOutline.getDeclaredFields(), getIgnoring()); + } - if (declaredFields.length > 0) { + final FieldOutline[] declaredFields = FieldOutlineUtils.filter( + classOutline.getDeclaredFields(), getIgnoring()); - final JBlock bl = body._if(draftCopy._instanceof(theClass)) - ._then(); + if (declaredFields.length > 0) { + + final JBlock bl = body._if(draftCopy._instanceof(theClass)) + ._then(); + + final JVar copy = bl.decl(JMod.FINAL, theClass, "copy", + JExpr.cast(theClass, draftCopy)); - final JVar copy = bl.decl(JMod.FINAL, theClass, "copy", - JExpr.cast(theClass, draftCopy)); - - for (final FieldOutline fieldOutline : declaredFields) { - - final FieldAccessorEx sourceFieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, JExpr._this()); - final FieldAccessorEx copyFieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, copy); - - if (sourceFieldAccessor.isConstant()) { - continue; - } - - final JBlock block = bl.block(); - - final JExpression valueIsSet = (sourceFieldAccessor - .isAlwaysSet() || sourceFieldAccessor.hasSetValue() == null) ? JExpr.TRUE - : sourceFieldAccessor.hasSetValue(); - - final JVar shouldBeCopied = block.decl(codeModel - .ref(Boolean.class), fieldOutline.getPropertyInfo() - .getName(false) + "ShouldBeCopiedAndSet", - copyStrategy.invoke("shouldBeCopiedAndSet").arg(locator) - .arg(valueIsSet)); - - final JConditional ifShouldBeSetConditional = block._if(JOp - .eq(shouldBeCopied, codeModel.ref(Boolean.class) - .staticRef("TRUE"))); - - final JBlock ifShouldBeSetBlock = ifShouldBeSetConditional - ._then(); - final JConditional ifShouldNotBeSetConditional = ifShouldBeSetConditional - ._elseif(JOp.eq( - shouldBeCopied, - codeModel.ref(Boolean.class).staticRef( - "FALSE"))); - final JBlock ifShouldBeUnsetBlock = ifShouldNotBeSetConditional - ._then(); - - final JType copyFieldType = sourceFieldAccessor.getType(); - final JVar sourceField = ifShouldBeSetBlock.decl( - copyFieldType, - "source" - + fieldOutline.getPropertyInfo().getName( - true)); - sourceFieldAccessor.toRawValue(ifShouldBeSetBlock, - sourceField); - final JExpression builtCopy = JExpr - .invoke(copyStrategy, "copy") - .arg(codeModel - .ref(LocatorUtils.class) - .staticInvoke("property") - .arg(locator) - .arg(fieldOutline.getPropertyInfo() - .getName(false)).arg(sourceField)) - .arg(sourceField).arg(valueIsSet); - final JVar copyField = ifShouldBeSetBlock.decl( - copyFieldType, - "copy" - + fieldOutline.getPropertyInfo().getName( - true), - copyFieldType.isPrimitive() ? builtCopy : - - JExpr.cast(copyFieldType, builtCopy)); - if (copyFieldType instanceof JClass - && ((JClass) copyFieldType).isParameterized()) { - copyField.annotate(SuppressWarnings.class).param( - "value", "unchecked"); - } - copyFieldAccessor.fromRawValue(ifShouldBeSetBlock, "unique" - + fieldOutline.getPropertyInfo().getName(true), - copyField); - - copyFieldAccessor.unsetValues(ifShouldBeUnsetBlock); + for (final FieldOutline fieldOutline : declaredFields) { + + final FieldAccessorEx sourceFieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, JExpr._this()); + final FieldAccessorEx copyFieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, copy); + + if (sourceFieldAccessor.isConstant()) { + continue; } - } - body._return(draftCopy); + final JBlock block = bl; // DEMATIC + + final JExpression valueIsSet = (sourceFieldAccessor + .isAlwaysSet() || sourceFieldAccessor.hasSetValue() == null) ? JExpr.TRUE + : sourceFieldAccessor.hasSetValue(); + + final JVar shouldBeCopied = block.decl(codeModel + .ref(Boolean.class), fieldOutline.getPropertyInfo() + .getName(false) + "ShouldBeCopiedAndSet", + copyStrategy.invoke("shouldBeCopiedAndSet").arg(locator) + .arg(valueIsSet)); + + final JConditional ifShouldBeSetConditional = block._if(JOp + .eq(shouldBeCopied, codeModel.ref(Boolean.class) + .staticRef("TRUE"))); + + final JBlock ifShouldBeSetBlock = ifShouldBeSetConditional + ._then(); + final JConditional ifShouldNotBeSetConditional = ifShouldBeSetConditional + ._elseif(JOp.eq( + shouldBeCopied, + codeModel.ref(Boolean.class).staticRef( + "FALSE"))); + final JBlock ifShouldBeUnsetBlock = ifShouldNotBeSetConditional + ._then(); + + final JType copyFieldType = sourceFieldAccessor.getType(); + + //final JVar sourceField = ifShouldBeSetBlock.decl( copyFieldType, "source" + fieldOutline.getPropertyInfo().getName(true)); + //sourceFieldAccessor.toRawValue(ifShouldBeSetBlock, sourceField); + + String propertyName = fieldOutline.getPropertyInfo().getName(true);// DEMATIC + final JVar sourceField = ifShouldBeSetBlock.decl(copyFieldType, "source" + propertyName, JExpr._this().invoke(createMethodName(fieldOutline))); // DEMATIC + + final JExpression builtCopy = JExpr + .invoke(copyStrategy, "copy") + .arg(codeModel + .ref(LocatorUtils.class) + .staticInvoke("property") + .arg(locator) + .arg(fieldOutline.getPropertyInfo() + .getName(false)).arg(sourceField)) + .arg(sourceField).arg(valueIsSet); + final JVar copyField = ifShouldBeSetBlock.decl( + copyFieldType, + "copy" + + fieldOutline.getPropertyInfo().getName( + true), + copyFieldType.isPrimitive() ? builtCopy : + + JExpr.cast(copyFieldType, builtCopy)); +// if (copyFieldType instanceof JClass +// && ((JClass) copyFieldType).isParameterized()) { +// copyField.annotate(SuppressWarnings.class).param( +// "value", "unchecked"); +// } + copyFieldAccessor.fromRawValue(ifShouldBeSetBlock, "unique" + + fieldOutline.getPropertyInfo().getName(true), + copyField); + + copyFieldAccessor.unsetValues(ifShouldBeUnsetBlock); + } } + + body._return(draftCopy); return copyTo; } - -} + + private String createMethodName(FieldOutline fieldOutline) { + String name = fieldOutline.getPropertyInfo().getName(true); + String type = fieldOutline.getRawType().name(); + if (type.toLowerCase().equals("boolean")) { + return "is" + name; + } + return "get" + name; + } +} \ No newline at end of file diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/mergeable/MergeablePlugin.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/mergeable/MergeablePlugin.java index 7edec3d1..03bbda08 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/mergeable/MergeablePlugin.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/mergeable/MergeablePlugin.java @@ -132,19 +132,17 @@ protected void processClassOutline(ClassOutline classOutline) { JCodeModel codeModel = theClass.owner(); final JMethod mergeFrom$mergeFrom = theClass.method(JMod.PUBLIC, codeModel.VOID, "mergeFrom"); - mergeFrom$mergeFrom.annotate(Override.class); - { - final JVar left = mergeFrom$mergeFrom.param(Object.class, "left"); - final JVar right = mergeFrom$mergeFrom.param(Object.class, "right"); - final JBlock body = mergeFrom$mergeFrom.body(); - - final JVar mergeStrategy = body.decl(JMod.FINAL, - codeModel.ref(MergeStrategy2.class), "strategy", - createMergeStrategy(codeModel)); - - body.invoke("mergeFrom").arg(JExpr._null()).arg(JExpr._null()) - .arg(left).arg(right).arg(mergeStrategy); - } + mergeFrom$mergeFrom.annotate(Override.class); // DEMATIC + final JVar left = mergeFrom$mergeFrom.param(Object.class, "left"); + final JVar right = mergeFrom$mergeFrom.param(Object.class, "right"); + final JBlock body = mergeFrom$mergeFrom.body(); + + final JVar mergeStrategy = body.decl(JMod.FINAL, + codeModel.ref(MergeStrategy2.class), "strategy2", + createMergeStrategy(codeModel)); + + body.invoke("mergeFrom").arg(JExpr._null()).arg(JExpr._null()) + .arg(left).arg(right).arg(mergeStrategy); return mergeFrom$mergeFrom; } @@ -154,143 +152,143 @@ protected void processClassOutline(ClassOutline classOutline) { final JMethod mergeFrom = theClass.method(JMod.PUBLIC, codeModel.VOID, "mergeFrom"); - mergeFrom.annotate(Override.class); - { - final JVar leftLocator = mergeFrom.param(ObjectLocator.class, - "leftLocator"); - final JVar rightLocator = mergeFrom.param(ObjectLocator.class, - "rightLocator"); - final JVar left = mergeFrom.param(Object.class, "left"); - final JVar right = mergeFrom.param(Object.class, "right"); + mergeFrom.annotate(Override.class); // DEMATIC + final JVar leftLocator = mergeFrom.param(ObjectLocator.class, + "leftLocator"); + final JVar rightLocator = mergeFrom.param(ObjectLocator.class, + "rightLocator"); + final JVar left = mergeFrom.param(Object.class, "left"); + final JVar right = mergeFrom.param(Object.class, "right"); - final JVar mergeStrategy = mergeFrom.param(MergeStrategy2.class, - "strategy"); + final JVar mergeStrategy = mergeFrom.param(MergeStrategy2.class, + "strategy2"); - final JBlock methodBody = mergeFrom.body(); + final JBlock methodBody = mergeFrom.body(); - Boolean superClassImplementsMergeFrom = StrategyClassUtils - .superClassImplements(classOutline, getIgnoring(), - MergeFrom2.class); + Boolean superClassImplementsMergeFrom = StrategyClassUtils + .superClassImplements(classOutline, getIgnoring(), + MergeFrom2.class); - if (superClassImplementsMergeFrom == null) { + if (superClassImplementsMergeFrom == null) { - } else if (superClassImplementsMergeFrom.booleanValue()) { - methodBody.invoke(JExpr._super(), "mergeFrom").arg(leftLocator) - .arg(rightLocator).arg(left).arg(right) - .arg(mergeStrategy); - } else { + } else if (superClassImplementsMergeFrom.booleanValue()) { + methodBody.invoke(JExpr._super(), "mergeFrom").arg(leftLocator) + .arg(rightLocator).arg(left).arg(right) + .arg(mergeStrategy); + } else { - } + } - final FieldOutline[] declaredFields = FieldOutlineUtils.filter( - classOutline.getDeclaredFields(), getIgnoring()); + final FieldOutline[] declaredFields = FieldOutlineUtils.filter( + classOutline.getDeclaredFields(), getIgnoring()); + + if (declaredFields.length > 0) { + + final JBlock body = methodBody._if(right._instanceof(theClass)) + ._then(); + + JVar target = body.decl(JMod.FINAL, theClass, "target", + JExpr._this()); + JVar leftObject = body.decl(JMod.FINAL, theClass, "leftObject", + JExpr.cast(theClass, left)); + JVar rightObject = body.decl(JMod.FINAL, theClass, + "rightObject", JExpr.cast(theClass, right)); + for (final FieldOutline fieldOutline : declaredFields) { + final FieldAccessorEx leftFieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, leftObject); + final FieldAccessorEx rightFieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, rightObject); + if (leftFieldAccessor.isConstant() + || rightFieldAccessor.isConstant()) { + continue; + } - if (declaredFields.length > 0) { + final JBlock block = body; // DEMATIC - final JBlock body = methodBody._if(right._instanceof(theClass)) - ._then(); + final JExpression leftFieldHasSetValue = (leftFieldAccessor + .isAlwaysSet() || leftFieldAccessor.hasSetValue() == null) ? JExpr.TRUE + : leftFieldAccessor.hasSetValue(); - JVar target = body.decl(JMod.FINAL, theClass, "target", - JExpr._this()); - JVar leftObject = body.decl(JMod.FINAL, theClass, "leftObject", - JExpr.cast(theClass, left)); - JVar rightObject = body.decl(JMod.FINAL, theClass, - "rightObject", JExpr.cast(theClass, right)); - for (final FieldOutline fieldOutline : declaredFields) { - final FieldAccessorEx leftFieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, leftObject); - final FieldAccessorEx rightFieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, rightObject); - if (leftFieldAccessor.isConstant() - || rightFieldAccessor.isConstant()) { - continue; - } - - final JBlock block = body.block(); - - final JExpression leftFieldHasSetValue = (leftFieldAccessor - .isAlwaysSet() || leftFieldAccessor.hasSetValue() == null) ? JExpr.TRUE - : leftFieldAccessor.hasSetValue(); - - final JExpression rightFieldHasSetValue = (rightFieldAccessor - .isAlwaysSet() || rightFieldAccessor.hasSetValue() == null) ? JExpr.TRUE - : rightFieldAccessor.hasSetValue(); - - final JVar shouldBeSet = block.decl( - codeModel.ref(Boolean.class), - fieldOutline.getPropertyInfo().getName(false) - + "ShouldBeMergedAndSet", - mergeStrategy.invoke("shouldBeMergedAndSet") - .arg(leftLocator).arg(rightLocator) - .arg(leftFieldHasSetValue) - .arg(rightFieldHasSetValue)); + final JExpression rightFieldHasSetValue = (rightFieldAccessor + .isAlwaysSet() || rightFieldAccessor.hasSetValue() == null) ? JExpr.TRUE + : rightFieldAccessor.hasSetValue(); + + final JVar shouldBeSet = block.decl( + codeModel.ref(Boolean.class), + fieldOutline.getPropertyInfo().getName(false) + + "ShouldBeMergedAndSet", + mergeStrategy.invoke("shouldBeMergedAndSet") + .arg(leftLocator).arg(rightLocator) + .arg(leftFieldHasSetValue) + .arg(rightFieldHasSetValue)); + + final JConditional ifShouldBeSetConditional = block._if(JOp + .eq(shouldBeSet, codeModel.ref(Boolean.class) + .staticRef("TRUE"))); - final JConditional ifShouldBeSetConditional = block._if(JOp - .eq(shouldBeSet, codeModel.ref(Boolean.class) - .staticRef("TRUE"))); - - final JBlock ifShouldBeSetBlock = ifShouldBeSetConditional - ._then(); - final JConditional ifShouldNotBeSetConditional = ifShouldBeSetConditional - ._elseif(JOp.eq( - shouldBeSet, - codeModel.ref(Boolean.class).staticRef( - "FALSE"))); - final JBlock ifShouldBeUnsetBlock = ifShouldNotBeSetConditional - ._then(); - // final JBlock ifShouldBeIgnoredBlock = - // ifShouldNotBeSetConditional - // ._else(); - - final JVar leftField = ifShouldBeSetBlock.decl( - leftFieldAccessor.getType(), - "lhs" - + fieldOutline.getPropertyInfo().getName( - true)); - leftFieldAccessor.toRawValue(ifShouldBeSetBlock, leftField); - final JVar rightField = ifShouldBeSetBlock.decl( - rightFieldAccessor.getType(), - "rhs" - + fieldOutline.getPropertyInfo().getName( - true)); - - rightFieldAccessor.toRawValue(ifShouldBeSetBlock, - rightField); - - final JExpression leftFieldLocator = codeModel - .ref(LocatorUtils.class).staticInvoke("property") - .arg(leftLocator) - .arg(fieldOutline.getPropertyInfo().getName(false)) - .arg(leftField); - final JExpression rightFieldLocator = codeModel - .ref(LocatorUtils.class).staticInvoke("property") - .arg(rightLocator) - .arg(fieldOutline.getPropertyInfo().getName(false)) - .arg(rightField); - - final FieldAccessorEx targetFieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, target); - final JExpression mergedValue = JExpr.cast( + final JBlock ifShouldBeSetBlock = ifShouldBeSetConditional + ._then(); + final JConditional ifShouldNotBeSetConditional = ifShouldBeSetConditional + ._elseif(JOp.eq( + shouldBeSet, + codeModel.ref(Boolean.class).staticRef( + "FALSE"))); + final JBlock ifShouldBeUnsetBlock = ifShouldNotBeSetConditional + ._then(); + // final JBlock ifShouldBeIgnoredBlock = + // ifShouldNotBeSetConditional + // ._else(); + + String propertyName = fieldOutline.getPropertyInfo().getName(true); + + //final JVar leftField = ifShouldBeSetBlock.decl(leftFieldAccessor.getType(),"lhs" + fieldOutline.getPropertyInfo().getName(true)); + //leftFieldAccessor.toRawValue(ifShouldBeSetBlock, leftField); + final JVar leftField = ifShouldBeSetBlock.decl(leftFieldAccessor.getType(), "lhs" + propertyName, leftObject.invoke(createMethodName(fieldOutline))); // DEMATIC + + //final JVar rightField = ifShouldBeSetBlock.decl(rightFieldAccessor.getType(),"rhs" + fieldOutline.getPropertyInfo().getName(true)); + //rightFieldAccessor.toRawValue(ifShouldBeSetBlock, rightField); + final JVar rightField = ifShouldBeSetBlock.decl(leftFieldAccessor.getType(), "rhs" + propertyName, rightObject.invoke(createMethodName(fieldOutline))); // DEMATIC + + final JExpression leftFieldLocator = codeModel + .ref(LocatorUtils.class).staticInvoke("property") + .arg(leftLocator) + .arg(fieldOutline.getPropertyInfo().getName(false)) + .arg(leftField); + final JExpression rightFieldLocator = codeModel + .ref(LocatorUtils.class).staticInvoke("property") + .arg(rightLocator) + .arg(fieldOutline.getPropertyInfo().getName(false)) + .arg(rightField); + + final FieldAccessorEx targetFieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, target); + final JExpression mergedValue; + if (targetFieldAccessor.getType().name().equals("byte")|| + targetFieldAccessor.getType().name().equals("int")|| + targetFieldAccessor.getType().name().equals("float")|| + targetFieldAccessor.getType().name().equals("long")|| + targetFieldAccessor.getType().name().equals("short")|| + targetFieldAccessor.getType().name().equals("Object") + ) { + mergedValue = mergeStrategy.invoke("merge").arg(leftFieldLocator) + .arg(rightFieldLocator).arg(leftField) + .arg(rightField).arg(leftFieldHasSetValue) + .arg(rightFieldHasSetValue); + + } else { + mergedValue = JExpr.cast( targetFieldAccessor.getType(), mergeStrategy.invoke("merge").arg(leftFieldLocator) .arg(rightFieldLocator).arg(leftField) .arg(rightField).arg(leftFieldHasSetValue) .arg(rightFieldHasSetValue)); + } + + final JVar merged = ifShouldBeSetBlock.decl( rightFieldAccessor.getType(), "merged" + fieldOutline.getPropertyInfo().getName(true), mergedValue); - final JVar merged = ifShouldBeSetBlock.decl( - rightFieldAccessor.getType(), - "merged" - + fieldOutline.getPropertyInfo().getName( - true), mergedValue); - - targetFieldAccessor.fromRawValue( - ifShouldBeSetBlock, - "unique" - + fieldOutline.getPropertyInfo().getName( - true), merged); + targetFieldAccessor.fromRawValue( ifShouldBeSetBlock, "unique" + fieldOutline.getPropertyInfo().getName(true), merged); - targetFieldAccessor.unsetValues(ifShouldBeUnsetBlock); - } + targetFieldAccessor.unsetValues(ifShouldBeUnsetBlock); } } return mergeFrom; @@ -305,14 +303,23 @@ protected void processClassOutline(ClassOutline classOutline) { final JMethod newMethod = theClass.method(JMod.PUBLIC, theClass .owner().ref(Object.class), "createNewInstance"); - newMethod.annotate(Override.class); - { - final JBlock body = newMethod.body(); - body._return(JExpr._new(theClass)); - } + newMethod.annotate(Override.class); // DEMATIC + final JBlock body = newMethod.body(); + body._return(JExpr._new(theClass)); + return newMethod; } else { return existingMethod; } } -} + + private String createMethodName(FieldOutline fieldOutline) { + String name = fieldOutline.getPropertyInfo().getName(true); + String type = fieldOutline.getRawType().name(); + if (type.toLowerCase().equals("boolean")) { + return "is" + name; + } + return "get" + name; + } + +} \ No newline at end of file diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simpleequals/SimpleEqualsPlugin.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simpleequals/SimpleEqualsPlugin.java index 954136ff..dd6e7297 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simpleequals/SimpleEqualsPlugin.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simpleequals/SimpleEqualsPlugin.java @@ -55,8 +55,10 @@ protected void generate(ClassOutline classOutline, JDefinedClass theClass) { final JCodeModel codeModel = theClass.owner(); final JMethod objectEquals = theClass.method(JMod.PUBLIC, codeModel.BOOLEAN, "equals"); - objectEquals.annotate(Override.class); + objectEquals.annotate(Override.class); // DEMATIC + final JVar object = objectEquals.param(Object.class, "object"); + final JBlock body = objectEquals.body(); JExpression objectIsNull = object.eq(JExpr._null()); @@ -94,18 +96,13 @@ protected void generate(ClassOutline classOutline, JDefinedClass theClass) { continue; } - final JBlock block = body.block(); - - final String name = fieldOutline.getPropertyInfo() - .getName(true); + final JBlock block = body; // DEMATIC + final String name = fieldOutline.getPropertyInfo().getName(true); final JType type = leftFieldAccessor.getType(); - final JVar leftValue = block.decl(type, "left" + name); - leftFieldAccessor.toRawValue(block, leftValue); - - final JVar rightValue = block.decl( - rightFieldAccessor.getType(), "right" + name); - rightFieldAccessor.toRawValue(block, rightValue); + + final JVar leftValue = block.decl(type, "left" + name, JExpr._this().invoke(createMethodName(fieldOutline))); // DEMATIC + final JVar rightValue = block.decl( rightFieldAccessor.getType(), "right" + name,_that.invoke(createMethodName(fieldOutline))); // DEMATIC final JType exposedType = leftFieldAccessor.getType(); @@ -137,4 +134,15 @@ protected void generate(ClassOutline classOutline, JDefinedClass theClass) { body._return(JExpr.TRUE); } + + + private String createMethodName(FieldOutline fieldOutline) { + String name = fieldOutline.getPropertyInfo().getName(true); + String type = fieldOutline.getRawType().name(); + if (type.toLowerCase().equals("boolean")) { + return "is" + name; + } + return "get" + name; + } + } diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/HashCodeCodeGenerationImplementor.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/HashCodeCodeGenerationImplementor.java index 572be117..2c156e05 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/HashCodeCodeGenerationImplementor.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/HashCodeCodeGenerationImplementor.java @@ -35,6 +35,15 @@ private void ifHasSetValueAssignPlusValueCastedToInt( true); } + //DEMATIC + private void ifHasSetValueAssignPlusValue( + HashCodeArguments arguments, JBlock block, boolean isAlwaysSet) { + ifHasSetValueAssignPlusValueHashCode(arguments, block, + arguments.value(), isAlwaysSet, + true); + } + + @Override public void onArray(JBlock block, boolean isAlwaysSet, HashCodeArguments arguments) { @@ -57,7 +66,7 @@ public void onBoolean(HashCodeArguments arguments, JBlock block, @Override public void onByte(HashCodeArguments arguments, JBlock block, boolean isAlwaysSet) { - ifHasSetValueAssignPlusValueCastedToInt(arguments, block, isAlwaysSet); + ifHasSetValueAssignPlusValue(arguments, block, isAlwaysSet); //DEMATIC } @Override @@ -111,7 +120,7 @@ public void onLong(HashCodeArguments arguments, JBlock block, @Override public void onShort(HashCodeArguments arguments, JBlock block, boolean isAlwaysSet) { - ifHasSetValueAssignPlusValueCastedToInt(arguments, block, isAlwaysSet); + ifHasSetValueAssignPlusValue(arguments, block, isAlwaysSet); //DEMATIC } @Override diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/SimpleHashCodePlugin.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/SimpleHashCodePlugin.java index 127ab61e..6ae4d229 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/SimpleHashCodePlugin.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/SimpleHashCodePlugin.java @@ -57,71 +57,75 @@ protected CodeGenerator createCodeGenerator( @Override protected void generate(ClassOutline classOutline, JDefinedClass theClass) { - final JCodeModel codeModel = theClass.owner(); - final JMethod object$hashCode = theClass.method(JMod.PUBLIC, - codeModel.INT, "hashCode"); - object$hashCode.annotate(Override.class); - { - final JBlock body = object$hashCode.body(); - - final JExpression currentHashCodeExpression = JExpr.lit(1); + final JMethod object$hashCode = theClass.method(JMod.PUBLIC, codeModel.INT, "hashCode"); + object$hashCode.annotate(Override.class); // DEMATIC - final JVar currentHashCode = body.decl(codeModel.INT, - "currentHashCode", currentHashCodeExpression); + final JBlock body = object$hashCode.body(); - final Boolean superClassImplementsHashCode = StrategyClassUtils - .superClassNotIgnored(classOutline, getIgnoring()); + final JExpression currentHashCodeExpression = JExpr.lit(1); - if (superClassImplementsHashCode != null) { - body.assign( - currentHashCode, - currentHashCode.mul(JExpr.lit(getMultiplier())).plus( - JExpr._super().invoke("hashCode"))); - } + final JVar currentHashCode = body.decl(codeModel.INT, + "currentHashCode", currentHashCodeExpression); - final FieldOutline[] declaredFields = FieldOutlineUtils.filter( - classOutline.getDeclaredFields(), getIgnoring()); + final Boolean superClassImplementsHashCode = StrategyClassUtils + .superClassNotIgnored(classOutline, getIgnoring()); - if (declaredFields.length > 0) { - - for (final FieldOutline fieldOutline : declaredFields) { - final FieldAccessorEx fieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, JExpr._this()); - if (fieldAccessor.isConstant()) { - continue; - } - final JBlock block = body.block(); - block.assign(currentHashCode, - currentHashCode.mul(JExpr.lit(getMultiplier()))); + if (superClassImplementsHashCode != null) { + body.assign( + currentHashCode, + currentHashCode.mul(JExpr.lit(getMultiplier())).plus( + JExpr._super().invoke("hashCode"))); + } - String propertyName = fieldOutline.getPropertyInfo() - .getName(true); - final JVar value = block.decl(fieldAccessor.getType(), - "the" + propertyName); + final FieldOutline[] declaredFields = FieldOutlineUtils.filter( + classOutline.getDeclaredFields(), getIgnoring()); - fieldAccessor.toRawValue(block, value); - final JType exposedType = fieldAccessor.getType(); + if (declaredFields.length > 0) { - final Collection possibleTypes = FieldUtils - .getPossibleTypes(fieldOutline, Aspect.EXPOSED); - final boolean isAlwaysSet = fieldAccessor.isAlwaysSet(); + for (final FieldOutline fieldOutline : declaredFields) { + final FieldAccessorEx fieldAccessor = getFieldAccessorFactory() + .createFieldAccessor(fieldOutline, JExpr._this()); + if (fieldAccessor.isConstant()) { + continue; + } + final JBlock block = body; // DEMATIC + block.assign(currentHashCode, + currentHashCode.mul(JExpr.lit(getMultiplier()))); + + String propertyName = fieldOutline.getPropertyInfo().getName(true);// DEMATIC + final JVar value = block.decl(fieldAccessor.getType(), "the" + propertyName,JExpr._this().invoke(createMethodName(fieldOutline))); // DEMATIC + + final JType exposedType = fieldAccessor.getType(); + + final Collection possibleTypes = FieldUtils + .getPossibleTypes(fieldOutline, Aspect.EXPOSED); + final boolean isAlwaysSet = fieldAccessor.isAlwaysSet(); // final JExpression hasSetValue = exposedType.isPrimitive() ? JExpr.TRUE // : value.ne(JExpr._null()); - - final JExpression hasSetValue = (fieldAccessor.isAlwaysSet() || fieldAccessor - .hasSetValue() == null) ? JExpr.TRUE - : fieldAccessor.hasSetValue(); - getCodeGenerator().generate( - block, - exposedType, - possibleTypes, - isAlwaysSet, - new HashCodeArguments(codeModel, currentHashCode, - getMultiplier(), value, hasSetValue)); - } + + final JExpression hasSetValue = (fieldAccessor.isAlwaysSet() || fieldAccessor + .hasSetValue() == null) ? JExpr.TRUE + : fieldAccessor.hasSetValue(); + getCodeGenerator().generate( + block, + exposedType, + possibleTypes, + isAlwaysSet, + new HashCodeArguments(codeModel, currentHashCode, + getMultiplier(), value, hasSetValue)); } - body._return(currentHashCode); } + body._return(currentHashCode); } + + private String createMethodName(FieldOutline fieldOutline) { + String name = fieldOutline.getPropertyInfo().getName(true); + String type = fieldOutline.getRawType().name(); + if (type.toLowerCase().equals("boolean")) { + return "is" + name; + } + return "get" + name; + } + } diff --git a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/tostring/ToStringPlugin.java b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/tostring/ToStringPlugin.java index 1d9ae783..d2553bb6 100644 --- a/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/tostring/ToStringPlugin.java +++ b/basic/src/main/java/org/jvnet/jaxb2_commons/plugin/tostring/ToStringPlugin.java @@ -122,22 +122,19 @@ protected void processClassOutline(ClassOutline classOutline) { final JCodeModel codeModel = theClass.owner(); final JMethod object$toString = theClass.method(JMod.PUBLIC, codeModel.ref(String.class), "toString"); - object$toString.annotate(Override.class); - { - final JBlock body = object$toString.body(); + object$toString.annotate(Override.class); // DEMATIC - final JVar toStringStrategy = + final JBlock body = object$toString.body(); - body.decl(JMod.FINAL, codeModel.ref(ToStringStrategy2.class), - "strategy", createToStringStrategy(codeModel)); + final JVar toStringStrategy = body.decl(JMod.FINAL, codeModel.ref(ToStringStrategy2.class), + "strategy2", createToStringStrategy(codeModel)); - final JVar buffer = body.decl(JMod.FINAL, - codeModel.ref(StringBuilder.class), "buffer", - JExpr._new(codeModel.ref(StringBuilder.class))); - body.invoke("append").arg(JExpr._null()).arg(buffer) - .arg(toStringStrategy); - body._return(buffer.invoke("toString")); - } + final JVar buffer = body.decl(JMod.FINAL, + codeModel.ref(StringBuilder.class), "buffer", + JExpr._new(codeModel.ref(StringBuilder.class))); + body.invoke("append").arg(JExpr._null()).arg(buffer).arg(toStringStrategy); + body._return(buffer.invoke("toString")); + return object$toString; } @@ -146,90 +143,92 @@ protected void processClassOutline(ClassOutline classOutline) { final JCodeModel codeModel = theClass.owner(); final JMethod toString$append = theClass.method(JMod.PUBLIC, codeModel.ref(StringBuilder.class), "append"); - toString$append.annotate(Override.class); - { - - final JVar locator = toString$append.param(ObjectLocator.class, - "locator"); - final JVar buffer = toString$append.param(StringBuilder.class, - "buffer"); - final JVar toStringStrategy = toString$append.param( - ToStringStrategy2.class, "strategy"); - - final JBlock body = toString$append.body(); - - body.invoke(toStringStrategy, "appendStart").arg(locator) - .arg(JExpr._this()).arg(buffer); - body.invoke("appendFields").arg(locator).arg(buffer) - .arg(toStringStrategy); - body.invoke(toStringStrategy, "appendEnd").arg(locator) - .arg(JExpr._this()).arg(buffer); - body._return(buffer); - } + toString$append.annotate(Override.class); // DEMATIC + + final JVar locator = toString$append.param(ObjectLocator.class, "locator"); + final JVar buffer = toString$append.param(StringBuilder.class, "buffer"); + final JVar toStringStrategy = toString$append.param( + ToStringStrategy2.class, "strategy2"); + + final JBlock body = toString$append.body(); + + body.invoke(toStringStrategy, "appendStart").arg(locator) + .arg(JExpr._this()).arg(buffer); + body.invoke("appendFields").arg(locator).arg(buffer) + .arg(toStringStrategy); + body.invoke(toStringStrategy, "appendEnd").arg(locator) + .arg(JExpr._this()).arg(buffer); + body._return(buffer); + return toString$append; } - protected JMethod generateToString$appendFields(ClassOutline classOutline, - final JDefinedClass theClass) { + protected JMethod generateToString$appendFields(ClassOutline classOutline, final JDefinedClass theClass) { final JCodeModel codeModel = theClass.owner(); final JMethod toString$appendFields = theClass.method(JMod.PUBLIC, codeModel.ref(StringBuilder.class), "appendFields"); - toString$appendFields.annotate(Override.class); - { - final JVar locator = toString$appendFields.param( - ObjectLocator.class, "locator"); - final JVar buffer = toString$appendFields.param( - StringBuilder.class, "buffer"); - final JVar toStringStrategy = toString$appendFields.param( - ToStringStrategy2.class, "strategy"); - final JBlock body = toString$appendFields.body(); - - final Boolean superClassImplementsToString = StrategyClassUtils - .superClassImplements(classOutline, ignoring, - ToString2.class); - - if (superClassImplementsToString == null) { - // No superclass - } else if (superClassImplementsToString.booleanValue()) { - body.invoke(JExpr._super(), "appendFields").arg(locator) - .arg(buffer).arg(toStringStrategy); - } else { - // Superclass does not implement ToString - } + toString$appendFields.annotate(Override.class); // DEMATIC + + final JVar locator = toString$appendFields.param( + ObjectLocator.class, "locator"); + final JVar buffer = toString$appendFields.param( + StringBuilder.class, "buffer"); + final JVar toStringStrategy = toString$appendFields.param( + ToStringStrategy2.class, "strategy2"); + final JBlock body = toString$appendFields.body(); + + final Boolean superClassImplementsToString = StrategyClassUtils + .superClassImplements(classOutline, ignoring, + ToString2.class); + + if (superClassImplementsToString == null) { + // No superclass + } else if (superClassImplementsToString.booleanValue()) { + body.invoke(JExpr._super(), "appendFields").arg(locator) + .arg(buffer).arg(toStringStrategy); + } else { + // Superclass does not implement ToString + } - final FieldOutline[] declaredFields = FieldOutlineUtils.filter( - classOutline.getDeclaredFields(), getIgnoring()); - - if (declaredFields.length > 0) { - - for (final FieldOutline fieldOutline : declaredFields) { - final JBlock block = body.block(); - final FieldAccessorEx fieldAccessor = getFieldAccessorFactory() - .createFieldAccessor(fieldOutline, JExpr._this()); - final JVar theValue = block.decl( - fieldAccessor.getType(), - "the" - + fieldOutline.getPropertyInfo().getName( - true)); - - final JExpression valueIsSet = (fieldAccessor.isAlwaysSet() || fieldAccessor - .hasSetValue() == null) ? JExpr.TRUE - : fieldAccessor.hasSetValue(); - - fieldAccessor.toRawValue(block, theValue); - - block.invoke(toStringStrategy, "appendField") - .arg(locator) - .arg(JExpr._this()) - .arg(JExpr.lit(fieldOutline.getPropertyInfo() - .getName(false))).arg(buffer).arg(theValue) - .arg(valueIsSet); - } + final FieldOutline[] declaredFields = FieldOutlineUtils.filter( + classOutline.getDeclaredFields(), getIgnoring()); + + if (declaredFields.length > 0) { + + for (final FieldOutline fieldOutline : declaredFields) { + final JBlock block = body; //DEMATIC + final FieldAccessorEx fieldAccessor = getFieldAccessorFactory().createFieldAccessor(fieldOutline, JExpr._this()); + + //final JVar theValue = block.decl(fieldAccessor.getType(),"the"+ fieldOutline.getPropertyInfo().getName(true)); + //fieldAccessor.toRawValue(block, theValue); + + String propertyName = fieldOutline.getPropertyInfo().getName(true); + final JVar theValue = block.decl(fieldAccessor.getType(), "the" + propertyName,JExpr._this().invoke(createMethodName(fieldOutline))); // DEMATIC + + final JExpression valueIsSet = (fieldAccessor.isAlwaysSet() || fieldAccessor + .hasSetValue() == null) ? JExpr.TRUE + : fieldAccessor.hasSetValue(); + + block.invoke(toStringStrategy, "appendField") + .arg(locator) + .arg(JExpr._this()) + .arg(JExpr.lit(fieldOutline.getPropertyInfo() + .getName(false))).arg(buffer).arg(theValue) + .arg(valueIsSet); } - body._return(buffer); } + body._return(buffer); return toString$appendFields; } + + private String createMethodName(FieldOutline fieldOutline) { + String name = fieldOutline.getPropertyInfo().getName(true); + String type = fieldOutline.getRawType().name(); + if (type.toLowerCase().equals("boolean")) { + return "is" + name; + } + return "get" + name; + } } \ No newline at end of file