From d74d648583c078c6fae16307f737a6f8b9c08954 Mon Sep 17 00:00:00 2001 From: Matt Pavlovich Date: Thu, 17 Aug 2023 14:55:03 -0500 Subject: [PATCH] [#309] Merge annox NOTE: po project still not functional due to need for modernization in testing --- LICENSE | 3 +- README.md | 22 + jaxb-annox-parent/jaxb-annox/.gitignore | 4 + .../jaxb-annox/META-INF/.gitignore | 1 + .../jaxb-annox/META-INF/MANIFEST.MF | 29 + jaxb-annox-parent/jaxb-annox/pom.xml | 107 ++++ .../main/java/org/jvnet/annox/Constants.java | 9 + .../AnnotationClassNotFoundException.java | 21 + .../NoSuchAnnotationFieldException.java | 30 + .../org/jvnet/annox/io/NestedIOException.java | 35 ++ .../japa/parser/AnnotationExprParser.java | 54 ++ .../AbstractGenericExpressionVisitor.java | 541 ++++++++++++++++++ .../org/jvnet/annox/model/XAnnotated.java | 99 ++++ .../jvnet/annox/model/XAnnotatedElement.java | 72 +++ .../org/jvnet/annox/model/XAnnotation.java | 269 +++++++++ .../model/XAnnotationFieldValueVisitor.java | 102 ++++ .../XAnnotationFieldValueVisitorAdapter.java | 268 +++++++++ .../annox/model/XAnnotationFieldVisitor.java | 21 + .../model/XAnnotationInvocationHandler.java | 314 ++++++++++ .../java/org/jvnet/annox/model/XClass.java | 150 +++++ .../org/jvnet/annox/model/XConstructor.java | 93 +++ .../java/org/jvnet/annox/model/XField.java | 38 ++ .../java/org/jvnet/annox/model/XMember.java | 69 +++ .../java/org/jvnet/annox/model/XMethod.java | 93 +++ .../java/org/jvnet/annox/model/XPackage.java | 57 ++ .../org/jvnet/annox/model/XParameter.java | 39 ++ .../annotation/field/XAnnotationField.java | 86 +++ .../field/XArrayAnnotationField.java | 130 +++++ .../field/XSingleAnnotationField.java | 64 +++ .../AbstractBasicXAnnotationValueVisitor.java | 83 +++ .../annotation/value/XAnnotationValue.java | 40 ++ .../value/XAnnotationValueVisitor.java | 34 ++ .../value/XArrayClassAnnotationValue.java | 63 ++ .../value/XBooleanAnnotationValue.java | 14 + .../value/XByteAnnotationValue.java | 13 + .../value/XCharAnnotationValue.java | 13 + .../value/XClassAnnotationValue.java | 13 + .../value/XClassByNameAnnotationValue.java | 40 ++ .../value/XDoubleAnnotationValue.java | 13 + .../value/XDynamicAnnotationValue.java | 5 + .../value/XEnumAnnotationValue.java | 14 + .../value/XEnumByNameAnnotationValue.java | 42 ++ .../value/XFloatAnnotationValue.java | 13 + .../annotation/value/XIntAnnotationValue.java | 13 + .../value/XLongAnnotationValue.java | 13 + .../value/XShortAnnotationValue.java | 13 + .../value/XStaticAnnotationValue.java | 24 + .../value/XStringAnnotationValue.java | 13 + .../value/XXAnnotationAnnotationValue.java | 47 ++ ...XAnnotationArrayAnnotationFieldParser.java | 147 +++++ .../annox/parser/XAnnotationFieldParser.java | 48 ++ .../jvnet/annox/parser/XAnnotationParser.java | 415 ++++++++++++++ ...AnnotationSingleAnnotationFieldParser.java | 100 ++++ .../parser/XArrayAnnotationFieldParser.java | 142 +++++ .../annox/parser/XGenericFieldParser.java | 228 ++++++++ .../parser/XSingleAnnotationFieldParser.java | 83 +++ ...XAnnotationArrayAnnotationFieldParser.java | 127 ++++ ...AnnotationSingleAnnotationFieldParser.java | 106 ++++ .../AnnotationElementParseException.java | 20 + .../AnnotationExpressionParseException.java | 25 + .../AnnotationStringParseException.java | 24 + .../parser/exception/ValueParseException.java | 35 ++ .../visitor/BooleanExpressionVisitor.java | 18 + .../java/visitor/ByteExpressionVisitor.java | 18 + .../visitor/CharacterExpressionVisitor.java | 29 + .../java/visitor/ClassExpressionVisitor.java | 151 +++++ .../java/visitor/DoubleExpressionVisitor.java | 18 + .../java/visitor/EnumExpressionVisitor.java | 27 + .../java/visitor/ExpressionVisitor.java | 24 + .../java/visitor/FloatExpressionVisitor.java | 18 + .../visitor/IntegerExpressionVisitor.java | 18 + .../java/visitor/LongExpressionVisitor.java | 36 ++ .../java/visitor/ShortExpressionVisitor.java | 18 + .../java/visitor/StringExpressionVisitor.java | 18 + .../parser/value/XAnnotationValueParser.java | 17 + .../value/XBooleanAnnotationValueParser.java | 29 + .../value/XByteAnnotationValueParser.java | 29 + .../value/XCharAnnotationValueParser.java | 32 ++ .../value/XClassAnnotationValueParser.java | 114 ++++ .../value/XDoubleAnnotationValueParser.java | 29 + .../value/XEnumAnnotationValueParser.java | 37 ++ .../value/XFloatAnnotationValueParser.java | 29 + .../value/XIntAnnotationValueParser.java | 29 + .../value/XLongAnnotationValueParser.java | 29 + .../value/XShortAnnotationValueParser.java | 29 + .../value/XStringAnnotationValueParser.java | 29 + .../java/org/jvnet/annox/reader/XReader.java | 38 ++ .../jvnet/annox/reader/resourced/NClass.java | 20 + .../annox/reader/resourced/NConstructor.java | 20 + .../jvnet/annox/reader/resourced/NField.java | 20 + .../jvnet/annox/reader/resourced/NMethod.java | 22 + .../annox/reader/resourced/NPackage.java | 20 + .../annox/reader/resourced/NParameter.java | 20 + .../jvnet/annox/reader/resourced/NParser.java | 56 ++ .../annox/reader/resourced/NXConverter.java | 260 +++++++++ .../reader/resourced/ResourcedXReader.java | 333 +++++++++++ .../annox/reader/resourced/package-info.java | 3 + .../reflect/AnnotatedElementException.java | 21 + .../reflect/AnnotatedElementFactory.java | 17 + .../reflect/ConstructorAnnotatedElement.java | 38 ++ .../DirectAnnotatedElementFactory.java | 30 + .../reflect/DualAnnotatedElementFactory.java | 57 ++ .../annox/reflect/MethodAnnotatedElement.java | 37 ++ .../ParameterizedAnnotatedElement.java | 23 + .../ResourcedAnnotatedElementFactory.java | 63 ++ .../annox/util/AnnotationElementUtils.java | 138 +++++ .../java/org/jvnet/annox/util/ArrayUtils.java | 87 +++ .../java/org/jvnet/annox/util/ClassUtils.java | 154 +++++ .../org/jvnet/annox/util/ObjectUtils.java | 67 +++ .../org/jvnet/annox/util/ReflectionUtils.java | 75 +++ .../annox/xml/bind/AnnoxAnnotationReader.java | 225 ++++++++ .../jvnet/annox/xml/bind/LocatableUtils.java | 73 +++ .../org/jvnet/annox/demos/guide/Comment.java | 6 + .../jvnet/annox/demos/guide/DemoClass.java | 30 + .../jvnet/annox/demos/guide/MyAnnotation.java | 12 + .../org/jvnet/annox/demos/guide/MyClass.java | 7 + .../demos/guide/tests/DemoClassTest.java | 38 ++ .../annox/demos/guide/tests/MyClassTest.java | 37 ++ .../test/AnnotationWithIntegerField.java | 7 + .../test/AnnotationWithIntegerFieldTest.java | 30 + .../java/org/jvnet/annox/parser/tests/A.java | 20 + .../java/org/jvnet/annox/parser/tests/B.java | 35 ++ .../java/org/jvnet/annox/parser/tests/D.java | 9 + .../java/org/jvnet/annox/parser/tests/E.java | 3 + .../org/jvnet/annox/parser/tests/Eight.java | 6 + .../org/jvnet/annox/parser/tests/Eleven.java | 6 + .../java/org/jvnet/annox/parser/tests/F.java | 13 + .../org/jvnet/annox/parser/tests/Five.java | 6 + .../org/jvnet/annox/parser/tests/Four.java | 57 ++ .../java/org/jvnet/annox/parser/tests/G.java | 13 + .../java/org/jvnet/annox/parser/tests/H.java | 34 ++ .../java/org/jvnet/annox/parser/tests/I.java | 39 ++ .../java/org/jvnet/annox/parser/tests/J.java | 10 + .../annox/parser/tests/JAXBDemoTest.java | 32 ++ .../parser/tests/JavaTypeParserTest.java | 56 ++ .../java/org/jvnet/annox/parser/tests/K.java | 10 + .../java/org/jvnet/annox/parser/tests/L.java | 10 + .../java/org/jvnet/annox/parser/tests/M.java | 10 + .../org/jvnet/annox/parser/tests/Nine.java | 6 + .../org/jvnet/annox/parser/tests/One.java | 29 + .../org/jvnet/annox/parser/tests/Seven.java | 6 + .../org/jvnet/annox/parser/tests/Six.java | 6 + .../org/jvnet/annox/parser/tests/Ten.java | 6 + .../org/jvnet/annox/parser/tests/Three.java | 6 + .../org/jvnet/annox/parser/tests/Twelve.java | 17 + .../org/jvnet/annox/parser/tests/Two.java | 30 + .../XAnnotationParserAnnotationExprTest.java | 126 ++++ .../parser/tests/XAnnotationParserTest.java | 270 +++++++++ .../annox/reader/resourced/tests/Alpha.java | 34 ++ .../annox/reader/resourced/tests/Eleven.java | 5 + .../annox/reader/resourced/tests/Epsilon.java | 10 + .../annox/reader/resourced/tests/One.java | 44 ++ .../tests/ResourcedXReaderTests.java | 113 ++++ .../annox/reader/resourced/tests/Twelve.java | 5 + .../java/org/jvnet/annox/tests/ProxyTest.java | 33 ++ .../annox/util/tests/ArrayUtilsTest.java | 29 + .../annox/util/tests/ClassUtilsTest.java | 51 ++ .../annox/util/tests/ReflectionUtilsTest.java | 78 +++ .../jvnet/annox/demos/guide/DemoClass.ann.xml | 64 +++ .../jvnet/annox/demos/guide/MyClass.ann.xml | 9 + .../annox/demos/guide/package-info.ann.xml | 18 + .../org/jvnet/annox/parser/tests/d.xml | 1 + .../org/jvnet/annox/parser/tests/eight.txt | 1 + .../org/jvnet/annox/parser/tests/eight.xml | 2 + .../org/jvnet/annox/parser/tests/eleven.txt | 1 + .../org/jvnet/annox/parser/tests/eleven.xml | 3 + .../org/jvnet/annox/parser/tests/field.xml | 5 + .../jvnet/annox/parser/tests/fieldBridge.xml | 4 + .../org/jvnet/annox/parser/tests/five.txt | 1 + .../org/jvnet/annox/parser/tests/five.xml | 3 + .../org/jvnet/annox/parser/tests/h.xml | 3 + .../org/jvnet/annox/parser/tests/j.xml | 2 + .../org/jvnet/annox/parser/tests/k.xml | 2 + .../org/jvnet/annox/parser/tests/l.xml | 4 + .../org/jvnet/annox/parser/tests/m.xml | 5 + .../org/jvnet/annox/parser/tests/nine.txt | 1 + .../org/jvnet/annox/parser/tests/nine.xml | 4 + .../org/jvnet/annox/parser/tests/one.txt | 25 + .../org/jvnet/annox/parser/tests/one.xml | 35 ++ .../annox/parser/tests/package-info.java | 2 + .../org/jvnet/annox/parser/tests/seven.txt | 1 + .../org/jvnet/annox/parser/tests/seven.xml | 2 + .../org/jvnet/annox/parser/tests/six.txt | 1 + .../org/jvnet/annox/parser/tests/six.xml | 3 + .../org/jvnet/annox/parser/tests/ten.txt | 1 + .../org/jvnet/annox/parser/tests/ten.xml | 5 + .../org/jvnet/annox/parser/tests/three.txt | 1 + .../org/jvnet/annox/parser/tests/three.xml | 1 + .../org/jvnet/annox/parser/tests/twelve.txt | 13 + .../org/jvnet/annox/parser/tests/twelve.xml | 16 + .../org/jvnet/annox/parser/tests/two.txt | 25 + .../org/jvnet/annox/parser/tests/two.xml | 35 ++ .../annox/reader/resourced/tests/One.ann.xml | 61 ++ jaxb-annox-parent/pom.xml | 41 ++ jaxb-annox-parent/samples/.gitignore | 3 + jaxb-annox-parent/samples/po/.gitignore | 4 + jaxb-annox-parent/samples/po/pom.xml | 77 +++ .../samples/po/project-build.xml | 98 ++++ jaxb-annox-parent/samples/po/project-pom.xml | 41 ++ .../annox/samples/po/BigDecimalAdapter.java | 19 + .../org/jvnet/annox/samples/po/Items.java | 85 +++ .../jvnet/annox/samples/po/ObjectFactory.java | 38 ++ .../annox/samples/po/PurchaseOrderType.java | 56 ++ .../org/jvnet/annox/samples/po/USAddress.java | 71 +++ .../jvnet/annox/samples/po/Items$Item.ann.xml | 17 + .../annox/samples/po/package-info.ann.xml | 38 ++ .../po/tests/AnnotationReaderTest.java | 50 ++ .../org/jvnet/annox/samples/po/tests/po.xml | 31 + jaxb-annox-parent/samples/pom.xml | 129 +++++ .../samples/src/main/assembly/ant-src.xml | 38 ++ .../samples/src/main/assembly/maven-src.xml | 25 + pom.xml | 1 + qrelease.bat | 79 --- release.bat | 79 --- 214 files changed, 10246 insertions(+), 159 deletions(-) create mode 100644 jaxb-annox-parent/jaxb-annox/.gitignore create mode 100644 jaxb-annox-parent/jaxb-annox/META-INF/.gitignore create mode 100644 jaxb-annox-parent/jaxb-annox/META-INF/MANIFEST.MF create mode 100644 jaxb-annox-parent/jaxb-annox/pom.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/Constants.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/AnnotationClassNotFoundException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/NoSuchAnnotationFieldException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/io/NestedIOException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/AnnotationExprParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/ast/visitor/AbstractGenericExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotated.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotatedElement.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotation.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitorAdapter.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationInvocationHandler.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XClass.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XConstructor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMember.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMethod.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XPackage.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XParameter.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XAnnotationField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XArrayAnnotationField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XSingleAnnotationField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/AbstractBasicXAnnotationValueVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValueVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XArrayClassAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XBooleanAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XByteAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XCharAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassByNameAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDoubleAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDynamicAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumByNameAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XFloatAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XIntAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XLongAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XShortAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStaticAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStringAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XXAnnotationAnnotationValue.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationArrayAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationSingleAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XArrayAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XGenericFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XSingleAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationArrayAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationSingleAnnotationFieldParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationElementParseException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationExpressionParseException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationStringParseException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/ValueParseException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/BooleanExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ByteExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/CharacterExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ClassExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/DoubleExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/EnumExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/FloatExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/IntegerExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/LongExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ShortExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/StringExpressionVisitor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XBooleanAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XByteAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XCharAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XClassAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XDoubleAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XEnumAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XFloatAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XIntAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XLongAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XShortAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XStringAnnotationValueParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/XReader.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NClass.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NConstructor.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NMethod.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NPackage.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParameter.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParser.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NXConverter.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/ResourcedXReader.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/package-info.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementException.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementFactory.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ConstructorAnnotatedElement.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DirectAnnotatedElementFactory.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DualAnnotatedElementFactory.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/MethodAnnotatedElement.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ParameterizedAnnotatedElement.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ResourcedAnnotatedElementFactory.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/AnnotationElementUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ArrayUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ClassUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ObjectUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ReflectionUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/AnnoxAnnotationReader.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/LocatableUtils.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/Comment.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/DemoClass.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyAnnotation.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyClass.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/DemoClassTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/MyClassTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerField.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerFieldTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/A.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/B.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/D.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/E.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eight.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eleven.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/F.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Five.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Four.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/G.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/H.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/I.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/J.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JAXBDemoTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JavaTypeParserTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/K.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/L.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/M.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Nine.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/One.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Seven.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Six.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Ten.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Three.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Twelve.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Two.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserAnnotationExprTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Alpha.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Eleven.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Epsilon.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/One.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/ResourcedXReaderTests.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Twelve.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/tests/ProxyTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ArrayUtilsTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ClassUtilsTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ReflectionUtilsTest.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/DemoClass.ann.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/MyClass.ann.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/package-info.ann.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/d.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/field.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/fieldBridge.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/h.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/j.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/k.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/l.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/m.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/package-info.java create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.txt create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.xml create mode 100644 jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/reader/resourced/tests/One.ann.xml create mode 100644 jaxb-annox-parent/pom.xml create mode 100644 jaxb-annox-parent/samples/.gitignore create mode 100644 jaxb-annox-parent/samples/po/.gitignore create mode 100644 jaxb-annox-parent/samples/po/pom.xml create mode 100644 jaxb-annox-parent/samples/po/project-build.xml create mode 100644 jaxb-annox-parent/samples/po/project-pom.xml create mode 100644 jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/BigDecimalAdapter.java create mode 100644 jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/Items.java create mode 100644 jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/ObjectFactory.java create mode 100644 jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/PurchaseOrderType.java create mode 100644 jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/USAddress.java create mode 100644 jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/Items$Item.ann.xml create mode 100644 jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/package-info.ann.xml create mode 100644 jaxb-annox-parent/samples/po/src/test/java/org/jvnet/annox/samples/po/tests/AnnotationReaderTest.java create mode 100644 jaxb-annox-parent/samples/po/src/test/resources/org/jvnet/annox/samples/po/tests/po.xml create mode 100644 jaxb-annox-parent/samples/pom.xml create mode 100644 jaxb-annox-parent/samples/src/main/assembly/ant-src.xml create mode 100644 jaxb-annox-parent/samples/src/main/assembly/maven-src.xml delete mode 100644 qrelease.bat delete mode 100644 release.bat diff --git a/LICENSE b/LICENSE index 294484a2a..5d5aad950 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,6 @@ +Copyright (c) 2021-2023, Matt Pavlovich. Copyright (c) 2005-2021, Alexey Valikov. + All rights reserved. Redistribution and use in source and binary forms, with or without @@ -21,4 +23,3 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/README.md b/README.md index 6ee6d650c..7dc659da7 100644 --- a/README.md +++ b/README.md @@ -115,3 +115,25 @@ JAXB2 Basics can only be used with Java 1.8 and above. ## Credits ## * Many thanks to **James Annesley** for his ideas and help with the [SimpleEquals Plugin](https://github.com/highsource/jaxb2-basics/wiki/JAXB2-SimpleEquals-Plugin) and the [SimpleHashCode Plugin](https://github.com/highsource/jaxb2-basics/wiki/JAXB2-SimpleHashCode-Plugin). + + +Annox +===== + +Parse Java annotations from text or XML resources. + +```java + // Parse annotation from the string + XAnnotation xannotation = + (XAnnotation) XAnnotationParser.INSTANCE.parse + ("@javax.xml.bind.annotation.XmlRootElement(name=\"foo\")"); + + // Create an instance of the annotation + XmlRootElement xmlRootElement = xannotation.getResult(); + assertEquals("foo", xmlRootElement.name()); + assertEquals("##default", xmlRootElement.namespace()); + + // Analyze the structure of the annotation + assertEquals(String.class, xannotation.getFieldsMap().get("name").getType()); + assertEquals("##default", xannotation.getFieldsMap().get("namespace").getResult()); +``` diff --git a/jaxb-annox-parent/jaxb-annox/.gitignore b/jaxb-annox-parent/jaxb-annox/.gitignore new file mode 100644 index 000000000..252d3b1ef --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/.gitignore @@ -0,0 +1,4 @@ +target +.settings +.project +.classpath diff --git a/jaxb-annox-parent/jaxb-annox/META-INF/.gitignore b/jaxb-annox-parent/jaxb-annox/META-INF/.gitignore new file mode 100644 index 000000000..44d7f550c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/META-INF/.gitignore @@ -0,0 +1 @@ +/MANIFEST.MF \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/META-INF/MANIFEST.MF b/jaxb-annox-parent/jaxb-annox/META-INF/MANIFEST.MF new file mode 100644 index 000000000..808e3905a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/META-INF/MANIFEST.MF @@ -0,0 +1,29 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Created-By: 17.0.3.1 (Oracle Corporation) +Tool: Bnd-1.15.0 +Bnd-LastModified: 1692302035692 +Export-Package: org.jvnet.annox,org.jvnet.annox.annotation;uses:="org.ap + ache.commons.lang3",org.jvnet.annox.io,org.jvnet.annox.model;uses:="org + .apache.commons.lang3,org.jvnet.annox.parser,org.jvnet.annox.reflect,or + g.apache.commons.lang3.builder",org.jvnet.annox.parser;uses:="org.jvnet + .annox.model,org.jvnet.annox.util,org.jvnet.annox.annotation,org.jvnet. + annox,org.apache.commons.lang3",org.jvnet.annox.reader;uses:="org.jvnet + .annox.model,org.jvnet.annox.reflect",org.jvnet.annox.reader.resourced; + uses:="org.apache.commons.lang3,org.jvnet.annox.io,org.jvnet.annox.mode + l,org.jvnet.annox.util,org.jvnet.annox.parser,org.jvnet.annox.reflect,o + rg.jvnet.annox.reader",org.jvnet.annox.reflect;uses:="org.jvnet.annox.r + eader.resourced,org.jvnet.annox.model,org.apache.commons.lang3,org.jvne + t.annox.reader",org.jvnet.annox.util;uses:="org.jvnet.annox,org.apache. + commons.lang3",org.jvnet.annox.xml.bind;uses:="org.jvnet.annox.reflect" +Import-Package: org.apache.commons.lang3;version="3.2.1",org.apache.comm + ons.lang3.builder;version="3.2.1" +Bundle-Version: 2.0.5.SNAPSHOT +Bundle-SymbolicName: org.jvnet.jaxb.annox +Bundle-License: https://github.com/highsource/jaxb-tools/blob/master/LIC + ENSE +Bundle-Description: JAXB Annox is a part of JAXB Tools project which imp + lements support for reading and writing XML annotations. +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-Name: JAXB Tools :: JAXB Annox + diff --git a/jaxb-annox-parent/jaxb-annox/pom.xml b/jaxb-annox-parent/jaxb-annox/pom.xml new file mode 100644 index 000000000..e1c7bced3 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/pom.xml @@ -0,0 +1,107 @@ + + 4.0.0 + + org.jvnet.jaxb + jaxb-annox-parent + 2.0.5-SNAPSHOT + ../pom.xml + + org.jvnet.jaxb + jaxb-annox + jar + JAXB Tools :: JAXB Annox + + ${project.version} + yyyyMMddHHmm + + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.version} + provided + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + 2.4 + + + com.google.code.javaparser + javaparser + 1.0.11 + + + org.hibernate + hibernate-search + 3.0.0.GA + test + + + javax.transaction + jta + 1.1 + test + + + + + + org.apache.felix + maven-bundle-plugin + true + 2.2.0 + + + bundle-manifest + process-classes + + manifest + + + + jar + + META-INF + + ${annox.osgi.version} + + org.apache.commons.lang3;version="3.2.1", + org.apache.commons.lang3.builder;version="3.2.1" + + + org.jvnet.annox, + org.jvnet.annox.annotation, + org.jvnet.annox.io, + org.jvnet.annox.model, + org.jvnet.annox.parser, + org.jvnet.annox.reader, + org.jvnet.annox.reader.resourced, + org.jvnet.annox.reflect, + org.jvnet.annox.util, + org.jvnet.annox.xml.bind + + J2SE-1.5 + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.5 + + + META-INF/MANIFEST.MF + + + + + + + diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/Constants.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/Constants.java new file mode 100644 index 000000000..7ed9e758d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/Constants.java @@ -0,0 +1,9 @@ +package org.jvnet.annox; + +public class Constants { + + public static final String NAMESPACE_URI = "http://annox.dev.java.net"; + + public static final String NAMESPACE_URI_PREFIX = NAMESPACE_URI + "/"; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/AnnotationClassNotFoundException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/AnnotationClassNotFoundException.java new file mode 100644 index 000000000..28d8e3a3a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/AnnotationClassNotFoundException.java @@ -0,0 +1,21 @@ +package org.jvnet.annox.annotation; + +import org.apache.commons.lang3.Validate; + +public class AnnotationClassNotFoundException extends Exception { + + private static final long serialVersionUID = 1L; + + private String className; + + public AnnotationClassNotFoundException(String className, Throwable cause) { + super("Annotation class [" + className + "] could not be found.", cause); + Validate.notNull(className); + this.className = className; + } + + public String getClassName() { + return className; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/NoSuchAnnotationFieldException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/NoSuchAnnotationFieldException.java new file mode 100644 index 000000000..a8831e8de --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/annotation/NoSuchAnnotationFieldException.java @@ -0,0 +1,30 @@ +package org.jvnet.annox.annotation; + +import java.lang.annotation.Annotation; + +public class NoSuchAnnotationFieldException extends Exception { + + private static final long serialVersionUID = 1L; + + private final Class annotationType; + + private final String name; + + public NoSuchAnnotationFieldException( + final Class annotationType, + final String name, Throwable cause) { + super("No such annotation field [" + name + "] in annotation class [" + + (annotationType == null ? "null" : annotationType.getName()) + + "].", cause); + this.annotationType = annotationType; + this.name = name; + } + + public Class getAnnotationType() { + return annotationType; + } + + public String getName() { + return name; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/io/NestedIOException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/io/NestedIOException.java new file mode 100644 index 000000000..d1780820b --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/io/NestedIOException.java @@ -0,0 +1,35 @@ +package org.jvnet.annox.io; + +import java.io.IOException; + +public class NestedIOException extends IOException { + + private static final long serialVersionUID = 1L; + + public NestedIOException(Throwable cause) { + super(); + initCause(cause); + } + + public NestedIOException(String msg, Throwable cause) { + super(msg); + initCause(cause); + } + + public String getMessage() { + return buildMessage(super.getMessage(), getCause()); + } + + public static String buildMessage(String message, Throwable cause) { + if (cause != null) { + StringBuffer buf = new StringBuffer(); + if (message != null) { + buf.append(message).append("; "); + } + buf.append("nested exception is ").append(cause); + return buf.toString(); + } else { + return message; + } + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/AnnotationExprParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/AnnotationExprParser.java new file mode 100644 index 000000000..9bef5b9fb --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/AnnotationExprParser.java @@ -0,0 +1,54 @@ +package org.jvnet.annox.japa.parser; + +import japa.parser.JavaParser; +import japa.parser.ParseException; +import japa.parser.ast.CompilationUnit; +import japa.parser.ast.body.ClassOrInterfaceDeclaration; +import japa.parser.ast.body.TypeDeclaration; +import japa.parser.ast.expr.AnnotationExpr; + +import java.io.StringReader; +import java.text.MessageFormat; +import java.util.List; + +import org.apache.commons.lang3.Validate; + +public class AnnotationExprParser { + + public List parse(String text) throws ParseException { + Validate.notNull(text); + final String classText = text + "\n" + "public class Dummy{}"; + final StringReader reader = new StringReader(classText); + final CompilationUnit compilationUnit = JavaParser.parse(reader, true); + final List typeDeclarations = compilationUnit + .getTypes(); + if (typeDeclarations.size() > 1) { + throw new ParseException( + MessageFormat + .format("Annotation [{0}] could not be parsed, it contains an unexpected type declaration.", + text)); + } + final TypeDeclaration typeDeclaration = typeDeclarations.get(0); + if (!(typeDeclaration instanceof ClassOrInterfaceDeclaration)) { + throw new ParseException(MessageFormat.format( + "Expected [{0}] as type declaration.", + ClassOrInterfaceDeclaration.class.getName())); + } + final ClassOrInterfaceDeclaration classDeclaration = (ClassOrInterfaceDeclaration) typeDeclaration; + if (!"Dummy".equals(classDeclaration.getName())) { + throw new ParseException(MessageFormat.format( + "Expected [{0}] as type declaration.", "Dummy")); + } + + final List annotations = typeDeclaration + .getAnnotations(); + + if (annotations == null || annotations.isEmpty()) { + throw new ParseException( + MessageFormat + .format("Annotation [{0}] could not be parsed, it does not seem to contain an annotation declaration.", + text)); + } + return annotations; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/ast/visitor/AbstractGenericExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/ast/visitor/AbstractGenericExpressionVisitor.java new file mode 100644 index 000000000..aea426190 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/japa/parser/ast/visitor/AbstractGenericExpressionVisitor.java @@ -0,0 +1,541 @@ +package org.jvnet.annox.japa.parser.ast.visitor; + +import japa.parser.ast.CompilationUnit; +import japa.parser.ast.ImportDeclaration; +import japa.parser.ast.Node; +import japa.parser.ast.PackageDeclaration; +import japa.parser.ast.TypeParameter; +import japa.parser.ast.body.AnnotationDeclaration; +import japa.parser.ast.body.AnnotationMemberDeclaration; +import japa.parser.ast.body.ClassOrInterfaceDeclaration; +import japa.parser.ast.body.ConstructorDeclaration; +import japa.parser.ast.body.EmptyMemberDeclaration; +import japa.parser.ast.body.EmptyTypeDeclaration; +import japa.parser.ast.body.EnumConstantDeclaration; +import japa.parser.ast.body.EnumDeclaration; +import japa.parser.ast.body.FieldDeclaration; +import japa.parser.ast.body.InitializerDeclaration; +import japa.parser.ast.body.MethodDeclaration; +import japa.parser.ast.body.MultiTypeParameter; +import japa.parser.ast.body.Parameter; +import japa.parser.ast.body.VariableDeclarator; +import japa.parser.ast.body.VariableDeclaratorId; +import japa.parser.ast.comments.BlockComment; +import japa.parser.ast.comments.JavadocComment; +import japa.parser.ast.comments.LineComment; +import japa.parser.ast.expr.AnnotationExpr; +import japa.parser.ast.expr.ArrayAccessExpr; +import japa.parser.ast.expr.ArrayCreationExpr; +import japa.parser.ast.expr.ArrayInitializerExpr; +import japa.parser.ast.expr.AssignExpr; +import japa.parser.ast.expr.BinaryExpr; +import japa.parser.ast.expr.BooleanLiteralExpr; +import japa.parser.ast.expr.CastExpr; +import japa.parser.ast.expr.CharLiteralExpr; +import japa.parser.ast.expr.ClassExpr; +import japa.parser.ast.expr.ConditionalExpr; +import japa.parser.ast.expr.DoubleLiteralExpr; +import japa.parser.ast.expr.EnclosedExpr; +import japa.parser.ast.expr.Expression; +import japa.parser.ast.expr.FieldAccessExpr; +import japa.parser.ast.expr.InstanceOfExpr; +import japa.parser.ast.expr.IntegerLiteralExpr; +import japa.parser.ast.expr.IntegerLiteralMinValueExpr; +import japa.parser.ast.expr.LiteralExpr; +import japa.parser.ast.expr.LongLiteralExpr; +import japa.parser.ast.expr.LongLiteralMinValueExpr; +import japa.parser.ast.expr.MarkerAnnotationExpr; +import japa.parser.ast.expr.MemberValuePair; +import japa.parser.ast.expr.MethodCallExpr; +import japa.parser.ast.expr.NameExpr; +import japa.parser.ast.expr.NormalAnnotationExpr; +import japa.parser.ast.expr.NullLiteralExpr; +import japa.parser.ast.expr.ObjectCreationExpr; +import japa.parser.ast.expr.QualifiedNameExpr; +import japa.parser.ast.expr.SingleMemberAnnotationExpr; +import japa.parser.ast.expr.StringLiteralExpr; +import japa.parser.ast.expr.SuperExpr; +import japa.parser.ast.expr.ThisExpr; +import japa.parser.ast.expr.UnaryExpr; +import japa.parser.ast.expr.VariableDeclarationExpr; +import japa.parser.ast.stmt.AssertStmt; +import japa.parser.ast.stmt.BlockStmt; +import japa.parser.ast.stmt.BreakStmt; +import japa.parser.ast.stmt.CatchClause; +import japa.parser.ast.stmt.ContinueStmt; +import japa.parser.ast.stmt.DoStmt; +import japa.parser.ast.stmt.EmptyStmt; +import japa.parser.ast.stmt.ExplicitConstructorInvocationStmt; +import japa.parser.ast.stmt.ExpressionStmt; +import japa.parser.ast.stmt.ForStmt; +import japa.parser.ast.stmt.ForeachStmt; +import japa.parser.ast.stmt.IfStmt; +import japa.parser.ast.stmt.LabeledStmt; +import japa.parser.ast.stmt.ReturnStmt; +import japa.parser.ast.stmt.SwitchEntryStmt; +import japa.parser.ast.stmt.SwitchStmt; +import japa.parser.ast.stmt.SynchronizedStmt; +import japa.parser.ast.stmt.ThrowStmt; +import japa.parser.ast.stmt.TryStmt; +import japa.parser.ast.stmt.TypeDeclarationStmt; +import japa.parser.ast.stmt.WhileStmt; +import japa.parser.ast.type.ClassOrInterfaceType; +import japa.parser.ast.type.PrimitiveType; +import japa.parser.ast.type.ReferenceType; +import japa.parser.ast.type.VoidType; +import japa.parser.ast.type.WildcardType; +import japa.parser.ast.visitor.GenericVisitor; + +public abstract class AbstractGenericExpressionVisitor implements + GenericVisitor { + + public abstract R visitDefault(Node n, A arg); + + public R visitDefault(Expression n, A arg) + { + return visitDefault((Node) n, arg); + } + + public R visitDefault(LiteralExpr n, A arg) + { + return visitDefault((Expression) n, arg); + } + + public R visitDefault(StringLiteralExpr n, A arg) + { + return visitDefault((LiteralExpr) n, arg); + } + + public R visitDefault(IntegerLiteralExpr n, A arg) + { + return visitDefault((StringLiteralExpr) n, arg); + } + + public R visitDefault(IntegerLiteralMinValueExpr n, A arg) + { + return visitDefault((IntegerLiteralExpr) n, arg); + } + + public R visitDefault(LongLiteralExpr n, A arg) + { + return visitDefault((StringLiteralExpr) n, arg); + } + + public R visitDefault(LongLiteralMinValueExpr n, A arg) + { + return visitDefault((LongLiteralExpr) n, arg); + } + + public R visitDefault(NameExpr n, A arg) { + return visitDefault((Expression) n, arg); + } + + + @Override + public R visit(CompilationUnit n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(PackageDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ImportDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(TypeParameter n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(LineComment n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(BlockComment n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ClassOrInterfaceDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EnumDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EmptyTypeDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EnumConstantDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(AnnotationDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(AnnotationMemberDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(FieldDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(VariableDeclarator n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(VariableDeclaratorId n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ConstructorDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(MethodDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(Parameter n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EmptyMemberDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(InitializerDeclaration n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(JavadocComment n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ClassOrInterfaceType n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(PrimitiveType n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ReferenceType n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(VoidType n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(WildcardType n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ArrayAccessExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ArrayCreationExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ArrayInitializerExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(AssignExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(BinaryExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(CastExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ClassExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ConditionalExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EnclosedExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(FieldAccessExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(InstanceOfExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(StringLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(IntegerLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(LongLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(IntegerLiteralMinValueExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(LongLiteralMinValueExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(CharLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(DoubleLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(BooleanLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(NullLiteralExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(MethodCallExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(NameExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ObjectCreationExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(QualifiedNameExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ThisExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(SuperExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(UnaryExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(VariableDeclarationExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(MarkerAnnotationExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(SingleMemberAnnotationExpr n, A arg) { + return visitDefault(n, arg); + } + + + public R visitDefault(AnnotationExpr n, A arg) + { + return visitDefault((Expression) n, arg); + } + + + @Override + public R visit(NormalAnnotationExpr n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(MemberValuePair n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ExplicitConstructorInvocationStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(TypeDeclarationStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(AssertStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(BlockStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(LabeledStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(EmptyStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ExpressionStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(SwitchStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(SwitchEntryStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(BreakStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ReturnStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(IfStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(WhileStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ContinueStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(DoStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ForeachStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ForStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(ThrowStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(SynchronizedStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(TryStmt n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(CatchClause n, A arg) { + return visitDefault(n, arg); + } + + @Override + public R visit(MultiTypeParameter n, A arg) { + return visitDefault(n, arg); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotated.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotated.java new file mode 100644 index 000000000..af042f2cc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotated.java @@ -0,0 +1,99 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; + +/** + * Defines an item with an array of the associated annotations. + * + * @author Aleksei Valikov + */ +public abstract class XAnnotated { + + /** + * Annotations. + */ + private final XAnnotation[] xannotations; + + /** + * Constructs an annotated item. + * + * @param xannotations + * item annotations, may be null + */ + public XAnnotated(XAnnotation[] xannotations) { + this.xannotations = xannotations != null ? xannotations + : new XAnnotation[0]; + } + + /** + * Returns the annotations associated with the item. + * + * @return Item annotations. + */ + public XAnnotation[] getXAnnotations() { + return xannotations; + } + + /** + * Returns annotations for this annotated item. + * + * @return Array of annotations. + */ + public Annotation[] getAnnotations() { + final XAnnotation[] xannotations = getXAnnotations(); + final Annotation[] annotations = new Annotation[xannotations.length]; + for (int index = 0; index < xannotations.length; index++) { + annotations[index] = xannotations[index].getResult(); + } + return annotations; + } + + @Override + public int hashCode() { + int hash = 0; + for (int i = 0; i < xannotations.length; i++) { + hash = hash * 37 + xannotations.hashCode(); + } + return hash; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof XAnnotated)) { + return false; + } + if (this == obj) { + return true; + } + final XAnnotated other = (XAnnotated) obj; + final XAnnotation[] lhs = xannotations; + final XAnnotation[] rhs = other.xannotations; + if (lhs == rhs) { + return true; + } + if (lhs == null || rhs == null) { + return false; + } + if (lhs.length != rhs.length) { + return false; + } + for (int i = 0; i < lhs.length; ++i) { + if (!(lhs[i].equals(rhs[i]))) + return false; + } + return true; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer(); + for (int index = 0; index < xannotations.length; index++) { + final XAnnotation field = xannotations[index]; + if (index > 0) { + sb.append("\n"); + } + sb.append(field); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotatedElement.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotatedElement.java new file mode 100644 index 000000000..14f6d3e0a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotatedElement.java @@ -0,0 +1,72 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; + +import org.apache.commons.lang3.Validate; + +/** + * Defines an annotated element. + * + * @param + * type of the annotated element. + * @author Aleksei Valikov + */ +public class XAnnotatedElement extends XAnnotated + implements AnnotatedElement { + + /** + * Target annotated element. + */ + private final T annotatedElement; + + /** + * Constructs an annotated element. + * + * @param annotatedElement + * target annotated element. + * @param xannotations + * element annotations. + */ + public XAnnotatedElement(T annotatedElement, XAnnotation[] xannotations) { + super(xannotations); + Validate.notNull(annotatedElement, + "Annotated element must not be null."); + this.annotatedElement = annotatedElement; + } + + /** + * Returns the target annotated element. + * + * @return Target annotated element. + */ + public T getAnnotatedElement() { + return annotatedElement; + } + + public boolean isAnnotationPresent( + Class annotationClass) { + for (final XAnnotation xannotation : getXAnnotations()) { + if (annotationClass.equals(xannotation.getAnnotationClass())) { + return true; + } + } + return false; + } + + public X getAnnotation(Class annotationClass) { + for (final XAnnotation xannotation : getXAnnotations()) { + if (annotationClass.equals(xannotation.getAnnotationClass())) { + @SuppressWarnings("unchecked") + final X result = (X) xannotation.getResult(); + return result; + } + } + return null; + } + + public Annotation[] getDeclaredAnnotations() { + throw new UnsupportedOperationException(); + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotation.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotation.java new file mode 100644 index 000000000..eb23bd7e7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotation.java @@ -0,0 +1,269 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.parser.XGenericFieldParser; + +/** + * Defines an xannotation. + * + * @author Aleksei Valikov + * + */ +public class XAnnotation { + + /** + * Empty array of annotations. + */ + public static XAnnotation[] EMPTY_ARRAY = new XAnnotation[0]; + + /** + * Class of the annotation. + */ + final Class annotationClass; + + /** + * Map of the xannotation fields. + */ + private final Map> fieldsMap; + + /** + * Set of the xannotation fields. + */ + private final Set> fieldsSet; + + /** + * List of the xannotation fields. + */ + private final List> fieldsList; + + /** + * Constructs an xannotation for the given annotation class. + * + * @param annotationClass + * annotation class, must not be null + * @param fields + * fields of the xannotation. + * @throws IllegalArgumentException + * If annotation class is null, some required + * annotation fields are missing or some annotation fields have + * mismatching types. + */ + public XAnnotation(final Class annotationClass, + final XAnnotationField... fields) + throws IllegalArgumentException { + Validate.notNull(annotationClass, "Annotation class must not be null."); + this.annotationClass = annotationClass; + final List> fieldsList = Collections + .unmodifiableList(toFieldsList(fields)); + + final Map> fieldsMap = Collections + .unmodifiableMap(toFieldsMap(annotationClass.getMethods(), + fieldsList)); + checkFieldsMap(fieldsMap); + + this.fieldsList = fieldsList; + this.fieldsMap = fieldsMap; + this.fieldsSet = Collections + .unmodifiableSet(new HashSet>(fieldsMap + .values())); + } + + private static List> toFieldsList( + final XAnnotationField[] fields) { + if (fields == null) { + return Collections.emptyList(); + } else { + final List> fieldsList = new ArrayList>( + fields.length); + + for (XAnnotationField field : fields) { + if (field != null) { + fieldsList.add(field); + } + } + return fieldsList; + } + } + + @SuppressWarnings("unchecked") + private static Map> toFieldsMap( + final Method[] methods, final List> fieldsList) { + final Map> definedFieldsMap = new HashMap>(); + if (fieldsList != null) { + for (XAnnotationField definedField : fieldsList) { + if (definedField == null) + throw new IllegalArgumentException( + "Fields array must not contain null entries."); + definedFieldsMap.put(definedField.getName(), definedField); + } + } + + final Map> fieldsMap = new HashMap>(); + + for (final Method method : methods) { + if (Annotation.class.equals(method.getDeclaringClass())) { + // Annotation class methods are ignored + } else { + final String name = method.getName(); + final Class fieldType = method.getReturnType(); + final XAnnotationField field; + + final XAnnotationField definedField = definedFieldsMap + .get(name); + if (definedField == null) { + final Object defaultValue = method.getDefaultValue(); + if (defaultValue == null) { + throw new IllegalArgumentException( + "Field [" + + name + + "] is not defined and it has no default value."); + } else { + try { + field = XGenericFieldParser.GENERIC.construct( + name, defaultValue, fieldType); + } catch (Exception ex) { + throw new IllegalArgumentException("Field [" + name + + "] could not be parsed.", ex); + } + } + } else { + final Class definedFieldType = definedField.getType(); + if (!fieldType.equals(definedFieldType)) { + throw new IllegalArgumentException("Field [" + name + + "] has the wrong type [" + definedFieldType + + "] instead of expected [" + fieldType + "]."); + } else { + field = definedField; + } + } + + fieldsMap.put(field.getName(), field); + } + } + return fieldsMap; + } + + private void checkFieldsMap(Map> fieldsMap) { + + final Method[] methods = annotationClass.getMethods(); + + for (final Method method : methods) { + if (!Annotation.class.equals(method.getDeclaringClass())) { + final String name = method.getName(); + final Class type = method.getReturnType(); + final XAnnotationField field = fieldsMap.get(name); + if (field == null) { + throw new IllegalArgumentException("Field [" + name + + "] is not defined."); + } + final Class fieldType = field.getType(); + if (!type.equals(fieldType)) { + throw new IllegalArgumentException("Field [" + name + + "] has the wrong type [" + field.getType() + + "] instead of expected [" + type + "]."); + } + } + } + + } + + /** + * Returns the annotation class. + * + * @return annotation class. + */ + public Class getAnnotationClass() { + return annotationClass; + } + + public String getAnnotationClassName() { + return annotationClass.getName(); + } + + /** + * Returns the list of the fields. + * + * @return list of the fields. + */ + public List> getFieldsList() { + return fieldsList; + } + + /** + * Returns the map of the fields. + * + * @return map of the fields. + */ + public Map> getFieldsMap() { + return fieldsMap; + } + + @Override + public int hashCode() { + int hash = 0; + hash = hash * 37 + annotationClass.hashCode(); + hash = hash * 37 + fieldsSet.hashCode(); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof XAnnotation)) { + return false; + } + if (this == obj) { + return true; + } + final XAnnotation other = (XAnnotation) obj; + return annotationClass.equals(other.annotationClass) + && fieldsSet.equals(other.fieldsSet); + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer(); + sb.append("@"); + sb.append(getAnnotationClass().getName()); + + sb.append("("); + for (int index = 0; index < fieldsList.size(); index++) { + final XAnnotationField field = fieldsList.get(index); + if (index > 0) { + sb.append(", "); + } + sb.append(field); + } + sb.append(")"); + return sb.toString(); + } + + /** + * Returns the instance of the annotation for this xannotation. + * + * @return Instance of the annotation for this xannotation. + */ + public A getResult() { + final InvocationHandler handler = new XAnnotationInvocationHandler(this); + + @SuppressWarnings("unchecked") + final A annotation = (A) Proxy.newProxyInstance( + annotationClass.getClassLoader(), + new Class[] { annotationClass }, handler); + + return annotation; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitor.java new file mode 100644 index 000000000..c700740da --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitor.java @@ -0,0 +1,102 @@ +//package org.jvnet.annox.model; +// +//import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +//import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +//import org.jvnet.annox.model.annotation.value.XAnnotationAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XArrayClassAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XBooleanAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XByteAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XCharAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XClassAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XClassByNameAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XDoubleAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XEnumAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XEnumByNameAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XFloatAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XIntAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XLongAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XShortAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XStringAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +// +//public interface XAnnotationFieldValueVisitor extends XAnnotationFieldVisitor { +// +// public T visit(XSingleAnnotationField field, +// XAnnotationAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XXAnnotationAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XBooleanAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XByteAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XCharAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XDoubleAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XFloatAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XIntAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XLongAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XShortAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, XStringAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XEnumAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XEnumByNameAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XClassAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XClassByNameAnnotationValue value); +// +// public T visit(XSingleAnnotationField field, +// XArrayClassAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XAnnotationAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XXAnnotationAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XBooleanAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XByteAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XCharAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XDoubleAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XFloatAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XIntAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XLongAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XShortAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XStringAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, XEnumAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XEnumByNameAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XClassAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XClassByNameAnnotationValue value); +// +// public T visit(XArrayAnnotationField field, +// XArrayClassAnnotationValue value); +// +//} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitorAdapter.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitorAdapter.java new file mode 100644 index 000000000..57a125fc1 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldValueVisitorAdapter.java @@ -0,0 +1,268 @@ +//package org.jvnet.annox.model; +// +//import org.apache.commons.lang3.Validate; +//import org.jvnet.annox.model.annotation.field.XAnnotationField; +//import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +//import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +//import org.jvnet.annox.model.annotation.value.XAnnotationAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XAnnotationValueVisitor; +//import org.jvnet.annox.model.annotation.value.XArrayClassAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XBooleanAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XByteAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XCharAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XClassAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XClassByNameAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XDoubleAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XEnumAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XEnumByNameAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XFloatAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XIntAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XLongAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XShortAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XStringAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +// +//public class XAnnotationFieldValueVisitorAdapter implements +// XAnnotationFieldVisitor { +// +// private final XAnnotationFieldValueVisitor fieldValueVisitor; +// +// public XAnnotationFieldValueVisitorAdapter( +// XAnnotationFieldValueVisitor fieldValueVisitor) { +// Validate.notNull(fieldValueVisitor); +// this.fieldValueVisitor = fieldValueVisitor; +// }; +// +// @Override +// public Void visitSingleAnnotationField(XSingleAnnotationField field) { +// final XAnnotationValue value = field.getAnnotationValue(); +// value.accept(new XSingleAnnotationFieldAnnotationValueVisitor(field)); +// return null; +// } +// +// @Override +// public Void visitArrayAnnotationField(XArrayAnnotationField field) { +// for (XAnnotationValue value : field.getAnnotationValues()) { +// value.accept(new XArrayAnnotationFieldAnnotationValueVisitor(field)); +// } +// return null; +// } +// +// private class XSingleAnnotationFieldAnnotationValueVisitor implements +// XAnnotationValueVisitor { +// private final XSingleAnnotationField field; +// +// public XSingleAnnotationFieldAnnotationValueVisitor( +// XSingleAnnotationField field) { +// super(); +// this.field = field; +// } +// +// @Override +// public T visit(XAnnotationAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XXAnnotationAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XBooleanAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XByteAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XCharAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XDoubleAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XFloatAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XIntAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XLongAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XShortAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XStringAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XEnumAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XEnumByNameAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XClassAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XClassByNameAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XArrayClassAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// } +// +// private class XArrayAnnotationFieldAnnotationValueVisitor implements +// XAnnotationValueVisitor { +// private final XArrayAnnotationField field; +// +// public XArrayAnnotationFieldAnnotationValueVisitor( +// XArrayAnnotationField field) { +// super(); +// this.field = field; +// } +// +// @Override +// public T visit(XAnnotationAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XXAnnotationAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XBooleanAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XByteAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XCharAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XDoubleAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XFloatAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XIntAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XLongAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XShortAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XStringAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XEnumAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XEnumByNameAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XClassAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XClassByNameAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// @Override +// public T visit(XArrayClassAnnotationValue value) { +// return XAnnotationFieldValueVisitorAdapter.this.fieldValueVisitor +// .visit(field, value); +// } +// +// } +// +//} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldVisitor.java new file mode 100644 index 000000000..c9d256122 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationFieldVisitor.java @@ -0,0 +1,21 @@ +package org.jvnet.annox.model; + +import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; + +/** + * Annotation visitor. + * + * @param + * Visitor return type. + * @author Aleksei Valikov + */ +public interface XAnnotationFieldVisitor { + + public T visitSingleAnnotationField( + XSingleAnnotationField singleAnnotationField); + + public T visitArrayAnnotationField( + XArrayAnnotationField arrayAnnotationField); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationInvocationHandler.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationInvocationHandler.java new file mode 100644 index 000000000..89e6cc933 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XAnnotationInvocationHandler.java @@ -0,0 +1,314 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; +import java.lang.annotation.IncompleteAnnotationException; +import java.lang.reflect.AccessibleObject; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.annotation.field.XAnnotationField; + +public final class XAnnotationInvocationHandler implements InvocationHandler { + + private final Class type; + + private final Map memberValues; + + public XAnnotationInvocationHandler(XAnnotation annotation) { + Validate.notNull(annotation); + this.type = annotation.getAnnotationClass(); + + final Map draft = new HashMap(); + + for (final Entry> entry : annotation + .getFieldsMap().entrySet()) { + draft.put(entry.getKey(), entry.getValue().getResult()); + } + this.memberValues = Collections.unmodifiableMap(draft); + } + + public Object invoke(Object proxy, Method method, Object[] args) { + String member = method.getName(); + Class[] paramTypes = method.getParameterTypes(); + + // Handle Object and Annotation methods + if (member.equals("equals") && paramTypes.length == 1 + && paramTypes[0] == Object.class) + return equalsImpl(args[0]); + assert paramTypes.length == 0; + if (member.equals("toString")) + return toStringImpl(); + if (member.equals("hashCode")) + return hashCodeImpl(); + if (member.equals("annotationType")) + return type; + + // Handle annotation member accessors + Object result = memberValues.get(member); + + if (result == null) + throw new IncompleteAnnotationException(type, member); + + // if (result instanceof ExceptionProxy) + // throw ((ExceptionProxy) result).generateException(); + + if (result.getClass().isArray() && Array.getLength(result) != 0) + result = cloneArray(result); + + return result; + } + + /** + * This method, which clones its array argument, would not be necessary if + * Cloneable had a public clone method. + */ + private Object cloneArray(Object array) { + Class type = array.getClass(); + + if (type == byte[].class) { + byte[] byteArray = (byte[]) array; + return byteArray.clone(); + } + if (type == char[].class) { + char[] charArray = (char[]) array; + return charArray.clone(); + } + if (type == double[].class) { + double[] doubleArray = (double[]) array; + return doubleArray.clone(); + } + if (type == float[].class) { + float[] floatArray = (float[]) array; + return floatArray.clone(); + } + if (type == int[].class) { + int[] intArray = (int[]) array; + return intArray.clone(); + } + if (type == long[].class) { + long[] longArray = (long[]) array; + return longArray.clone(); + } + if (type == short[].class) { + short[] shortArray = (short[]) array; + return shortArray.clone(); + } + if (type == boolean[].class) { + boolean[] booleanArray = (boolean[]) array; + return booleanArray.clone(); + } + + Object[] objectArray = (Object[]) array; + return objectArray.clone(); + } + + /** + * Implementation of dynamicProxy.toString() + */ + private String toStringImpl() { + StringBuffer result = new StringBuffer(128); + result.append('@'); + result.append(type.getName()); + result.append('('); + boolean firstMember = true; + for (Map.Entry e : memberValues.entrySet()) { + if (firstMember) + firstMember = false; + else + result.append(", "); + + result.append(e.getKey()); + result.append('='); + result.append(memberValueToString(e.getValue())); + } + result.append(')'); + return result.toString(); + } + + private static String memberValueToString(Object value) { + Class type = value.getClass(); + if (!type.isArray()) // primitive, string, class, enum const, + // or annotation + return value.toString(); + + if (type == byte[].class) + return Arrays.toString((byte[]) value); + if (type == char[].class) + return Arrays.toString((char[]) value); + if (type == double[].class) + return Arrays.toString((double[]) value); + if (type == float[].class) + return Arrays.toString((float[]) value); + if (type == int[].class) + return Arrays.toString((int[]) value); + if (type == long[].class) + return Arrays.toString((long[]) value); + if (type == short[].class) + return Arrays.toString((short[]) value); + if (type == boolean[].class) + return Arrays.toString((boolean[]) value); + return Arrays.toString((Object[]) value); + } + + /** + * Implementation of dynamicProxy.equals(Object o) + */ + private Boolean equalsImpl(Object o) { + if (o == this) + return true; + + if (!type.isInstance(o)) + return false; + for (Method memberMethod : getMemberMethods()) { + String member = memberMethod.getName(); + Object ourValue = memberValues.get(member); + Object hisValue = null; + XAnnotationInvocationHandler hisHandler = asOneOfUs(o); + if (hisHandler != null) { + hisValue = hisHandler.memberValues.get(member); + } else { + try { + hisValue = memberMethod.invoke(o); + } catch (InvocationTargetException e) { + return false; + } catch (IllegalAccessException e) { + throw new AssertionError(e); + } + } + if (!memberValueEquals(ourValue, hisValue)) + return false; + } + return true; + } + + /** + * Returns an object's invocation handler if that object is a dynamic proxy + * with a handler of type AnnotationInvocationHandler. Returns null + * otherwise. + */ + private XAnnotationInvocationHandler asOneOfUs(Object o) { + if (Proxy.isProxyClass(o.getClass())) { + InvocationHandler handler = Proxy.getInvocationHandler(o); + if (handler instanceof XAnnotationInvocationHandler) + return (XAnnotationInvocationHandler) handler; + } + return null; + } + + /** + * Returns true iff the two member values in "dynamic proxy return form" are + * equal using the appropriate equality function depending on the member + * type. The two values will be of the same type unless one of the + * containing annotations is ill-formed. If one of the containing + * annotations is ill-formed, this method will return false unless the two + * members are identical object references. + */ + private static boolean memberValueEquals(Object v1, Object v2) { + Class type = v1.getClass(); + + // Check for primitive, string, class, enum const, annotation, + // or ExceptionProxy + if (!type.isArray()) + return v1.equals(v2); + + // Check for array of string, class, enum const, annotation, + // or ExceptionProxy + if (v1 instanceof Object[] && v2 instanceof Object[]) + return Arrays.equals((Object[]) v1, (Object[]) v2); + + // Check for ill formed annotation(s) + if (v2.getClass() != type) + return false; + + // Deal with array of primitives + if (type == byte[].class) + return Arrays.equals((byte[]) v1, (byte[]) v2); + if (type == char[].class) + return Arrays.equals((char[]) v1, (char[]) v2); + if (type == double[].class) + return Arrays.equals((double[]) v1, (double[]) v2); + if (type == float[].class) + return Arrays.equals((float[]) v1, (float[]) v2); + if (type == int[].class) + return Arrays.equals((int[]) v1, (int[]) v2); + if (type == long[].class) + return Arrays.equals((long[]) v1, (long[]) v2); + if (type == short[].class) + return Arrays.equals((short[]) v1, (short[]) v2); + assert type == boolean[].class; + return Arrays.equals((boolean[]) v1, (boolean[]) v2); + } + + /** + * Returns the member methods for our annotation type. These are obtained + * lazily and cached, as they're expensive to obtain and we only need them + * if our equals method is invoked (which should be rare). + */ + private Method[] getMemberMethods() { + if (memberMethods == null) { + memberMethods = AccessController + .doPrivileged(new PrivilegedAction() { + public Method[] run() { + final Method[] mm = type.getDeclaredMethods(); + AccessibleObject.setAccessible(mm, true); + return mm; + } + }); + } + return memberMethods; + } + + private transient volatile Method[] memberMethods = null; + + /** + * Implementation of dynamicProxy.hashCode() + */ + private int hashCodeImpl() { + int result = 0; + for (Map.Entry e : memberValues.entrySet()) { + result += (127 * e.getKey().hashCode()) + ^ memberValueHashCode(e.getValue()); + } + return result; + } + + /** + * Computes hashCode of a member value (in "dynamic proxy return form") + */ + private static int memberValueHashCode(Object value) { + Class type = value.getClass(); + if (!type.isArray()) // primitive, string, class, enum const, + // or annotation + return value.hashCode(); + + if (type == byte[].class) + return Arrays.hashCode((byte[]) value); + if (type == char[].class) + return Arrays.hashCode((char[]) value); + if (type == double[].class) + return Arrays.hashCode((double[]) value); + if (type == float[].class) + return Arrays.hashCode((float[]) value); + if (type == int[].class) + return Arrays.hashCode((int[]) value); + if (type == long[].class) + return Arrays.hashCode((long[]) value); + if (type == short[].class) + return Arrays.hashCode((short[]) value); + if (type == boolean[].class) + return Arrays.hashCode((boolean[]) value); + return Arrays.hashCode((Object[]) value); + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XClass.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XClass.java new file mode 100644 index 000000000..e15eb7cef --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XClass.java @@ -0,0 +1,150 @@ +package org.jvnet.annox.model; + +import org.apache.commons.lang3.Validate; + +/** + * Defines an annotated class. + * + * @author Aleksei Valikov + */ +public class XClass extends XAnnotatedElement> { + + /** + * Empty array of classes. + */ + public static final XClass[] EMPTY_ARRAY = new XClass[0]; + + /** + * XClass for Void. + */ + public static final XClass VOID = new XClass(Void.class, + XAnnotation.EMPTY_ARRAY, XField.EMPTY_ARRAY, + XConstructor.EMPTY_ARRAY, XMethod.EMPTY_ARRAY); + + /** + * Target class. + */ + private final Class targetClass; + + /** + * Annotated class members (constructors, fields, methods). + */ + private final XMember[] members; + + /** + * Annotated class constructors. + */ + private final XConstructor[] constructors; + + /** + * Annotated class fields. + */ + private final XField[] fields; + + /** + * Annotated class methods. + */ + private final XMethod[] methods; + + /** + * Constructs an annotated class. + * + * @param targetClass + * target class. + * @param xannotations + * class annotations. + * @param xfields + * annotated fields. + * @param xconstructors + * annotated constructors. + * @param xmethods + * annotated methods. + */ + public XClass(final Class targetClass, + final XAnnotation[] xannotations, final XField[] xfields, + final XConstructor[] xconstructors, final XMethod[] xmethods) { + super(targetClass, xannotations); + Validate.noNullElements(xconstructors, + "Constructors must not contain null elements."); + Validate.noNullElements(xfields, + "Fields must not contain null elements."); + Validate.noNullElements(xmethods, + "Methods must not contain null elements."); + this.targetClass = targetClass; + this.constructors = xconstructors; + this.fields = xfields; + this.methods = xmethods; + + final XMember[] members = new XMember[xconstructors.length + + xfields.length + xmethods.length]; + + System.arraycopy(xconstructors, 0, members, 0, xconstructors.length); + System.arraycopy(xfields, 0, members, xconstructors.length, + xfields.length); + System.arraycopy(xmethods, 0, members, xconstructors.length + + xfields.length, xmethods.length); + + checkMembers(members); + this.members = members; + } + + /** + * Returns the target class. + * + * @return Target class. + */ + public Class getTargetClass() { + return getAnnotatedElement(); + } + + /** + * Returns annotated members of the class. + * + * @return Annotated members of the class. + */ + public XMember[] getMembers() { + return members; + } + + /** + * Returns annotated constructors of the class. + * + * @return Annotated constructors of the class. + */ + public XConstructor[] getConstructors() { + return constructors; + } + + /** + * Returns annotated fields of the class. + * + * @return Annotated fields of the class. + */ + public XField[] getFields() { + return fields; + } + + /** + * Returns annotated methods of the class. + * + * @return Annotated methods of the class. + */ + public XMethod[] getMethods() { + return methods; + } + + /** + * Checks if all the passed members belong to the given target class. + */ + private void checkMembers(XMember[] members) { + for (int index = 0; index < members.length; index++) { + final XMember member = members[index]; + if (!member.getMember().getDeclaringClass() + .isAssignableFrom(getTargetClass())) { + throw new IllegalArgumentException("Member [" + member + + "] does not belong to the target class [" + + targetClass + "]."); + } + } + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XConstructor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XConstructor.java new file mode 100644 index 000000000..498f159b9 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XConstructor.java @@ -0,0 +1,93 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.reflect.ParameterizedAnnotatedElement; + +/** + * Defines an annotated constructor. + * + * @author Aleksei Valikov + * + */ +public class XConstructor extends XMember> implements + ParameterizedAnnotatedElement { + + /** + * Empty array of constructors. + */ + public static final XConstructor[] EMPTY_ARRAY = new XConstructor[0]; + + /** + * Annotated constructor parameters. + */ + private final XParameter[] parameters; + + /** + * Constructs an annotated constructor. + * + * @param constructor + * target constructor. + * @param xannotations + * constructor annotations. + * @param parameters + * annotated constructor parameters. + */ + public XConstructor(Constructor constructor, + XAnnotation[] xannotations, XParameter[] parameters) { + super(constructor, xannotations); + this.parameters = parameters; + check(); + } + + /** + * Returns annotated parameters of the method. + * + * @return Annotated parameters of the method. + */ + public XParameter[] getParameters() { + return parameters; + } + + /** + * Checks if annoated parameters match method parameters. + * + * @throws IllegalArgumentException + * If annotated parameters do not match method parameters. + */ + private void check() { + final Constructor constructor = getConstructor(); + final XParameter[] parameters = getParameters(); + final Class[] parameterTypes = constructor.getParameterTypes(); + Validate.isTrue(parameters.length == parameterTypes.length, + "Wrong number of parameters: [" + parameters.length + + "], expected [" + parameterTypes.length + "]."); + for (int index = 0; index < parameters.length; index++) { + final XParameter parameter = parameters[index]; + final Class parameterType = parameterTypes[index]; + Validate.isTrue(parameterType.equals(parameter.getType()), + "Wrong parameter type: [" + parameter.getType() + + "], expected [" + parameterType + "]"); + } + } + + /** + * Returns the target constructor. + * + * @return Target constructor. + */ + public Constructor getConstructor() { + return getMember(); + } + + public Annotation[][] getParameterAnnotations() { + final XParameter[] xparameters = getParameters(); + final Annotation[][] parameterAnnotations = new Annotation[xparameters.length][]; + for (int index = 0; index < xparameters.length; index++) { + parameterAnnotations[index] = xparameters[index].getAnnotations(); + } + return parameterAnnotations; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XField.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XField.java new file mode 100644 index 000000000..0735af15a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XField.java @@ -0,0 +1,38 @@ +package org.jvnet.annox.model; + +import java.lang.reflect.Field; + +/** + * Defines an annotated field. + * + * @author Aleksei Valikov + * + */ +public class XField extends XMember { + + /** + * Emprty array of fields. + */ + public static final XField[] EMPTY_ARRAY = new XField[0]; + + /** + * Constructs an annotated field. + * + * @param field + * target field. + * @param xannotations + * field annotations. + */ + public XField(Field field, XAnnotation[] xannotations) { + super(field, xannotations); + } + + /** + * Returns the target field. + * + * @return Target field. + */ + public Field getField() { + return getMember(); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMember.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMember.java new file mode 100644 index 000000000..5e66cca19 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMember.java @@ -0,0 +1,69 @@ +package org.jvnet.annox.model; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Member; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; + +/** + * Defines an annotated member. + * + * @param + * type of the target member. + * @author Aleksei Valikov + */ +public abstract class XMember extends + XAnnotatedElement { + + /** + * Returns the target member. + * + * @return Target member. + */ + public T getMember() { + return getAnnotatedElement(); + } + + /** + * Returns name of the target member. + * + * @return Name of the target memeber. + */ + public String getName() { + return getMember().getName(); + } + + /** + * Constructs an annotated member. + * + * @param member + * target member. + * @param xannotations + * member annotations. + */ + public XMember(final T member, final XAnnotation[] xannotations) { + super(member, xannotations); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(getMember()) + .append(getXAnnotations()).toHashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) + return false; + if (!getClass().isAssignableFrom(obj.getClass())) { + return false; + } + if (this == obj) { + return true; + } + final XMember rhs = (XMember) obj; + return new EqualsBuilder().append(getMember(), rhs.getMember()) + .append(getXAnnotations(), rhs.getXAnnotations()).isEquals(); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMethod.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMethod.java new file mode 100644 index 000000000..33d0df397 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XMethod.java @@ -0,0 +1,93 @@ +package org.jvnet.annox.model; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.reflect.ParameterizedAnnotatedElement; + +/** + * Defines an annotated method. + * + * @author Aleksei Valikov + */ +public class XMethod extends XMember implements + ParameterizedAnnotatedElement { + + /** + * Empty array of methods. + */ + public static final XMethod[] EMPTY_ARRAY = new XMethod[0]; + + /** + * Annotated method parameters. + */ + private final XParameter[] parameters; + + /** + * Constructs an annotated method. + * + * @param method + * target method. + * @param xannotations + * annotations of the target method. + * @param parameters + * annotated method parameters. + */ + public XMethod(final Method method, XAnnotation[] xannotations, + XParameter[] parameters) { + super(method, xannotations); + Validate.noNullElements(parameters); + this.parameters = parameters; + check(); + } + + /** + * Returns annotated parameters of the method. + * + * @return Annotated parameters of the method. + */ + public XParameter[] getParameters() { + return parameters; + } + + /** + * Checks if annoated parameters match method parameters. + * + * @throws IllegalArgumentException + * If annotated parameters do not match method parameters. + */ + private void check() { + final Method method = getMethod(); + final XParameter[] parameters = getParameters(); + final Class[] parameterTypes = method.getParameterTypes(); + Validate.isTrue(parameters.length == parameterTypes.length, + "Wrong number of parameters: [" + parameters.length + + "], expected [" + parameterTypes.length + "]."); + for (int index = 0; index < parameters.length; index++) { + final XParameter parameter = parameters[index]; + final Class parameterType = parameterTypes[index]; + Validate.isTrue(parameterType.equals(parameter.getType()), + "Wrong parameter type: [" + parameter.getType() + + "], expected [" + parameterType + "]"); + } + } + + /** + * Returns the target methid. + * + * @return Target method. + */ + public Method getMethod() { + return getMember(); + } + + public Annotation[][] getParameterAnnotations() { + final XParameter[] xparameters = getParameters(); + final Annotation[][] parameterAnnotations = new Annotation[xparameters.length][]; + for (int index = 0; index < xparameters.length; index++) { + parameterAnnotations[index] = xparameters[index].getAnnotations(); + } + return parameterAnnotations; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XPackage.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XPackage.java new file mode 100644 index 000000000..6089435d5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XPackage.java @@ -0,0 +1,57 @@ +package org.jvnet.annox.model; + +import org.apache.commons.lang3.Validate; + +/** + * Defines an annotated package. + * + * @author Aleksei Valikov + */ +public class XPackage extends XAnnotatedElement { + + /** + * VOID package. + */ + public static final XPackage VOID = new XPackage( + Package.getPackage("java.lang"), XAnnotation.EMPTY_ARRAY, + XClass.EMPTY_ARRAY); + + /** + * Annotated classes. + */ + private final XClass[] classes; + + /** + * Constructs an annotated package. + * + * @param targetPackage + * target package. + * @param xannotations + * package annotations, may be null. + */ + public XPackage(Package targetPackage, XAnnotation[] xannotations, + XClass[] xclasses) { + super(targetPackage, xannotations); + Validate.noNullElements(xclasses); + this.classes = xclasses; + } + + /** + * Returns the target package. + * + * @return Target package. + */ + public Package getPackage() { + return getAnnotatedElement(); + } + + /** + * Returns annotated classes of the package. + * + * @return Annotated classes of the package. + */ + public XClass[] getClasses() { + return classes; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XParameter.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XParameter.java new file mode 100644 index 000000000..eb8921aff --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/XParameter.java @@ -0,0 +1,39 @@ +package org.jvnet.annox.model; + +import org.apache.commons.lang3.Validate; + +/** + * Defines an annotated method or constructor parameter. + * + * @author Aleksei Valikov + */ +public class XParameter extends XAnnotated { + + /** + * Type of the parameter. + */ + private final Class type; + + /** + * Constructs an annotated method parameter. + * + * @param type + * parameter type. + * @param xannotations + * parameter annotations. + */ + public XParameter(Class type, XAnnotation[] xannotations) { + super(xannotations); + Validate.notNull(type, "Parameter type must not be null."); + this.type = type; + } + + /** + * Returns type of the method parameter. + * + * @return Type of the method parameter. + */ + public Class getType() { + return type; + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XAnnotationField.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XAnnotationField.java new file mode 100644 index 000000000..3ab6a9862 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XAnnotationField.java @@ -0,0 +1,86 @@ +package org.jvnet.annox.model.annotation.field; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.XAnnotationFieldVisitor; + +/** + * Defines an annotation field. + * + * @param + * Type of the field. + * @author Aleksei Valikov + */ +public abstract class XAnnotationField { + + /** + * Name of the field. + */ + private final String name; + + /** + * Returns the name of the field. + * + * @return Name of the field. + */ + public String getName() { + return name; + } + + /** + * Returns the value of the field. + * + * @return Value of the field. + */ + public abstract T getValue(); + + /** + * Returns the internal value of the field used for {@link #hashCode()}, + * {@link #equals(Object)} and {@link #toString()} operations. Defaults to + * the value of the field. + * + * @return Returns the value of the field. + */ + protected final Object getInternalValue() { + return getValue(); + } + + /** + * Returns the result value of the field. By default, returns the value of + * the field. + * + * @return Result value of the field. + */ + public Object getResult() { + return getValue(); + } + + /** + * Return the type of the field. + * + * @return Type of the field. + */ + public abstract Class getType(); + + /** + * Accepts the annotation visitor. + * + * @param + *

+ * Return type of the visitor. + * @param visitor + * visitor to accept. + * @return Result of the visit. + */ + public abstract

P accept(XAnnotationFieldVisitor

visitor); + + /** + * Constructrs an annotation field with the given name. + * + * @param name + * name of the field. + */ + public XAnnotationField(final String name) { + Validate.notNull(name, "Field name must not be null."); + this.name = name; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XArrayAnnotationField.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XArrayAnnotationField.java new file mode 100644 index 000000000..96c22eb4d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XArrayAnnotationField.java @@ -0,0 +1,130 @@ +package org.jvnet.annox.model.annotation.field; + +import java.lang.reflect.Array; +import java.text.MessageFormat; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.XAnnotationFieldVisitor; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.util.ClassUtils; + +public class XArrayAnnotationField extends XAnnotationField { + + private final Class type; + private final Class componentType; + private final Class wrapperComponentType; + private final XAnnotationValue[] annotationValues; + + public XArrayAnnotationField(String name, Class type, + XAnnotationValue... values) { + super(name); + if (!type.isArray()) { + throw new IllegalArgumentException(MessageFormat.format( + "Type [{0}] is expected to be an array type.", type)); + } + type = ClassUtils.wrapperArrayToPrimitiveArray(type); + this.annotationValues = Validate.noNullElements(values); + this.type = type; + this.componentType = type.getComponentType(); + this.wrapperComponentType = ClassUtils + .primitiveToWrapper(this.componentType); + } + + @Override + public Class getType() { + return this.type; + } + + public XAnnotationValue[] getAnnotationValues() { + return annotationValues; + } + + @Override + public T[] getValue() { + final Object array = Array.newInstance(wrapperComponentType, + this.annotationValues.length); + @SuppressWarnings("unchecked") + final T[] value = (T[]) array; + for (int index = 0; index < this.annotationValues.length; index++) { + final T singleValue = this.annotationValues[index].getValue(); + value[index] = singleValue; + } + return value; + } + + @Override + public Object getResult() { + final Object array = Array.newInstance(this.componentType, + this.annotationValues.length); + for (int index = 0; index < this.annotationValues.length; index++) { + Array.set(array, index, this.annotationValues[index].getValue()); + } + return array; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer(); + sb.append(getName()); + sb.append("=["); + final XAnnotationValue[] values = getAnnotationValues(); + for (int index = 0; index < values.length; index++) { + final XAnnotationValue value = values[index]; + if (index > 0) { + sb.append(", "); + } + sb.append(value.toString()); + } + sb.append("]"); + return sb.toString(); + } + + @Override + public int hashCode() { + int hash = 0; + final String name = getName(); + hash = hash * 37 + name.hashCode(); + final XAnnotationValue[] values = getAnnotationValues(); + for (int index = 0; index < values.length; index++) { + final XAnnotationValue v = values[index]; + hash = hash * 37 + v.hashCode(); + } + return hash; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof XArrayAnnotationField)) { + return false; + } + if (this == obj) { + return true; + } + final XArrayAnnotationField other = (XArrayAnnotationField) obj; + if (!getName().equals(other.getName())) + return false; + + final XAnnotationValue[] lhs = getAnnotationValues(); + final XAnnotationValue[] rhs = other.getAnnotationValues(); + if (lhs == rhs) { + return true; + } + if (lhs == null || rhs == null) { + return false; + } + if (lhs.length != rhs.length) { + return false; + } + for (int i = 0; i < lhs.length; ++i) { + if (!(lhs[i].equals(rhs[i]))) + return false; + } + return true; + } + + @Override + public

P accept(XAnnotationFieldVisitor

visitor) { + return visitor.visitArrayAnnotationField(this); + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XSingleAnnotationField.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XSingleAnnotationField.java new file mode 100644 index 000000000..f82cf68fa --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/field/XSingleAnnotationField.java @@ -0,0 +1,64 @@ +package org.jvnet.annox.model.annotation.field; + +import org.jvnet.annox.model.XAnnotationFieldVisitor; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.util.ClassUtils; + +public class XSingleAnnotationField extends XAnnotationField { + + private final Class type; + private final XAnnotationValue annotationValue; + + public XSingleAnnotationField(String name, Class type, + XAnnotationValue value) { + super(name); + this.type = ClassUtils.wrapperToPrimitive(type); + this.annotationValue = value; + } + + @Override + public Class getType() { + return type; + } + + @Override + public T getValue() { + return this.annotationValue.getValue(); + } + + public XAnnotationValue getAnnotationValue() { + return annotationValue; + } + + @Override + public String toString() { + return getName() + "=" + getAnnotationValue().toString(); + } + + @Override + public int hashCode() { + int hash = 0; + hash = hash * 37 + getName().hashCode(); + hash = hash * 37 + getAnnotationValue().hashCode(); + return hash; + } + + @Override + public final boolean equals(Object obj) { + if (!(obj instanceof XSingleAnnotationField)) { + return false; + } + if (this == obj) { + return true; + } + final XSingleAnnotationField other = (XSingleAnnotationField) obj; + return getName().equals(other.getName()) + && getAnnotationValue().equals(other.getAnnotationValue()); + } + + @Override + public

P accept(XAnnotationFieldVisitor

visitor) { + return visitor.visitSingleAnnotationField(this); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/AbstractBasicXAnnotationValueVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/AbstractBasicXAnnotationValueVisitor.java new file mode 100644 index 000000000..5b4e53883 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/AbstractBasicXAnnotationValueVisitor.java @@ -0,0 +1,83 @@ +package org.jvnet.annox.model.annotation.value; + +public abstract class AbstractBasicXAnnotationValueVisitor implements + XAnnotationValueVisitor { + + public abstract R visitDefault(XAnnotationValue value); + + @Override + public R visit(XXAnnotationAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XBooleanAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XByteAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XCharAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XDoubleAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XFloatAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XIntAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XLongAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XShortAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XStringAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XEnumAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XEnumByNameAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XClassAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XClassByNameAnnotationValue value) { + return visitDefault(value); + } + + @Override + public R visit(XArrayClassAnnotationValue value) { + return visitDefault(value); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValue.java new file mode 100644 index 000000000..f5ddcd587 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValue.java @@ -0,0 +1,40 @@ +package org.jvnet.annox.model.annotation.value; + + +public abstract class XAnnotationValue { + + public abstract T getValue(); + + protected abstract Object getInternalValue(); + + public final Object getResult() { + return getValue(); + } + + public abstract

P accept(XAnnotationValueVisitor

visitor); + + @Override + public final String toString() { + return getInternalValue().toString(); + } + + @Override + public final int hashCode() { + int hash = 0; + final Object value = getInternalValue(); + hash = hash * 37 + value.hashCode(); + return hash; + } + + @Override + public final boolean equals(Object obj) { + if (!(obj instanceof XAnnotationValue)) { + return false; + } + if (this == obj) { + return true; + } + final XAnnotationValue other = (XAnnotationValue) obj; + return getInternalValue().equals(other.getInternalValue()); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValueVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValueVisitor.java new file mode 100644 index 000000000..60591944e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XAnnotationValueVisitor.java @@ -0,0 +1,34 @@ +package org.jvnet.annox.model.annotation.value; + +public interface XAnnotationValueVisitor { + + public R visit(XXAnnotationAnnotationValue value); + + public R visit(XBooleanAnnotationValue value); + + public R visit(XByteAnnotationValue value); + + public R visit(XCharAnnotationValue value); + + public R visit(XDoubleAnnotationValue value); + + public R visit(XFloatAnnotationValue value); + + public R visit(XIntAnnotationValue value); + + public R visit(XLongAnnotationValue value); + + public R visit(XShortAnnotationValue value); + + public R visit(XStringAnnotationValue value); + + public R visit(XEnumAnnotationValue value); + + public R visit(XEnumByNameAnnotationValue value); + + public R visit(XClassAnnotationValue value); + + public R visit(XClassByNameAnnotationValue value); + + public R visit(XArrayClassAnnotationValue value); +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XArrayClassAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XArrayClassAnnotationValue.java new file mode 100644 index 000000000..cd0f9106b --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XArrayClassAnnotationValue.java @@ -0,0 +1,63 @@ +package org.jvnet.annox.model.annotation.value; + +import java.lang.reflect.Array; +import java.util.Arrays; + +import org.apache.commons.lang3.Validate; + +public class XArrayClassAnnotationValue extends + XDynamicAnnotationValue> { + + private final XClassByNameAnnotationValue itemClassByNameAnnotationValue; + private final int dimension; + private final String arrayClassName; + + public XArrayClassAnnotationValue( + XClassByNameAnnotationValue itemClassByNameAnnotationValue, + int dimension) { + this.itemClassByNameAnnotationValue = Validate + .notNull(itemClassByNameAnnotationValue); + Validate.isTrue(dimension > 0); + this.dimension = dimension; + String arrayClassName = itemClassByNameAnnotationValue.getClassName(); + for (int index = 0; index < dimension; index++) { + arrayClassName = arrayClassName + "[]"; + } + this.arrayClassName = arrayClassName; + } + + public XClassByNameAnnotationValue getItemClassByNameAnnotationValue() { + return itemClassByNameAnnotationValue; + } + + public String getItemClassName() { + return itemClassByNameAnnotationValue.getClassName(); + } + + public int getDimension() { + return dimension; + } + + @Override + protected Object getInternalValue() { + return this.arrayClassName; + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } + + @Override + public Class getValue() { + final Class componentType = this.itemClassByNameAnnotationValue + .getValue(); + + final int[] dimensions = new int[this.dimension]; + Arrays.fill(dimensions, 0); + final Object array = Array.newInstance(componentType, dimensions); + @SuppressWarnings("unchecked") + final Class arrayClass = (Class) array.getClass(); + return arrayClass; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XBooleanAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XBooleanAnnotationValue.java new file mode 100644 index 000000000..571c4e1b7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XBooleanAnnotationValue.java @@ -0,0 +1,14 @@ +package org.jvnet.annox.model.annotation.value; + +public class XBooleanAnnotationValue extends XStaticAnnotationValue { + + public XBooleanAnnotationValue(boolean value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XByteAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XByteAnnotationValue.java new file mode 100644 index 000000000..c62712368 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XByteAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XByteAnnotationValue extends XStaticAnnotationValue { + + public XByteAnnotationValue(byte value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XCharAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XCharAnnotationValue.java new file mode 100644 index 000000000..b0bace547 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XCharAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XCharAnnotationValue extends XStaticAnnotationValue { + + public XCharAnnotationValue(char value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassAnnotationValue.java new file mode 100644 index 000000000..abe6b8a95 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XClassAnnotationValue extends XStaticAnnotationValue> { + + public XClassAnnotationValue(Class value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassByNameAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassByNameAnnotationValue.java new file mode 100644 index 000000000..34149a950 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XClassByNameAnnotationValue.java @@ -0,0 +1,40 @@ +package org.jvnet.annox.model.annotation.value; + +import java.text.MessageFormat; + +public class XClassByNameAnnotationValue extends + XDynamicAnnotationValue> { + + private final String className; + + public XClassByNameAnnotationValue(String className) { + this.className = className; + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } + + public String getClassName() { + return className; + } + + @Override + protected Object getInternalValue() { + return this.className; + } + + @Override + public Class getValue() { + try { + @SuppressWarnings("unchecked") + final Class _class = (Class) Class.forName(this.className); + return _class; + } catch (ClassNotFoundException cnfex) { + throw new IllegalStateException(MessageFormat.format( + "Could not find the class [{0}]", this.className), cnfex); + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDoubleAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDoubleAnnotationValue.java new file mode 100644 index 000000000..513633bd5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDoubleAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XDoubleAnnotationValue extends XStaticAnnotationValue { + + public XDoubleAnnotationValue(double value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDynamicAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDynamicAnnotationValue.java new file mode 100644 index 000000000..4a6991c18 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XDynamicAnnotationValue.java @@ -0,0 +1,5 @@ +package org.jvnet.annox.model.annotation.value; + +public abstract class XDynamicAnnotationValue extends XAnnotationValue { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumAnnotationValue.java new file mode 100644 index 000000000..ac3426be3 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumAnnotationValue.java @@ -0,0 +1,14 @@ +package org.jvnet.annox.model.annotation.value; + +public class XEnumAnnotationValue> extends + XStaticAnnotationValue { + + public XEnumAnnotationValue(E value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumByNameAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumByNameAnnotationValue.java new file mode 100644 index 000000000..c316ee7b8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XEnumByNameAnnotationValue.java @@ -0,0 +1,42 @@ +package org.jvnet.annox.model.annotation.value; + +import org.apache.commons.lang3.Validate; + +public class XEnumByNameAnnotationValue> extends + XDynamicAnnotationValue { + + private final XClassByNameAnnotationValue enumByNameAnnotationValue; + private final String name; + private final String enumName; + + public XEnumByNameAnnotationValue(XClassByNameAnnotationValue enumClass, + String name) { + this.enumByNameAnnotationValue = Validate.notNull(enumClass); + this.name = Validate.notNull(name); + this.enumName = enumClass.getClassName() + "." + name; + } + + public String getEnumClassName() { + return enumByNameAnnotationValue.getClassName(); + } + + public String getName() { + return name; + } + + @Override + protected Object getInternalValue() { + return enumName; + } + + @Override + public E getValue() { + final Class enumClass = this.enumByNameAnnotationValue.getValue(); + return Enum.valueOf(enumClass, name); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XFloatAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XFloatAnnotationValue.java new file mode 100644 index 000000000..a904757b8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XFloatAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XFloatAnnotationValue extends XStaticAnnotationValue { + + public XFloatAnnotationValue(float value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XIntAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XIntAnnotationValue.java new file mode 100644 index 000000000..295b17ba2 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XIntAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XIntAnnotationValue extends XStaticAnnotationValue { + + public XIntAnnotationValue(int value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XLongAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XLongAnnotationValue.java new file mode 100644 index 000000000..20f29b659 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XLongAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XLongAnnotationValue extends XStaticAnnotationValue { + + public XLongAnnotationValue(long value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XShortAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XShortAnnotationValue.java new file mode 100644 index 000000000..f016ca26f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XShortAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XShortAnnotationValue extends XStaticAnnotationValue { + + public XShortAnnotationValue(short value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStaticAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStaticAnnotationValue.java new file mode 100644 index 000000000..4b2b4b84a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStaticAnnotationValue.java @@ -0,0 +1,24 @@ +package org.jvnet.annox.model.annotation.value; + +import org.apache.commons.lang3.Validate; + +public abstract class XStaticAnnotationValue extends XAnnotationValue { + + private final T value; + + public XStaticAnnotationValue(T value) { + Validate.notNull(value); + this.value = value; + } + + @Override + public T getValue() { + return this.value; + } + + @Override + protected Object getInternalValue() { + return getValue(); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStringAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStringAnnotationValue.java new file mode 100644 index 000000000..48ff2c27d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XStringAnnotationValue.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.model.annotation.value; + +public class XStringAnnotationValue extends XStaticAnnotationValue { + + public XStringAnnotationValue(String value) { + super(value); + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XXAnnotationAnnotationValue.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XXAnnotationAnnotationValue.java new file mode 100644 index 000000000..2617d23ea --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/model/annotation/value/XXAnnotationAnnotationValue.java @@ -0,0 +1,47 @@ +package org.jvnet.annox.model.annotation.value; + +import java.lang.annotation.Annotation; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.XAnnotation; + +public class XXAnnotationAnnotationValue extends + XDynamicAnnotationValue { + + private final A annotation; + private final XAnnotation xannotation; + + public XXAnnotationAnnotationValue(XAnnotation xannotation) { + this.xannotation = Validate.notNull(xannotation); + this.annotation = null; + } + + public XXAnnotationAnnotationValue(A annotation, XAnnotation xannotation) { + this.xannotation = Validate.notNull(xannotation); + this.annotation = null; + } + + public XAnnotation getXAnnotation() { + return this.xannotation; + } + + @Override + public A getValue() { + if (this.annotation == null) { + return this.xannotation.getResult(); + } else { + return this.annotation; + } + } + + @Override + protected Object getInternalValue() { + return this.xannotation; + } + + @Override + public

P accept(XAnnotationValueVisitor

visitor) { + return visitor.visit(this); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationArrayAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationArrayAnnotationFieldParser.java new file mode 100644 index 000000000..2b49ec5bc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationArrayAnnotationFieldParser.java @@ -0,0 +1,147 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.Node; +import japa.parser.ast.expr.AnnotationExpr; +import japa.parser.ast.expr.ArrayInitializerExpr; +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; +import java.text.MessageFormat; +import java.util.List; + +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.util.AnnotationElementUtils; +import org.w3c.dom.Element; + +public class XAnnotationArrayAnnotationFieldParser + extends XAnnotationFieldParser { + + @Override + public XAnnotationField parse(Element annotationElement, String name, + Class type) throws AnnotationElementParseException { + + final Element[] elements = AnnotationElementUtils.getFieldElements( + annotationElement, name); + + @SuppressWarnings("unchecked") + final XAnnotation[] xannotations = new XAnnotation[elements.length]; + + for (int index = 0; index < elements.length; index++) { + try { + @SuppressWarnings("unchecked") + final XAnnotation annotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(elements[index]); + xannotations[index] = annotation; + } catch (AnnotationElementParseException aepex) { + throw new AnnotationElementParseException(annotationElement, + aepex); + } + } + return construct(name, xannotations, type); + } + + public XAnnotationField parse(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + final A[] value = getAnnotationFieldValue(annotation, name); + @SuppressWarnings("unchecked") + final XAnnotation[] xannotations = new XAnnotation[value.length]; + + for (int index = 0; index < value.length; index++) { + @SuppressWarnings("unchecked") + final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(value[index]); + xannotations[index] = xannotation; + } + return construct(name, xannotations, type); + } + + @Override + public XAnnotationField parse(Expression expression, String name, + Class type) throws AnnotationExpressionParseException { + final Expression[] items = expression.accept( + new AbstractGenericExpressionVisitor() { + @Override + public Expression[] visit(ArrayInitializerExpr n, Void arg) { + final List values = n.getValues(); + return values.toArray(new Expression[values.size()]); + } + + @Override + public Expression[] visitDefault(Expression n, Void arg) { + return new Expression[]{n}; + } + + @Override + public Expression[] visitDefault(Node n, Void arg) { + throw new IllegalArgumentException( + MessageFormat + .format("Unexpected expression [{0}], only array initializer expressions are expected.", + n)); + } + }, null); + + @SuppressWarnings("unchecked") + final XAnnotation[] xannotations = new XAnnotation[items.length]; + + for (int index = 0; index < items.length; index++) { + + final Expression item = items[index]; + final AnnotationExpr annotationExpression = item + .accept(new AbstractGenericExpressionVisitor() { + @Override + public AnnotationExpr visitDefault(Node n, Void arg) { + throw new IllegalArgumentException( + MessageFormat + .format("Unexpected expression [{0}], only annotation expressions are expected.", + n)); + } + + @Override + public AnnotationExpr visitDefault(AnnotationExpr n, + Void arg) { + return n; + } + }, null); + + @SuppressWarnings("unchecked") + final XAnnotation annotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(annotationExpression); + xannotations[index] = annotation; + } + return construct(name, xannotations, type); + } + + @SuppressWarnings("unchecked") + public XAnnotationField construct(String name, final A[] annotations, + Class type) { + final XAnnotation[] xannotations = new XAnnotation[annotations.length]; + final XAnnotationValue[] xannotationValues = new XAnnotationValue[annotations.length]; + for (int index = 0; index < annotations.length; index++) { + final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(annotations[index]); + xannotations[index] = xannotation; + xannotationValues[index] = new XXAnnotationAnnotationValue( + annotations[index], xannotations[index]); + } + return new XArrayAnnotationField(name, type, xannotationValues); + } + + private XAnnotationField construct(String name, + final XAnnotation[] xannotations, Class type) { + @SuppressWarnings("unchecked") + final XAnnotationValue[] xannotationValues = new XAnnotationValue[xannotations.length]; + for (int index = 0; index < xannotations.length; index++) { + xannotationValues[index] = new XXAnnotationAnnotationValue( + xannotations[index]); + } + return new XArrayAnnotationField(name, type, xannotationValues); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationFieldParser.java new file mode 100644 index 000000000..4528a910a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationFieldParser.java @@ -0,0 +1,48 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.w3c.dom.Element; + +public abstract class XAnnotationFieldParser { + + public abstract XAnnotationField parse(Element element, String name, + Class type) throws AnnotationElementParseException; + + public abstract XAnnotationField parse(Expression expression, + String name, Class type) + throws AnnotationExpressionParseException; + + public abstract XAnnotationField parse(Annotation annotation, + String name, Class type) throws NoSuchAnnotationFieldException; + + public abstract XAnnotationField construct(String name, V value, + Class type); + + @SuppressWarnings("unchecked") + public U getAnnotationFieldValue(Annotation annotation, String name) + throws NoSuchAnnotationFieldException { + final Class annotationClass = annotation + .annotationType(); + try { + final Method method = annotationClass.getMethod(name); + final U value = (U) method.invoke(annotation); + return value; + } catch (NoSuchMethodException nsmex) { + throw new NoSuchAnnotationFieldException(annotationClass, name, + nsmex); + } catch (IllegalAccessException iaex) { + throw new AssertionError(iaex); + } catch (InvocationTargetException itex) { + throw new AssertionError(itex); + } + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationParser.java new file mode 100644 index 000000000..8c02363ac --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationParser.java @@ -0,0 +1,415 @@ +package org.jvnet.annox.parser; + +import japa.parser.ParseException; +import japa.parser.ast.Node; +import japa.parser.ast.expr.AnnotationExpr; +import japa.parser.ast.expr.Expression; +import japa.parser.ast.expr.MarkerAnnotationExpr; +import japa.parser.ast.expr.MemberValuePair; +import japa.parser.ast.expr.NormalAnnotationExpr; +import japa.parser.ast.expr.SingleMemberAnnotationExpr; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.commons.lang3.ClassUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.Constants; +import org.jvnet.annox.annotation.AnnotationClassNotFoundException; +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.japa.parser.AnnotationExprParser; +import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.parser.exception.AnnotationStringParseException; +import org.w3c.dom.Element; + +public class XAnnotationParser { + + public static final XAnnotationParser INSTANCE = new XAnnotationParser(); + + private final ClassLoader classLoader; + + /** + * Default constructor. + */ + public XAnnotationParser() { + classLoader = this.getClass().getClassLoader(); + } + + /** + * Constructor with a specified class loader. + * + * @param classLoader + * the class loader which should be used to get classes (like + * annotations) + */ + public XAnnotationParser(ClassLoader classLoader) { + super(); + this.classLoader = classLoader; + } + + public XAnnotation parse(final Annotation annotation) { + Validate.notNull(annotation, "Annotation must not be null."); + + final Class annotationClass = annotation + .annotationType(); + + final XAnnotationField[] fields = parseFields(annotation, + annotationClass); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + final XAnnotation xannotation = new XAnnotation(annotationClass, + fields); + return xannotation; + + } + + public XAnnotation[] parse(final Annotation[] annotations) { + Validate.noNullElements(annotations, + "Annotations must not contain nulls."); + final XAnnotation[] xannotations = new XAnnotation[annotations.length]; + for (int index = 0; index < annotations.length; index++) { + final Annotation annotation = annotations[index]; + xannotations[index] = parse(annotation); + } + return xannotations; + } + + @SuppressWarnings("unchecked") + public XAnnotation parse(final Element annotationElement) + throws AnnotationElementParseException { + Validate.notNull(annotationElement, + "Annotation element must not be null."); + + final String name = annotationElement.getLocalName(); + + final String classAttribute = annotationElement.getAttributeNS( + Constants.NAMESPACE_URI, "class"); + + final String className; + if (!StringUtils.isEmpty(classAttribute)) { + className = classAttribute; + } else { + final String namespaceURI = annotationElement.getNamespaceURI(); + + if (namespaceURI != null + && namespaceURI.startsWith(Constants.NAMESPACE_URI_PREFIX)) { + final String containerPrefix = namespaceURI + .substring(Constants.NAMESPACE_URI_PREFIX.length()); + className = containerPrefix + "." + name.replace('.', '$'); + } else { + className = name; + } + } + + try { + final Class draftClass = classLoader.loadClass(className); + + if (!Annotation.class.isAssignableFrom(draftClass)) + throw new AnnotationElementParseException(annotationElement, + new IllegalArgumentException(MessageFormat.format( + "The class [{0}] is not an annotation class.", + draftClass.getName()))); + + final Class annotationClass = (Class) draftClass; + + final XAnnotationField[] fields = parseFields(annotationElement, + annotationClass); + @SuppressWarnings("rawtypes") + final XAnnotation xannotation = new XAnnotation(annotationClass, + fields); + return xannotation; + } catch (ClassNotFoundException cnfex) { + throw new AnnotationElementParseException(annotationElement, + new AnnotationClassNotFoundException(className, cnfex)); + } catch (AnnotationElementParseException cnfex) { + throw new AnnotationElementParseException(annotationElement, + new AnnotationClassNotFoundException(className, cnfex)); + } + + } + + public XAnnotation[] parse(final Element[] annotationElements) + throws AnnotationElementParseException { + Validate.noNullElements(annotationElements, + "Annotation elements must not contain null."); + final XAnnotation[] xannotations = new XAnnotation[annotationElements.length]; + for (int index = 0; index < annotationElements.length; index++) { + final Element annotationElement = annotationElements[index]; + try { + xannotations[index] = parse(annotationElement); + } catch (AnnotationElementParseException aepex) { + throw new AnnotationElementParseException(annotationElement, + aepex); + } + } + return xannotations; + } + + public XAnnotation parse(final String annotationString) + throws AnnotationStringParseException, + AnnotationExpressionParseException { + final AnnotationExpr expression = parseAnnotationExpr(annotationString); + return parse(expression); + } + + public XAnnotation[] parse(final String[] annotationStrings) + throws AnnotationStringParseException, + AnnotationExpressionParseException { + Validate.noNullElements(annotationStrings); + final List allAnnotationExprs = new ArrayList( + annotationStrings.length); + for (String annotationString : annotationStrings) { + allAnnotationExprs.addAll(parseAnnotationExprs(annotationString)); + } + final AnnotationExpr[] annotationExprs = new AnnotationExpr[allAnnotationExprs + .size()]; + allAnnotationExprs.toArray(annotationExprs); + return parse(annotationExprs); + } + + private AnnotationExpr parseAnnotationExpr(final String annotationString) + throws AnnotationStringParseException { + List annotationExprs = parseAnnotationExprs(annotationString); + + if (annotationExprs.isEmpty()) { + throw new AnnotationStringParseException( + MessageFormat.format( + "Could not parse the annotation [{0}], this expression apparently contains no annotations.", + annotationString), annotationString); + } else if (annotationExprs.size() > 1) { + throw new AnnotationStringParseException( + MessageFormat.format( + "Could not parse the annotation [{0}], this expression apparently more than one annotation.", + annotationString), annotationString); + } else { + return annotationExprs.get(0); + } + } + + private List parseAnnotationExprs( + final String annotationString) + throws AnnotationStringParseException { + final AnnotationExprParser parser = new AnnotationExprParser(); + + try { + + final List annotations = parser + .parse(annotationString); + + return annotations; + } catch (ParseException pex) { + throw new AnnotationStringParseException(MessageFormat.format( + "Could not parse the annotation [{0}].", annotationString), + annotationString, pex); + } + } + + @SuppressWarnings("unchecked") + public XAnnotation parse(final AnnotationExpr annotationElement) + throws AnnotationExpressionParseException { + Validate.notNull(annotationElement, + "Annotation expression must not be null."); + final String className = annotationElement.getName().toString(); + + try { + + final Class draftClass = ClassUtils.getClass(classLoader, + className); + + if (!Annotation.class.isAssignableFrom(draftClass)) + throw new AnnotationExpressionParseException(annotationElement, + new IllegalArgumentException(MessageFormat.format( + "The class [{0}] is not an annotation class.", + draftClass.getName()))); + + final Class annotationClass = (Class) draftClass; + + final XAnnotationField[] fields = parseFields(annotationElement, + annotationClass); + @SuppressWarnings("rawtypes") + final XAnnotation xannotation = new XAnnotation(annotationClass, + fields); + return xannotation; + } catch (ClassNotFoundException cnfex) { + throw new AnnotationExpressionParseException(annotationElement, + new AnnotationClassNotFoundException(className, cnfex)); + } + } + + public XAnnotation[] parse(final AnnotationExpr[] annotationElements) + throws AnnotationExpressionParseException { + Validate.noNullElements(annotationElements, + "Annotation elements must not contain null."); + final XAnnotation[] xannotations = new XAnnotation[annotationElements.length]; + for (int index = 0; index < annotationElements.length; index++) { + final AnnotationExpr annotationElement = annotationElements[index]; + try { + xannotations[index] = parse(annotationElement); + } catch (AnnotationExpressionParseException aepex) { + throw new AnnotationExpressionParseException(annotationElement, + aepex); + } + } + return xannotations; + } + + public XAnnotationField[] parseFields(Element annotationElement, + Class annotationClass) + throws AnnotationElementParseException { + + final Method[] methods = annotationClass.getMethods(); + + final Map> fieldsMap = new HashMap>(); + + for (final Method method : methods) { + if (!Annotation.class.equals(method.getDeclaringClass())) { + final String name = method.getName(); + final Class type = method.getReturnType(); + fieldsMap.put(name, type); + } + } + + final List> fields = new ArrayList>( + fieldsMap.size()); + + for (Entry> entry : fieldsMap.entrySet()) { + final String name = entry.getKey(); + final Class type = entry.getValue(); + try { + final XAnnotationField field = parseField(annotationElement, + name, type); + if (field != null) { + fields.add(field); + } + } catch (AnnotationElementParseException aepex) { + throw new AnnotationElementParseException(annotationElement, + aepex); + + } + + } + return fields.toArray(new XAnnotationField[fields.size()]); + } + + public XAnnotationField[] parseFields(Annotation annotation, + Class annotationClass) { + + final Method[] methods = annotationClass.getMethods(); + + final List> fields = new ArrayList>( + methods.length); + + for (final Method method : methods) { + if (!Annotation.class.equals(method.getDeclaringClass())) { + final String name = method.getName(); + final Class type = method.getReturnType(); + try { + fields.add(parseField(annotation, name, type)); + } catch (NoSuchAnnotationFieldException nsafex) { + // We're sure that method exists, exception can not happen + throw new AssertionError(nsafex); + } + } + } + return fields.toArray(new XAnnotationField[fields.size()]); + } + + public XAnnotationField[] parseFields(AnnotationExpr annotationExpr, + Class annotationClass) + throws AnnotationExpressionParseException { + final List pairs = annotationExpr + .accept(new AbstractGenericExpressionVisitor, Void>() { + @Override + public List visitDefault(Node n, Void arg) { + throw new IllegalArgumentException(); + } + + @Override + public List visit(NormalAnnotationExpr n, + Void arg) { + return n.getPairs(); + } + + @Override + public List visit(MarkerAnnotationExpr n, + Void arg) { + return Collections.emptyList(); + } + + @Override + public List visit( + SingleMemberAnnotationExpr n, Void arg) { + return Collections.singletonList(new MemberValuePair( + "value", n.getMemberValue())); + } + }, null); + + final Method[] methods = annotationClass.getMethods(); + + final Map> fieldsMap = new HashMap>(); + + for (final Method method : methods) { + if (!Annotation.class.equals(method.getDeclaringClass())) { + final String name = method.getName(); + final Class type = method.getReturnType(); + fieldsMap.put(name, type); + } + } + + final List> fields = new ArrayList>( + fieldsMap.size()); + + for (MemberValuePair memberValuePair : pairs) { + final String name = memberValuePair.getName(); + final Expression value = memberValuePair.getValue(); + final Class type = fieldsMap.get(name); + if (type != null) { + fields.add(parseField(value, name, type)); + } else { + // TODO + } + } + return fields.toArray(new XAnnotationField[fields.size()]); + } + + @SuppressWarnings("unchecked") + public XAnnotationField parseField(Expression annotationExpression, + String name, Class type) + throws AnnotationExpressionParseException { + + final XAnnotationField field = XGenericFieldParser.GENERIC.parse( + annotationExpression, name, type); + return field; + } + + @SuppressWarnings("unchecked") + public XAnnotationField parseField(Element annotationElement, + String name, Class type) throws AnnotationElementParseException { + + final XAnnotationField field = XGenericFieldParser.GENERIC.parse( + annotationElement, name, type); + return field; + } + + @SuppressWarnings("unchecked") + public XAnnotationField parseField(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + + final XAnnotationField field = XGenericFieldParser.GENERIC.parse( + annotation, name, type); + return field; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationSingleAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationSingleAnnotationFieldParser.java new file mode 100644 index 000000000..72650d80b --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XAnnotationSingleAnnotationFieldParser.java @@ -0,0 +1,100 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.Node; +import japa.parser.ast.expr.AnnotationExpr; +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; + +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.util.AnnotationElementUtils; +import org.w3c.dom.Element; + +public class XAnnotationSingleAnnotationFieldParser + extends XAnnotationFieldParser { + + @Override + @SuppressWarnings("unchecked") + public XAnnotationField parse(Element annotationElement, String name, + Class type) throws AnnotationElementParseException { + + final Element element = AnnotationElementUtils.getFieldElement( + annotationElement, name); + + if (element == null) { + return null; + } else { + try { + final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(element); + return construct(name, xannotation, type); + } catch (AnnotationElementParseException aepex) { + throw new AnnotationElementParseException(annotationElement, + aepex); + } + } + } + + @Override + @SuppressWarnings("unchecked") + public XAnnotationField parse(Expression annotationElement, String name, + Class type) throws AnnotationExpressionParseException { + + final AnnotationExpr element = annotationElement.accept( + new AbstractGenericExpressionVisitor() { + + public AnnotationExpr visitDefault(AnnotationExpr n, + Void arg) { + return n; + } + + @Override + public AnnotationExpr visitDefault(Node n, Void arg) { + throw new IllegalArgumentException("Expression [" + n + + "] must be an annotation expression."); + } + }, null); + + if (element == null) { + return null; + } else { + try { + final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(element); + return construct(name, xannotation, type); + } catch (AnnotationExpressionParseException aepex) { + throw new AnnotationExpressionParseException(annotationElement, + aepex); + } + } + } + + @Override + public XAnnotationField parse(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + final A value = getAnnotationFieldValue(annotation, name); + return construct(name, value, type); + } + + @Override + public XAnnotationField construct(String name, A value, Class type) { + @SuppressWarnings("unchecked") + final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE + .parse(value); + return new XSingleAnnotationField(name, type, + new XXAnnotationAnnotationValue(value, xannotation)); + } + + private XAnnotationField construct(String name, + XAnnotation xannotation, Class type) { + return new XSingleAnnotationField(name, type, + new XXAnnotationAnnotationValue(xannotation)); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XArrayAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XArrayAnnotationFieldParser.java new file mode 100644 index 000000000..bb878cf95 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XArrayAnnotationFieldParser.java @@ -0,0 +1,142 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.Node; +import japa.parser.ast.expr.AnnotationExpr; +import japa.parser.ast.expr.ArrayInitializerExpr; +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; +import java.text.MessageFormat; +import java.util.List; + +import org.apache.commons.lang3.ClassUtils; +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.value.XAnnotationValueParser; +import org.jvnet.annox.util.AnnotationElementUtils; +import org.w3c.dom.Element; + +public class XArrayAnnotationFieldParser extends + XAnnotationFieldParser { + + private final XAnnotationValueParser annotationValueParser; + + public XArrayAnnotationFieldParser( + XAnnotationValueParser annotationValueParser) { + this.annotationValueParser = Validate.notNull(annotationValueParser); + } + + @Override + public XAnnotationField parse(Element element, String name, + Class type) throws AnnotationElementParseException { + final Class componentType = type.getComponentType(); + final String[] draft = AnnotationElementUtils.getFieldValues(element, + name); + try { + @SuppressWarnings("unchecked") + final XAnnotationValue[] fieldValues = (XAnnotationValue[]) new XAnnotationValue[draft.length]; + + for (int index = 0; index < draft.length; index++) { + fieldValues[index] = this.annotationValueParser.parse( + draft[index], componentType); + } + return new XArrayAnnotationField(name, type, fieldValues); + } catch (ValueParseException vpex) { + throw new AnnotationElementParseException(element, vpex); + } + } + + @Override + public XAnnotationField construct(String name, V[] value, Class type) { + if (!type.isArray()) { + throw new IllegalArgumentException(MessageFormat.format( + "Type [{0}] is expected to be an array type.", type)); + } + final Class componentType = type.getComponentType(); + @SuppressWarnings("unchecked") + final XAnnotationValue[] fieldValues = (XAnnotationValue[]) new XAnnotationValue[value.length]; + for (int index = 0; index < value.length; index++) { + final V item = value[index]; + fieldValues[index] = this.annotationValueParser.construct(item, + componentType); + } + final XArrayAnnotationField annotationField = new XArrayAnnotationField( + name, type, fieldValues); + return annotationField; + } + + @SuppressWarnings("unchecked") + @Override + public XAnnotationField parse(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + final Object values = getAnnotationFieldValue(annotation, name); + final int length = Array.getLength(values); + + final V[] value = (V[]) Array.newInstance( + ClassUtils.primitiveToWrapper(type.getComponentType()), length); + for (int index = 0; index < length; index++) { + final Object object = Array.get(values, index); + value[index] = (V) object; + } + return construct(name, value, type); + } + + @Override + public XAnnotationField parse(Expression expression, + final String name, final Class type) + throws AnnotationExpressionParseException { + final ExpressionVisitor> expressionVisitor = this.annotationValueParser + .createExpressionVisitor(type.getComponentType()); + try { + return expression.accept( + new ExpressionVisitor>(type) { + + @Override + public XAnnotationField visitDefault(Expression n, Void arg) { + final XAnnotationValue v = n.accept(expressionVisitor, null); + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XArrayAnnotationField arrayAnnotationField = new XArrayAnnotationField( + name, type, new XAnnotationValue[]{v}); + return arrayAnnotationField; + } + + @Override + public XAnnotationField visit( + ArrayInitializerExpr n, Void arg) { + final List expressions = n.getValues(); + + @SuppressWarnings("unchecked") + final XAnnotationValue[] values = new XAnnotationValue[expressions + .size()]; + + for (int index = 0; index < expressions.size(); index++) { + final XAnnotationValue v = expressions.get( + index).accept(expressionVisitor, null); + values[index] = v; + } + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XArrayAnnotationField arrayAnnotationField = new XArrayAnnotationField( + name, type, values); + return arrayAnnotationField; + } + + }, null); + } catch (RuntimeException rex) { + if (rex.getCause() != null) { + throw new AnnotationExpressionParseException(expression, + rex.getCause()); + } else { + throw new AnnotationExpressionParseException(expression, rex); + } + } + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XGenericFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XGenericFieldParser.java new file mode 100644 index 000000000..a2b38d21c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XGenericFieldParser.java @@ -0,0 +1,228 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; + +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.parser.value.XBooleanAnnotationValueParser; +import org.jvnet.annox.parser.value.XByteAnnotationValueParser; +import org.jvnet.annox.parser.value.XCharAnnotationValueParser; +import org.jvnet.annox.parser.value.XClassAnnotationValueParser; +import org.jvnet.annox.parser.value.XDoubleAnnotationValueParser; +import org.jvnet.annox.parser.value.XEnumAnnotationValueParser; +import org.jvnet.annox.parser.value.XFloatAnnotationValueParser; +import org.jvnet.annox.parser.value.XIntAnnotationValueParser; +import org.jvnet.annox.parser.value.XLongAnnotationValueParser; +import org.jvnet.annox.parser.value.XShortAnnotationValueParser; +import org.jvnet.annox.parser.value.XStringAnnotationValueParser; +import org.w3c.dom.Element; + +public class XGenericFieldParser extends XAnnotationFieldParser { + + public static final XAnnotationFieldParser BOOLEAN = new XSingleAnnotationFieldParser( + new XBooleanAnnotationValueParser()); + public static final XAnnotationFieldParser BYTE = new XSingleAnnotationFieldParser( + new XByteAnnotationValueParser()); + public static final XAnnotationFieldParser INT = new XSingleAnnotationFieldParser( + new XIntAnnotationValueParser()); + public static final XAnnotationFieldParser LONG = new XSingleAnnotationFieldParser( + new XLongAnnotationValueParser()); + public static final XAnnotationFieldParser SHORT = new XSingleAnnotationFieldParser( + new XShortAnnotationValueParser()); + public static final XAnnotationFieldParser CHAR = new XSingleAnnotationFieldParser( + new XCharAnnotationValueParser()); + public static final XAnnotationFieldParser, Class> CLASS = new XSingleAnnotationFieldParser, Class>( + new XClassAnnotationValueParser()); + public static final XAnnotationFieldParser DOUBLE = new XSingleAnnotationFieldParser( + new XDoubleAnnotationValueParser()); + public static final XAnnotationFieldParser FLOAT = new XSingleAnnotationFieldParser( + new XFloatAnnotationValueParser()); + public static final XAnnotationFieldParser, Enum> ENUM = new XSingleAnnotationFieldParser, Enum>( + new XEnumAnnotationValueParser()); + public static final XAnnotationFieldParser STRING = new XSingleAnnotationFieldParser( + new XStringAnnotationValueParser()); + + @SuppressWarnings("rawtypes") + public static final XAnnotationFieldParser ANNOTATION = new XAnnotationSingleAnnotationFieldParser(); +// @SuppressWarnings("rawtypes") +// public static final XAnnotationFieldParser XANNOTATION = new XXAnnotationSingleAnnotationFieldParser(); + + public static final XAnnotationFieldParser BOOLEAN_ARRAY = new XArrayAnnotationFieldParser( + new XBooleanAnnotationValueParser()); + public static final XAnnotationFieldParser BYTE_ARRAY = new XArrayAnnotationFieldParser( + new XByteAnnotationValueParser()); + public static final XAnnotationFieldParser INT_ARRAY = new XArrayAnnotationFieldParser( + new XIntAnnotationValueParser()); + public static final XAnnotationFieldParser LONG_ARRAY = new XArrayAnnotationFieldParser( + new XLongAnnotationValueParser()); + public static final XAnnotationFieldParser SHORT_ARRAY = new XArrayAnnotationFieldParser( + new XShortAnnotationValueParser()); + public static final XAnnotationFieldParser CHAR_ARRAY = new XArrayAnnotationFieldParser( + new XCharAnnotationValueParser()); + public static final XAnnotationFieldParser[], Class[]> CLASS_ARRAY = new XArrayAnnotationFieldParser, Class>( + new XClassAnnotationValueParser()); + public static final XAnnotationFieldParser DOUBLE_ARRAY = new XArrayAnnotationFieldParser( + new XDoubleAnnotationValueParser()); + public static final XAnnotationFieldParser FLOAT_ARRAY = new XArrayAnnotationFieldParser( + new XFloatAnnotationValueParser()); + public static final XAnnotationFieldParser[], Enum[]> ENUM_ARRAY = new XArrayAnnotationFieldParser, Enum>( + new XEnumAnnotationValueParser()); + public static final XAnnotationFieldParser STRING_ARRAY = new XArrayAnnotationFieldParser( + new XStringAnnotationValueParser()); + + // public static final XBooleanArrayAnnotationFieldParser BOOLEAN_ARRAY = + // new XBooleanArrayAnnotationFieldParser(); + // public static final XByteArrayAnnotationFieldParser BYTE_ARRAY = new + // XByteArrayAnnotationFieldParser(); + // public static final XIntArrayAnnotationFieldParser INT_ARRAY = new + // XIntArrayAnnotationFieldParser(); + // public static final XLongArrayAnnotationFieldParser LONG_ARRAY = new + // XLongArrayAnnotationFieldParser(); + // public static final XShortArrayAnnotationFieldParser SHORT_ARRAY = new + // XShortArrayAnnotationFieldParser(); + // public static final XCharArrayAnnotationFieldParser CHAR_ARRAY = new + // XCharArrayAnnotationFieldParser(); + // public static final XClassArrayAnnotationFieldParser CLASS_ARRAY = new + // XClassArrayAnnotationFieldParser(); + // public static final XDoubleArrayAnnotationFieldParser DOUBLE_ARRAY = new + // XDoubleArrayAnnotationFieldParser(); + // public static final XFloatArrayAnnotationFieldParser FLOAT_ARRAY = new + // XFloatArrayAnnotationFieldParser(); + // public static final XEnumArrayAnnotationFieldParser ENUM_ARRAY = new + // XEnumArrayAnnotationFieldParser(); + // public static final XStringArrayAnnotationFieldParser STRING_ARRAY = new + // XStringArrayAnnotationFieldParser(); + @SuppressWarnings("rawtypes") + public static final XAnnotationArrayAnnotationFieldParser ANNOTATION_ARRAY = new XAnnotationArrayAnnotationFieldParser(); +// @SuppressWarnings("rawtypes") +// public static final XXAnnotationArrayAnnotationFieldParser XANNOTATION_ARRAY = new XXAnnotationArrayAnnotationFieldParser(); + + @SuppressWarnings("rawtypes") + public static final XGenericFieldParser GENERIC = new XGenericFieldParser(); + + @Override + public XAnnotationField parse(Element element, String name, Class type) + throws AnnotationElementParseException { + + @SuppressWarnings("unchecked") + final XAnnotationFieldParser parser = (XAnnotationFieldParser) XGenericFieldParser + .detectType(type); + return parser.parse(element, name, type); + } + + @Override + public XAnnotationField parse(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + @SuppressWarnings("unchecked") + final XAnnotationFieldParser parser = (XAnnotationFieldParser) XGenericFieldParser + .detectType(type); + return parser.parse(annotation, name, type); + } + + @Override + public XAnnotationField construct(String name, V value, Class type) { + @SuppressWarnings("unchecked") + final XAnnotationFieldParser parser = (XAnnotationFieldParser) XGenericFieldParser + .detectType(type); + return parser.construct(name, value, type); + } + + @Override + public XAnnotationField parse(Expression expression, String name, + Class type) throws AnnotationExpressionParseException { + @SuppressWarnings("unchecked") + final XAnnotationFieldParser parser = (XAnnotationFieldParser) XGenericFieldParser + .detectType(type); + return parser.parse(expression, name, type); + } + + public static XAnnotationFieldParser generic() { + @SuppressWarnings("unchecked") + final XAnnotationFieldParser parser = XGenericFieldParser.GENERIC; + return parser; + } + + public static XAnnotationFieldParser detectType(Class theClass) { + if (theClass == null) + throw new IllegalArgumentException("Class must not be null."); + + if (theClass.isArray()) { + final XAnnotationFieldParser componentType = detectType(theClass + .getComponentType()); + if (componentType == XGenericFieldParser.BOOLEAN) + return XGenericFieldParser.BOOLEAN_ARRAY; + else if (componentType == XGenericFieldParser.BYTE) + return XGenericFieldParser.BYTE_ARRAY; + else if (componentType == XGenericFieldParser.INT) + return XGenericFieldParser.INT_ARRAY; + else if (componentType == XGenericFieldParser.LONG) + return XGenericFieldParser.LONG_ARRAY; + else if (componentType == XGenericFieldParser.SHORT) + return XGenericFieldParser.SHORT_ARRAY; + else if (componentType == XGenericFieldParser.CHAR) + return XGenericFieldParser.CHAR_ARRAY; + else if (componentType == XGenericFieldParser.CLASS) + return XGenericFieldParser.CLASS_ARRAY; + else if (componentType == XGenericFieldParser.DOUBLE) + return XGenericFieldParser.DOUBLE_ARRAY; + else if (componentType == XGenericFieldParser.FLOAT) + return XGenericFieldParser.FLOAT_ARRAY; + else if (componentType == XGenericFieldParser.ENUM) + return XGenericFieldParser.ENUM_ARRAY; + else if (componentType == XGenericFieldParser.STRING) + return XGenericFieldParser.STRING_ARRAY; + else if (componentType == XGenericFieldParser.ANNOTATION) + return XGenericFieldParser.ANNOTATION_ARRAY; +// else if (componentType == XGenericFieldParser.XANNOTATION) +// return XGenericFieldParser.XANNOTATION_ARRAY; + else + throw new IllegalArgumentException( + "Unknown annotation field type."); + + } else { + if (Boolean.class.equals(theClass) || Boolean.TYPE.equals(theClass)) { + return XGenericFieldParser.BOOLEAN; + } else if (Byte.class.equals(theClass) + || Byte.TYPE.equals(theClass)) { + return XGenericFieldParser.BYTE; + } else if (Integer.class.equals(theClass) + || Integer.TYPE.equals(theClass)) { + return XGenericFieldParser.INT; + } else if (Long.class.equals(theClass) + || Long.TYPE.equals(theClass)) { + return XGenericFieldParser.LONG; + } else if (Short.class.equals(theClass) + || Short.TYPE.equals(theClass)) { + return XGenericFieldParser.SHORT; + } else if (Character.class.equals(theClass) + || Character.TYPE.equals(theClass)) { + return XGenericFieldParser.CHAR; + } else if (Double.class.equals(theClass) + || Double.TYPE.equals(theClass)) { + return XGenericFieldParser.DOUBLE; + } else if (Float.class.equals(theClass) + || Float.TYPE.equals(theClass)) { + return XGenericFieldParser.FLOAT; + } else if (Class.class.equals(theClass)) { + return XGenericFieldParser.CLASS; + } else if (String.class.equals(theClass)) { + return XGenericFieldParser.STRING; + } else if (Enum.class.isAssignableFrom(theClass)) { + return XGenericFieldParser.ENUM; + } else if (Annotation.class.isAssignableFrom(theClass)) { + return XGenericFieldParser.ANNOTATION; +// } else if (XAnnotation.class.isAssignableFrom(theClass)) { +// return XGenericFieldParser.XANNOTATION; + } else { + throw new IllegalArgumentException( + "Unknown annotation field type [" + theClass.getName() + + "]."); + } + } + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XSingleAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XSingleAnnotationFieldParser.java new file mode 100644 index 000000000..5b01540f0 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XSingleAnnotationFieldParser.java @@ -0,0 +1,83 @@ +package org.jvnet.annox.parser; + +import japa.parser.ast.expr.Expression; + +import java.lang.annotation.Annotation; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.value.XAnnotationValueParser; +import org.jvnet.annox.util.AnnotationElementUtils; +import org.w3c.dom.Element; + +public class XSingleAnnotationFieldParser extends + XAnnotationFieldParser { + + private final XAnnotationValueParser annotationValueParser; + + public XSingleAnnotationFieldParser( + XAnnotationValueParser annotationValueParser) { + Validate.notNull(annotationValueParser); + this.annotationValueParser = annotationValueParser; + } + + @Override + public XAnnotationField parse(Element element, String name, Class type) + throws AnnotationElementParseException { + Validate.notNull(element, "Element must not be null."); + Validate.notNull(name, "Field name must not be null."); + Validate.notNull(type, "Type must not be null."); + final String draft = AnnotationElementUtils + .getFieldValue(element, name); + + if (draft == null) { + return null; + } else { + try { + final XAnnotationValue value = this.annotationValueParser.parse(draft, type); + return new XSingleAnnotationField(name, type, value); + } catch (ValueParseException vpex) { + throw new AnnotationElementParseException(element, vpex); + } + } + } + + public XAnnotationField parse(Annotation annotation, String name, + Class type) throws NoSuchAnnotationFieldException { + final V value = this. getAnnotationFieldValue(annotation, name); + return construct(name, value, type); + } + + public final XAnnotationField construct(String name, V value, + Class type) { + final XAnnotationValue fieldValue = this.annotationValueParser.construct(value, type); + return new XSingleAnnotationField(name, type, fieldValue); + } + + @Override + public XAnnotationField parse(Expression expression, String name, + Class type) throws AnnotationExpressionParseException { + final ExpressionVisitor> expressionVisitor = this.annotationValueParser + .createExpressionVisitor(type); + try { + + final XAnnotationValue value = expression.accept( + expressionVisitor, null); + return new XSingleAnnotationField(name, type, value); + } catch (RuntimeException rex) { + if (rex.getCause() != null) { + throw new AnnotationExpressionParseException(expression, + rex.getCause()); + } else { + throw new AnnotationExpressionParseException(expression, rex); + } + } + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationArrayAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationArrayAnnotationFieldParser.java new file mode 100644 index 000000000..2b65a8fc4 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationArrayAnnotationFieldParser.java @@ -0,0 +1,127 @@ +//package org.jvnet.annox.parser; +// +//import japa.parser.ast.Node; +//import japa.parser.ast.expr.AnnotationExpr; +//import japa.parser.ast.expr.ArrayInitializerExpr; +//import japa.parser.ast.expr.Expression; +// +//import java.lang.annotation.Annotation; +//import java.text.MessageFormat; +//import java.util.List; +// +//import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +//import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +//import org.jvnet.annox.model.XAnnotation; +//import org.jvnet.annox.model.annotation.field.XAnnotationField; +//import org.jvnet.annox.model.annotation.field.XArrayAnnotationField; +//import org.jvnet.annox.model.annotation.value.XAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +//import org.jvnet.annox.parser.exception.AnnotationElementParseException; +//import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +//import org.jvnet.annox.util.AnnotationElementUtils; +//import org.w3c.dom.Element; +// +//public class XXAnnotationArrayAnnotationFieldParser +// extends XAnnotationFieldParser[]> { +// +// @Override +// public XAnnotationField parse(Element annotationElement, String name, +// Class type) throws AnnotationElementParseException { +// +// final Element[] elements = AnnotationElementUtils.getFieldElements( +// annotationElement, name); +// +// @SuppressWarnings("unchecked") +// final XAnnotation[] xannotations = new XAnnotation[elements.length]; +// +// for (int index = 0; index < elements.length; index++) { +// try { +// @SuppressWarnings("unchecked") +// final XAnnotation annotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(elements[index]); +// xannotations[index] = annotation; +// } catch (AnnotationElementParseException aepex) { +// throw new AnnotationElementParseException(annotationElement, +// aepex); +// } +// } +// return construct(name, xannotations, type); +// } +// +// public XAnnotationField parse(Annotation annotation, String name, +// Class type) throws NoSuchAnnotationFieldException { +// final A[] value = getAnnotationFieldValue(annotation, name); +// @SuppressWarnings("unchecked") +// final XAnnotation[] xannotations = new XAnnotation[value.length]; +// +// for (int index = 0; index < value.length; index++) { +// @SuppressWarnings("unchecked") +// final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(value[index]); +// xannotations[index] = xannotation; +// } +// return construct(name, xannotations, type); +// } +// +// @Override +// public XAnnotationField parse(Expression expression, String name, +// Class type) throws AnnotationExpressionParseException { +// final Expression[] items = expression.accept( +// new AbstractGenericExpressionVisitor() { +// @Override +// public Expression[] visit(ArrayInitializerExpr n, Void arg) { +// final List values = n.getValues(); +// return values.toArray(new Expression[values.size()]); +// } +// +// @Override +// public Expression[] visitDefault(Node n, Void arg) { +// throw new IllegalArgumentException( +// MessageFormat +// .format("Unexpected expression [{0}], only array initializer expressions are expected.", +// n)); +// } +// }, null); +// +// @SuppressWarnings("unchecked") +// final XAnnotation[] xannotations = new XAnnotation[items.length]; +// +// for (int index = 0; index < items.length; index++) { +// +// final Expression item = items[index]; +// final AnnotationExpr annotationExpression = item +// .accept(new AbstractGenericExpressionVisitor() { +// @Override +// public AnnotationExpr visitDefault(Node n, Void arg) { +// throw new IllegalArgumentException( +// MessageFormat +// .format("Unexpected expression [{0}], only annotation expressions are expected.", +// n)); +// } +// +// @Override +// public AnnotationExpr visitDefault(AnnotationExpr n, +// Void arg) { +// return n; +// } +// }, null); +// +// @SuppressWarnings("unchecked") +// final XAnnotation annotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(annotationExpression); +// xannotations[index] = annotation; +// } +// return construct(name, xannotations, type); +// } +// +// public XAnnotationField construct(String name, +// final XAnnotation[] xannotations, Class type) { +// @SuppressWarnings("unchecked") +// final XAnnotationValue[] xannotationValues = new XAnnotationValue[xannotations.length]; +// for (int index = 0; index < xannotations.length; index++) { +// xannotationValues[index] = new XXAnnotationAnnotationValue( +// xannotations[index]); +// } +// return new XArrayAnnotationField(name, type, xannotationValues); +// } +//} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationSingleAnnotationFieldParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationSingleAnnotationFieldParser.java new file mode 100644 index 000000000..7ccd3f7f7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/XXAnnotationSingleAnnotationFieldParser.java @@ -0,0 +1,106 @@ +//package org.jvnet.annox.parser; +// +//import japa.parser.ast.Node; +//import japa.parser.ast.expr.AnnotationExpr; +//import japa.parser.ast.expr.Expression; +// +//import java.lang.annotation.Annotation; +//import java.text.MessageFormat; +// +//import org.jvnet.annox.annotation.NoSuchAnnotationFieldException; +//import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +//import org.jvnet.annox.model.XAnnotation; +//import org.jvnet.annox.model.annotation.field.XAnnotationField; +//import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +//import org.jvnet.annox.model.annotation.value.XAnnotationValue; +//import org.jvnet.annox.model.annotation.value.XXAnnotationAnnotationValue; +//import org.jvnet.annox.parser.exception.AnnotationElementParseException; +//import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +//import org.jvnet.annox.util.AnnotationElementUtils; +//import org.w3c.dom.Element; +// +//public class XXAnnotationSingleAnnotationFieldParser +// extends XAnnotationFieldParser> { +// +// @Override +// @SuppressWarnings("unchecked") +// public XAnnotationField parse(Element annotationElement, String name, +// Class type) throws AnnotationElementParseException { +// +// final Element element = AnnotationElementUtils.getFieldElement( +// annotationElement, name); +// +// if (element == null) { +// return null; +// } else { +// try { +// final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(element); +// +// final XAnnotationValue value = new XXAnnotationAnnotationValue( +// xannotation); +// return new XSingleAnnotationField(name, type, value); +// } catch (AnnotationElementParseException aepex) { +// throw new AnnotationElementParseException(annotationElement, +// aepex); +// } +// } +// } +// +// @Override +// public XAnnotationField parse(Expression annotationElement, String name, +// Class type) throws AnnotationExpressionParseException { +// +// final AnnotationExpr element = annotationElement.accept( +// new AbstractGenericExpressionVisitor() { +// @Override +// public AnnotationExpr visitDefault(Node n, Void arg) { +// throw new IllegalArgumentException( +// MessageFormat +// .format("Unexpected expression [{0}], only annotation expressions are expected.", +// n)); +// } +// +// @Override +// public AnnotationExpr visitDefault(AnnotationExpr n, +// Void arg) { +// return n; +// } +// }, null); +// +// if (element == null) { +// return null; +// } else { +// try { +// @SuppressWarnings("unchecked") +// final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(element); +// final XAnnotationValue value = new XXAnnotationAnnotationValue( +// xannotation); +// return new XSingleAnnotationField(name, type, value); +// } catch (AnnotationExpressionParseException aepex) { +// throw new AnnotationExpressionParseException(annotationElement, +// aepex); +// } +// } +// } +// +// @Override +// public XAnnotationField parse(Annotation annotation, String name, +// Class type) throws NoSuchAnnotationFieldException { +// final A value = getAnnotationFieldValue(annotation, name); +// @SuppressWarnings("unchecked") +// final XAnnotation xannotation = (XAnnotation) XAnnotationParser.INSTANCE +// .parse(value); +// return new XSingleAnnotationField(name, type, +// new XXAnnotationAnnotationValue(value, xannotation)); +// } +// +// @Override +// public XAnnotationField construct(String name, +// XAnnotation annotation, Class type) { +// return new XSingleAnnotationField(name, type, +// new XXAnnotationAnnotationValue(annotation)); +// } +// +//} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationElementParseException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationElementParseException.java new file mode 100644 index 000000000..a420aa026 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationElementParseException.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.parser.exception; + +import org.w3c.dom.Element; + +public class AnnotationElementParseException extends Exception { + + private static final long serialVersionUID = 1L; + + private Element element; + + public AnnotationElementParseException(Element element, Throwable cause) { + super("Could not parse the annotation element.", cause); + this.element = element; + } + + public Element getElement() { + return element; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationExpressionParseException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationExpressionParseException.java new file mode 100644 index 000000000..7a8075b23 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationExpressionParseException.java @@ -0,0 +1,25 @@ +package org.jvnet.annox.parser.exception; + +import java.text.MessageFormat; + +import japa.parser.ast.Node; + +public class AnnotationExpressionParseException extends Exception { + + private static final long serialVersionUID = 1L; + + private Node expression; + + public AnnotationExpressionParseException(Node expression, Throwable cause) { + super( + MessageFormat.format( + "Could not parse the annotation expression [{0}].", + expression), cause); + this.expression = expression; + } + + public Node getExpression() { + return expression; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationStringParseException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationStringParseException.java new file mode 100644 index 000000000..b4710e65e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/AnnotationStringParseException.java @@ -0,0 +1,24 @@ +package org.jvnet.annox.parser.exception; + +public class AnnotationStringParseException extends Exception { + + private static final long serialVersionUID = 1L; + + private String text; + + public AnnotationStringParseException(String message, String text, + Throwable cause) { + super(message, cause); + this.text = text; + } + + public AnnotationStringParseException(String message, String text) { + super(message); + this.text = text; + } + + public String getText() { + return text; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/ValueParseException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/ValueParseException.java new file mode 100644 index 000000000..5f185c59a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/exception/ValueParseException.java @@ -0,0 +1,35 @@ +package org.jvnet.annox.parser.exception; + +import java.text.MessageFormat; + +public class ValueParseException extends Exception { + + private static final long serialVersionUID = 1L; + + private Class targetClass; + + private Object value; + + public ValueParseException(Object value, Class targetClass, Throwable cause) { + this(value, targetClass); + this.value = value; + } + + public ValueParseException(Object value, Class targetClass) { + super(MessageFormat.format( + "Could not parse the value [{0}] into the target class [{1}].", + (value == null ? "null" : value.toString()), + (targetClass == null ? "null" : targetClass.getName()))); + this.targetClass = targetClass; + this.value = value; + } + + public Object getValue() { + return value; + } + + public Class getTargetClass() { + return targetClass; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/BooleanExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/BooleanExpressionVisitor.java new file mode 100644 index 000000000..0099cfd4e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/BooleanExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XBooleanAnnotationValue; + +import japa.parser.ast.expr.BooleanLiteralExpr; + +public final class BooleanExpressionVisitor extends + ExpressionVisitor> { + public BooleanExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visit(BooleanLiteralExpr n, Void arg) { + return new XBooleanAnnotationValue(n.getValue()); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ByteExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ByteExpressionVisitor.java new file mode 100644 index 000000000..a43fe6c78 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ByteExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XByteAnnotationValue; + +public final class ByteExpressionVisitor extends + ExpressionVisitor> { + public ByteExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XByteAnnotationValue(Byte.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/CharacterExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/CharacterExpressionVisitor.java new file mode 100644 index 000000000..eb0138b92 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/CharacterExpressionVisitor.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XCharAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; + +public final class CharacterExpressionVisitor extends + ExpressionVisitor> { + public CharacterExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, + Void arg) { + final String value = n.getValue(); + if (value == null) { + throw new RuntimeException(new ValueParseException(value, + this.targetClass)); + } else if (value.length() != 1) { + throw new RuntimeException(new ValueParseException(value, + this.targetClass)); + } else { + return new XCharAnnotationValue(Character.valueOf(value.charAt(0))); + } + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ClassExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ClassExpressionVisitor.java new file mode 100644 index 000000000..39fdc9baa --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ClassExpressionVisitor.java @@ -0,0 +1,151 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.ClassExpr; +import japa.parser.ast.type.ClassOrInterfaceType; +import japa.parser.ast.type.PrimitiveType; +import japa.parser.ast.type.ReferenceType; +import japa.parser.ast.type.Type; +import japa.parser.ast.type.VoidType; +import japa.parser.ast.type.WildcardType; + +import java.lang.reflect.Array; + +import org.jvnet.annox.model.annotation.value.AbstractBasicXAnnotationValueVisitor; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XArrayClassAnnotationValue; +import org.jvnet.annox.model.annotation.value.XClassAnnotationValue; +import org.jvnet.annox.model.annotation.value.XClassByNameAnnotationValue; + +public final class ClassExpressionVisitor extends + ExpressionVisitor>> { + public ClassExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue> visit(ClassExpr n, Void arg) { + return n.getType().accept( + new ExpressionVisitor>>( + this.targetClass) { + + @Override + public XAnnotationValue> visit( + ClassOrInterfaceType n, Void arg) { + // TODO Scopes + // TODO unknown clases + // TODO We'll need a more complex construct for classes + // here + final String className = n.toString(); + try { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> classAnnotationValue = new XClassAnnotationValue( + Class.forName(className)); + return classAnnotationValue; + } catch (ClassNotFoundException cnfex) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> classByNameAnnotationValue = new XClassByNameAnnotationValue( + className); + return classByNameAnnotationValue; + } + } + + @Override + public XAnnotationValue> visit(ReferenceType n, + Void arg) { + + // BUG arraycount is not yet considered + // TODO consider arrayCount + final Type type = n.getType(); + final XAnnotationValue> t = type.accept(this, + arg); + final int arrayCount = n.getArrayCount(); + if (arrayCount == 0) { + return t; + } else { + + return t.accept(new AbstractBasicXAnnotationValueVisitor>>() { + + @Override + public XAnnotationValue> visitDefault( + XAnnotationValue value) { + throw new IllegalArgumentException(); + } + + @Override + public XAnnotationValue> visit( + XArrayClassAnnotationValue value) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> arrayClassAnnotationValue = new XArrayClassAnnotationValue( + value.getItemClassByNameAnnotationValue(), + value.getDimension() + arrayCount); + return arrayClassAnnotationValue; + } + + @Override + public XAnnotationValue> visit( + XClassAnnotationValue value) { + Class _class = value.getValue(); + for (int index = 0; index < arrayCount; index++) { + _class = Array.newInstance(_class, 0) + .getClass(); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> classAnnotationValue = new XClassAnnotationValue( + _class); + return classAnnotationValue; + } + + @Override + public XAnnotationValue> visit( + XClassByNameAnnotationValue value) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> arrayClassAnnotationValue = new XArrayClassAnnotationValue( + value, arrayCount); + return arrayClassAnnotationValue; + } + }); + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public XAnnotationValue> visit(VoidType n, Void arg) { + return new XClassAnnotationValue(Void.class); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public XAnnotationValue> visit(PrimitiveType n, + Void arg) { + switch (n.getType()) { + case Boolean: + return new XClassAnnotationValue(boolean.class); + case Char: + return new XClassAnnotationValue(char.class); + case Byte: + return new XClassAnnotationValue(byte.class); + case Short: + return new XClassAnnotationValue(short.class); + case Int: + return new XClassAnnotationValue(int.class); + case Long: + return new XClassAnnotationValue(long.class); + case Double: + return new XClassAnnotationValue(double.class); + case Float: + return new XClassAnnotationValue(float.class); + default: + throw new IllegalArgumentException(); + } + } + + @Override + public XAnnotationValue> visit(WildcardType n, + Void arg) { + throw new UnsupportedOperationException( + "Wildcard types are not supported."); + } + + }, null); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/DoubleExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/DoubleExpressionVisitor.java new file mode 100644 index 000000000..1b42e78b8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/DoubleExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XDoubleAnnotationValue; + +public final class DoubleExpressionVisitor extends + ExpressionVisitor> { + public DoubleExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XDoubleAnnotationValue(Double.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/EnumExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/EnumExpressionVisitor.java new file mode 100644 index 000000000..f55488bea --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/EnumExpressionVisitor.java @@ -0,0 +1,27 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.FieldAccessExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XEnumAnnotationValue; + +public final class EnumExpressionVisitor extends + ExpressionVisitor>> { + public EnumExpressionVisitor(Class targetClass) { + super(targetClass); + } + + // TODO Implement handling enums as strings. + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public XAnnotationValue> visit(FieldAccessExpr n, Void arg) { + try { + final Class enumClass = (Class) this.targetClass; + return new XEnumAnnotationValue(Enum.valueOf(enumClass, + n.getField())); + } catch (Exception ex) { + // BUG + throw new RuntimeException(ex); + } + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ExpressionVisitor.java new file mode 100644 index 000000000..f679b1da8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ExpressionVisitor.java @@ -0,0 +1,24 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.Node; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.japa.parser.ast.visitor.AbstractGenericExpressionVisitor; +import org.jvnet.annox.parser.exception.ValueParseException; + +public class ExpressionVisitor extends + AbstractGenericExpressionVisitor { + protected final Class targetClass; + + public ExpressionVisitor(Class targetClass) { + Validate.notNull(targetClass); + this.targetClass = targetClass; + } + + @Override + public V visitDefault(Node n, Void arg) { + throw new RuntimeException(new ValueParseException(n, + this.targetClass)); + } + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/FloatExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/FloatExpressionVisitor.java new file mode 100644 index 000000000..dfd3282e7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/FloatExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XFloatAnnotationValue; + +public final class FloatExpressionVisitor extends + ExpressionVisitor> { + public FloatExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XFloatAnnotationValue(Float.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/IntegerExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/IntegerExpressionVisitor.java new file mode 100644 index 000000000..1eb7c573c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/IntegerExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XIntAnnotationValue; + +public final class IntegerExpressionVisitor extends + ExpressionVisitor> { + public IntegerExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XIntAnnotationValue(Integer.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/LongExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/LongExpressionVisitor.java new file mode 100644 index 000000000..7146cf279 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/LongExpressionVisitor.java @@ -0,0 +1,36 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.LongLiteralExpr; +import japa.parser.ast.expr.LongLiteralMinValueExpr; +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XLongAnnotationValue; + +public final class LongExpressionVisitor extends + ExpressionVisitor> { + public LongExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XLongAnnotationValue(Long.valueOf(n.getValue())); + } + + @Override + public XAnnotationValue visit(LongLiteralMinValueExpr n, Void arg) { + return new XLongAnnotationValue(Long.MIN_VALUE); + } + + @Override + public XAnnotationValue visit(LongLiteralExpr n, Void arg) { + String value = n.getValue(); + if (value.endsWith("L") || value.endsWith("l")) { + return new XLongAnnotationValue(Long.valueOf(value.substring(0, + value.length() - 1))); + } else { + return super.visit(n, arg); + } + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ShortExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ShortExpressionVisitor.java new file mode 100644 index 000000000..a3980549b --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/ShortExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XShortAnnotationValue; + +public final class ShortExpressionVisitor extends + ExpressionVisitor> { + public ShortExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XShortAnnotationValue(Short.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/StringExpressionVisitor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/StringExpressionVisitor.java new file mode 100644 index 000000000..b4697844c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/java/visitor/StringExpressionVisitor.java @@ -0,0 +1,18 @@ +package org.jvnet.annox.parser.java.visitor; + +import japa.parser.ast.expr.StringLiteralExpr; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XStringAnnotationValue; + +public final class StringExpressionVisitor extends + ExpressionVisitor> { + public StringExpressionVisitor(Class targetClass) { + super(targetClass); + } + + @Override + public XAnnotationValue visitDefault(StringLiteralExpr n, Void arg) { + return new XStringAnnotationValue(String.valueOf(n.getValue())); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XAnnotationValueParser.java new file mode 100644 index 000000000..1030bd8e5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XAnnotationValueParser.java @@ -0,0 +1,17 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public abstract class XAnnotationValueParser { + + public abstract XAnnotationValue parse(String value, Class type) + throws ValueParseException; + + public abstract XAnnotationValue construct(V value, Class type); + + public abstract ExpressionVisitor> createExpressionVisitor( + Class type); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XBooleanAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XBooleanAnnotationValueParser.java new file mode 100644 index 000000000..5bad22fdc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XBooleanAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XBooleanAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.BooleanExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XBooleanAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Boolean.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Boolean value, Class type) { + return new XBooleanAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new BooleanExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XByteAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XByteAnnotationValueParser.java new file mode 100644 index 000000000..4a8b6fa56 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XByteAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XByteAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ByteExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XByteAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Byte.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Byte value, Class type) { + return new XByteAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new ByteExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XCharAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XCharAnnotationValueParser.java new file mode 100644 index 000000000..29b5997dc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XCharAnnotationValueParser.java @@ -0,0 +1,32 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XCharAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.CharacterExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XCharAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + if (value.length() != 1) { + throw new ValueParseException(value, type); + } + return construct(Character.valueOf(value.charAt(0)), type); + } + + @Override + public XAnnotationValue construct(Character value, Class type) { + return new XCharAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new CharacterExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XClassAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XClassAnnotationValueParser.java new file mode 100644 index 000000000..d87d1bb7d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XClassAnnotationValueParser.java @@ -0,0 +1,114 @@ +package org.jvnet.annox.parser.value; + +import java.lang.reflect.Array; + +import org.apache.commons.lang3.ClassUtils; +import org.apache.commons.lang3.StringUtils; +import org.jvnet.annox.model.annotation.value.AbstractBasicXAnnotationValueVisitor; +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XArrayClassAnnotationValue; +import org.jvnet.annox.model.annotation.value.XClassAnnotationValue; +import org.jvnet.annox.model.annotation.value.XClassByNameAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ClassExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XClassAnnotationValueParser extends + XAnnotationValueParser, Class> { + + @Override + public XAnnotationValue> parse(String value, Class type) + throws ValueParseException { + try { + final Class _class = ClassUtils.getClass(value); + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> annotationValue = new XClassAnnotationValue( + _class); + return annotationValue; + } catch (ClassNotFoundException cnfex) { + + final int lastLeftBracketPosition = value.lastIndexOf('['); + final int lastRightBracketPosition = value.lastIndexOf(']'); + + if (lastLeftBracketPosition >= 0 + && lastRightBracketPosition > lastLeftBracketPosition) { + + final String classNamePart = value.substring(0, + lastLeftBracketPosition); + final String indexPart = value.substring( + lastLeftBracketPosition + 1, lastRightBracketPosition); + final String suffixPart = value + .substring(lastRightBracketPosition + 1); + + if (!StringUtils.isBlank(classNamePart) + && StringUtils.isBlank(indexPart) + && StringUtils.isBlank(suffixPart)) { + final XAnnotationValue> componentTypeValue = parse( + classNamePart.trim(), type); + + return componentTypeValue + .accept(new AbstractBasicXAnnotationValueVisitor>>() { + + @Override + public XAnnotationValue> visitDefault( + XAnnotationValue value) { + throw new IllegalArgumentException(); + } + + @SuppressWarnings("rawtypes") + @Override + public XAnnotationValue> visit( + XClassAnnotationValue value) { + final Class itemClass = value.getValue(); + final Class arrayClass = Array + .newInstance(itemClass, 0) + .getClass(); + @SuppressWarnings("unchecked") + final XAnnotationValue> classAnnotationValue = new XClassAnnotationValue( + arrayClass); + return classAnnotationValue; + } + + @Override + public XAnnotationValue> visit( + XClassByNameAnnotationValue value) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> arrayClassAnnotationValue = new XArrayClassAnnotationValue( + value, 1); + return arrayClassAnnotationValue; + } + + @Override + public XAnnotationValue> visit( + XArrayClassAnnotationValue value) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> arrayClassAnnotationValue = new XArrayClassAnnotationValue( + value.getItemClassByNameAnnotationValue(), + value.getDimension() + 1); + return arrayClassAnnotationValue; + } + }); + } + } + @SuppressWarnings({ "rawtypes", "unchecked" }) + final XAnnotationValue> classByNameAnnotationValue = new XClassByNameAnnotationValue( + value); + return classByNameAnnotationValue; + } + } + + @Override + public XAnnotationValue> construct(Class value, Class type) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> annotationValue = new XClassAnnotationValue( + value); + return annotationValue; + } + + @Override + public ExpressionVisitor>> createExpressionVisitor( + Class type) { + return new ClassExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XDoubleAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XDoubleAnnotationValueParser.java new file mode 100644 index 000000000..49b33d0ac --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XDoubleAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XDoubleAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.DoubleExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XDoubleAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Double.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Double value, Class type) { + return new XDoubleAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new DoubleExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XEnumAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XEnumAnnotationValueParser.java new file mode 100644 index 000000000..f652fb1c7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XEnumAnnotationValueParser.java @@ -0,0 +1,37 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XEnumAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.EnumExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; + +public class XEnumAnnotationValueParser extends + XAnnotationValueParser, Enum> { + + @Override + public XAnnotationValue> parse(String value, Class type) + throws ValueParseException { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final Class enumClass = (Class) type; + @SuppressWarnings({ "rawtypes", "unchecked" }) + final XAnnotationValue> annotationValue = new XEnumAnnotationValue( + Enum.valueOf(enumClass, value)); + return annotationValue; + } + + @Override + public XAnnotationValue> construct(Enum value, Class type) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + final XAnnotationValue> annotationValue = new XEnumAnnotationValue( + value); + return annotationValue; + } + + @Override + public ExpressionVisitor>> createExpressionVisitor( + Class type) { + return new EnumExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XFloatAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XFloatAnnotationValueParser.java new file mode 100644 index 000000000..a3dd1bf1f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XFloatAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XFloatAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.FloatExpressionVisitor; + +public class XFloatAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Float.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Float value, Class type) { + return new XFloatAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new FloatExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XIntAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XIntAnnotationValueParser.java new file mode 100644 index 000000000..d11909cc1 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XIntAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XIntAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.IntegerExpressionVisitor; + +public class XIntAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Integer.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Integer value, Class type) { + return new XIntAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new IntegerExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XLongAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XLongAnnotationValueParser.java new file mode 100644 index 000000000..d3b6361e8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XLongAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XLongAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.LongExpressionVisitor; + +public class XLongAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Long.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Long value, Class type) { + return new XLongAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new LongExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XShortAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XShortAnnotationValueParser.java new file mode 100644 index 000000000..414d940dd --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XShortAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XShortAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.ShortExpressionVisitor; + +public class XShortAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(Short.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(Short value, Class type) { + return new XShortAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new ShortExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XStringAnnotationValueParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XStringAnnotationValueParser.java new file mode 100644 index 000000000..691c680e6 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/parser/value/XStringAnnotationValueParser.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.value; + +import org.jvnet.annox.model.annotation.value.XAnnotationValue; +import org.jvnet.annox.model.annotation.value.XStringAnnotationValue; +import org.jvnet.annox.parser.exception.ValueParseException; +import org.jvnet.annox.parser.java.visitor.ExpressionVisitor; +import org.jvnet.annox.parser.java.visitor.StringExpressionVisitor; + +public class XStringAnnotationValueParser extends + XAnnotationValueParser { + + @Override + public XAnnotationValue parse(String value, Class type) + throws ValueParseException { + return construct(String.valueOf(value), type); + } + + @Override + public XAnnotationValue construct(String value, Class type) { + return new XStringAnnotationValue(value); + } + + @Override + public ExpressionVisitor> createExpressionVisitor( + Class type) { + return new StringExpressionVisitor(type); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/XReader.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/XReader.java new file mode 100644 index 000000000..c58c53454 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/XReader.java @@ -0,0 +1,38 @@ +package org.jvnet.annox.reader; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.jvnet.annox.model.XClass; +import org.jvnet.annox.model.XConstructor; +import org.jvnet.annox.model.XField; +import org.jvnet.annox.model.XMethod; +import org.jvnet.annox.model.XPackage; +import org.jvnet.annox.reflect.AnnotatedElementException; + +public interface XReader { + + public XPackage getXPackage(Package thePackage) + throws AnnotatedElementException; + + public XClass getXClass(Class theClass) throws AnnotatedElementException; + + public XField getXField(Field theField) throws AnnotatedElementException; + + public XField getXField(Class theClass, Field theField) + throws AnnotatedElementException; + + public XConstructor getXConstructor(Constructor theConstructor) + throws AnnotatedElementException; + + public XConstructor getXConstructor(Class theClass, + Constructor theConstructor) throws AnnotatedElementException; + + public XMethod getXMethod(Method theMethod) + throws AnnotatedElementException; + + public XMethod getXMethod(Class theClass, Method theMethod) + throws AnnotatedElementException; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NClass.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NClass.java new file mode 100644 index 000000000..98e50caa8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NClass.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "class") +@XmlType(name = "classType") +@XmlSeeAlso( { NField.class, NConstructor.class, NMethod.class }) +public class NClass { + @XmlAttribute + public String name; + @XmlAnyElement(lax = true) + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NConstructor.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NConstructor.java new file mode 100644 index 000000000..d0250079f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NConstructor.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "constructor") +@XmlType(name = "constructorType") +@XmlSeeAlso( { NParameter.class }) +public class NConstructor { + @XmlAttribute + public String arguments; + @XmlAnyElement(lax = true) + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NField.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NField.java new file mode 100644 index 000000000..e103f1380 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NField.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.w3c.dom.Element; + +@XmlRootElement(name = "field") +@XmlType(name = "fieldType") +public class NField { + @XmlAttribute + public String name; + @XmlAnyElement + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NMethod.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NMethod.java new file mode 100644 index 000000000..1de41ddee --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NMethod.java @@ -0,0 +1,22 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "method") +@XmlType(name = "methodType") +@XmlSeeAlso( { NParameter.class }) +public class NMethod { + @XmlAttribute + public String name; + @XmlAttribute + public String arguments; + @XmlAnyElement(lax = true) + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NPackage.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NPackage.java new file mode 100644 index 000000000..9bfedc872 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NPackage.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + +@XmlRootElement(name = "package") +@XmlType(name = "packageType") +@XmlSeeAlso( { NClass.class }) +public class NPackage { + @XmlAttribute + public String name; + @XmlAnyElement(lax = true) + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParameter.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParameter.java new file mode 100644 index 000000000..8d4748314 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParameter.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.reader.resourced; + +import java.util.List; + +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + +import org.w3c.dom.Element; + +@XmlRootElement(name = "parameter") +@XmlType(name = "parameterType") +public class NParameter { + @XmlAttribute + public int index; + @XmlAnyElement + public List content; + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParser.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParser.java new file mode 100644 index 000000000..71f75913a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NParser.java @@ -0,0 +1,56 @@ +package org.jvnet.annox.reader.resourced; + +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.io.NestedIOException; + +public class NParser { + + private final JAXBContext context; + + public NParser(JAXBContext context) { + Validate.notNull(context); + this.context = context; + } + + public NParser() { + try { + this.context = JAXBContext.newInstance(NPackage.class); + } catch (JAXBException jaxbex) { + throw new ExceptionInInitializerError(jaxbex); + } + } + + public JAXBContext getContext() { + return context; + } + + public NPackage parseNPackage(InputStream is) throws IOException { + Validate.notNull(is); + try { + final Object result = getContext().createUnmarshaller().unmarshal( + is); + return (NPackage) result; + } catch (JAXBException jaxbex) { + throw new NestedIOException(jaxbex); + } + + } + + public NClass parseNClass(InputStream is) throws IOException { + Validate.notNull(is); + try { + final Object result = getContext().createUnmarshaller().unmarshal( + is); + return (NClass) result; + } catch (JAXBException jaxbex) { + throw new NestedIOException(jaxbex); + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NXConverter.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NXConverter.java new file mode 100644 index 000000000..1b62302b1 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/NXConverter.java @@ -0,0 +1,260 @@ +package org.jvnet.annox.reader.resourced; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.XClass; +import org.jvnet.annox.model.XConstructor; +import org.jvnet.annox.model.XField; +import org.jvnet.annox.model.XMethod; +import org.jvnet.annox.model.XPackage; +import org.jvnet.annox.model.XParameter; +import org.jvnet.annox.parser.XAnnotationParser; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.util.ClassUtils; +import org.jvnet.annox.util.ReflectionUtils; +import org.w3c.dom.Element; + +public class NXConverter { + + private final XAnnotationParser xannotationParser; + + private final ClassLoader classLoader; + + public NXConverter() { + this(XAnnotationParser.INSTANCE, Thread.currentThread() + .getContextClassLoader()); + } + + public NXConverter(XAnnotationParser xannotationParser, + ClassLoader classLoader) { + this.xannotationParser = xannotationParser; + if (classLoader != null) { + this.classLoader = classLoader; + } else { + final ClassLoader contextClassLoader = Thread.currentThread() + .getContextClassLoader(); + if (contextClassLoader != null) { + this.classLoader = contextClassLoader; + } else { + this.classLoader = NXConverter.class.getClassLoader(); + } + } + } + + protected XAnnotationParser getXAnnotationParser() { + return this.xannotationParser; + } + + protected ClassLoader getClassLoader() { + return this.classLoader; + } + + public XPackage convertNPackage(Package thePackage, NPackage npackage) + throws ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + final List classes = new LinkedList(); + List annotationElements = null; + if (npackage.content != null) { + for (Object item : npackage.content) { + if (item instanceof Element) { + if (annotationElements == null) { + annotationElements = new LinkedList(); + } + annotationElements.add((Element) item); + } else if (item instanceof NClass) { + final NClass nclass = (NClass) item; + final Class theClass = getClass(thePackage, nclass.name); + classes.add(convertNClass(theClass, nclass)); + } + } + } + final XAnnotation[] xannotations = parseAnnotations(annotationElements); + final XClass[] xclasses = classes.toArray(new XClass[classes.size()]); + return new XPackage(thePackage, xannotations, xclasses); + } + + public XClass convertNClass(Class theClass, NClass nclass) + throws ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + + List content = null; + final List xfields = new LinkedList(); + final List xconstructors = new LinkedList(); + final List xmethods = new LinkedList(); + if (nclass.content != null) { + for (Object item : nclass.content) { + if (item instanceof Element) { + if (content == null) { + content = new LinkedList(); + } + content.add((Element) item); + } else if (item instanceof NField) { + xfields.add(convertNField(theClass, (NField) item)); + } else if (item instanceof NConstructor) { + xconstructors.add(convertNConstructor(theClass, + (NConstructor) item)); + } else if (item instanceof NMethod) { + xmethods.add(convertNMethod(theClass, (NMethod) item)); + } + } + } + final XAnnotation[] annotations = parseAnnotations(content); + final XField[] fields = xfields.toArray(new XField[xfields.size()]); + final XConstructor[] constructors = xconstructors + .toArray(new XConstructor[xconstructors.size()]); + final XMethod[] methods = xmethods + .toArray(new XMethod[xmethods.size()]); + return new XClass(theClass, annotations, fields, constructors, methods); + } + + public XField convertNField(Class theClass, NField nfield) + throws NoSuchFieldException, AnnotationElementParseException { + // TODO check nfield + final Field field = getField(theClass, nfield.name); + final XAnnotation[] annotations = parseAnnotations(nfield.content); + return new XField(field, annotations); + } + + public XConstructor convertNConstructor(Class theClass, + NConstructor nconstructor) throws ClassNotFoundException, + NoSuchMethodException, + + AnnotationElementParseException { + // TODO check nconstructor + final Constructor theConstructor = getConstructor(theClass, + parseArguments(nconstructor.arguments)); + + List elements = null; + List nparameters = null; + if (nconstructor.content != null) { + for (Object item : nconstructor.content) { + if (item instanceof Element) { + if (elements == null) { + elements = new LinkedList(); + } + elements.add((Element) item); + } else if (item instanceof NParameter) { + if (nparameters == null) { + nparameters = new LinkedList(); + } + nparameters.add((NParameter) item); + } else { + // TODO + } + } + } + + final XAnnotation[] xannotations = parseAnnotations(elements); + final XParameter[] xparameters = convertNParameters(theConstructor + .getParameterTypes(), nparameters); + return new XConstructor(theConstructor, xannotations, xparameters); + } + + public XMethod convertNMethod(Class theClass, NMethod nmethod) + throws ClassNotFoundException, NoSuchMethodException, + AnnotationElementParseException { + // Check nmethod + final Method method = getMethod(theClass, nmethod.name, + parseArguments(nmethod.arguments)); + + List elements = null; + List nparameters = null; + if (nmethod.content != null) { + for (Object item : nmethod.content) { + if (item instanceof Element) { + if (elements == null) { + elements = new LinkedList(); + } + elements.add((Element) item); + } else if (item instanceof NParameter) { + if (nparameters == null) { + nparameters = new LinkedList(); + } + nparameters.add((NParameter) item); + } else { + // TODO + } + } + } + + final XAnnotation[] xannotations = parseAnnotations(elements); + final XParameter[] xparameters = convertNParameters(method + .getParameterTypes(), nparameters); + return new XMethod(method, xannotations, xparameters); + } + + public XParameter[] convertNParameters(Class[] parameterTypes, + List nparameters) + throws AnnotationElementParseException { + final NParameter[] nparametersArray = new NParameter[parameterTypes.length]; + if (nparameters != null) { + for (NParameter nparameter : nparameters) { + // TODO + nparametersArray[nparameter.index] = nparameter; + } + } + + final XParameter[] xparameters = new XParameter[parameterTypes.length]; + + for (int index = 0; index < parameterTypes.length; index++) { + final Class parameterType = parameterTypes[index]; + final NParameter nparameter = nparametersArray[index]; + xparameters[index] = convertNParameter(parameterType, nparameter); + } + return xparameters; + } + + public XParameter convertNParameter(Class parameterType, + NParameter nparameter) throws AnnotationElementParseException { + Validate.notNull(parameterType); + final XAnnotation[] annotations = nparameter == null ? XAnnotation.EMPTY_ARRAY + : parseAnnotations(nparameter.content); + return new XParameter(parameterType, annotations); + } + + protected Class getClass(Package thePackage, String name) + throws ClassNotFoundException { + final String className = thePackage.getName() + "." + name; + return ClassUtils.forName(className, true, getClassLoader()); + } + + protected Field getField(Class theClass, String name) + throws NoSuchFieldException { + return ReflectionUtils.getField(theClass, name); + + } + + protected Constructor getConstructor(Class theClass, + Class[] arguments) throws NoSuchMethodException { + return ReflectionUtils.getConstructor(theClass, arguments); + } + + protected Method getMethod(Class theClass, String name, + Class[] arguments) throws NoSuchMethodException { + return ReflectionUtils.getMethod(theClass, name, arguments); + } + + protected XAnnotation[] parseAnnotations(List elements) + throws AnnotationElementParseException { + if (elements == null || elements.isEmpty()) { + return XAnnotation.EMPTY_ARRAY; + } else { + final Element[] annotationElements = elements + .toArray(new Element[elements.size()]); + return getXAnnotationParser().parse(annotationElements); + + } + } + + protected Class[] parseArguments(String arguments) + throws ClassNotFoundException { + return ClassUtils.forNames(arguments, true, getClassLoader()); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/ResourcedXReader.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/ResourcedXReader.java new file mode 100644 index 000000000..85851c8a8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/ResourcedXReader.java @@ -0,0 +1,333 @@ +package org.jvnet.annox.reader.resourced; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.WeakHashMap; + +import javax.xml.bind.JAXBContext; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.model.XClass; +import org.jvnet.annox.model.XConstructor; +import org.jvnet.annox.model.XField; +import org.jvnet.annox.model.XMethod; +import org.jvnet.annox.model.XPackage; +import org.jvnet.annox.parser.XAnnotationParser; +import org.jvnet.annox.parser.exception.AnnotationElementParseException; +import org.jvnet.annox.reader.XReader; +import org.jvnet.annox.reflect.AnnotatedElementException; + +public class ResourcedXReader implements XReader { + + private final NParser nparser; + + private final NXConverter nxconverter; + + private final ClassLoader classLoader; + + private Map packages = new WeakHashMap(); + + private Map, XClass> classes = new WeakHashMap, XClass>(); + + private Map, XClass> packageClasses = new WeakHashMap, XClass>(); + + @SuppressWarnings("unused") + private Map fields = new WeakHashMap(); + + @SuppressWarnings("unused") + private Map, XConstructor> constructors = new WeakHashMap, XConstructor>(); + + @SuppressWarnings("unused") + private Map methods = new WeakHashMap(); + + public ResourcedXReader() { + this.nparser = new NParser(); + final ClassLoader contextClassLoader = Thread.currentThread() + .getContextClassLoader(); + if (contextClassLoader != null) { + this.classLoader = contextClassLoader; + } else { + this.classLoader = NXConverter.class.getClassLoader(); + } + this.nxconverter = new NXConverter(XAnnotationParser.INSTANCE, + this.classLoader); + } + + public ResourcedXReader(final ClassLoader classLoader) { + Validate.notNull(classLoader); + this.nparser = new NParser(); + this.classLoader = classLoader; + this.nxconverter = new NXConverter(new XAnnotationParser( + this.classLoader), this.classLoader); + } + + public ResourcedXReader(final ClassLoader classLoader, + final JAXBContext context, final XAnnotationParser xannotationParser) { + Validate.notNull(classLoader); + Validate.notNull(context); + Validate.notNull(xannotationParser); + this.classLoader = classLoader; + this.nparser = new NParser(context); + this.nxconverter = new NXConverter(xannotationParser, classLoader); + } + + public ResourcedXReader(final ClassLoader classLoader, + final NParser nparser, NXConverter nxconverter) { + Validate.notNull(classLoader); + Validate.notNull(nparser); + Validate.notNull(nxconverter); + this.classLoader = classLoader; + this.nparser = nparser; + this.nxconverter = nxconverter; + } + + protected ClassLoader getClassLoader() { + return classLoader; + } + + protected NParser getNParser() { + return nparser; + } + + protected NXConverter getNXConverter() { + return nxconverter; + } + + public XPackage getXPackage(Package thePackage) + throws AnnotatedElementException { + // Check cache + final XPackage one = packages.get(thePackage); + // If something is found in the cache + if (one != null) { + // VOID signals that package could not be found + if (one == XPackage.VOID) { + return null; + } else { + return one; + } + } else { + final String resourceName = getResourceName(thePackage); + final InputStream is = getClassLoader().getResourceAsStream( + resourceName); + if (is == null) { + // If package could not be found, put a VOID marker + packages.put(thePackage, XPackage.VOID); + return null; + } else { + try { + return loadXPackage(thePackage, is); + } catch (IOException ex) { + throw new AnnotatedElementException(thePackage, ex); + } catch (ClassNotFoundException ex) { + throw new AnnotatedElementException(thePackage, ex); + } catch (NoSuchFieldException ex) { + throw new AnnotatedElementException(thePackage, ex); + } catch (NoSuchMethodException ex) { + throw new AnnotatedElementException(thePackage, ex); + } catch (AnnotationElementParseException ex) { + throw new AnnotatedElementException(thePackage, ex); + } + } + } + } + + public XClass getXClass(Class theClass) throws AnnotatedElementException { + Validate.notNull(theClass); + // Check direct class cache + final XClass one = classes.get(theClass); + if (one != null && one != XClass.VOID) { + return one; + } else { + // One is null or VOID + // Check package class cache + final XClass two = packageClasses.get(theClass); + if (two != null) { + // VOID signals that class was not found + if (two == XClass.VOID) { + return null; + } else { + return two; + } + } else { + final String resourceName = getResourceName(theClass); + + final InputStream is = getClassLoader().getResourceAsStream( + resourceName); + if (is == null) { + // Put a VOID as a sign that class resource is not found + classes.put(theClass, XClass.VOID); + // Check package + final Package thePackage = theClass.getPackage(); + final XPackage xpackage = getXPackage(thePackage); + // If the class could not be found in the package, put VOID + // marker + if (xpackage == null) { + packageClasses.put(theClass, XClass.VOID); + return null; + } else { + for (XClass xclass : xpackage.getClasses()) { + if (xclass.getTargetClass().equals(theClass)) { + return xclass; + } + } + // The class could not have been found in the package + packageClasses.put(theClass, XClass.VOID); + return null; + } + } else { + try { + return loadXClass(theClass, is); + } catch (IOException ex) { + throw new AnnotatedElementException(theClass, ex); + } catch (ClassNotFoundException ex) { + throw new AnnotatedElementException(theClass, ex); + } catch (NoSuchFieldException ex) { + throw new AnnotatedElementException(theClass, ex); + } catch (NoSuchMethodException ex) { + throw new AnnotatedElementException(theClass, ex); + } catch (AnnotationElementParseException ex) { + throw new AnnotatedElementException(theClass, ex); + } + } + } + } + } + + public XField getXField(Field theField) throws AnnotatedElementException { + Validate.notNull(theField); + return getXField(theField.getDeclaringClass(), theField); + } + + public XField getXField(Class theClass, Field theField) + throws AnnotatedElementException { + Validate.notNull(theClass); + Validate.notNull(theField); + final XClass xclass = getXClass(theClass); + if (xclass == null) { + return null; + } else { + for (XField field : xclass.getFields()) { + if (theField.equals(field.getField())) { + return field; + } + } + return null; + } + } + + public XConstructor getXConstructor(Constructor theConstructor) + throws AnnotatedElementException { + Validate.notNull(theConstructor); + return getXConstructor(theConstructor.getDeclaringClass(), + theConstructor); + } + + public XConstructor getXConstructor(Class theClass, + Constructor theConstructor) throws AnnotatedElementException { + Validate.notNull(theClass); + Validate.notNull(theConstructor); + final XClass xclass = getXClass(theClass); + if (xclass == null) { + return null; + } else { + for (XConstructor constructor : xclass.getConstructors()) { + if (theConstructor.equals(constructor.getConstructor())) { + return constructor; + } + } + return null; + } + } + + public XMethod getXMethod(Method theMethod) + throws AnnotatedElementException { + Validate.notNull(theMethod); + return getXMethod(theMethod.getDeclaringClass(), theMethod); + + } + + public XMethod getXMethod(Class theClass, Method theMethod) + throws AnnotatedElementException { + Validate.notNull(theClass); + Validate.notNull(theMethod); + final XClass xclass = getXClass(theClass); + if (xclass == null) { + return null; + } else { + for (XMethod method : xclass.getMethods()) { + if (theMethod.equals(method.getMethod())) { + return method; + } + } + return null; + } + } + + protected XPackage loadXPackage(Package thePackage, final InputStream is) + throws IOException, ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + try { + final XPackage xpackage = parseXPackage(thePackage, is); + packages.put(thePackage, xpackage); + for (XClass xclass : xpackage.getClasses()) { + packageClasses.put(xclass.getTargetClass(), xclass); + } + return xpackage; + } finally { + try { + is.close(); + } catch (IOException ignored) { + } + } + } + + protected XClass loadXClass(Class theClass, final InputStream is) + throws IOException, ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + try { + final XClass xclass = parseXClass(theClass, is); + classes.put(theClass, xclass); + return xclass; + } finally { + try { + is.close(); + } catch (IOException ignored) { + + } + } + } + + protected XPackage parseXPackage(Package thePackage, final InputStream is) + throws IOException, ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + final NPackage npackage = getNParser().parseNPackage(is); + final XPackage xpackage = getNXConverter().convertNPackage(thePackage, + npackage); + return xpackage; + } + + protected XClass parseXClass(Class theClass, final InputStream is) + throws IOException, ClassNotFoundException, NoSuchFieldException, + NoSuchMethodException, AnnotationElementParseException { + final NClass nclass = getNParser().parseNClass(is); + final XClass xclass = getNXConverter().convertNClass(theClass, nclass); + return xclass; + } + + protected String getResourceName(Package thePackage) { + final String resourceName = (thePackage == null ? "" : thePackage + .getName().replace('.', '/') + '/') + "package-info.ann.xml"; + return resourceName; + } + + protected String getResourceName(Class theClass) { + final String resourceName = theClass.getName().replace('.', '/') + + ".ann.xml"; + return resourceName; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/package-info.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/package-info.java new file mode 100644 index 000000000..e140a686f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reader/resourced/package-info.java @@ -0,0 +1,3 @@ +@javax.xml.bind.annotation.XmlSchema(namespace = "http://annox.dev.java.net", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED) +@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD) +package org.jvnet.annox.reader.resourced; \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementException.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementException.java new file mode 100644 index 000000000..3be4a5f5e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementException.java @@ -0,0 +1,21 @@ +package org.jvnet.annox.reflect; + +import java.lang.reflect.AnnotatedElement; + +public class AnnotatedElementException extends Exception { + + private static final long serialVersionUID = 1L; + + private AnnotatedElement annotatedElement; + + public AnnotatedElementException(AnnotatedElement annotatedElement, + Throwable cause) { + super(cause); + this.annotatedElement = annotatedElement; + } + + public AnnotatedElement getAnnotatedElement() { + return annotatedElement; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementFactory.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementFactory.java new file mode 100644 index 000000000..32562bcf8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/AnnotatedElementFactory.java @@ -0,0 +1,17 @@ +package org.jvnet.annox.reflect; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public interface AnnotatedElementFactory { + + public AnnotatedElement getAnnotatedElement( + AnnotatedElement annotatedElement) throws AnnotatedElementException; + + public ParameterizedAnnotatedElement getAnnotatedElement(Method method) + throws AnnotatedElementException; + + public ParameterizedAnnotatedElement getAnnotatedElement( + Constructor constructor) throws AnnotatedElementException; +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ConstructorAnnotatedElement.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ConstructorAnnotatedElement.java new file mode 100644 index 000000000..b8546bd4e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ConstructorAnnotatedElement.java @@ -0,0 +1,38 @@ +/** + * + */ +package org.jvnet.annox.reflect; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; + +public final class ConstructorAnnotatedElement implements + ParameterizedAnnotatedElement { + private final Constructor constructor; + + public ConstructorAnnotatedElement(Constructor constructor) { + this.constructor = constructor; + } + + public T getAnnotation(Class annotationClass) { + final T annotation = constructor. getAnnotation(annotationClass); + return annotation; + } + + public Annotation[] getAnnotations() { + return constructor.getAnnotations(); + } + + public Annotation[] getDeclaredAnnotations() { + return constructor.getDeclaredAnnotations(); + } + + public Annotation[][] getParameterAnnotations() { + return constructor.getParameterAnnotations(); + } + + public boolean isAnnotationPresent( + Class annotationClass) { + return constructor.isAnnotationPresent(annotationClass); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DirectAnnotatedElementFactory.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DirectAnnotatedElementFactory.java new file mode 100644 index 000000000..da1e40bb7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DirectAnnotatedElementFactory.java @@ -0,0 +1,30 @@ +package org.jvnet.annox.reflect; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class DirectAnnotatedElementFactory implements AnnotatedElementFactory { + + public static DirectAnnotatedElementFactory INSTANCE = new DirectAnnotatedElementFactory(); + + public static DirectAnnotatedElementFactory getInstance() { + return INSTANCE; + } + + public AnnotatedElement getAnnotatedElement( + AnnotatedElement annotatedElement) throws AnnotatedElementException { + return annotatedElement; + } + + public ParameterizedAnnotatedElement getAnnotatedElement(final Method method) + throws AnnotatedElementException { + return new MethodAnnotatedElement(method); + } + + public ParameterizedAnnotatedElement getAnnotatedElement( + @SuppressWarnings("rawtypes") final Constructor constructor) throws AnnotatedElementException { + return new ConstructorAnnotatedElement(constructor); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DualAnnotatedElementFactory.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DualAnnotatedElementFactory.java new file mode 100644 index 000000000..d75e822bc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/DualAnnotatedElementFactory.java @@ -0,0 +1,57 @@ +package org.jvnet.annox.reflect; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class DualAnnotatedElementFactory implements AnnotatedElementFactory { + + private AnnotatedElementFactory primary; + + private AnnotatedElementFactory secondary; + + public DualAnnotatedElementFactory(AnnotatedElementFactory primary, + AnnotatedElementFactory secondary) { + super(); + this.primary = primary; + this.secondary = secondary; + } + + public DualAnnotatedElementFactory() { + this(new ResourcedAnnotatedElementFactory(), + new DirectAnnotatedElementFactory()); + } + + public AnnotatedElement getAnnotatedElement( + AnnotatedElement annotatedElement) throws AnnotatedElementException { + final AnnotatedElement primaryAnnotatedElement = primary + .getAnnotatedElement(annotatedElement); + if (primaryAnnotatedElement != null) { + return primaryAnnotatedElement; + } else { + return secondary.getAnnotatedElement(annotatedElement); + } + } + + public ParameterizedAnnotatedElement getAnnotatedElement( + @SuppressWarnings("rawtypes") Constructor annotatedElement) throws AnnotatedElementException { + final ParameterizedAnnotatedElement primaryAnnotatedElement = primary + .getAnnotatedElement(annotatedElement); + if (primaryAnnotatedElement != null) { + return primaryAnnotatedElement; + } else { + return secondary.getAnnotatedElement(annotatedElement); + } + } + + public ParameterizedAnnotatedElement getAnnotatedElement( + Method annotatedElement) throws AnnotatedElementException { + final ParameterizedAnnotatedElement primaryAnnotatedElement = primary + .getAnnotatedElement(annotatedElement); + if (primaryAnnotatedElement != null) { + return primaryAnnotatedElement; + } else { + return secondary.getAnnotatedElement(annotatedElement); + } + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/MethodAnnotatedElement.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/MethodAnnotatedElement.java new file mode 100644 index 000000000..2440fef0a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/MethodAnnotatedElement.java @@ -0,0 +1,37 @@ +/** + * + */ +package org.jvnet.annox.reflect; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +public final class MethodAnnotatedElement implements + ParameterizedAnnotatedElement { + private final Method method; + + public MethodAnnotatedElement(Method method) { + this.method = method; + } + + public T getAnnotation(Class annotationClass) { + return method. getAnnotation(annotationClass); + } + + public Annotation[] getAnnotations() { + return method.getAnnotations(); + } + + public Annotation[] getDeclaredAnnotations() { + return method.getDeclaredAnnotations(); + } + + public Annotation[][] getParameterAnnotations() { + return method.getParameterAnnotations(); + } + + public boolean isAnnotationPresent( + Class annotationClass) { + return method.isAnnotationPresent(annotationClass); + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ParameterizedAnnotatedElement.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ParameterizedAnnotatedElement.java new file mode 100644 index 000000000..9544187e0 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ParameterizedAnnotatedElement.java @@ -0,0 +1,23 @@ +package org.jvnet.annox.reflect; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; + +public interface ParameterizedAnnotatedElement extends AnnotatedElement { + + /** + * Returns an array of arrays that represent the annotations on the formal + * parameters, in declaration order, of the method represented by this + * parameterized annotated element. (Returns an array of length zero if the + * underlying element is parameterless. If the method has one or more + * parameters, a nested array of length zero is returned for each parameter + * with no annotations.) The caller of this method is free to modify the + * returned arrays; it will have no effect on the arrays returned to other + * callers. + * + * @return an array of arrays that represent the annotations on the formal + * parameters, in declaration order. + */ + public Annotation[][] getParameterAnnotations(); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ResourcedAnnotatedElementFactory.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ResourcedAnnotatedElementFactory.java new file mode 100644 index 000000000..ccb5c5835 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/reflect/ResourcedAnnotatedElementFactory.java @@ -0,0 +1,63 @@ +package org.jvnet.annox.reflect; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.commons.lang3.Validate; +import org.jvnet.annox.reader.XReader; +import org.jvnet.annox.reader.resourced.ResourcedXReader; + +public class ResourcedAnnotatedElementFactory implements + AnnotatedElementFactory { + + private final XReader xreader; + + public ResourcedAnnotatedElementFactory(XReader xreader) { + Validate.notNull(xreader); + this.xreader = xreader; + } + + public ResourcedAnnotatedElementFactory() { + this(new ResourcedXReader()); + } + + public XReader getXReader() { + return xreader; + } + + public AnnotatedElement getAnnotatedElement( + AnnotatedElement annotatedElement) throws AnnotatedElementException { + Validate.notNull(annotatedElement); + if (annotatedElement instanceof Package) { + return getXReader().getXPackage((Package) annotatedElement); + } else if (annotatedElement instanceof Class) { + return getXReader().getXClass((Class) annotatedElement); + } else if (annotatedElement instanceof Field) { + return getXReader().getXField((Field) annotatedElement); + } + + else if (annotatedElement instanceof Constructor) { + return getXReader().getXConstructor( + (Constructor) annotatedElement); + } else if (annotatedElement instanceof Method) { + return getXReader().getXMethod((Method) annotatedElement); + } else { + throw new AssertionError("Unexpected annotated element [" + + annotatedElement + "]"); + } + } + + public ParameterizedAnnotatedElement getAnnotatedElement( + @SuppressWarnings("rawtypes") Constructor constructor) throws AnnotatedElementException { + Validate.notNull(constructor); + return getXReader().getXConstructor(constructor); + } + + public ParameterizedAnnotatedElement getAnnotatedElement(Method method) + throws AnnotatedElementException { + Validate.notNull(method); + return getXReader().getXMethod(method); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/AnnotationElementUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/AnnotationElementUtils.java new file mode 100644 index 000000000..10afc7616 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/AnnotationElementUtils.java @@ -0,0 +1,138 @@ +package org.jvnet.annox.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.jvnet.annox.Constants; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class AnnotationElementUtils { + + private AnnotationElementUtils() { + } + + public static String getFieldValue(final Element annotationElement, + final String name) { + String value = null; + + final String attribute = annotationElement.getAttribute(name); + if (!StringUtils.isEmpty(attribute)) { + value = attribute; + } + + final NodeList nodes = annotationElement.getChildNodes(); + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (isFieldContainerElement(node, name)) { + value = ((Element) node).getTextContent(); + } + } + if ("value".equals(name) && value == null) { + value = annotationElement.getTextContent(); + } + return value; + } + + private static boolean isFieldContainerElement(Node node, String name) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + final Element element = (Element) node; + if (name.equals(element.getLocalName()) + || name.equals(element.getAttributeNS( + Constants.NAMESPACE_URI, "field"))) { + return true; + } + } + return false; + } + + public static Element getFieldElement(final Element annotationElement, + final String name) { + Element value = null; + final NodeList nodes = annotationElement.getChildNodes(); + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (isFieldContainerElement(node, name)) { + final Element element = (Element) node; + final NodeList subelements = element.getChildNodes(); + for (int jndex = 0; jndex < subelements.getLength(); jndex++) { + final Node subnode = subelements.item(jndex); + if (subnode.getNodeType() == Node.ELEMENT_NODE) { + value = (Element) subnode; + } + } + } + } + if ("value".equals(name) && value == null) { + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (node.getNodeType() == Node.ELEMENT_NODE) { + value = (Element) node; + } + } + } + return value; + } + + public static String[] getFieldValues(final Element annotationElement, + final String name) { + final List values = new ArrayList(); + final String attribute = annotationElement.getAttribute(name); + if (!StringUtils.isEmpty(attribute)) { + final String[] entries = StringUtils.split(attribute.trim(), ' '); + values.addAll(Arrays.asList(entries)); + } + + final NodeList nodes = annotationElement.getChildNodes(); + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (isFieldContainerElement(node, name)) { + final Element element = (Element) node; + final String entry = element.getTextContent(); + values.add(entry); + } + } + + if ("value".equals(name) && values.isEmpty()) { + final String text = annotationElement.getTextContent(); + if (!StringUtils.isEmpty(text)) { + final String[] entries = StringUtils.split(text.trim(), ' '); + values.addAll(Arrays.asList(entries)); + } + } + return values.isEmpty() ? new String[0] : values + .toArray(new String[values.size()]); + } + + public static Element[] getFieldElements(final Element annotationElement, + final String name) { + final List values = new ArrayList(); + final NodeList nodes = annotationElement.getChildNodes(); + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (isFieldContainerElement(node, name)) { + final Element element = (Element) node; + final NodeList subelements = element.getChildNodes(); + for (int jndex = 0; jndex < subelements.getLength(); jndex++) { + final Node subnode = subelements.item(jndex); + if (subnode.getNodeType() == Node.ELEMENT_NODE) { + values.add((Element) subnode); + } + } + } + } + if ("value".equals(name) && values.isEmpty()) { + for (int index = 0; index < nodes.getLength(); index++) { + final Node node = nodes.item(index); + if (node.getNodeType() == Node.ELEMENT_NODE) { + values.add((Element) node); + } + } + } + return values.isEmpty() ? new Element[0] : values + .toArray(new Element[values.size()]); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ArrayUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ArrayUtils.java new file mode 100644 index 000000000..53af80708 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ArrayUtils.java @@ -0,0 +1,87 @@ +package org.jvnet.annox.util; + +import org.apache.commons.lang3.Validate; + +public class ArrayUtils { + + @SuppressWarnings("unchecked") + public static T asPrimitiveArray(Object array) { + if (array == null) { + return null; + } + final Class arrayClass = array.getClass(); + Validate.isTrue(arrayClass.isArray(), "Argument must be an array."); + final Class componentType = arrayClass.getComponentType(); + if (componentType.isPrimitive()) { + return (T) array; + } else if (Boolean.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Boolean[]) array); + } else if (Byte.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Byte[]) array); + } else if (Character.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Character[]) array); + } else if (Short.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Short[]) array); + } else if (Integer.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Integer[]) array); + } else if (Long.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Long[]) array); + } else if (Double.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Double[]) array); + } else if (Float.class.equals(componentType)) { + return (T) org.apache.commons.lang3.ArrayUtils + .toPrimitive((Float[]) array); + } else { + return (T) array; + } + } + + @SuppressWarnings("unchecked") + public static T[] asObjectArray(Object array) { + if (array == null) { + return null; + } + final Class arrayClass = array.getClass(); + Validate.isTrue(arrayClass.isArray(), "Argument must be an array."); + final Class componentType = arrayClass.getComponentType(); + if (!componentType.isPrimitive()) { + return (T[]) array; + } + if (Boolean.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((boolean[]) array); + } else if (Byte.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((byte[]) array); + } else if (Character.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((char[]) array); + } else if (Short.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((short[]) array); + } else if (Integer.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((int[]) array); + } else if (Long.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((long[]) array); + } else if (Double.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((double[]) array); + } else if (Float.TYPE.equals(componentType)) { + return (T[]) org.apache.commons.lang3.ArrayUtils + .toObject((float[]) array); + } else { + throw new AssertionError("Unexpected primitive type [" + + componentType + "]."); + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ClassUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ClassUtils.java new file mode 100644 index 000000000..a1f622cd9 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ClassUtils.java @@ -0,0 +1,154 @@ +package org.jvnet.annox.util; + +import java.lang.reflect.Array; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; + +public class ClassUtils { + + private static Map, Class> primitiveWrapperMap = new HashMap, Class>(); + static { + primitiveWrapperMap.put(Boolean.TYPE, Boolean.class); + primitiveWrapperMap.put(Byte.TYPE, Byte.class); + primitiveWrapperMap.put(Character.TYPE, Character.class); + primitiveWrapperMap.put(Short.TYPE, Short.class); + primitiveWrapperMap.put(Integer.TYPE, Integer.class); + primitiveWrapperMap.put(Long.TYPE, Long.class); + primitiveWrapperMap.put(Double.TYPE, Double.class); + primitiveWrapperMap.put(Float.TYPE, Float.class); + } + + private static Map, Class> wrapperPrimitiveMap = new HashMap, Class>(); + static { + wrapperPrimitiveMap.put(Boolean.class, Boolean.TYPE); + wrapperPrimitiveMap.put(Byte.class, Byte.TYPE); + wrapperPrimitiveMap.put(Character.class, Character.TYPE); + wrapperPrimitiveMap.put(Short.class, Short.TYPE); + wrapperPrimitiveMap.put(Integer.class, Integer.TYPE); + wrapperPrimitiveMap.put(Long.class, Long.TYPE); + wrapperPrimitiveMap.put(Double.class, Double.TYPE); + wrapperPrimitiveMap.put(Float.class, Float.TYPE); + } + + private static Map> namePrimitiveMap = new HashMap>( + 8); + static { + namePrimitiveMap.put("boolean", Boolean.TYPE); + namePrimitiveMap.put("byte", Byte.TYPE); + namePrimitiveMap.put("char", Character.TYPE); + namePrimitiveMap.put("short", Short.TYPE); + namePrimitiveMap.put("int", Integer.TYPE); + namePrimitiveMap.put("long", Long.TYPE); + namePrimitiveMap.put("double", Double.TYPE); + namePrimitiveMap.put("float", Float.TYPE); + } + + @SuppressWarnings("rawtypes") + public static Class primitiveToWrapper(Class cls) { + Validate.notNull(cls); + if (cls.isPrimitive()) { + return primitiveWrapperMap.get(cls); + } else { + return cls; + } + } + + @SuppressWarnings("rawtypes") + public static Class wrapperToPrimitive(Class cls) { + Validate.notNull(cls); + final Class primitiveClass = wrapperPrimitiveMap.get(cls); + if (primitiveClass != null) { + return primitiveClass; + } else { + return cls; + } + } + + @SuppressWarnings("rawtypes") + public static Class wrapperArrayToPrimitiveArray(Class cls) { + Validate.notNull(cls); + Validate.isTrue(cls.isArray()); + + final Class componentType = cls.getComponentType(); + final Class primitiveComponentType = wrapperToPrimitive(componentType); + + if (primitiveComponentType == componentType) { + return cls; + } else { + Object array = Array.newInstance(primitiveComponentType, 0); + return array.getClass(); + } + } + + @SuppressWarnings("rawtypes") + public static Class nameToPrimitive(String name) { + if (name == null) { + return null; + } else { + return namePrimitiveMap.get(name); + } + } + + public static final String ARRAY_SUFFIX = "[]"; + + public static Class forName(String className) + throws ClassNotFoundException { + return forName(className, true, Thread.currentThread() + .getContextClassLoader()); + } + + public static Class forName(String className, boolean initialize, + ClassLoader loader) throws ClassNotFoundException { + if (className == null) { + return null; + } + if (className.endsWith(ARRAY_SUFFIX)) { + final String componentClassName = className.substring(0, + className.length() - ARRAY_SUFFIX.length()); + return getArrayClass(forName(componentClassName, initialize, loader)); + } + + @SuppressWarnings("rawtypes") + final Class primitiveClass = nameToPrimitive(className); + + if (primitiveClass != null) { + return primitiveClass; + } else { + return Class.forName(className, initialize, loader); + } + } + + public static Class getArrayClass(final Class componentClass) { + final Object componentArray = Array.newInstance(componentClass, 0); + return componentArray.getClass(); + } + + public static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; + + public static Class[] forNames(String names) + throws ClassNotFoundException { + return forNames(names, true, null); + } + + public static Class[] forNames(String names, boolean initialize, + ClassLoader loader) throws ClassNotFoundException { + if (names == null) { + return null; + } + final String n = names.trim(); + + if ("".equals(n)) { + return EMPTY_CLASS_ARRAY; + } + final String[] classNames = StringUtils.split(n, ','); + final Class[] classes = new Class[classNames.length]; + for (int index = 0; index < classNames.length; index++) { + classes[index] = forName(classNames[index].trim(), initialize, + loader); + } + return classes; + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ObjectUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ObjectUtils.java new file mode 100644 index 000000000..01f03dbb8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ObjectUtils.java @@ -0,0 +1,67 @@ +package org.jvnet.annox.util; + +import java.lang.reflect.Array; + +import org.apache.commons.lang3.Validate; + +public class ObjectUtils { + + @SuppressWarnings("unchecked") + public static Object valueOf(Class basicType, String value) + throws ClassNotFoundException, NumberFormatException, + IllegalArgumentException { + if (value == null) { + return null; + } + final Class type = ClassUtils.primitiveToWrapper(basicType); + if (Boolean.class.equals(type)) { + return Boolean.valueOf(value); + } else if (Byte.class.equals(type)) { + return Byte.valueOf(value); + } else if (Character.class.equals(type)) { + Validate.isTrue(value.length() == 1, + "One character string expected."); + return Character.valueOf(value.charAt(0)); + } else if (Short.class.equals(type)) { + return Short.valueOf(value); + } else if (Integer.class.equals(type)) { + return Integer.valueOf(value); + } else if (Long.class.equals(type)) { + return Long.valueOf(value); + } else if (Double.class.equals(type)) { + return Double.valueOf(value); + } else if (Float.class.equals(type)) { + return Float.valueOf(value); + } else if (Enum.class.isAssignableFrom(type)) { + @SuppressWarnings("rawtypes") + final Class enumClass = (Class) type; + return Enum.valueOf(enumClass, value); + } else if (Class.class.equals(type)) { + return Class.forName(value); + } else if (String.class.equals(type)) { + return value; + } else { + throw new IllegalArgumentException("The type [" + basicType + + "] is not recognized."); + } + } + + public static Object[] valueOf(Class basicType, String[] values) + throws ClassNotFoundException, NumberFormatException, + IllegalArgumentException { + if (values == null) { + return null; + } + final Class type = ClassUtils.primitiveToWrapper(basicType); + + final Object[] array = (Object[]) Array + .newInstance(type, values.length); + + for (int index = 0; index < values.length; index++) { + final String value = values[index]; + array[index] = valueOf(type, value); + } + return array; + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ReflectionUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ReflectionUtils.java new file mode 100644 index 000000000..818e8972d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/util/ReflectionUtils.java @@ -0,0 +1,75 @@ +package org.jvnet.annox.util; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.apache.commons.lang3.Validate; + +public class ReflectionUtils { + + public static Constructor getConstructor(Class theClass, + Class[] parameterTypes) throws NoSuchMethodException { + Validate.notNull(theClass); + if (parameterTypes == null) { + try { + return theClass + .getDeclaredConstructor(ClassUtils.EMPTY_CLASS_ARRAY); + } catch (NoSuchMethodException ignored) { + } + Constructor foundMethod = null; + for (final Constructor method : theClass + .getDeclaredConstructors()) { + if (foundMethod == null) { + foundMethod = method; + } else { + throw new NoSuchMethodException("Duplicate constructors [" + + foundMethod + "] and [" + method + "]."); + } + } + if (foundMethod != null) { + return foundMethod; + } else { + throw new NoSuchMethodException(); + } + } else { + return theClass.getDeclaredConstructor(parameterTypes); + } + } + + public static Method getMethod(Class theClass, String methodName, + Class[] parameterTypes) throws NoSuchMethodException { + Validate.notNull(theClass); + Validate.notNull(methodName); + if (parameterTypes == null) { + try { + return theClass.getMethod(methodName, + ClassUtils.EMPTY_CLASS_ARRAY); + } catch (NoSuchMethodException ignored) { + } + Method foundMethod = null; + for (final Method method : theClass.getDeclaredMethods()) { + if (methodName.equals(method.getName())) { + if (foundMethod == null) { + foundMethod = method; + } else { + throw new NoSuchMethodException("Duplicate methods [" + + foundMethod + "] and [" + method + "]."); + } + } + } + if (foundMethod != null) { + return foundMethod; + } else { + throw new NoSuchMethodException(); + } + } else { + return theClass.getDeclaredMethod(methodName, parameterTypes); + } + } + + public static Field getField(Class theClass, String fieldName) + throws NoSuchFieldException { + return theClass.getDeclaredField(fieldName); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/AnnoxAnnotationReader.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/AnnoxAnnotationReader.java new file mode 100644 index 000000000..66aa819b6 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/AnnoxAnnotationReader.java @@ -0,0 +1,225 @@ +package org.jvnet.annox.xml.bind; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; + +import org.jvnet.annox.reflect.AnnotatedElementException; +import org.jvnet.annox.reflect.AnnotatedElementFactory; +import org.jvnet.annox.reflect.DualAnnotatedElementFactory; +import org.jvnet.annox.reflect.MethodAnnotatedElement; +import org.jvnet.annox.reflect.ParameterizedAnnotatedElement; + +import com.sun.xml.bind.v2.model.annotation.AbstractInlineAnnotationReaderImpl; +import com.sun.xml.bind.v2.model.annotation.Locatable; +import com.sun.xml.bind.v2.model.annotation.LocatableAnnotation; +import com.sun.xml.bind.v2.model.annotation.RuntimeAnnotationReader; +import com.sun.xml.bind.v2.runtime.IllegalAnnotationException; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class AnnoxAnnotationReader extends + AbstractInlineAnnotationReaderImpl + implements RuntimeAnnotationReader { + + private AnnotatedElementFactory annotatedElementFactory; + + public AnnoxAnnotationReader() { + this(new DualAnnotatedElementFactory()); + } + + public AnnoxAnnotationReader(AnnotatedElementFactory annotatedElementFactory) { + super(); + this.annotatedElementFactory = annotatedElementFactory; + } + + public AnnotatedElementFactory getAnnotatedElementFactory() { + return annotatedElementFactory; + } + + protected AnnotatedElement getAnnotatedElement(Field field) { + try { + return getAnnotatedElementFactory().getAnnotatedElement(field); + } catch (AnnotatedElementException aex) { + getErrorHandler().error( + new IllegalAnnotationException( + "Could not load annotated element exception for field [" + + field.getName() + "].", LocatableUtils + .getLocatable(field))); + return field; + } + } + + protected ParameterizedAnnotatedElement getAnnotatedElement(Method theMethod) { + try { + return getAnnotatedElementFactory().getAnnotatedElement(theMethod); + } catch (AnnotatedElementException aex) { + getErrorHandler().error( + new IllegalAnnotationException( + "Could not load annotated element exception for method [" + + theMethod.getName() + "].", + LocatableUtils.getLocatable(theMethod))); + return new MethodAnnotatedElement(theMethod); + } + } + + protected AnnotatedElement getAnnotatedElement(Class theClass) { + try { + return getAnnotatedElementFactory().getAnnotatedElement(theClass); + } catch (AnnotatedElementException aex) { + getErrorHandler().error( + new IllegalAnnotationException( + "Could not load annotated element exception for class [" + + theClass.getName() + "].", LocatableUtils + .getLocatable(theClass))); + return theClass; + } + } + + protected AnnotatedElement getAnnotatedElement(Package thePackage) { + try { + return getAnnotatedElementFactory().getAnnotatedElement(thePackage); + } catch (AnnotatedElementException aex) { + getErrorHandler().error( + new IllegalAnnotationException( + "Could not load annotated element exception for class [" + + thePackage.getName() + "].", + LocatableUtils.getLocatable(thePackage))); + return thePackage; + } + } + + public A getFieldAnnotation(Class annotation, + Field field, Locatable srcPos) { + final AnnotatedElement annotatedElement = getAnnotatedElement(field); + return LocatableAnnotation.create(annotatedElement + .getAnnotation(annotation), srcPos); + } + + public boolean hasFieldAnnotation( + Class annotationType, Field field) { + final AnnotatedElement annotatedElement = getAnnotatedElement(field); + return annotatedElement.isAnnotationPresent(annotationType); + } + + public boolean hasClassAnnotation(Class clazz, + Class annotationType) { + final AnnotatedElement annotatedElement = getAnnotatedElement(clazz); + return annotatedElement.isAnnotationPresent(annotationType); + } + + public Annotation[] getAllFieldAnnotations(Field field, Locatable srcPos) { + final AnnotatedElement annotatedElement = getAnnotatedElement(field); + Annotation[] r = annotatedElement.getAnnotations(); + for (int i = 0; i < r.length; i++) { + r[i] = LocatableAnnotation.create(r[i], srcPos); + } + return r; + } + + public A getMethodAnnotation(Class annotation, + Method method, Locatable srcPos) { + final AnnotatedElement annotatedElement = getAnnotatedElement(method); + return LocatableAnnotation.create(annotatedElement + .getAnnotation(annotation), srcPos); + } + + public boolean hasMethodAnnotation(Class annotation, + Method method) { + final AnnotatedElement annotatedElement = getAnnotatedElement(method); + return annotatedElement.isAnnotationPresent(annotation); + } + + public Annotation[] getAllMethodAnnotations(Method method, Locatable srcPos) { + final AnnotatedElement annotatedElement = getAnnotatedElement(method); + Annotation[] r = annotatedElement.getAnnotations(); + for (int i = 0; i < r.length; i++) { + r[i] = LocatableAnnotation.create(r[i], srcPos); + } + return r; + } + + public A getMethodParameterAnnotation( + Class annotation, Method method, int paramIndex, Locatable srcPos) { + final ParameterizedAnnotatedElement annotatedElement = getAnnotatedElement(method); + + Annotation[] pa = annotatedElement.getParameterAnnotations()[paramIndex]; + for (Annotation a : pa) { + if (a.annotationType() == annotation) { + final A typedA = (A) a; + return LocatableAnnotation.create(typedA, srcPos); + } + } + return null; + } + + public A getClassAnnotation(Class a, Class clazz, + Locatable srcPos) { + final AnnotatedElement annotatedElement = getAnnotatedElement(clazz); + return LocatableAnnotation.create(annotatedElement.getAnnotation(a), + srcPos); + } + + public Class getClassValue(Annotation a, String name) { + try { + return (Class) a.annotationType().getMethod(name).invoke(a); + } catch (IllegalAccessException e) { + // impossible + throw new IllegalAccessError(e.getMessage()); + } catch (InvocationTargetException e) { + // impossible + throw new InternalError(e.getMessage()); + } catch (NoSuchMethodException e) { + throw new NoSuchMethodError(e.getMessage()); + } + } + + public Class[] getClassArrayValue(Annotation a, String name) { + try { + return (Class[]) a.annotationType().getMethod(name).invoke(a); + } catch (IllegalAccessException e) { + // impossible + throw new IllegalAccessError(e.getMessage()); + } catch (InvocationTargetException e) { + // impossible + throw new InternalError(e.getMessage()); + } catch (NoSuchMethodException e) { + throw new NoSuchMethodError(e.getMessage()); + } + } + + protected String fullName(Method m) { + return m.getDeclaringClass().getName() + '#' + m.getName(); + } + + private final Map, Map> packageCache = new HashMap, Map>(); + + public A getPackageAnnotation(Class a, + Class clazz, Locatable srcPos) { + Package p = clazz.getPackage(); + if (p == null) + return null; + + AnnotatedElement annotatedElement = getAnnotatedElement(p); + + Map cache = packageCache.get(a); + if (cache == null) { + cache = new HashMap(); + packageCache.put(a, cache); + } + + if (cache.containsKey(p)) + return (A) cache.get(p); + else { + A ann = LocatableAnnotation.create(annotatedElement + .getAnnotation(a), srcPos); + cache.put(p, ann); + return ann; + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/LocatableUtils.java b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/LocatableUtils.java new file mode 100644 index 000000000..1cb079a98 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/main/java/org/jvnet/annox/xml/bind/LocatableUtils.java @@ -0,0 +1,73 @@ +package org.jvnet.annox.xml.bind; + +import java.lang.reflect.Member; + +import com.sun.xml.bind.v2.model.annotation.Locatable; +import com.sun.xml.bind.v2.runtime.Location; + +public class LocatableUtils { + + public static Locatable getLocatable(final Package thePackage) { + if (thePackage == null) { + return null; + } else { + return new Locatable() { + public Locatable getUpstream() { + return null; + } + + public Location getLocation() { + return new Location() { + @Override + public String toString() { + return thePackage.getName(); + } + }; + } + }; + } + } + + public static Locatable getLocatable(final Class theClass) { + if (theClass == null) { + return null; + } else { + return new Locatable() { + public Locatable getUpstream() { + return getLocatable(theClass.getPackage()); + } + + public Location getLocation() { + return new Location() { + @Override + public String toString() { + return theClass.getName(); + } + }; + } + }; + } + } + + public static Locatable getLocatable(final Member theMember) { + if (theMember == null) { + return null; + } else { + return new Locatable() { + public Locatable getUpstream() { + return getLocatable(theMember.getDeclaringClass()); + } + + public Location getLocation() { + return new Location() { + @Override + public String toString() { + return theMember.getName(); + } + }; + } + }; + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/Comment.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/Comment.java new file mode 100644 index 000000000..653082f5f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/Comment.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.demos.guide; + +public @interface Comment { + public String lang() default "en"; + public String value(); +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/DemoClass.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/DemoClass.java new file mode 100644 index 000000000..33f9b3583 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/DemoClass.java @@ -0,0 +1,30 @@ +package org.jvnet.annox.demos.guide; + +public class DemoClass { + + public int value = 0; + + public DemoClass() + {} + + public DemoClass(int value) + { this.value = value; } + + public int getValue() + { return this.value; } + + public void setValue() + { this.value = 0; } + + public void setValue(int value) + { this.value = value; } + + public void setValue(String s) + { this.value = Integer.valueOf(s); } + + public void setValue(String s, int radix) + { this.value = Integer.valueOf(s, radix); } + + public int add(int value) + { return this.value += value; } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyAnnotation.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyAnnotation.java new file mode 100644 index 000000000..0a2c59af0 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyAnnotation.java @@ -0,0 +1,12 @@ +package org.jvnet.annox.demos.guide; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.FIELD}) +public @interface MyAnnotation { + String printName() default ""; +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyClass.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyClass.java new file mode 100644 index 000000000..bf429ceb9 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/MyClass.java @@ -0,0 +1,7 @@ +package org.jvnet.annox.demos.guide; + +@MyAnnotation(printName = "My class") +public class MyClass { + @MyAnnotation(printName = "My field") + public String myField; +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/DemoClassTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/DemoClassTest.java new file mode 100644 index 000000000..b68f5b06e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/DemoClassTest.java @@ -0,0 +1,38 @@ +package org.jvnet.annox.demos.guide.tests; + +import java.lang.reflect.AnnotatedElement; + +import junit.framework.TestCase; + +import org.jvnet.annox.demos.guide.Comment; +import org.jvnet.annox.demos.guide.DemoClass; +import org.jvnet.annox.reflect.AnnotatedElementFactory; +import org.jvnet.annox.reflect.DualAnnotatedElementFactory; +import org.jvnet.annox.reflect.ParameterizedAnnotatedElement; + +public class DemoClassTest extends TestCase { + + public void testDemoClassAnnotations() throws Exception { + + final AnnotatedElementFactory aef = new DualAnnotatedElementFactory(); + + final AnnotatedElement demoClass = aef + .getAnnotatedElement(DemoClass.class); + assertNotNull(demoClass.getAnnotation(Comment.class).value()); + + final AnnotatedElement valueField = aef + .getAnnotatedElement(DemoClass.class.getDeclaredField("value")); + assertNotNull(valueField.getAnnotation(Comment.class).value()); + + final AnnotatedElement defaultConstructor = aef + .getAnnotatedElement(DemoClass.class.getConstructor()); + assertNotNull(defaultConstructor.getAnnotation(Comment.class).value()); + + final ParameterizedAnnotatedElement secondConstructor = aef + .getAnnotatedElement(DemoClass.class.getConstructor(int.class)); + assertNotNull(secondConstructor.getAnnotation(Comment.class).value()); + String t = ((Comment)secondConstructor.getParameterAnnotations()[0][0]).value(); + assertNotNull(t); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/MyClassTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/MyClassTest.java new file mode 100644 index 000000000..d3e039b2c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/demos/guide/tests/MyClassTest.java @@ -0,0 +1,37 @@ +package org.jvnet.annox.demos.guide.tests; + +import java.lang.reflect.AnnotatedElement; + +import org.jvnet.annox.demos.guide.MyAnnotation; +import org.jvnet.annox.demos.guide.MyClass; +import org.jvnet.annox.reflect.AnnotatedElementFactory; +import org.jvnet.annox.reflect.DualAnnotatedElementFactory; + +import junit.framework.TestCase; + +public class MyClassTest extends TestCase { + + public void testNormal() throws Exception { + final AnnotatedElement myClass = MyClass.class; + final AnnotatedElement myField = MyClass.class.getDeclaredField("myField"); + final MyAnnotation myClassAnnotation = myClass.getAnnotation(MyAnnotation.class); + final MyAnnotation myFieldAnnotation = myField.getAnnotation(MyAnnotation.class); + + assertEquals("My class", myClassAnnotation.printName()); + assertEquals("My field", myFieldAnnotation.printName()); + } + + public void testAnnox() throws Exception { + + final AnnotatedElementFactory aef = new DualAnnotatedElementFactory(); + + final AnnotatedElement myClass = aef.getAnnotatedElement(MyClass.class); + final AnnotatedElement myField = aef.getAnnotatedElement(MyClass.class.getDeclaredField("myField")); + final MyAnnotation myClassAnnotation = myClass.getAnnotation(MyAnnotation.class); + final MyAnnotation myFieldAnnotation = myField.getAnnotation(MyAnnotation.class); + + assertEquals("My annotated class", myClassAnnotation.printName()); + assertEquals("My annotated field", myFieldAnnotation.printName()); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerField.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerField.java new file mode 100644 index 000000000..78ae56438 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerField.java @@ -0,0 +1,7 @@ +package org.jvnet.annox.model.test; + +public @interface AnnotationWithIntegerField { + int integerField(); + + int[] integerFields(); +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerFieldTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerFieldTest.java new file mode 100644 index 000000000..72f0ad1f3 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/model/test/AnnotationWithIntegerFieldTest.java @@ -0,0 +1,30 @@ +package org.jvnet.annox.model.test; + +import org.junit.Assert; +import org.junit.Test; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.annotation.field.XAnnotationField; +import org.jvnet.annox.parser.XGenericFieldParser; + +public class AnnotationWithIntegerFieldTest { + + @Test + public void test() { + + @SuppressWarnings("unchecked") + final XAnnotationField integerField = XGenericFieldParser.GENERIC + .construct("integerField", Integer.valueOf(42), Integer.class); + + @SuppressWarnings("unchecked") + final XAnnotationField integerFields = XGenericFieldParser.GENERIC + .construct("integerFields", new Integer[] { 37, 73 }, + Integer[].class); + + final XAnnotation annotation = new XAnnotation( + AnnotationWithIntegerField.class, integerField, integerFields); + + AnnotationWithIntegerField result = annotation.getResult(); + Assert.assertEquals(42, result.integerField()); + Assert.assertArrayEquals(new int[] { 37, 73 }, result.integerFields()); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/A.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/A.java new file mode 100644 index 000000000..dbfa330e4 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/A.java @@ -0,0 +1,20 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface A { + long longField(); + int intField(); + short shortField(); + char charField(); + byte byteField(); + double doubleField(); + float floatField(); + boolean booleanField(); + String stringField(); + E enumField(); + Class classField(); + B annotationField(); +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/B.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/B.java new file mode 100644 index 000000000..a1f4c10fd --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/B.java @@ -0,0 +1,35 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface B { + long[] longArrayField(); + + int[] intArrayField(); + + short[] shortArrayField(); + + char[] charArrayField(); + + byte[] byteArrayField(); + + double[] doubleArrayField(); + + float[] floatArrayField(); + + boolean[] booleanArrayField(); + + String[] stringArrayField(); + + E[] enumArrayField(); + + Class[] classArrayField(); + + B.C[] annotationArrayField(); + + @Retention(RetentionPolicy.RUNTIME) + public static @interface C { + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/D.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/D.java new file mode 100644 index 000000000..f15c9fb17 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/D.java @@ -0,0 +1,9 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface D { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/E.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/E.java new file mode 100644 index 000000000..17aecd4cc --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/E.java @@ -0,0 +1,3 @@ +package org.jvnet.annox.parser.tests; + +public enum E {ONE, TWO, THREE, FOUR;} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eight.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eight.java new file mode 100644 index 000000000..1b8a3e33d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eight.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@K( { "k", "kay" }) +public class Eight { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eleven.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eleven.java new file mode 100644 index 000000000..83f1139f1 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Eleven.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@H +public class Eleven { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/F.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/F.java new file mode 100644 index 000000000..3c9fa07d1 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/F.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface F { + String name() default "test"; + String eman(); +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Five.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Five.java new file mode 100644 index 000000000..7ca9da64a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Five.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@F(eman = "tset") +public class Five { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Four.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Four.java new file mode 100644 index 000000000..9df88ed15 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Four.java @@ -0,0 +1,57 @@ +package org.jvnet.annox.parser.tests; + +public class Four { + + private String annotatedProperty; + + public String getAnnotatedProperty() { + return annotatedProperty; + } + + public void setAnnotatedProperty(String annotatedProperty) { + this.annotatedProperty = annotatedProperty; + } + + private int annotatedGetter; + + public int getAnnotatedGetter() { + return annotatedGetter; + } + + public void setAnnotatedGetter(int annotatedGetter) { + this.annotatedGetter = annotatedGetter; + } + + private int annotatedSetter; + + public int getAnnotatedSetter() { + return annotatedSetter; + } + + public void setAnnotatedSetter(int annotatedSetter) { + this.annotatedSetter = annotatedSetter; + } + + public boolean[] annotatedField; + + public void annotatedMethod() { + + } + + public void annotatedMethodWithArguments(int a, java.lang.String b, int[] c) { + + } + + public void annotatedMethodWithArguments(int a, java.lang.String b, + int[] c, java.lang.String[] d) { + + } + + public Four() { + + } + + public Four(int a, java.lang.String b, int[] c, java.lang.String[] d) { + + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/G.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/G.java new file mode 100644 index 000000000..e4ea83953 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/G.java @@ -0,0 +1,13 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface G { + E[] e() default {}; + B[] b() default {}; +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/H.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/H.java new file mode 100644 index 000000000..078a4d492 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/H.java @@ -0,0 +1,34 @@ +/** + * + */ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface H { + long longField() default 1; + + int intField() default 2; + + short shortField() default 3; + + char charField() default 'c'; + + byte byteField() default 5; + + double doubleField() default 6d; + + float floatField() default 7f; + + boolean booleanField() default true; + + String stringField() default "nine"; + + E enumField() default E.ONE; + + Class classField() default String.class; + + G annotationField() default @G(); +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/I.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/I.java new file mode 100644 index 000000000..8fcdab60e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/I.java @@ -0,0 +1,39 @@ +/** + * + */ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface I { + + long[] longArrayField() default { 1, 2 }; + + int[] intArrayField() default { 3, 4 }; + + short[] shortArrayField() default { 5, 6 }; + + char[] charArrayField() default { 'e', 'n' }; + + byte[] byteArrayField() default { 10, 11 }; + + double[] doubleArrayField() default { 12d, 13d }; + + float[] floatArrayField() default { 14f, 15f }; + + boolean[] booleanArrayField() default { true, false }; + + String[] stringArrayField() default { "18", "19" }; + + E[] enumArrayField() default { E.ONE, E.TWO }; + + Class[] classArrayField() default { Object.class, String.class }; + + I.C[] annotationArrayField() default { @C, @C }; + + @Retention(RetentionPolicy.RUNTIME) + public static @interface C { + } +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/J.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/J.java new file mode 100644 index 000000000..de6627d6e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/J.java @@ -0,0 +1,10 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface J { + String value(); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JAXBDemoTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JAXBDemoTest.java new file mode 100644 index 000000000..0640814c8 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JAXBDemoTest.java @@ -0,0 +1,32 @@ +package org.jvnet.annox.parser.tests; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.parser.XAnnotationParser; +import org.jvnet.annox.parser.exception.AnnotationExpressionParseException; +import org.jvnet.annox.parser.exception.AnnotationStringParseException; + +import junit.framework.TestCase; + +public class JAXBDemoTest extends TestCase { + + public void testXMLRootElement() throws AnnotationStringParseException, + AnnotationExpressionParseException { + @SuppressWarnings("unchecked") + + // Parse annotation from the string + XAnnotation xannotation = + (XAnnotation) XAnnotationParser.INSTANCE.parse + ("@javax.xml.bind.annotation.XmlRootElement(name=\"foo\")"); + + // Create an instance of the annotation + XmlRootElement xmlRootElement = xannotation.getResult(); + assertEquals("foo", xmlRootElement.name()); + assertEquals("##default", xmlRootElement.namespace()); + + // Analyze the structure of the annotation + assertEquals(String.class, xannotation.getFieldsMap().get("name").getType()); + assertEquals("##default", xannotation.getFieldsMap().get("namespace").getResult()); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JavaTypeParserTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JavaTypeParserTest.java new file mode 100644 index 000000000..89f87a3eb --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/JavaTypeParserTest.java @@ -0,0 +1,56 @@ +package org.jvnet.annox.parser.tests; + +import japa.parser.ast.expr.AnnotationExpr; + +import java.util.List; + +import junit.framework.TestCase; + +import org.jvnet.annox.japa.parser.AnnotationExprParser; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.parser.XAnnotationParser; + +public class JavaTypeParserTest extends TestCase { + + public void testParse() throws Exception { + + final String text = "@org.jvnet.annox.parser.tests.A(" + + "booleanField = false,\n" + + "byteField = 0,\n" + + "charField = 'a',\n" + + "classField = java.lang.String.class,\n" + + "doubleField = 1,\n" + + "enumField = org.jvnet.annox.parser.tests.E.ONE,\n" + + "floatField = 2.3f,\n" + + "intField = 4,\n" + + "longField = 5,\n" + + "shortField = 6,\n" + + "stringField = \"7\",\n" + + "annotationField = @org.jvnet.annox.parser.tests.B(\n" + + "booleanArrayField = { false, true },\n" + + "byteArrayField = { 0, 1 },\n" + + "charArrayField = { 'a', 'b' },\n" + + "classArrayField = { java.lang.String.class, java.lang.Boolean.class },\n" + + "doubleArrayField = { 2, 3 },\n" + + "enumArrayField = { org.jvnet.annox.parser.tests.E.ONE, org.jvnet.annox.parser.tests.E.TWO },\n" + + "floatArrayField = { 4.5f, 6.7f },\n" + + "intArrayField = { 8, 9 },\n" + + "longArrayField = { 10, 11 },\n" + + "shortArrayField = { 12, 13 },\n" + + "stringArrayField = { \"14\", \"15\", \"16\", \"17\" },\n" + + "annotationArrayField = { @org.jvnet.annox.parser.tests.B.C, @org.jvnet.annox.parser.tests.B.C }))"; + + final AnnotationExprParser parser = new AnnotationExprParser(); + + List annotations = parser.parse(text); + + assertEquals(1, annotations.size()); + + final AnnotationExpr annotationExpr = annotations.get(0); + + final XAnnotationParser xAnnotationParser = new XAnnotationParser(); + XAnnotation xannotation = xAnnotationParser.parse(annotationExpr); + assertNotNull(xannotation); + + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/K.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/K.java new file mode 100644 index 000000000..785ecc40d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/K.java @@ -0,0 +1,10 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface K { + String[] value(); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/L.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/L.java new file mode 100644 index 000000000..a6a459c49 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/L.java @@ -0,0 +1,10 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface L { + J value(); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/M.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/M.java new file mode 100644 index 000000000..bec315186 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/M.java @@ -0,0 +1,10 @@ +package org.jvnet.annox.parser.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface M { + K[] value(); + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Nine.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Nine.java new file mode 100644 index 000000000..ff11b6983 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Nine.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@L(@J("jay")) +public class Nine { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/One.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/One.java new file mode 100644 index 000000000..d80c81dd2 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/One.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.parser.tests; +@A( + booleanField = false, + byteField = 0, + charField = 'a', + classField = String[][][].class, + doubleField = 1, + enumField = E.ONE, + floatField = 2.3f, + intField = 4, + longField = 5, + shortField = 6, + stringField = "7", + annotationField = @B( + booleanArrayField = { false, true }, + byteArrayField = { 0, 1 }, + charArrayField = { 'a', 'b' }, + classArrayField = { String.class, Boolean.class }, + doubleArrayField = { 2, 3 }, + enumArrayField = { E.ONE, E.TWO }, + floatArrayField = { 4.5f, 6.7f }, + intArrayField = { 8, 9 }, + longArrayField = { 10, -9223372036854775808L }, + shortArrayField = { 12, 13 }, + stringArrayField = { "14", "15", "16", "17" }, + annotationArrayField = { @B.C, @B.C })) +public class One { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Seven.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Seven.java new file mode 100644 index 000000000..037945cf7 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Seven.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@J("jay") +public class Seven { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Six.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Six.java new file mode 100644 index 000000000..a4b022e11 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Six.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@G +public class Six { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Ten.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Ten.java new file mode 100644 index 000000000..8b714dc7d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Ten.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@M( { @K( { "k", "kay" }), @K( { "K", "KAY" }) }) +public class Ten { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Three.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Three.java new file mode 100644 index 000000000..7681d0569 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Three.java @@ -0,0 +1,6 @@ +package org.jvnet.annox.parser.tests; + +@D +public class Three { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Twelve.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Twelve.java new file mode 100644 index 000000000..8fc854745 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Twelve.java @@ -0,0 +1,17 @@ +package org.jvnet.annox.parser.tests; +@B( + booleanArrayField = false, + byteArrayField = 0, + charArrayField = 'a', + classArrayField = String.class, + doubleArrayField = 2, + enumArrayField = E.ONE, + floatArrayField = 4.5f, + intArrayField = 8, + longArrayField = 10, + shortArrayField = 12, + stringArrayField = "14", + annotationArrayField = @B.C) +public class Twelve { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Two.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Two.java new file mode 100644 index 000000000..f43171d8d --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/Two.java @@ -0,0 +1,30 @@ +package org.jvnet.annox.parser.tests; + +@A( + booleanField = false, + byteField = 0, + charField = 'a', + classField = String[][][].class, + doubleField = 1, + enumField = E.ONE, + floatField = 2.3f, + intField = 4, + longField = 5, + shortField = 6, + stringField = "7", + annotationField = @B( + annotationArrayField = {@B.C, @B.C }, + booleanArrayField = { false, true }, + byteArrayField = {0, 1 }, + charArrayField = { 'a', 'b' }, + classArrayField = {String.class, Boolean.class }, + doubleArrayField = { 2, 3 }, + enumArrayField = { E.ONE, E.TWO }, + floatArrayField = { 4.5f, 6.7f }, + intArrayField = { 8, 9 }, + longArrayField = { 10, -9223372036854775808L }, + shortArrayField = { 12, 13 }, + stringArrayField = { "14", "15", "16", "17" })) +public class Two { + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserAnnotationExprTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserAnnotationExprTest.java new file mode 100644 index 000000000..50462148f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserAnnotationExprTest.java @@ -0,0 +1,126 @@ +package org.jvnet.annox.parser.tests; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import junit.framework.TestCase; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.parser.XAnnotationParser; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class XAnnotationParserAnnotationExprTest extends TestCase { + + public Element getElement(final String resourceName) throws Exception { + InputStream is = null; + try { + is = getClass().getResourceAsStream(resourceName); + final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); + documentBuilderFactory.setNamespaceAware(true); + final DocumentBuilder documentBuilder = documentBuilderFactory + .newDocumentBuilder(); + final Document document = documentBuilder.parse(is); + return document.getDocumentElement(); + } finally { + try { + if (is != null) { + is.close(); + } + } catch (IOException ioe) { + // ignore + } + } + + } + + public String getAnnotationString(final String resourceName) + throws Exception { + InputStream is = null; + try { + is = getClass().getResourceAsStream(resourceName); + final String text = IOUtils.toString(is, "UTF-8"); + return text; + } finally { + IOUtils.closeQuietly(is); + } + } + + public void check(String javaResourceName, String xmlResourceName, + Class clazz, Class annotationClazz) + throws Exception { + final String annotationExpr = getAnnotationString(javaResourceName); + final Element element = getElement(xmlResourceName); + final Annotation annotation = clazz.getAnnotation(annotationClazz); + final XAnnotationParser parser = new XAnnotationParser(); + final XAnnotation one = parser.parse(annotation); + final XAnnotation two = parser.parse(annotationExpr); + final XAnnotation three = parser.parse(element); + System.out.println(one.toString()); + System.out.println(two.toString()); + System.out.println(three.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + Assert.assertEquals("Annotations should be identical.", two, three); + Assert.assertEquals("Annotations should be identical.", + one.getResult(), two.getResult()); + Assert.assertEquals("Annotations should be identical.", + two.getResult(), three.getResult()); + Assert.assertEquals("Annotations should be identical.", annotation, + one.getResult()); + Assert.assertEquals("Annotations should be identical.", annotation, + two.getResult()); + Assert.assertEquals("Annotations should be identical.", annotation, + three.getResult()); + } + + public void testOne() throws Exception { + check("one.txt", "one.xml", One.class, A.class); + } + + public void testTwo() throws Exception { + check("two.txt", "two.xml", Two.class, A.class); + } + + public void testThree() throws Exception { + check("three.txt", "three.xml", Three.class, D.class); + } + + public void testFive() throws Exception { + check("five.txt", "five.xml", Five.class, F.class); + } + + public void testSix() throws Exception { + check("six.txt", "six.xml", Six.class, G.class); + } + + public void testSeven() throws Exception { + check("seven.txt", "seven.xml", Seven.class, J.class); + } + + public void testEight() throws Exception { + check("eight.txt", "eight.xml", Eight.class, K.class); + } + + public void testNine() throws Exception { + check("nine.txt", "nine.xml", Nine.class, L.class); + } + + public void testTen() throws Exception { + check("ten.txt", "ten.xml", Ten.class, M.class); + } + + public void testEleven() throws Exception { + check("eleven.txt", "eleven.xml", Eleven.class, H.class); + } + + public void testTwelve() throws Exception { + check("twelve.txt", "twelve.xml", Twelve.class, B.class); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserTest.java new file mode 100644 index 000000000..ca88d758a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/parser/tests/XAnnotationParserTest.java @@ -0,0 +1,270 @@ +package org.jvnet.annox.parser.tests; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Annotation; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import junit.framework.TestCase; + +import org.junit.Assert; +import org.jvnet.annox.model.XAnnotation; +import org.jvnet.annox.model.annotation.field.XSingleAnnotationField; +import org.jvnet.annox.model.annotation.value.XStringAnnotationValue; +import org.jvnet.annox.parser.XAnnotationParser; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +public class XAnnotationParserTest extends TestCase { + + public Element getElement(final String resourceName) throws Exception { + InputStream is = null; + try { + is = getClass().getResourceAsStream(resourceName); + final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory + .newInstance(); + documentBuilderFactory.setNamespaceAware(true); + final DocumentBuilder documentBuilder = documentBuilderFactory + .newDocumentBuilder(); + final Document document = documentBuilder.parse(is); + return document.getDocumentElement(); + } finally { + try { + if (is != null) { + is.close(); + } + } catch (IOException ioe) { + // ignore + } + } + + } + + public void testA() throws Exception { + + XAnnotationParser parser = new XAnnotationParser(); + + final Element element = getElement("one.xml"); + + final XAnnotation one = parser.parse(element); + System.out.println(one.toString()); + final A zeroResult = One.class.getAnnotation(A.class); + final int zeroHashCode = zeroResult.hashCode(); + final String zeroToString = zeroResult.toString(); + final XAnnotation two = parser.parse(zeroResult); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + final Annotation oneResult = one.getResult(); + final int oneHashCode = oneResult.hashCode(); + final String oneToString = oneResult.toString(); + final Annotation twoResult = two.getResult(); + final int twoHashCode = twoResult.hashCode(); + final String twoToString = twoResult.toString(); + final XAnnotation three = parser.parse(oneResult); + System.out.println(three.toString()); + final XAnnotation four = parser.parse(twoResult); + System.out.println(four.toString()); + Assert.assertEquals("Annotations should be identical.", three, four); + Assert.assertEquals("Annotation toStrings must have the same length", + zeroToString.length(), oneToString.length()); + Assert.assertEquals("Annotation toStrings must have the same length", + oneToString.length(), twoToString.length()); + Assert.assertEquals("Annotation hashCodes should be identical.", + zeroHashCode, oneHashCode); + Assert.assertEquals("Annotation hashCodes should be identical.", + oneHashCode, twoHashCode); + Assert.assertEquals("Annotation should be equal.", zeroResult, + oneResult); + Assert.assertEquals("Annotation should be equal.", oneResult, twoResult); + } + + public void testD() throws Exception { + + XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final Element element = getElement("d.xml"); + + final XAnnotation one = parser.parse(element); + System.out.println(one.toString()); + final XAnnotation two = parser.parse(Three.class + .getAnnotation(D.class)); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + final Annotation oneResult = one.getResult(); + final Annotation twoResult = two.getResult(); + final XAnnotation three = parser.parse(oneResult); + System.out.println(three.toString()); + final XAnnotation four = parser.parse(twoResult); + System.out.println(four.toString()); + Assert.assertEquals("Annotations should be identical.", three, four); + } + + public void testEquals() throws Exception { + + final Annotation one = One.class.getAnnotation(A.class); + final Annotation two = Two.class.getAnnotation(A.class); + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + } + + public void testF() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Five.class + .getAnnotation(F.class)); + + final XAnnotation two = new XAnnotation(F.class, + new XSingleAnnotationField("eman", String.class, + new XStringAnnotationValue("tset"))); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + + public void testG() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Six.class + .getAnnotation(G.class)); + + final XAnnotation two = new XAnnotation(G.class); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + + public void testField() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final Element element = getElement("field.xml"); + + final XAnnotation zero = parser.parse(element); + Assert.assertEquals("Annotations should be identical.", + zero.toString(), + "@org.hibernate.search.annotations.Field(index=TOKENIZED, store=NO)"); + + } + + public void testFieldBridge() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final Element element = getElement("fieldBridge.xml"); + + final XAnnotation zero = parser.parse(element); + + System.out.println(zero.toString()); + Assert.assertEquals( + "Annotations should be identical.", + zero.toString(), + "@org.hibernate.search.annotations.FieldBridge(impl=java.lang.String1[][][][], params=[])"); + + } + + public void testH() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final Element element = getElement("h.xml"); + + final XAnnotation zero = parser.parse(element); + + final XAnnotation one = parser.parse(Eleven.class + .getAnnotation(H.class)); + + final XAnnotation two = new XAnnotation(H.class); + + System.out.println(zero.toString()); + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", zero, one); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + +// public void testI() throws Exception { +// +// final XAnnotation d = new XAnnotation(D.class); +// @SuppressWarnings("unchecked") +// final XAnnotation[] ds = new XAnnotation[] { d }; +// XGenericFieldParser.generic().construct("d", d, d.getClass()); +// XGenericFieldParser.generic().construct("d", ds, ds.getClass()); +// } + + public void testJ() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Seven.class + .getAnnotation(J.class)); + + final Element element = getElement("j.xml"); + + final XAnnotation two = parser.parse(element); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + + public void testK() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Eight.class + .getAnnotation(K.class)); + + final Element element = getElement("k.xml"); + + final XAnnotation two = parser.parse(element); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + + public void testL() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Nine.class + .getAnnotation(L.class)); + + final Element element = getElement("l.xml"); + + final XAnnotation two = parser.parse(element); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + + } + + public void testM() throws Exception { + + final XAnnotationParser parser = XAnnotationParser.INSTANCE; + + final XAnnotation one = parser.parse(Ten.class + .getAnnotation(M.class)); + + final Element element = getElement("m.xml"); + + final XAnnotation two = parser.parse(element); + + System.out.println(one.toString()); + System.out.println(two.toString()); + Assert.assertEquals("Annotations should be identical.", one, two); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Alpha.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Alpha.java new file mode 100644 index 000000000..35a46247b --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Alpha.java @@ -0,0 +1,34 @@ +/** + * + */ +package org.jvnet.annox.reader.resourced.tests; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Alpha { + long longField() default 1; + + int intField() default 2; + + short shortField() default 3; + + char charField() default 'f'; + + byte byteField() default 5; + + double doubleField() default 6.0; + + float floatField() default 7.0f; + + boolean booleanField() default true; + + String stringField() default "nine"; + + Epsilon enumField() default Epsilon.TEN; + + Class classField() default Eleven.class; + + // B annotationField(); +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Eleven.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Eleven.java new file mode 100644 index 000000000..e92e0fd4e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Eleven.java @@ -0,0 +1,5 @@ +package org.jvnet.annox.reader.resourced.tests; + +public class Eleven { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Epsilon.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Epsilon.java new file mode 100644 index 000000000..3f0b1ef2e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Epsilon.java @@ -0,0 +1,10 @@ +/** + * + */ +package org.jvnet.annox.reader.resourced.tests; + +public enum Epsilon { + + ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN; + +} \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/One.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/One.java new file mode 100644 index 000000000..5832e144c --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/One.java @@ -0,0 +1,44 @@ +package org.jvnet.annox.reader.resourced.tests; + +// Class +public class One { + + // Constructor + public One() { + + } + + public int fieldA; + + public String fieldB; + + public int getFieldA() { + return fieldA; + } + + public void setFieldA(int fieldA) { + this.fieldA = fieldA; + } + + public String getFieldB() { + return fieldB; + } + + public void setFieldB(String fieldB) { + this.fieldB = fieldB; + } + + public void setFieldB() { + this.setFieldB(null); + } + + public void setFieldC(String x, int y) { + } + + public void setFieldC(String x, int y, byte z) { + } + + public void setFieldC(int y, byte z) { + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/ResourcedXReaderTests.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/ResourcedXReaderTests.java new file mode 100644 index 000000000..e976d119f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/ResourcedXReaderTests.java @@ -0,0 +1,113 @@ +package org.jvnet.annox.reader.resourced.tests; + +import java.lang.annotation.Annotation; + +import org.junit.Assert; +import junit.framework.TestCase; + +import org.jvnet.annox.model.XClass; +import org.jvnet.annox.model.XField; +import org.jvnet.annox.model.XMethod; +import org.jvnet.annox.reader.XReader; +import org.jvnet.annox.reader.resourced.ResourcedXReader; + +public class ResourcedXReaderTests extends TestCase { + + protected XReader xreader; + + @Override + protected void setUp() throws Exception { + super.setUp(); + this.xreader = new ResourcedXReader(); + } + + public void testOne() throws Exception { + + final XClass xone = xreader.getXClass(One.class); + Assert.assertNotNull(xone); + Assert.assertTrue(xone.isAnnotationPresent(Alpha.class)); + { + Alpha alpha = xone.getAnnotation(Alpha.class); + Assert.assertEquals(2, alpha.longField()); + Assert.assertEquals(3, alpha.intField()); + Assert.assertEquals(4, alpha.shortField()); + Assert.assertEquals('g', alpha.charField()); + Assert.assertEquals(6, alpha.byteField()); + Assert.assertEquals(6.0, alpha.doubleField(), 0.001); + Assert.assertEquals(7, alpha.floatField(), 0.001); + Assert.assertEquals(true, alpha.booleanField()); + Assert.assertEquals("nine", alpha.stringField()); + Assert.assertEquals(Epsilon.TEN, alpha.enumField()); + Assert.assertEquals(Twelve.class, alpha.classField()); + Assert.assertSame(xone, xreader.getXClass(One.class)); + } + // Check field + final XField xfieldA = xreader.getXField(One.class.getField("fieldA")); + Alpha ann_fieldA = xfieldA.getAnnotation(Alpha.class); + Assert.assertEquals(16, ann_fieldA.intField()); + + // Check methods + final XMethod xgetFieldA = xreader.getXMethod(One.class + .getMethod("getFieldA")); + Alpha ann_getFieldA = xgetFieldA.getAnnotation(Alpha.class); + Assert.assertEquals(32, ann_getFieldA.shortField()); + + final XMethod xsetFieldA = xreader.getXMethod(One.class.getMethod( + "setFieldA", int.class)); + Alpha ann_setFieldA = xsetFieldA.getAnnotation(Alpha.class); + Assert.assertEquals('Z', ann_setFieldA.charField()); + + final XMethod xsetFieldB1 = xreader.getXMethod(One.class + .getMethod("setFieldB")); + Alpha ann_setFieldB1 = xsetFieldB1.getAnnotation(Alpha.class); + Assert.assertEquals(64, ann_setFieldB1.byteField()); + + final XMethod xsetFieldB2 = xreader.getXMethod(One.class.getMethod( + "setFieldB", String.class)); + Alpha ann_setFieldB2 = xsetFieldB2.getAnnotation(Alpha.class); + Assert.assertEquals(65, ann_setFieldB2.doubleField(), 0.001); + + { + final XMethod xmethod = xreader.getXMethod(One.class.getMethod( + "setFieldC", String.class, int.class)); + final Alpha alpha = xmethod.getAnnotation(Alpha.class); + Assert.assertEquals(128, alpha.floatField(), 0.001); + final Annotation[][] pa = xmethod.getParameterAnnotations(); + Assert.assertEquals(2, pa.length); + Assert.assertEquals(0, pa[0].length); + Assert.assertEquals(1, pa[1].length); + Assert.assertEquals("int", ((Alpha) pa[1][0]).stringField()); + + } + + { + final XMethod xmethod = xreader.getXMethod(One.class.getMethod( + "setFieldC", String.class, int.class, byte.class)); + Alpha alpha = xmethod.getAnnotation(Alpha.class); + Assert.assertEquals(129, alpha.floatField(), 0.001); + final Annotation[][] pa = xmethod.getParameterAnnotations(); + Assert.assertEquals(3, pa.length); + Assert.assertEquals(1, pa[0].length); + Assert.assertEquals(0, pa[1].length); + Assert.assertEquals(1, pa[2].length); + Assert.assertEquals("java.lang.String", ((Alpha) pa[0][0]) + .stringField()); + Assert.assertEquals("byte", ((Alpha) pa[2][0]).stringField()); + } + + { + final XMethod xmethod = xreader.getXMethod(One.class.getMethod( + "setFieldC", int.class, byte.class)); + Alpha alpha = xmethod.getAnnotation(Alpha.class); + Assert.assertEquals(130, alpha.floatField(), 0.001); + + final Annotation[][] pa = xmethod.getParameterAnnotations(); + Assert.assertEquals(2, pa.length); + Assert.assertEquals(1, pa[0].length); + Assert.assertEquals(1, pa[1].length); + Assert.assertEquals("int", ((Alpha) pa[0][0]).stringField()); + Assert.assertEquals("byte", ((Alpha) pa[1][0]).stringField()); + } + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Twelve.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Twelve.java new file mode 100644 index 000000000..556ceb942 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/reader/resourced/tests/Twelve.java @@ -0,0 +1,5 @@ +package org.jvnet.annox.reader.resourced.tests; + +public class Twelve { + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/tests/ProxyTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/tests/ProxyTest.java new file mode 100644 index 000000000..0f81fc7ce --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/tests/ProxyTest.java @@ -0,0 +1,33 @@ +package org.jvnet.annox.tests; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +import org.junit.Assert; +import junit.framework.TestCase; + +public class ProxyTest extends TestCase { + + public void testProxy() throws Exception { + + + final InvocationHandler handler = new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return "a"; + } + }; + + final A a = (A) Proxy.newProxyInstance( + A.class.getClassLoader(), + new Class[]{ A.class }, + handler); + + Assert.assertEquals("Wrong value.", "a", a.stringField()); + } + + public static interface A { + public String stringField(); + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ArrayUtilsTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ArrayUtilsTest.java new file mode 100644 index 000000000..4c3c3c930 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ArrayUtilsTest.java @@ -0,0 +1,29 @@ +package org.jvnet.annox.util.tests; + +import java.util.Arrays; + +import org.junit.Assert; +import junit.framework.TestCase; + +import org.jvnet.annox.util.ArrayUtils; + +public class ArrayUtilsTest extends TestCase { + + public void testToObjectArray() throws Exception { + + final int[] ein = null; + final Integer[] one = ArrayUtils.asObjectArray(ein); + final int[] zwei = new int[] {}; + final Integer[] two = ArrayUtils.asObjectArray(zwei); + final int[] drei = new int[] { 1, 2 }; + final Integer[] three = ArrayUtils.asObjectArray(drei); + + final int[] un = ArrayUtils.asPrimitiveArray(one); + final int[] deux = ArrayUtils.asPrimitiveArray(two); + final int[] troi = ArrayUtils.asPrimitiveArray(three); + + Assert.assertTrue("Wrong value.", Arrays.equals(ein, un)); + Assert.assertTrue("Wrong value.", Arrays.equals(zwei, deux)); + Assert.assertTrue("Wrong value.", Arrays.equals(drei, troi)); + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ClassUtilsTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ClassUtilsTest.java new file mode 100644 index 000000000..b34bcbe91 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ClassUtilsTest.java @@ -0,0 +1,51 @@ +package org.jvnet.annox.util.tests; + +import java.net.URL; +import java.util.Arrays; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import org.jvnet.annox.util.ClassUtils; + +public class ClassUtilsTest { + + @Test + public void testwrapperArrayToPrimitiveArray() { + Assert.assertEquals(int[].class, + ClassUtils.wrapperArrayToPrimitiveArray(Integer[].class)); + Assert.assertEquals(int[].class, + ClassUtils.wrapperArrayToPrimitiveArray(int[].class)); + Assert.assertEquals(Object[].class, + ClassUtils.wrapperArrayToPrimitiveArray(Object[].class)); + } + + @Test + public void testForName() throws Exception { + + Assert.assertEquals("Wrong class.", Integer.TYPE, + ClassUtils.forName("int")); + Assert.assertEquals("Wrong class.", byte[].class, + ClassUtils.forName("byte[]")); + Assert.assertEquals("Wrong class.", String.class, + ClassUtils.forName("java.lang.String")); + Assert.assertEquals("Wrong class.", URL[].class, + ClassUtils.forName("java.net.URL[]")); + + } + + @Test + public void testForNames() throws Exception { + + Assert.assertTrue( + "Class arrays must be equal.", + Arrays.equals( + + new Class[] { Integer.TYPE, String.class, + int[].class, String[].class, Map.Entry.class }, + ClassUtils + .forNames("int, java.lang.String, int[], java.lang.String[], java.util.Map$Entry"))); + + } + +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ReflectionUtilsTest.java b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ReflectionUtilsTest.java new file mode 100644 index 000000000..bf55b537f --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/java/org/jvnet/annox/util/tests/ReflectionUtilsTest.java @@ -0,0 +1,78 @@ +package org.jvnet.annox.util.tests; + +import org.junit.Assert; +import junit.framework.TestCase; + +import org.jvnet.annox.util.ClassUtils; +import org.jvnet.annox.util.ReflectionUtils; + +public class ReflectionUtilsTest extends TestCase { + + public static class Test { + public Test() { + } + + public Test(String x) { + } + + public void one() { + } + + public void two() { + } + + public void two(String value) { + } + + public void three() { + } + + public void three(String value) { + } + + public void three(String[] value) { + } + + public void three(Object value) { + } + + public void three(Object[] value) { + } + + public void four(String x, int y, char[] z) { + } + } + + public void testGetMethod() throws Exception { + + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "one", + ClassUtils.forNames(null))); + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "two", + ClassUtils.forNames(null))); + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "two", + ClassUtils.forNames(""))); + Assert.assertEquals(ReflectionUtils.getMethod(Test.class, "two", + ClassUtils.forNames("")), ReflectionUtils.getMethod(Test.class, + "two", ClassUtils.forNames(""))); + + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "two", + ClassUtils.forNames("java.lang.String"))); + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "three", + ClassUtils.forNames("java.lang.String[]"))); + Assert.assertNotNull(ReflectionUtils.getMethod(Test.class, "four", + ClassUtils.forNames("java.lang.String, int, char[]"))); + + } + + public void testGetConstructor() throws Exception { + + ReflectionUtils.getConstructor(Test.class, null); + ReflectionUtils + .getConstructor(Test.class, ClassUtils.EMPTY_CLASS_ARRAY); + ReflectionUtils.getConstructor(Test.class, ClassUtils.forNames(null)); + ReflectionUtils.getConstructor(Test.class, ClassUtils.forNames("")); + ReflectionUtils.getConstructor(Test.class, ClassUtils + .forNames("java.lang.String")); + + } +} diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/DemoClass.ann.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/DemoClass.ann.xml new file mode 100644 index 000000000..42c33b178 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/DemoClass.ann.xml @@ -0,0 +1,64 @@ + + + Annotation for the DemoGuide class. + + + + Annotation for the value field. + + + + + Annotation for the default constructor. Since + default constructor does not have any arguments, + we don't need to define any arguments here. + + + + + Annotation for the second constructor. To distinguish it + from the default constructor, we have to define constructor + arguments. + + + + Annotation for the first parameter of the + constructor. + + + + + + + + + + + + + + + + + + Annotation for the + setValue(java.lang.String value, int radix) method. + + + + Annotation for the radix parameter. + + + + + + Annotation for the add(int value) method. + Since there is no other add(...) method in the class + ("add" is an unambiguous method name), + we don't need to define them in the arguments attribute. + + + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/MyClass.ann.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/MyClass.ann.xml new file mode 100644 index 000000000..85221c820 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/MyClass.ann.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/package-info.ann.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/package-info.ann.xml new file mode 100644 index 000000000..0decbc65e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/demos/guide/package-info.ann.xml @@ -0,0 +1,18 @@ + + + Annotation for the org.jvnet.annox.demos.guide package. + + + + Annotation for the DemoClass class. + + + + Annotation for the value field. + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/d.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/d.xml new file mode 100644 index 000000000..d66ee3fed --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/d.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.txt new file mode 100644 index 000000000..617732475 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.K( { "k", "kay" }) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.xml new file mode 100644 index 000000000..304976c76 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eight.xml @@ -0,0 +1,2 @@ +k kay \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.txt new file mode 100644 index 000000000..b194bc9e6 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.H \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.xml new file mode 100644 index 000000000..12e3a1ef5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/eleven.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/field.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/field.xml new file mode 100644 index 000000000..bf263a0b3 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/field.xml @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/fieldBridge.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/fieldBridge.xml new file mode 100644 index 000000000..105de605a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/fieldBridge.xml @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.txt new file mode 100644 index 000000000..5b4dace25 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.F(eman = "tset") \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.xml new file mode 100644 index 000000000..3c041461a --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/five.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/h.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/h.xml new file mode 100644 index 000000000..12e3a1ef5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/h.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/j.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/j.xml new file mode 100644 index 000000000..f0e94c374 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/j.xml @@ -0,0 +1,2 @@ +jay \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/k.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/k.xml new file mode 100644 index 000000000..304976c76 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/k.xml @@ -0,0 +1,2 @@ +k kay \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/l.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/l.xml new file mode 100644 index 000000000..1efc3bbc5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/l.xml @@ -0,0 +1,4 @@ + + jay + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/m.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/m.xml new file mode 100644 index 000000000..24dc4cd92 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/m.xml @@ -0,0 +1,5 @@ + + k kay + K KAY + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.txt new file mode 100644 index 000000000..2bb8080ed --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.L(@org.jvnet.annox.parser.tests.J("jay")) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.xml new file mode 100644 index 000000000..1efc3bbc5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/nine.xml @@ -0,0 +1,4 @@ + + jay + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.txt new file mode 100644 index 000000000..bb2ebd4a2 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.txt @@ -0,0 +1,25 @@ +@org.jvnet.annox.parser.tests.A( + booleanField = false, + byteField = 0, + charField = 'a', + classField = java.lang.String[][][].class, + doubleField = 1, + enumField = org.jvnet.annox.parser.tests.E.ONE, + floatField = 2.3f, + intField = 4, + longField = 5, + shortField = 6, + stringField = "7", + annotationField = @org.jvnet.annox.parser.tests.B( + booleanArrayField = { false, true }, + byteArrayField = { 0, 1 }, + charArrayField = { 'a', 'b' }, + classArrayField = { java.lang.String.class, java.lang.Boolean.class }, + doubleArrayField = { 2, 3d }, + enumArrayField = { org.jvnet.annox.parser.tests.E.ONE, org.jvnet.annox.parser.tests.E.TWO }, + floatArrayField = { 4.5f, 6.7f }, + intArrayField = { 8, 9 }, + longArrayField = { 10L, -9223372036854775808L }, + shortArrayField = { 12, 13 }, + stringArrayField = { "14", "15", "16", "17" }, + annotationArrayField = { @org.jvnet.annox.parser.tests.B.C, @org.jvnet.annox.parser.tests.B.C })) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.xml new file mode 100644 index 000000000..8107b1ee5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/one.xml @@ -0,0 +1,35 @@ + + + + 16 + 17 + + + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/package-info.java b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/package-info.java new file mode 100644 index 000000000..e2e181810 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/package-info.java @@ -0,0 +1,2 @@ +@D +package org.jvnet.annox.parser.tests; \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.txt new file mode 100644 index 000000000..3b94cb689 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.J("jay") \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.xml new file mode 100644 index 000000000..f0e94c374 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/seven.xml @@ -0,0 +1,2 @@ +jay \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.txt new file mode 100644 index 000000000..ebe4874e3 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.G \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.xml new file mode 100644 index 000000000..a972b4aa4 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/six.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.txt new file mode 100644 index 000000000..7c56c9e98 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.M( { @org.jvnet.annox.parser.tests.K( { "k", "kay" }), @org.jvnet.annox.parser.tests.K( { "K", "KAY" }) }) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.xml new file mode 100644 index 000000000..24dc4cd92 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/ten.xml @@ -0,0 +1,5 @@ + + k kay + K KAY + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.txt new file mode 100644 index 000000000..b4c3c396e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.txt @@ -0,0 +1 @@ +@org.jvnet.annox.parser.tests.D \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.xml new file mode 100644 index 000000000..d66ee3fed --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/three.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.txt new file mode 100644 index 000000000..4462e313e --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.txt @@ -0,0 +1,13 @@ +@org.jvnet.annox.parser.tests.B( + booleanArrayField = false, + byteArrayField = 0, + charArrayField = 'a', + classArrayField = java.lang.String.class, + doubleArrayField = 2, + enumArrayField = org.jvnet.annox.parser.tests.E.ONE, + floatArrayField = 4.5f, + intArrayField = 8, + longArrayField = 10L, + shortArrayField = 12, + stringArrayField = "14", + annotationArrayField = @org.jvnet.annox.parser.tests.B.C) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.xml new file mode 100644 index 000000000..63712feea --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/twelve.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.txt b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.txt new file mode 100644 index 000000000..92abfae13 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.txt @@ -0,0 +1,25 @@ +@org.jvnet.annox.parser.tests.A( + booleanField = false, + byteField = 0, + charField = 'a', + classField = java.lang.String[][][].class, + doubleField = 1, + enumField = org.jvnet.annox.parser.tests.E.ONE, + floatField = 2.3f, + intField = 4, + longField = 5, + shortField = 6, + stringField = "7", + annotationField = @org.jvnet.annox.parser.tests.B( + annotationArrayField = {@org.jvnet.annox.parser.tests.B.C, @org.jvnet.annox.parser.tests.B.C }, + booleanArrayField = { false, true }, + byteArrayField = {0, 1 }, + charArrayField = { 'a', 'b' }, + classArrayField = {java.lang.String.class, java.lang.Boolean.class }, + doubleArrayField = { 2, 3 }, + enumArrayField = { org.jvnet.annox.parser.tests.E.ONE, org.jvnet.annox.parser.tests.E.TWO }, + floatArrayField = { 4.5f, 6.7f }, + intArrayField = { 8, 9 }, + longArrayField = { 10, -9223372036854775808L }, + shortArrayField = { 12, 13 }, + stringArrayField = { "14", "15", "16", "17" })) \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.xml new file mode 100644 index 000000000..8107b1ee5 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/parser/tests/two.xml @@ -0,0 +1,35 @@ + + + + 16 + 17 + + + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/reader/resourced/tests/One.ann.xml b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/reader/resourced/tests/One.ann.xml new file mode 100644 index 000000000..491e3a539 --- /dev/null +++ b/jaxb-annox-parent/jaxb-annox/src/test/resources/org/jvnet/annox/reader/resourced/tests/One.ann.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jaxb-annox-parent/pom.xml b/jaxb-annox-parent/pom.xml new file mode 100644 index 000000000..4e63378e6 --- /dev/null +++ b/jaxb-annox-parent/pom.xml @@ -0,0 +1,41 @@ + + 4.0.0 + + org.jvnet.jaxb + jaxb-tools-project + 2.0.5-SNAPSHOT + ../pom.xml + + jaxb-annox-parent + pom + JAXB Tools :: JAXB Annox :: Parent + JAXB Annox is a part of JAXB Tools project which implements support for reading and writing XML annotations. + + jaxb-annox + samples + + + + samples + + samples + + + + all + + jaxb-annox + samples + + + + + + + junit + junit + test + + + + diff --git a/jaxb-annox-parent/samples/.gitignore b/jaxb-annox-parent/samples/.gitignore new file mode 100644 index 000000000..ee5779d53 --- /dev/null +++ b/jaxb-annox-parent/samples/.gitignore @@ -0,0 +1,3 @@ +target +.settings +.project diff --git a/jaxb-annox-parent/samples/po/.gitignore b/jaxb-annox-parent/samples/po/.gitignore new file mode 100644 index 000000000..252d3b1ef --- /dev/null +++ b/jaxb-annox-parent/samples/po/.gitignore @@ -0,0 +1,4 @@ +target +.settings +.project +.classpath diff --git a/jaxb-annox-parent/samples/po/pom.xml b/jaxb-annox-parent/samples/po/pom.xml new file mode 100644 index 000000000..41573b19d --- /dev/null +++ b/jaxb-annox-parent/samples/po/pom.xml @@ -0,0 +1,77 @@ + + 4.0.0 + + org.jvnet.jaxb + jaxb-annox-samples-parent + 2.0.5-SNAPSHOT + ../pom.xml + + jaxb-annox-samples-po + pom + JAXB Tools :: JAXB Annox :: Sample [po] + + + org.jvnet.jaxb + jaxb-annox + ${project.version} + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb.version} + + + + install + + + maven-assembly-plugin + + + ant-assembly + package + + + maven-assembly + package + + + + + maven-antrun-plugin + + + ant-unpack + pre-integration-test + + + maven-unpack + pre-integration-test + + + ant-integration-test + integration-test + + + + + maven-invoker-plugin + 2.0.0 + + + maven-integration-test + integration-test + + + + + maven-deploy-plugin + + true + + + + + diff --git a/jaxb-annox-parent/samples/po/project-build.xml b/jaxb-annox-parent/samples/po/project-build.xml new file mode 100644 index 000000000..9af67077f --- /dev/null +++ b/jaxb-annox-parent/samples/po/project-build.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/samples/po/project-pom.xml b/jaxb-annox-parent/samples/po/project-pom.xml new file mode 100644 index 000000000..de41f70c9 --- /dev/null +++ b/jaxb-annox-parent/samples/po/project-pom.xml @@ -0,0 +1,41 @@ + + 4.0.0 + org.jvnet.annox + annox-samples-po-maven + ${project.version} + jar + Annox Samples [po:maven] + + + org.jvnet.annox + annox + ${project.version} + + + com.sun.xml.bind + jaxb-impl + 2.1.13 + + + junit + junit + 3.8.1 + test + + + + install + + + true + maven-compiler-plugin + + 1.6 + 1.6 + + + + + diff --git a/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/BigDecimalAdapter.java b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/BigDecimalAdapter.java new file mode 100644 index 000000000..ea6f78151 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/BigDecimalAdapter.java @@ -0,0 +1,19 @@ +package org.jvnet.annox.samples.po; + +import java.math.BigDecimal; + +import javax.xml.bind.annotation.adapters.XmlAdapter; + +public class BigDecimalAdapter extends XmlAdapter { + + @Override + public BigDecimal unmarshal(String v) throws Exception { + return v == null ? null : new BigDecimal(v); + } + + @Override + public String marshal(BigDecimal v) throws Exception { + return v == null ? null : v.toString(); + } + +} diff --git a/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/Items.java b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/Items.java new file mode 100644 index 000000000..648db7143 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/Items.java @@ -0,0 +1,85 @@ +package org.jvnet.annox.samples.po; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.datatype.XMLGregorianCalendar; + + +public class Items { + + protected List item; + + public List getItem() { + if (item == null) { + item = new ArrayList(); + } + return this.item; + } + + + public static class Item { + + + protected String productName; + + protected int quantity; + + protected BigDecimal usPrice; + + protected String comment; + + protected XMLGregorianCalendar shipDate; + + protected String partNum; + + public String getProductName() { + return productName; + } + + public void setProductName(String value) { + this.productName = value; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int value) { + this.quantity = value; + } + + public BigDecimal getUSPrice() { + return usPrice; + } + + public void setUSPrice(BigDecimal value) { + this.usPrice = value; + } + + public String getComment() { + return comment; + } + + public void setComment(String value) { + this.comment = value; + } + + public XMLGregorianCalendar getShipDate() { + return shipDate; + } + + public void setShipDate(XMLGregorianCalendar value) { + this.shipDate = value; + } + + public String getPartNum() { + return partNum; + } + + public void setPartNum(String value) { + this.partNum = value; + } + } +} diff --git a/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/ObjectFactory.java b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/ObjectFactory.java new file mode 100644 index 000000000..53f8db9f0 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/ObjectFactory.java @@ -0,0 +1,38 @@ +package org.jvnet.annox.samples.po; + +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + + +public class ObjectFactory { + + private final static QName _PurchaseOrder_QNAME = new QName("", "purchaseOrder"); + private final static QName _Comment_QNAME = new QName("", "comment"); + + public ObjectFactory() { + } + + public PurchaseOrderType createPurchaseOrderType() { + return new PurchaseOrderType(); + } + + public Items.Item createItemsItem() { + return new Items.Item(); + } + + public Items createItems() { + return new Items(); + } + + public USAddress createUSAddress() { + return new USAddress(); + } + + public JAXBElement createPurchaseOrder(PurchaseOrderType value) { + return new JAXBElement(_PurchaseOrder_QNAME, PurchaseOrderType.class, null, value); + } + + public JAXBElement createComment(String value) { + return new JAXBElement(_Comment_QNAME, String.class, null, value); + } +} diff --git a/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/PurchaseOrderType.java b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/PurchaseOrderType.java new file mode 100644 index 000000000..8ce241764 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/PurchaseOrderType.java @@ -0,0 +1,56 @@ +package org.jvnet.annox.samples.po; + +import javax.xml.datatype.XMLGregorianCalendar; + +public class PurchaseOrderType { + + protected USAddress shipTo; + + protected USAddress billTo; + + protected String comment; + + protected Items items; + + protected XMLGregorianCalendar orderDate; + + public USAddress getShipTo() { + return shipTo; + } + + public void setShipTo(USAddress value) { + this.shipTo = value; + } + + public USAddress getBillTo() { + return billTo; + } + + public void setBillTo(USAddress value) { + this.billTo = value; + } + + public String getComment() { + return comment; + } + + public void setComment(String value) { + this.comment = value; + } + + public Items getItems() { + return items; + } + + public void setItems(Items value) { + this.items = value; + } + + public XMLGregorianCalendar getOrderDate() { + return orderDate; + } + + public void setOrderDate(XMLGregorianCalendar value) { + this.orderDate = value; + } +} diff --git a/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/USAddress.java b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/USAddress.java new file mode 100644 index 000000000..a95b9a161 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/java/org/jvnet/annox/samples/po/USAddress.java @@ -0,0 +1,71 @@ +package org.jvnet.annox.samples.po; + +import java.math.BigDecimal; + +public class USAddress { + + protected String name; + + protected String street; + + protected String city; + + protected String state; + + protected BigDecimal zip; + + protected String country; + + public String getName() { + return name; + } + + public void setName(String value) { + this.name = value; + } + + public String getStreet() { + return street; + } + + public void setStreet(String value) { + this.street = value; + } + + public String getCity() { + return city; + } + + public void setCity(String value) { + this.city = value; + } + + public String getState() { + return state; + } + + public void setState(String value) { + this.state = value; + } + + public BigDecimal getZip() { + return zip; + } + + public void setZip(BigDecimal value) { + this.zip = value; + } + + public String getCountry() { + if (country == null) { + return "US"; + } else { + return country; + } + } + + public void setCountry(String value) { + this.country = value; + } + +} diff --git a/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/Items$Item.ann.xml b/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/Items$Item.ann.xml new file mode 100644 index 000000000..e4d07bdb9 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/Items$Item.ann.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/package-info.ann.xml b/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/package-info.ann.xml new file mode 100644 index 000000000..7336f6902 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/main/resources/org/jvnet/annox/samples/po/package-info.ann.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jaxb-annox-parent/samples/po/src/test/java/org/jvnet/annox/samples/po/tests/AnnotationReaderTest.java b/jaxb-annox-parent/samples/po/src/test/java/org/jvnet/annox/samples/po/tests/AnnotationReaderTest.java new file mode 100644 index 000000000..b22a41d60 --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/test/java/org/jvnet/annox/samples/po/tests/AnnotationReaderTest.java @@ -0,0 +1,50 @@ +package org.jvnet.annox.samples.po.tests; + +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBElement; + +import junit.framework.TestCase; + +import org.jvnet.annox.samples.po.PurchaseOrderType; +import org.jvnet.annox.xml.bind.AnnoxAnnotationReader; + +import com.sun.xml.bind.api.JAXBRIContext; +import com.sun.xml.bind.v2.model.annotation.RuntimeAnnotationReader; + +public class AnnotationReaderTest extends TestCase { + + public void testAnnotationReader() throws Exception { + + final RuntimeAnnotationReader annotationReader = new AnnoxAnnotationReader(); + + final Map properties = new HashMap(); + + properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader); + + final JAXBContext context = JAXBContext.newInstance( + "org.jvnet.annox.samples.po", Thread.currentThread() + .getContextClassLoader(), properties); + + @SuppressWarnings("unchecked") + final JAXBElement purchaseOrderElement = (JAXBElement) context + .createUnmarshaller().unmarshal( + getClass().getResource("po.xml")); + + final PurchaseOrderType purchaseOrder = purchaseOrderElement.getValue(); + + assertNotNull(purchaseOrder.getOrderDate()); + assertNotNull(purchaseOrder.getShipTo()); + assertNotNull(purchaseOrder.getBillTo()); + assertEquals("Hurry, my lawn is going wild!", purchaseOrder + .getComment()); + assertNotNull(purchaseOrder.getItems()); + assertEquals(2, purchaseOrder.getItems().getItem().size()); + assertEquals("Confirm this is electric", purchaseOrder.getItems() + .getItem().get(0).getComment()); + + } + +} diff --git a/jaxb-annox-parent/samples/po/src/test/resources/org/jvnet/annox/samples/po/tests/po.xml b/jaxb-annox-parent/samples/po/src/test/resources/org/jvnet/annox/samples/po/tests/po.xml new file mode 100644 index 000000000..6ab460a9c --- /dev/null +++ b/jaxb-annox-parent/samples/po/src/test/resources/org/jvnet/annox/samples/po/tests/po.xml @@ -0,0 +1,31 @@ + + + Alice Smith + 123 Maple Street + Mill Valley + CA + 90952 + + + Robert Smith + 8 Oak Avenue + Old Town + PA + 95819 + + Hurry, my lawn is going wild! + + + Lawnmower + 1 + 148.95 + Confirm this is electric + + + Baby Monitor + 1 + 39.98 + 1999-05-21 + + + diff --git a/jaxb-annox-parent/samples/pom.xml b/jaxb-annox-parent/samples/pom.xml new file mode 100644 index 000000000..2a7944cf5 --- /dev/null +++ b/jaxb-annox-parent/samples/pom.xml @@ -0,0 +1,129 @@ + + 4.0.0 + + org.jvnet.jaxb + jaxb-annox-parent + 2.0.5-SNAPSHOT + ../pom.xml + + jaxb-annox-samples-parent + pom + JAXB Tools :: JAXB Annox :: Samples Parent + + + + + install + + + maven-assembly-plugin + true + + + maven-assembly + + none + + single + + + + ../src/main/assembly/maven-src.xml + + + + + ant-assembly + + none + + single + + + + ../src/main/assembly/ant-src.xml + + + + + + + maven-antrun-plugin + true + + + maven-unpack + + none + + + + + + + + run + + + + ant-unpack + + none + + + + + + + run + + + + ant-integration-test + + none + + + + + + + run + + + + + + maven-invoker-plugin + 1.9 + true + + + maven-integration-test + + none + + run + + + true + ${basedir}/target/test-maven-assembly + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.1 + + true + + + + + diff --git a/jaxb-annox-parent/samples/src/main/assembly/ant-src.xml b/jaxb-annox-parent/samples/src/main/assembly/ant-src.xml new file mode 100644 index 000000000..5d7e11e86 --- /dev/null +++ b/jaxb-annox-parent/samples/src/main/assembly/ant-src.xml @@ -0,0 +1,38 @@ + + ant-src + + zip + + + + + README* + LICENSE* + NOTICE* + + + + src + + + + + ${basedir}/project-build.xml + build.xml + + + + + lib + compile + + + lib + runtime + + + lib + test + + + diff --git a/jaxb-annox-parent/samples/src/main/assembly/maven-src.xml b/jaxb-annox-parent/samples/src/main/assembly/maven-src.xml new file mode 100644 index 000000000..c699068c1 --- /dev/null +++ b/jaxb-annox-parent/samples/src/main/assembly/maven-src.xml @@ -0,0 +1,25 @@ + + maven-src + + zip + + + + + README* + LICENSE* + NOTICE* + + + + src + + + + + ${basedir}/project-pom.xml + pom.xml + true + + + diff --git a/pom.xml b/pom.xml index 63b72a037..b5aaad79a 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ jaxb-bom-parent + jaxb-annox-parent maven-plugin basics diff --git a/qrelease.bat b/qrelease.bat deleted file mode 100644 index 5bb9745bb..000000000 --- a/qrelease.bat +++ /dev/null @@ -1,79 +0,0 @@ -setlocal -echo Setting JAVA_HOME to %JAVA9_HOME%. -set JAVA_HOME=%JAVA9_HOME% - -echo Performing a full clean build. -rem pause -call mvn clean install -Pall,sonatype-oss-release -DperformRelease -echo Full clean build completed. -rem pause - -echo Setting new version to %1. -rem pause -call mvn versions:set -Pall -DnewVersion=%1 -echo Version was set to %1. -rem pause -call mvn versions:commit -Pall -echo Version %1 committed. -rem pause - -echo Performing a full clean build. -rem pause -call mvn clean install -Pall,sonatype-oss-release -DperformRelease -echo Full clean build completed. -rem pause - -echo Checking in version %1. -rem pause -git commit -a -m "Version %1" -echo Version %1 was checked in. -rem pause - -echo Tagging version %1. -rem pause -git tag -a %1 -m "Version %1" -echo Version %1 was tagged. -rem pause - -echo Pushing version %1. -rem pause -git push origin master -git push --tags origin master -echo Version %1 was pushed. -rem pause - -echo Performing full clean deploy. -rem pause -call mvn -DperformRelease -Pall,sonatype-oss-release clean deploy -echo Full clean deploy done. -rem pause - -echo Setting new version to %2. -rem pause -call mvn versions:set -Pall -DnewVersion=%2 -echo Version was set to %2. -rem pause -call mvn versions:commit -Pall -echo Version %2 was committed. -rem pause - -echo Performing a full clean build. -rem pause -call mvn clean install -DperformRelease -Pall,sonatype-oss-release -echo Full clean build completed. -rem pause - -echo Checking in version %2. -rem pause -git commit -a -m "Version %2" -echo Version %2 was checked in. -rem pause - -echo Pushing version %2. -rem pause -git push origin master -git push --tags origin master -echo Version %2 was pushed. -rem pause - -endlocal \ No newline at end of file diff --git a/release.bat b/release.bat deleted file mode 100644 index f8f765912..000000000 --- a/release.bat +++ /dev/null @@ -1,79 +0,0 @@ -setlocal -echo Setting JAVA_HOME to %JAVA7_HOME%. -set JAVA_HOME=%JAVA7_HOME% - -echo Performing a full clean build. -pause -call mvn clean install -DperformRelease -Pall -echo Full clean build completed. -pause - -echo Setting new version to %1. -pause -call mvn versions:set -Pall -DnewVersion=%1 -echo Version was set to %1. -pause -call mvn versions:commit -Pall -echo Version %1 committed. -pause - -echo Performing a full clean build. -pause -call mvn clean install -Pall -DperformRelease -echo Full clean build completed. -pause - -echo Checking in version %1. -pause -git commit -a -m "Version %1" -echo Version %1 was checked in. -pause - -echo Tagging version %1. -pause -git tag -a %1 -m "Version %1" -echo Version %1 was tagged. -pause - -echo Pushing version %1. -pause -git push origin master -git push --tags origin master -echo Version %1 was pushed. -pause - -echo Performing full clean deploy. -pause -call mvn -DperformRelease -Psonatype-oss-release,all clean deploy -echo Full clean deploy done. -pause - -echo Setting new version to %2. -pause -call mvn versions:set -Pall -DnewVersion=%2 -echo Version was set to %2. -pause -call mvn versions:commit -Pall -echo Version %2 was committed. -pause - -echo Performing a full clean build. -pause -call mvn clean install -DperformRelease -Pall -echo Full clean build completed. -pause - -echo Checking in version %2. -pause -git commit -a -m "Version %2" -echo Version %2 was checked in. -pause - -echo Pushing version %2. -pause -git push origin master -git push --tags origin master -echo Version %2 was pushed. -pause - -endlocal \ No newline at end of file