Skip to content

Commit 0634bac

Browse files
committed
#21 - ENH: Support non-default constructor for form beans
1 parent ef3d4c8 commit 0634bac

File tree

1 file changed

+56
-6
lines changed

1 file changed

+56
-6
lines changed

src/main/java/io/dinject/javalin/generator/BeanParamReader.java

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package io.dinject.javalin.generator;
22

33
import javax.lang.model.element.Element;
4+
import javax.lang.model.element.ExecutableElement;
45
import javax.lang.model.element.TypeElement;
6+
import javax.lang.model.element.VariableElement;
7+
import java.util.ArrayList;
58
import java.util.HashSet;
69
import java.util.LinkedHashMap;
710
import java.util.List;
@@ -21,6 +24,8 @@ class BeanParamReader {
2124

2225
private final Map<String, FieldReader> fieldMap = new LinkedHashMap<>();
2326

27+
private final List<ExecutableElement> constructors = new ArrayList<>();
28+
2429
BeanParamReader(ProcessingContext ctx, TypeElement beanType, String beanVarName, String beanShortType, ParamType defaultParamType) {
2530
this.ctx = ctx;
2631
this.beanType = beanType;
@@ -35,6 +40,9 @@ private void read() {
3540

3641
for (Element enclosedElement : beanType.getEnclosedElements()) {
3742
switch (enclosedElement.getKind()) {
43+
case CONSTRUCTOR:
44+
constructors.add((ExecutableElement) enclosedElement);
45+
break;
3846
case METHOD:
3947
readMethod(enclosedElement);
4048
break;
@@ -60,28 +68,59 @@ private void readMethod(Element enclosedElement) {
6068

6169
void write(Append writer) {
6270

63-
writer.append(" new %s();", beanShortType).eol();
71+
writer.append(" new %s(", beanShortType);
72+
final Set<String> constructorParams = writeConstructorParams(writer);
73+
writer.append(");").eol();
6474

6575
for (String setterMethod : setterMethods) {
6676
String propName = Util.propertyName(setterMethod);
67-
FieldReader field = fieldMap.get(propName);
68-
if (field != null) {
69-
field.setUseSetter(setterMethod);
77+
if (!constructorParams.contains(propName)) {
78+
FieldReader field = fieldMap.get(propName);
79+
if (field != null) {
80+
field.setUseSetter(setterMethod);
81+
}
7082
}
7183
}
7284

7385
for (FieldReader field : fieldMap.values()) {
74-
field.writeSet(writer, beanVarName);
86+
if (!field.isConstructorParam()) {
87+
field.writeSet(writer, beanVarName);
88+
}
7589
}
7690
writer.eol();
7791
}
7892

93+
private Set<String> writeConstructorParams(Append writer) {
94+
Set<String> paramsUsed = new HashSet<>();
95+
if (constructors.size() == 1) {
96+
int count = 0;
97+
for (VariableElement parameter : constructors.get(0).getParameters()) {
98+
final String paramName = parameter.getSimpleName().toString();
99+
final FieldReader field = fieldMap.get(paramName);
100+
if (field != null) {
101+
if (count++ > 0) {
102+
writer.append(", ");
103+
}
104+
writer.eol().append(" ");
105+
field.writeConstructorParam(writer);
106+
paramsUsed.add(paramName);
107+
}
108+
}
109+
if (count > 0) {
110+
writer.eol().append(" ");
111+
}
112+
}
113+
return paramsUsed;
114+
}
115+
79116
static class FieldReader {
80117

81118
private final ElementReader element;
82119

83120
private String setterMethod;
84121

122+
private boolean constructorParam;
123+
85124
FieldReader(ProcessingContext ctx, Element enclosedElement, ParamType defaultParamType) {
86125
this.element = new ElementReader(enclosedElement, ctx, defaultParamType, false);
87126
}
@@ -95,13 +134,25 @@ public String toString() {
95134
return element.toString();
96135
}
97136

137+
void writeConstructorParam(Append writer) {
138+
// populate in constructor
139+
constructorParam = true;
140+
element.setValue(writer);
141+
}
142+
143+
boolean isConstructorParam() {
144+
return constructorParam;
145+
}
146+
98147
void writeSet(Append writer, String beanVarName) {
99148
if (setterMethod != null) {
149+
// populate via setter method
100150
writer.append(" %s.%s(", beanVarName, setterMethod);
101151
element.setValue(writer);
102152
writer.append(");").eol();
103153

104154
} else {
155+
// populate via field put
105156
writer.append(" %s.%s = ", beanVarName, getVarName());
106157
element.setValue(writer);
107158
writer.append(";").eol();
@@ -113,5 +164,4 @@ void setUseSetter(String setterMethod) {
113164
}
114165
}
115166

116-
117167
}

0 commit comments

Comments
 (0)