forked from highsource/jaxb-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ja6a
authored and
ja6a
committed
Nov 28, 2014
1 parent
24a2913
commit dcdce1a
Showing
9 changed files
with
219 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
...va/org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/BaseHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import org.apache.commons.lang3.Validate; | ||
|
||
import com.sun.codemodel.JCodeModel; | ||
|
||
public abstract class BaseHashCodeCodeGenerator implements | ||
HashCodeCodeGenerator { | ||
|
||
private final JCodeModel codeModel; | ||
|
||
public BaseHashCodeCodeGenerator(JCodeModel codeModel) { | ||
this.codeModel = Validate.notNull(codeModel); | ||
} | ||
|
||
public JCodeModel getCodeModel() { | ||
return codeModel; | ||
} | ||
} |
34 changes: 34 additions & 0 deletions
34
...a/org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/BasicHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.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 BasicHashCodeCodeGenerator implements | ||
HashCodeCodeGenerator { | ||
|
||
private final JCodeModel codeModel; | ||
|
||
public BasicHashCodeCodeGenerator(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); | ||
} |
17 changes: 17 additions & 0 deletions
17
.../org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/DoubleHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import com.sun.codemodel.JCodeModel; | ||
import com.sun.codemodel.JExpression; | ||
|
||
public class DoubleHashCodeCodeGenerator extends | ||
PrimitiveHashCodeCodeGenerator { | ||
public DoubleHashCodeCodeGenerator(JCodeModel codeModel) { | ||
super(codeModel); | ||
} | ||
|
||
@Override | ||
public JExpression transform(JExpression expression) { | ||
return getCodeModel().ref(Double.class) | ||
.staticInvoke("doubleToLongBits").arg(expression); | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
...a/org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/FloatHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import com.sun.codemodel.JCodeModel; | ||
import com.sun.codemodel.JExpression; | ||
|
||
public class FloatHashCodeCodeGenerator extends | ||
PrimitiveHashCodeCodeGenerator { | ||
public FloatHashCodeCodeGenerator(JCodeModel codeModel) { | ||
super(codeModel); | ||
} | ||
|
||
@Override | ||
public JExpression transform(JExpression expression) { | ||
return getCodeModel().ref(Float.class) | ||
.staticInvoke("floatToIntBits").arg(expression); | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
...n/java/org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/HashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.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 HashCodeCodeGenerator extends CodeGenerator { | ||
|
||
public void generate(JBlock block, JType type, JExpression left, | ||
JExpression right); | ||
} |
68 changes: 68 additions & 0 deletions
68
...org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/HashCodeCodeGeneratorFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import java.util.LinkedHashMap; | ||
import java.util.Map; | ||
import java.util.Map.Entry; | ||
|
||
import org.apache.commons.lang3.Validate; | ||
import org.jvnet.jaxb2_commons.codemodel.JCMType; | ||
import org.jvnet.jaxb2_commons.codemodel.JCMTypeFactory; | ||
import org.jvnet.jaxb2_commons.codemodel.generator.TypedCodeGeneratorFactory; | ||
|
||
import com.sun.codemodel.JCodeModel; | ||
import com.sun.codemodel.JType; | ||
|
||
public class HashCodeCodeGeneratorFactory implements | ||
TypedCodeGeneratorFactory<HashCodeCodeGenerator> { | ||
|
||
private final JCodeModel codeModel; | ||
private final JCMTypeFactory typeFactory = new JCMTypeFactory(); | ||
// Known code generators | ||
private final Map<JCMType<?>, HashCodeCodeGenerator> codeGenerators = new LinkedHashMap<JCMType<?>, HashCodeCodeGenerator>(); | ||
|
||
public HashCodeCodeGeneratorFactory(JCodeModel codeModel) { | ||
|
||
this.codeModel = Validate.notNull(codeModel); | ||
addCodeGenerator(this.codeModel.BOOLEAN, | ||
new PrimitiveHashCodeCodeGenerator(this.codeModel)); | ||
addCodeGenerator(this.codeModel.BYTE, new PrimitiveHashCodeCodeGenerator( | ||
this.codeModel)); | ||
addCodeGenerator(this.codeModel.SHORT, | ||
new PrimitiveHashCodeCodeGenerator(this.codeModel)); | ||
addCodeGenerator(this.codeModel.CHAR, new PrimitiveHashCodeCodeGenerator( | ||
this.codeModel)); | ||
addCodeGenerator(this.codeModel.INT, new PrimitiveHashCodeCodeGenerator( | ||
this.codeModel)); | ||
addCodeGenerator(this.codeModel.FLOAT, new FloatHashCodeCodeGenerator( | ||
this.codeModel)); | ||
addCodeGenerator(this.codeModel.LONG, new PrimitiveHashCodeCodeGenerator( | ||
this.codeModel)); | ||
addCodeGenerator(this.codeModel.DOUBLE, new FloatHashCodeCodeGenerator( | ||
this.codeModel)); | ||
// TODO primitive arrays | ||
// TODO Collections/Lists | ||
// TODO JAXBElement | ||
addCodeGenerator(this.codeModel.ref(Object.class), | ||
new ObjectHashCodeCodeGenerator(this.codeModel)); | ||
} | ||
|
||
private void addCodeGenerator(final JType type, | ||
HashCodeCodeGenerator hashCodeCodeGenerator) { | ||
final JCMType<?> factoredType = typeFactory.create(type); | ||
this.codeGenerators.put(factoredType, hashCodeCodeGenerator); | ||
} | ||
|
||
@Override | ||
public HashCodeCodeGenerator getCodeGenerator(JType type) { | ||
final JCMType<JType> factoredType = typeFactory.create(type); | ||
for (Entry<JCMType<?>, HashCodeCodeGenerator> entry : codeGenerators | ||
.entrySet()) { | ||
if (entry.getKey().matches(factoredType)) { | ||
return entry.getValue(); | ||
} | ||
} | ||
throw new IllegalArgumentException( | ||
"Could not find a code generator for [" + type + "]."); | ||
} | ||
|
||
} |
18 changes: 18 additions & 0 deletions
18
.../org/jvnet/jaxb2_commons/plugin/simplehashcode/generator/ObjectHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import com.sun.codemodel.JCodeModel; | ||
import com.sun.codemodel.JExpression; | ||
|
||
public class ObjectHashCodeCodeGenerator extends | ||
BasicHashCodeCodeGenerator { | ||
|
||
public ObjectHashCodeCodeGenerator(JCodeModel codeModel) { | ||
super(codeModel); | ||
} | ||
|
||
@Override | ||
public JExpression comparison(JExpression left, JExpression right) { | ||
// left.hashCode(right) | ||
return left.invoke("hashCode").arg(right); | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
...g/jvnet/jaxb2_commons/plugin/simplehashcode/generator/PrimitiveHashCodeCodeGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package org.jvnet.jaxb2_commons.plugin.simplehashcode.generator; | ||
|
||
import com.sun.codemodel.JBlock; | ||
import com.sun.codemodel.JCodeModel; | ||
import com.sun.codemodel.JExpr; | ||
import com.sun.codemodel.JExpression; | ||
import com.sun.codemodel.JType; | ||
|
||
public class PrimitiveHashCodeCodeGenerator extends | ||
BaseHashCodeCodeGenerator { | ||
|
||
public PrimitiveHashCodeCodeGenerator(JCodeModel codeModel) { | ||
super(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(comparison.not())._then()._return(JExpr.FALSE); | ||
} | ||
|
||
public JExpression comparison(JExpression left, JExpression right) { | ||
return transform(left).eq(transform(right)); | ||
} | ||
|
||
public JExpression transform(JExpression expression) { | ||
return expression; | ||
} | ||
} |