|
1 | 1 | package com.github.sabomichal.immutablexjc;
|
2 | 2 |
|
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.*; |
45 | 4 | import com.sun.tools.xjc.Options;
|
46 | 5 | import com.sun.tools.xjc.Plugin;
|
47 | 6 | import com.sun.tools.xjc.outline.ClassOutline;
|
|
53 | 12 | import org.apache.commons.lang3.reflect.FieldUtils;
|
54 | 13 | import org.xml.sax.ErrorHandler;
|
55 | 14 |
|
| 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 | + |
56 | 24 | /**
|
57 | 25 | * IMMUTABLE-XJC plugin implementation.
|
58 | 26 | *
|
@@ -213,9 +181,7 @@ public String getUsage() {
|
213 | 181 | private void appendOption(StringBuilder retval, String option, String description, String n, int optionColumnWidth) {
|
214 | 182 | retval.append(" ");
|
215 | 183 | 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()))); |
219 | 185 | retval.append(" : ");
|
220 | 186 | retval.append(description);
|
221 | 187 | retval.append(n);
|
@@ -345,7 +311,7 @@ private JMethod addBuildMethod(JDefinedClass clazz, JDefinedClass builderClass,
|
345 | 311 | JBlock block = method.body();
|
346 | 312 | JConditional conditional = block._if(field.eq(JExpr._null()));
|
347 | 313 | 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.")); |
349 | 315 | }
|
350 | 316 | constructorInvocation.arg(JExpr.ref(field.name()));
|
351 | 317 | }
|
@@ -814,13 +780,14 @@ private JMethod generateCopyConstructor(final JDefinedClass clazz, final JDefine
|
814 | 780 |
|
815 | 781 | for (JFieldVar field : superclassFields) {
|
816 | 782 | String propertyName = field.name();
|
817 |
| - JType type = field.type(); |
818 | 783 | JMethod getter = getGetterProperty(field, clazz);
|
819 | 784 | if (isCollection(field)) {
|
820 | 785 | JVar tmpVar = ctor.body().decl(0, getJavaType(field), "_" + propertyName, JExpr.invoke(o, getter));
|
821 | 786 | JConditional conditional = ctor.body()._if(tmpVar.eq(JExpr._null()));
|
822 | 787 | conditional._then().assign(JExpr.refthis(propertyName), getNewCollectionExpression(codeModel, getJavaType(field)));
|
823 | 788 | 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())); |
824 | 791 | } else {
|
825 | 792 | ctor.body().assign(JExpr.refthis(propertyName), JExpr.invoke(o, getter));
|
826 | 793 | }
|
|
0 commit comments