Skip to content

Commit

Permalink
Issue highsource#11.
Browse files Browse the repository at this point in the history
  • Loading branch information
highsource committed Nov 27, 2014
1 parent c2aad7f commit 24a2913
Show file tree
Hide file tree
Showing 21 changed files with 565 additions and 135 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,15 @@

import javax.xml.namespace.QName;

import org.jvnet.jaxb2_commons.lang.Equals;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;
import org.jvnet.jaxb2_commons.codemodel.generator.TypedCodeGeneratorFactory;
import org.jvnet.jaxb2_commons.plugin.AbstractParameterizablePlugin;
import org.jvnet.jaxb2_commons.plugin.Customizations;
import org.jvnet.jaxb2_commons.plugin.CustomizedIgnoring;
import org.jvnet.jaxb2_commons.plugin.Ignoring;
import org.jvnet.jaxb2_commons.plugin.simpleequals.generator.EqualsCodeGenerator;
import org.jvnet.jaxb2_commons.plugin.simpleequals.generator.EqualsCodeGeneratorFactory;
import org.jvnet.jaxb2_commons.plugin.util.FieldOutlineUtils;
import org.jvnet.jaxb2_commons.plugin.util.StrategyClassUtils;
import org.jvnet.jaxb2_commons.util.ClassUtils;
import org.jvnet.jaxb2_commons.util.FieldAccessorFactory;
import org.jvnet.jaxb2_commons.util.PropertyFieldAccessorFactory;
import org.jvnet.jaxb2_commons.xjc.outline.FieldAccessorEx;
Expand All @@ -31,6 +28,7 @@
import com.sun.codemodel.JMethod;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JOp;
import com.sun.codemodel.JType;
import com.sun.codemodel.JVar;
import com.sun.tools.xjc.Options;
import com.sun.tools.xjc.outline.ClassOutline;
Expand Down Expand Up @@ -61,21 +59,6 @@ public void setFieldAccessorFactory(
this.fieldAccessorFactory = fieldAccessorFactory;
}

private String equalsStrategyClass = JAXBEqualsStrategy.class.getName();

public void setEqualsStrategyClass(String equalsStrategyClass) {
this.equalsStrategyClass = equalsStrategyClass;
}

public String getEqualsStrategyClass() {
return equalsStrategyClass;
}

public JExpression createEqualsStrategy(JCodeModel codeModel) {
return StrategyClassUtils.createStrategyInstanceExpression(codeModel,
EqualsStrategy.class, getEqualsStrategyClass());
}

private Ignoring ignoring = new CustomizedIgnoring(
org.jvnet.jaxb2_commons.plugin.equals.Customizations.IGNORED_ELEMENT_NAME,
Customizations.IGNORED_ELEMENT_NAME,
Expand All @@ -97,30 +80,30 @@ public Collection<QName> getCustomizationElementNames() {
Customizations.GENERATED_ELEMENT_NAME);
}

private TypedCodeGeneratorFactory<EqualsCodeGenerator> codeGeneratorFactory;

private TypedCodeGeneratorFactory<EqualsCodeGenerator> getCodeGeneratorFactory() {
if (codeGeneratorFactory == null) {
throw new IllegalStateException(
"Code generator factory was not set yet.");
}
return codeGeneratorFactory;
}

@Override
public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) {
this.codeGeneratorFactory = new EqualsCodeGeneratorFactory(
outline.getCodeModel());
for (final ClassOutline classOutline : outline.getClasses()) {
if (!getIgnoring().isIgnored(classOutline)) {
processClassOutline(classOutline);
}
}
// for (final EnumOutline enumOutline : outline.getEnums()) {
// if (!getIgnoring().isIgnored(enumOutline)) {
// processEnumOutline(enumOutline);
// }
// }
return true;
}

