Skip to content

Commit d6ef4a3

Browse files
jecedesabomichal
andauthored
Cc parent optionals fix (#143)
* support optional getters * add optional field * correct faulty commit edited the wrong part in the web editor * #142 tests in progress * support no optional getters setting --------- Co-authored-by: Michal Sabo <michal.sabo@nike.sk>
1 parent ec75d59 commit d6ef4a3

File tree

7 files changed

+24
-54
lines changed

7 files changed

+24
-54
lines changed

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@
8080
<artifactId>maven-compiler-plugin</artifactId>
8181
<version>3.13.0</version>
8282
<configuration>
83-
<release>8</release>
8483
<debug>true</debug>
8584
<optimize>true</optimize>
8685
<showDeprecation>true</showDeprecation>
@@ -370,6 +369,8 @@
370369
<forceRegenerate>true</forceRegenerate>
371370
<args>
372371
<arg>-Ximm</arg>
372+
<arg>-Ximm-builder</arg>
373+
<arg>-Ximm-cc</arg>
373374
<arg>-Ximm-optionalgetter</arg>
374375
</args>
375376
</configuration>

src/main/java/com/github/sabomichal/immutablexjc/PluginImpl.java

Lines changed: 14 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,6 @@
11
package com.github.sabomichal.immutablexjc;
22

3-
import java.beans.Introspector;
4-
import java.io.StringWriter;
5-
import java.text.MessageFormat;
6-
import java.util.ArrayList;
7-
import java.util.Arrays;
8-
import java.util.Collection;
9-
import java.util.Collections;
10-
import java.util.Comparator;
11-
import java.util.HashMap;
12-
import java.util.HashSet;
13-
import java.util.Iterator;
14-
import java.util.List;
15-
import java.util.Map;
16-
import java.util.Optional;
17-
import java.util.ResourceBundle;
18-
import java.util.Set;
19-
import java.util.SortedMap;
20-
import java.util.SortedSet;
21-
import java.util.TreeMap;
22-
import java.util.TreeSet;
23-
import java.util.logging.Level;
24-
import java.util.stream.Collectors;
25-
import java.util.stream.IntStream;
26-
import java.util.stream.Stream;
27-
28-
import com.sun.codemodel.JAnnotationUse;
29-
import com.sun.codemodel.JAnnotationValue;
30-
import com.sun.codemodel.JBlock;
31-
import com.sun.codemodel.JClass;
32-
import com.sun.codemodel.JClassAlreadyExistsException;
33-
import com.sun.codemodel.JCodeModel;
34-
import com.sun.codemodel.JConditional;
35-
import com.sun.codemodel.JDefinedClass;
36-
import com.sun.codemodel.JExpr;
37-
import com.sun.codemodel.JExpression;
38-
import com.sun.codemodel.JFieldVar;
39-
import com.sun.codemodel.JFormatter;
40-
import com.sun.codemodel.JInvocation;
41-
import com.sun.codemodel.JMethod;
42-
import com.sun.codemodel.JMod;
43-
import com.sun.codemodel.JType;
44-
import com.sun.codemodel.JVar;
3+
import com.sun.codemodel.*;
454
import com.sun.tools.xjc.Options;
465
import com.sun.tools.xjc.Plugin;
476
import com.sun.tools.xjc.outline.ClassOutline;
@@ -53,6 +12,15 @@
5312
import org.apache.commons.lang3.reflect.FieldUtils;
5413
import org.xml.sax.ErrorHandler;
5514

15+
import java.beans.Introspector;
16+
import java.io.StringWriter;
17+
import java.text.MessageFormat;
18+
import java.util.*;
19+
import java.util.logging.Level;
20+
import java.util.stream.Collectors;
21+
import java.util.stream.IntStream;
22+
import java.util.stream.Stream;
23+
5624
/**
5725
* IMMUTABLE-XJC plugin implementation.
5826
*
@@ -213,9 +181,7 @@ public String getUsage() {
213181
private void appendOption(StringBuilder retval, String option, String description, String n, int optionColumnWidth) {
214182
retval.append(" ");
215183
retval.append(option);
216-
for (int i = option.length(); i < optionColumnWidth; i++) {
217-
retval.append(' ');
218-
}
184+
retval.append(" ".repeat(Math.max(0, optionColumnWidth - option.length())));
219185
retval.append(" : ");
220186
retval.append(description);
221187
retval.append(n);
@@ -345,7 +311,7 @@ private JMethod addBuildMethod(JDefinedClass clazz, JDefinedClass builderClass,
345311
JBlock block = method.body();
346312
JConditional conditional = block._if(field.eq(JExpr._null()));
347313
conditional._then()._throw(JExpr._new(builderClass.owner().ref(NullPointerException.class))
348-
.arg("Required field '" + field.name() + "' have to be assigned a value."));
314+
.arg("Required field '" + field.name() + "' have to be assigned a value."));
349315
}
350316
constructorInvocation.arg(JExpr.ref(field.name()));
351317
}
@@ -814,13 +780,14 @@ private JMethod generateCopyConstructor(final JDefinedClass clazz, final JDefine
814780

815781
for (JFieldVar field : superclassFields) {
816782
String propertyName = field.name();
817-
JType type = field.type();
818783
JMethod getter = getGetterProperty(field, clazz);
819784
if (isCollection(field)) {
820785
JVar tmpVar = ctor.body().decl(0, getJavaType(field), "_" + propertyName, JExpr.invoke(o, getter));
821786
JConditional conditional = ctor.body()._if(tmpVar.eq(JExpr._null()));
822787
conditional._then().assign(JExpr.refthis(propertyName), getNewCollectionExpression(codeModel, getJavaType(field)));
823788
conditional._else().assign(JExpr.refthis(propertyName), getDefensiveCopyExpression(codeModel, getJavaType(field), tmpVar));
789+
} else if (optionalGetter && !isRequired(field)) {
790+
ctor.body().assign(JExpr.refthis(propertyName), JExpr.invoke(o, getter).invoke("orElse").arg(JExpr._null()));
824791
} else {
825792
ctor.body().assign(JExpr.refthis(propertyName), JExpr.invoke(o, getter));
826793
}

src/test/java/com/github/sabomichal/immutablexjc/test/TestBasic.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ public void testMarshall() throws Exception {
4141
by1.add(x1);
4242
NameExpression y1 = new NameExpression("y");
4343
by1.add(y1);
44-
Declaration declaration1 = new Declaration(by1, "name", new HashMap<>(),"doc", "type");
44+
Declaration declaration1 = new Declaration(by1, "name", "comment", new HashMap<>(),"doc", "type");
4545
parameter.add(declaration1);
4646

4747
List<NameExpression> by2 = new ArrayList<>();
4848
NameExpression x2 = new NameExpression("x");
4949
by2.add(x2);
5050
NameExpression y2 = new NameExpression("y");
5151
by2.add(y2);
52-
Declaration declaration2 = new Declaration(by2, "name", new HashMap<>(), "doc", "type");
52+
Declaration declaration2 = new Declaration(by2, "name", "comment", new HashMap<>(), "doc", "type");
5353
parameter.add(declaration2);
5454

5555
Parameters parameters = new Parameters(parameter);

src/test/java/com/github/sabomichal/immutablexjc/test/TestMiscOptions.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,11 @@ public void testCollectionsAreImmutable() {
9797

9898
@Test
9999
public void testOptionalGetter() {
100-
assertFalse(new com.github.sabomichal.immutablexjc.test.optionalgetter.Declaration(null, null, null, null, null)
100+
assertFalse(new com.github.sabomichal.immutablexjc.test.optionalgetter.Declaration(null, null, null,null, null, null)
101101
.getDocumentation()
102102
.isPresent());
103103

104-
assertTrue(new com.github.sabomichal.immutablexjc.test.optionalgetter.Declaration(null, null, null, "documentation", null)
104+
assertTrue(new com.github.sabomichal.immutablexjc.test.optionalgetter.Declaration(null, null, null, null, "documentation", null)
105105
.getDocumentation()
106106
.isPresent());
107107

src/test/java/com/github/sabomichal/immutablexjc/test/TestNoFinalClasses.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static class MyDeclaration extends Declaration {
3535
private final String myAdditionalElement;
3636

3737
public MyDeclaration(String myAdditionalElement) {
38-
super(new ArrayList<>(), "name", new HashMap<>(), "doc", "type");
38+
super(new ArrayList<>(), "name", "comment", new HashMap<>(), "doc", "type");
3939
this.myAdditionalElement = myAdditionalElement;
4040
}
4141

src/test/xsd/abstract.xsd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
<xs:element name="correlation_id" type="xs:string"/>
1919
<xs:element name="session_id" type="xs:string"/>
2020
<xs:element name="return_code" type="xs:string"/>
21+
<xs:element name="min_version" type="xs:string"/>
2122
</xs:sequence>
2223
</xs:complexType>
2324
<xs:element name="body" type="body"/>
2425
<xs:complexType name="body" abstract="true">
2526
<xs:sequence/>
2627
</xs:complexType>
27-
</xs:schema>
28+
</xs:schema>

src/test/xsd/basic.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<xs:element name="by" type="NameExpression" maxOccurs="unbounded" minOccurs="0"/>
3333
</xs:sequence>
3434
<xs:attribute name="name" type="xs:string" use="required"/>
35+
<xs:attribute name="comment" type="xs:string" use="optional"/>
3536
<xs:anyAttribute/>
3637
</xs:complexType>
3738
<xs:complexType name="NameExpression">

0 commit comments

Comments
 (0)