protected void processClassOutline(ClassOutline classOutline) {
final JDefinedClass theClass = classOutline.implClass;
ClassUtils._implements(theClass, theClass.owner().ref(Equals.class));

// @SuppressWarnings("unused")
// final JMethod equals0 = generateEquals$Equals0(classOutline,
// theClass);
@SuppressWarnings("unused")
final JMethod equals = generateEquals$equals(classOutline, theClass);
@SuppressWarnings("unused")
final JMethod objectEquals = generateObject$equals(classOutline,
theClass);
Expand All @@ -143,46 +126,6 @@ protected void processClassOutline(ClassOutline classOutline) {
{
final JVar object = objectEquals.param(Object.class, "object");
final JBlock body = objectEquals.body();
final JVar equalsStrategy = body.decl(JMod.FINAL,
codeModel.ref(EqualsStrategy.class), "strategy",
createEqualsStrategy(codeModel));
body._return(JExpr.invoke("equals").arg(JExpr._null())
.arg(JExpr._null()).arg(object).arg(equalsStrategy));
}
return objectEquals;
}

// protected JMethod generateEquals$Equals0(final ClassOutline classOutline,
// final JDefinedClass theClass) {
// final JMethod equalsEquals0 = theClass.method(JMod.PUBLIC, theClass
// .owner().BOOLEAN, "equals");
// {
// final JVar object = equalsEquals0.param(Object.class, "object");
// final JVar equalsStrategy = equalsEquals0.param(
// EqualsStrategy.class, "strategy");
// final JBlock body = equalsEquals0.body();
//
// body._return(JExpr.invoke("equals").arg(JExpr._null()).arg(
// JExpr._null()).arg(object).arg(equalsStrategy));
// }
// return equalsEquals0;
// }

protected JMethod generateEquals$equals(ClassOutline classOutline,
final JDefinedClass theClass) {

final JCodeModel codeModel = theClass.owner();
final JMethod equals = theClass.method(JMod.PUBLIC, codeModel.BOOLEAN,
"equals");
{
final JBlock body = equals.body();
final JVar leftLocator = equals.param(ObjectLocator.class,
"thisLocator");
final JVar rightLocator = equals.param(ObjectLocator.class,
"thatLocator");
final JVar object = equals.param(Object.class, "object");
final JVar equalsStrategy = equals.param(EqualsStrategy.class,
"strategy");

final JConditional ifNotInstanceof = body._if(JOp.not(object
._instanceof(theClass)));
Expand All @@ -192,17 +135,13 @@ protected void processClassOutline(ClassOutline classOutline) {
body._if(JExpr._this().eq(object))._then()._return(JExpr.TRUE);

final Boolean superClassImplementsEquals = StrategyClassUtils
.superClassImplements(classOutline, getIgnoring(),
Equals.class);
.superClassNotIgnored(classOutline, ignoring);

if (superClassImplementsEquals == null) {
// No superclass
} else if (superClassImplementsEquals.booleanValue()) {
body._if(
JOp.not(JExpr._super().invoke("equals")
.arg(leftLocator).arg(rightLocator).arg(object)
.arg(equalsStrategy)))._then()
._return(JExpr.FALSE);
body._if(JOp.not(JExpr._super().invoke("equals").arg(object)))
._then()._return(JExpr.FALSE);

} else {
body._if(JOp.not(JExpr._super().invoke("equals").arg(object)))
Expand All @@ -211,15 +150,15 @@ protected void processClassOutline(ClassOutline classOutline) {

final JExpression _this = JExpr._this();

final FieldOutline[] declaredFields = FieldOutlineUtils.filter(
final FieldOutline[] fields = FieldOutlineUtils.filter(
classOutline.getDeclaredFields(), getIgnoring());

if (declaredFields.length > 0) {
if (fields.length > 0) {

final JVar _that = body.decl(JMod.FINAL, theClass, "that",
JExpr.cast(theClass, object));

for (final FieldOutline fieldOutline : declaredFields) {
for (final FieldOutline fieldOutline : fields) {

final FieldAccessorEx leftFieldAccessor = getFieldAccessorFactory()
.createFieldAccessor(fieldOutline, _this);
Expand All @@ -236,65 +175,21 @@ protected void processClassOutline(ClassOutline classOutline) {
final String name = fieldOutline.getPropertyInfo().getName(
true);

final JVar lhsValue = block.decl(
leftFieldAccessor.getType(), "lhs" + name);
final JType type = leftFieldAccessor.getType();
final JVar lhsValue = block.decl(type, "lhs" + name);
leftFieldAccessor.toRawValue(block, lhsValue);

final JVar rhsValue = block.decl(
rightFieldAccessor.getType(), "rhs" + name);
rightFieldAccessor.toRawValue(block, rhsValue);

final JExpression leftFieldLocator = codeModel
.ref(LocatorUtils.class).staticInvoke("property")
.arg(leftLocator)
.arg(fieldOutline.getPropertyInfo().getName(false))
.arg(lhsValue);
final JExpression rightFieldLocator = codeModel
.ref(LocatorUtils.class).staticInvoke("property")
.arg(rightLocator)
.arg(fieldOutline.getPropertyInfo().getName(false))
.arg(rhsValue);
block._if(
JOp.not(JExpr.invoke(equalsStrategy, "equals")
.arg(leftFieldLocator)
.arg(rightFieldLocator).arg(lhsValue)
.arg(rhsValue)))._then()
._return(JExpr.FALSE);
final EqualsCodeGenerator codeGenerator = getCodeGeneratorFactory()
.getCodeGenerator(type);
codeGenerator.generate(block, type, lhsValue, rhsValue);
}
}
body._return(JExpr.TRUE);
}
return equals;
return objectEquals;
}

// protected JMethod generateEquals$equals(EnumOutline enumOutline,
// final JDefinedClass theClass) {
//
// final JCodeModel codeModel = theClass.owner();
// final JMethod equals = theClass.method(JMod.PUBLIC, codeModel.BOOLEAN,
// "equals");
//
// {
// final JBlock body = equals.body();
// final JVar leftLocator = equals.param(ObjectLocator.class,
// "thisLocator");
// final JVar rightLocator = equals.param(ObjectLocator.class,
// "thatLocator");
// final JVar object = equals.param(Object.class, "object");
// final JVar equalsStrategy = equals.param(EqualsStrategy.class,
// "strategy");
//
// body._return(equalsStrategy
// .invoke("equals")
// .arg(codeModel.ref(LocatorUtils.class)
// .staticInvoke("property").arg(leftLocator)
// .arg("value").arg(JExpr._this().ref("value")))
// .arg(codeModel.ref(LocatorUtils.class)
// .staticInvoke("property").arg(rightLocator)
// .arg("value").arg(object.ref("value")))
// .arg(JExpr._this().ref("value")).arg(object.ref("value")));
//
// }
// return equals;
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.jvnet.jaxb2_commons.plugin.simpleequals.generator;

import org.apache.commons.lang3.Validate;

import com.sun.codemodel.JCodeModel;

public abstract class BaseEqualsCodeGenerator implements
EqualsCodeGenerator {

private final JCodeModel codeModel;

public BaseEqualsCodeGenerator(JCodeModel codeModel) {
this.codeModel = Validate.notNull(codeModel);
}

public JCodeModel getCodeModel() {
return codeModel;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.jvnet.jaxb2_commons.plugin.simpleequals.generator;

import org.apache.commons.lang3.Validate;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JOp;
import com.sun.codemodel.JType;

public abstract class BasicEqualsCodeGenerator implements
EqualsCodeGenerator {

private final JCodeModel codeModel;

public BasicEqualsCodeGenerator(JCodeModel codeModel) {
this.codeModel = Validate.notNull(codeModel);
}

@Override
public void generate(JBlock block, JType type, JExpression left,
JExpression right) {
// if (!(left ==null ? right == null : <comparison>))
// { return false; }
final JExpression comparison = comparison(left, right);
block._if(
JOp.cond(left.eq(JExpr._null()), right.eq(JExpr._null()),
comparison).not())._then()._return(JExpr.FALSE);
}

public abstract JExpression comparison(JExpression left,
JExpression right);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.jvnet.jaxb2_commons.plugin.simpleequals.generator;

import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.JExpression;

public class DoubleEqualsCodeGenerator extends
PrimitiveEqualsCodeGenerator {
public DoubleEqualsCodeGenerator(JCodeModel codeModel) {
super(codeModel);
}

@Override
public JExpression transform(JExpression expression) {
return getCodeModel().ref(Double.class)
.staticInvoke("doubleToLongBits").arg(expression);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.jvnet.jaxb2_commons.plugin.simpleequals.generator;

import org.jvnet.jaxb2_commons.codemodel.generator.CodeGenerator;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JType;

public interface EqualsCodeGenerator extends CodeGenerator {

public void generate(JBlock block, JType type, JExpression left,
JExpression right);
}
Loading

0 comments on commit 24a2913

Please # to comment.