[DEV] update real separation between the node and the properties

This commit is contained in:
Edouard DUPIN 2021-07-03 00:12:50 +02:00
parent 956f78642b
commit d4b528eedf
4 changed files with 332 additions and 45 deletions

View File

@ -7,16 +7,17 @@ import org.atriasoft.exml.exception.ExmlBuilderException;
public abstract class IntrospectionModel {
protected static final Boolean DEFAULT_ATTRIBUTE = false;
protected static final Boolean DEFAULT_CASE_SENSITIVE = true;
protected static final Boolean DEFAULT_MANAGED = true;
protected static final Boolean DEFAULT_OPTIONAL = false;
protected final Class<?> classType;
public List<IntrospectionProperty> getMethods() {
public List<IntrospectionProperty> getNodes() {
return null;
}
public List<IntrospectionProperty> getProperties() {
public List<IntrospectionProperty> getAttributes() {
return null;
}
public Class<?> getClassType() {

View File

@ -16,7 +16,9 @@ import java.util.stream.Collectors;
import org.atriasoft.eStringSerialize.StringSerializer;
import org.atriasoft.etk.util.ArraysTools;
import org.atriasoft.exml.annotation.XmlAttribute;
import org.atriasoft.exml.annotation.XmlCaseSensitive;
import org.atriasoft.exml.annotation.XmlDefaultAttibute;
import org.atriasoft.exml.annotation.XmlDefaultCaseSensitive;
import org.atriasoft.exml.annotation.XmlDefaultManaged;
import org.atriasoft.exml.annotation.XmlDefaultOptional;
@ -33,23 +35,24 @@ public class IntrospectionModelComplex extends IntrospectionModel {
// TODO Optimize this with external object for basic types....
private final Method valueof; // used for the set Text if the object is an end point...
private final List<IntrospectionProperty> methods = new ArrayList<>();
private final List<IntrospectionProperty> nodes = new ArrayList<>();
private final List<IntrospectionProperty> properties = new ArrayList<>();
private final List<IntrospectionProperty> attributes = new ArrayList<>();
@Override
public List<IntrospectionProperty> getMethods() {
return this.methods;
public List<IntrospectionProperty> getNodes() {
return this.nodes;
}
@Override
public List<IntrospectionProperty> getProperties() {
return this.properties;
public List<IntrospectionProperty> getAttributes() {
return this.attributes;
}
public IntrospectionModelComplex(final Class<?> classType) throws ExmlBuilderException {
super(classType);
try {
final Boolean isDefaultAttribute = getIsDefaultAttribute(classType, IntrospectionModel.DEFAULT_ATTRIBUTE);
final Boolean isDefaultManaged = getIsDefaultManaged(classType, IntrospectionModel.DEFAULT_MANAGED);
final Boolean isDefaultOptional = getIsDefaultOptional(classType, IntrospectionModel.DEFAULT_OPTIONAL);
final Boolean isDefaultCaseSensitive = getIsDefaultCaseSensitive(classType, IntrospectionModel.DEFAULT_CASE_SENSITIVE);
@ -70,6 +73,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
if (!Modifier.isPublic(elem.getModifiers())) {
continue;
}
final Boolean isAttribute = getIsAttribute(elem, isDefaultAttribute);
final Boolean isManaged = getIsManaged(elem, isDefaultManaged);
final Boolean isOptionnal = getIsOptional(elem, isDefaultOptional);
final String[] names = getNames(elem, Tools.decapitalizeFirst(elem.getName()));
@ -77,7 +81,11 @@ public class IntrospectionModelComplex extends IntrospectionModel {
final String listName = getListName(elem, null);
// TODO check if property does not already exist ...
if (isManaged) {
this.properties.add(new IntrospectionPropertyField(elem, names, listName, caseSensitive, isOptionnal));
if (isAttribute) {
this.attributes.add(new IntrospectionPropertyField(elem, names, listName, caseSensitive, isOptionnal));
} else {
this.nodes.add(new IntrospectionPropertyField(elem, names, listName, caseSensitive, isOptionnal));
}
}
Log.verbose(" - " + elem.toGenericString());
}
@ -234,6 +242,13 @@ public class IntrospectionModelComplex extends IntrospectionModel {
if (elem.setter != null && elem.getter != null) {
Log.info(" setter: " + elem.setter.toGenericString());
Log.info(" getter: " + elem.getter.toGenericString());
final Boolean isAttributeSet = getIsAttribute(elem.setter, null);
final Boolean isAttributeGet = getIsAttribute(elem.getter, null);
if (isAttributeSet != null && isAttributeGet != null && isAttributeSet != isAttributeGet) {
throw new Exception("Can net set oposite information on getter and setter");
}
final Boolean isAttribute = isAttributeSet != null ? isAttributeSet : isAttributeGet != null ? isAttributeGet : isDefaultAttribute;
final Boolean isManagedSet = getIsManaged(elem.setter, null);
final Boolean isManagedGet = getIsManaged(elem.getter, null);
if (isManagedSet != null && isManagedGet != null && isManagedSet != isManagedGet) {
@ -265,15 +280,21 @@ public class IntrospectionModelComplex extends IntrospectionModel {
final String listNameSet = getListName(elem.setter, null);
final String listNameGet = getListName(elem.getter, null);
final String listName = listNameSet != null? listNameSet: listNameGet;
this.methods.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptional));
if (isAttribute) {
this.attributes.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptional));
} else {
this.nodes.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptional));
}
} else {
Boolean isManaged = null;
Boolean isOptionnal = null;
String[] names = null;
Boolean isCaseSensitive = null;
String listName = null;
Boolean isAttribute = isDefaultAttribute;
if (elem.setter != null) {
Log.info(" setter: " + elem.setter.toGenericString());
isAttribute = getIsAttribute(elem.setter, isDefaultAttribute);
isManaged = getIsManaged(elem.setter, isDefaultManaged);
isOptionnal = getIsOptional(elem.setter, isDefaultOptional);
names = getNames(elem.setter, Tools.decapitalizeFirst(elem.name));
@ -284,6 +305,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
}
if (elem.getter != null) {
Log.info(" getter: " + elem.getter.toGenericString());
isAttribute = getIsAttribute(elem.getter, isDefaultAttribute);
isManaged = getIsManaged(elem.getter, isDefaultManaged);
isOptionnal = getIsOptional(elem.getter, isDefaultOptional);
names = getNames(elem.getter, Tools.decapitalizeFirst(elem.name));
@ -293,7 +315,11 @@ public class IntrospectionModelComplex extends IntrospectionModel {
Log.info(" getter: null");
}
if (isManaged) {
this.methods.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptionnal));
if (isAttribute) {
this.attributes.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptionnal));
} else {
this.nodes.add(new IntrospectionPropertyMethod(elem.setter, elem.getter, names, listName, isCaseSensitive, isOptionnal));
}
}
}
}
@ -330,16 +356,16 @@ public class IntrospectionModelComplex extends IntrospectionModel {
@Override
protected List<String> getNodeAvaillable() {
List<String> out = new ArrayList<>();
for (final IntrospectionProperty prop : this.methods) {
out.add(prop.getNames()[0]);
}
for (final IntrospectionProperty prop : this.properties) {
for (final IntrospectionProperty prop : this.nodes) {
out.add(prop.getNames()[0]);
}
// for (final IntrospectionProperty prop : this.attributes) {
// out.add(prop.getNames()[0]);
// }
return out;
}
protected IntrospectionProperty findMethodDescription(final String propertyName) throws ExmlBuilderException {
for (final IntrospectionProperty prop : this.methods) {
protected IntrospectionProperty findNodeDescription(final String propertyName) throws ExmlBuilderException {
for (final IntrospectionProperty prop : this.nodes) {
if (prop.isCompatible(propertyName)) {
return prop;
}
@ -348,7 +374,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
}
protected IntrospectionProperty findPropertyDescription(final String propertyName) throws ExmlBuilderException {
for (final IntrospectionProperty prop : this.properties) {
for (final IntrospectionProperty prop : this.attributes) {
if (prop.isCompatible(propertyName)) {
return prop;
}
@ -362,7 +388,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlCaseSensitive) annotation[0]).value();
}
@ -373,7 +399,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlCaseSensitive) annotation[0]).value();
}
@ -384,10 +410,21 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlDefaultCaseSensitive) annotation[0]).value();
}
private Boolean getIsDefaultAttribute(final Class<?> classType, final Boolean defaultValue) throws ExmlBuilderException {
final Annotation[] annotation = classType.getDeclaredAnnotationsByType(XmlDefaultAttibute.class);
if (annotation.length == 0) {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlDefaultAttibute) annotation[0]).value();
}
private Boolean getIsDefaultManaged(final Class<?> classType, final Boolean defaultValue) throws ExmlBuilderException {
final Annotation[] annotation = classType.getDeclaredAnnotationsByType(XmlDefaultManaged.class);
@ -395,7 +432,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlDefaultManaged) annotation[0]).value();
}
@ -406,18 +443,40 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlDefaultOptional) annotation[0]).value();
}
protected Boolean getIsAttribute(final Field element, final Boolean parentValue) throws ExmlBuilderException {
final Annotation[] annotation = element.getDeclaredAnnotationsByType(XmlAttribute.class);
if (annotation.length == 0) {
return parentValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlAttribute) annotation[0]).value();
}
protected Boolean getIsAttribute(final Method element, final Boolean parentValue) throws ExmlBuilderException {
final Annotation[] annotation = element.getDeclaredAnnotationsByType(XmlAttribute.class);
if (annotation.length == 0) {
return parentValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlAttribute) annotation[0]).value();
}
protected Boolean getIsManaged(final Field element, final Boolean parentValue) throws ExmlBuilderException {
final Annotation[] annotation = element.getDeclaredAnnotationsByType(XmlManaged.class);
if (annotation.length == 0) {
return parentValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlManaged) annotation[0]).value();
}
@ -428,7 +487,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return parentValue;
}
if (annotation.length > 1) {
throw new ExmlBuilderException("Must not hame more that ");
throw new ExmlBuilderException("Must not have more that ");
}
return ((XmlManaged) annotation[0]).value();
}
@ -439,7 +498,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return parentValue;
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
return ((XmlOptional) annotation[0]).value();
}
@ -450,7 +509,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return parentValue;
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
return ((XmlOptional) annotation[0]).value();
}
@ -464,7 +523,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return new String[] { defaultValue };
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
final String[] tmp = ((XmlName) annotation[0]).value();
if (tmp == null) {
@ -493,7 +552,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return new String[] { defaultValue };
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
final String[] tmp = ((XmlName) annotation[0]).value();
if (tmp == null) {
@ -519,7 +578,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
final String tmp = ((XmlList) annotation[0]).value();
if (tmp == null) {
@ -533,7 +592,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
return defaultValue;
}
if (annotation.length > 1) {
throw new Exception("Must not hame more that ");
throw new Exception("Must not have more that ");
}
final String tmp = ((XmlList) annotation[0]).value();
if (tmp == null) {
@ -555,7 +614,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
private void setValue(final Object data, final String name, final Object value) throws ExmlBuilderException {
Log.error(" Set value ='" + name + "' propertyValue='" + value + "' " + value.getClass().getCanonicalName());
// by default use setter to set the property
final IntrospectionProperty propMethode = findMethodDescription(name);
final IntrospectionProperty propMethode = findNodeDescription(name);
if (propMethode != null && propMethode.canSetValue()) {
Log.verbose(" ==> find '" + Arrays.toString(propMethode.getNames()) + " type=" + propMethode.getType() + " sub-type=" + propMethode.getSubType() );
if (propMethode.getType().isAssignableFrom(value.getClass())) {
@ -676,7 +735,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
public Class<?> getTypeOfSubNode(final Object data, final String nodeName) throws ExmlBuilderException {
Log.error(" nodeType='" + nodeName + "'");
// by default use setter to set the property
final IntrospectionProperty propMethode = findMethodDescription(nodeName);
final IntrospectionProperty propMethode = findNodeDescription(nodeName);
if (propMethode != null && propMethode.canSetValue()) {
Log.error(" ==> find '" + propMethode.getNames());
return propMethode.getType();
@ -694,7 +753,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
public Class<?> getTypeOfSubNodeList(final Object data, final String nodeName) throws ExmlBuilderException {
Log.error(" nodeType='" + nodeName + "'");
// by default use setter to set the property
final IntrospectionProperty propMethode = findMethodDescription(nodeName);
final IntrospectionProperty propMethode = findNodeDescription(nodeName);
if (propMethode != null && propMethode.canSetValue()) {
Log.error(" ==> find '" + propMethode.getNames());
return propMethode.getSubType();
@ -711,7 +770,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
public String getTreeNameOfSubNode(final Object data, final String nodeName) throws ExmlBuilderException {
Log.error(" nodeType='" + nodeName + "'");
// by default use setter to set the property
final IntrospectionProperty propMethode = findMethodDescription(nodeName);
final IntrospectionProperty propMethode = findNodeDescription(nodeName);
if (propMethode != null && propMethode.canSetValue()) {
Log.error(" ==> find '" + propMethode.getNames());
return propMethode.getListName();
@ -780,7 +839,7 @@ public class IntrospectionModelComplex extends IntrospectionModel {
public Object getValue(final String propertyName, final String propertyValue) throws ExmlBuilderException {
Log.error(" propertyName='" + propertyName + "' propertyValue='" + propertyValue + "' ");
// by default use setter to set the property
final IntrospectionProperty propMethode = findMethodDescription(propertyName);
final IntrospectionProperty propMethode = findNodeDescription(propertyName);
if (propMethode != null && propMethode.canSetValue()) {
Log.verbose(" ==> find '" + propMethode.getNames());
return propMethode.createValue(propertyValue);

View File

@ -34,7 +34,7 @@ public class GeneratorIntrospection implements Generator {
}
public void generateProperties(final Object data, final IntrospectionModel introspection, final StringBuilder tmpp) throws ExmlBuilderException {
List<IntrospectionProperty> elements = introspection.getProperties();
List<IntrospectionProperty> elements = introspection.getAttributes();
if (elements == null) {
return;
}
@ -54,7 +54,7 @@ public class GeneratorIntrospection implements Generator {
}
}
public void generateSubNodes(final Object data, final IntrospectionModel introspection, final StringBuilder tmpp, final int indent) throws ExmlBuilderException {
List<IntrospectionProperty> elements = introspection.getMethods();
List<IntrospectionProperty> elements = introspection.getNodes();
for (IntrospectionProperty elem : elements) {
if (!elem.canGetValue()) {
continue;
@ -109,7 +109,7 @@ public class GeneratorIntrospection implements Generator {
tmpp.append("<");
tmpp.append(nodeName);
generateProperties(data, introspection, tmpp);
if (introspection.getMethods().size() != 0) {
if (introspection.getNodes().size() != 0) {
tmpp.append(">");
generateSubNodes(data, introspection, tmpp, indent + 1);
Tools.addIndent(tmpp, indent);

View File

@ -100,19 +100,19 @@ public class ExmlTestIntrospectionBoolean {
private Boolean valueA;
private Boolean valueB;
private Boolean valueNull;
public Boolean getValueA() {
public Boolean isValueA() {
return this.valueA;
}
public void setValueA(final Boolean valueA) {
this.valueA = valueA;
}
public Boolean getValueB() {
public Boolean isValueB() {
return this.valueB;
}
public void setValueB(final Boolean valueB) {
this.valueB = valueB;
}
public Boolean getValueNull() {
public Boolean isValueNull() {
return this.valueNull;
}
public void setValueNull(final Boolean valueNull) {
@ -134,9 +134,9 @@ public class ExmlTestIntrospectionBoolean {
Assertions.assertEquals("<elem valueA=\"false\" valueB=\"true\"/>", dataTest);
final TestBooleanFunc root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestBooleanFunc.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(false, root.getValueA());
Assertions.assertEquals(true, root.getValueB());
Assertions.assertEquals(null, root.getValueNull());
Assertions.assertEquals(false, root.isValueA());
Assertions.assertEquals(true, root.isValueB());
Assertions.assertEquals(null, root.isValueNull());
}
@XmlDefaultAttibute
@ -203,6 +203,233 @@ public class ExmlTestIntrospectionBoolean {
Assertions.assertEquals(false, root.getValues().get(3));
Assertions.assertEquals(true, root.getValues().get(4));
}
public class TestNodeBoolean {
public Boolean valueA;
public Boolean valueB;
public Boolean valueNull;
}
@Test
public void testModelNodeBoolean() {
TestNodeBoolean elem = new TestNodeBoolean();
elem.valueA = false;
elem.valueB = true;
elem.valueNull = null;
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem>\n"
+ " <valueA>false</valueA>\n"
+ " <valueB>true</valueB>\n"
+ "</elem>", dataTest);
final TestNodeBoolean root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestNodeBoolean.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(false, root.valueA);
Assertions.assertEquals(true, root.valueB);
Assertions.assertEquals(null, root.valueNull);
}
public class TestArrayNodeBoolean {
public Boolean[] values;
}
@Test
public void testModelArrayNodeBoolean() {
TestArrayNodeBoolean elem = new TestArrayNodeBoolean();
elem.values = new Boolean[] {false, false, true, false, true};
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem>\n"
+ " <values>false</values>\n"
+ " <values>false</values>\n"
+ " <values>true</values>\n"
+ " <values>false</values>\n"
+ " <values>true</values>\n"
+ "</elem>", dataTest);
final TestArrayNodeBoolean root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestArrayNodeBoolean.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(5, root.values.length);
Assertions.assertEquals(false, root.values[0]);
Assertions.assertEquals(false, root.values[1]);
Assertions.assertEquals(true, root.values[2]);
Assertions.assertEquals(false, root.values[3]);
Assertions.assertEquals(true, root.values[4]);
}
public class TestListNodeBoolean {
public List<Boolean> values;
}
@Test
public void testModelListNodeBoolean() {
TestListNodeBoolean elem = new TestListNodeBoolean();
elem.values = List.of(false, false, true, false, true);
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem values=\"false;false;true;false;true\"/>", dataTest);
final TestListNodeBoolean root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestListNodeBoolean.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(5, root.values.size());
Assertions.assertEquals(false, root.values.get(0));
Assertions.assertEquals(false, root.values.get(1));
Assertions.assertEquals(true, root.values.get(2));
Assertions.assertEquals(false, root.values.get(3));
Assertions.assertEquals(true, root.values.get(4));
}
public class TestNodeBooleanFunc {
private Boolean valueA;
private Boolean valueB;
private Boolean valueNull;
public Boolean isValueA() {
return this.valueA;
}
public void setValueA(final Boolean valueA) {
this.valueA = valueA;
}
public Boolean isValueB() {
return this.valueB;
}
public void setValueB(final Boolean valueB) {
this.valueB = valueB;
}
public Boolean isValueNull() {
return this.valueNull;
}
public void setValueNull(final Boolean valueNull) {
this.valueNull = valueNull;
}
}
@Test
public void testModelNodeBooleanFunc() {
TestNodeBooleanFunc elem = new TestNodeBooleanFunc();
elem.setValueA(false);
elem.setValueB(true);
elem.setValueNull(null);
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem>\n"
+ " <valueA>false</valueA>\n"
+ " <valueB>true</valueB>\n"
+ "</elem>", dataTest);
final TestNodeBooleanFunc root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestNodeBooleanFunc.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(false, root.isValueA());
Assertions.assertEquals(true, root.isValueB());
Assertions.assertEquals(null, root.isValueNull());
}
public class TestArrayNodeBooleanFunc {
private Boolean[] values;
public Boolean[] getValues() {
return this.values;
}
public void setValues(final Boolean[] values) {
this.values = values;
}
}
@Test
public void testModelArrayNodeBooleanFunc() {
TestArrayNodeBooleanFunc elem = new TestArrayNodeBooleanFunc();
elem.setValues(new Boolean[] {false, false, true, false, true});
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem>\n"
+ " <values>false</values>\n"
+ " <values>false</values>\n"
+ " <values>true</values>\n"
+ " <values>false</values>\n"
+ " <values>true</values>\n"
+ "</elem>", dataTest);
final TestArrayNodeBooleanFunc root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestArrayNodeBooleanFunc.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(5, root.getValues().length);
Assertions.assertEquals(false, root.getValues()[0]);
Assertions.assertEquals(false, root.getValues()[1]);
Assertions.assertEquals(true, root.getValues()[2]);
Assertions.assertEquals(false, root.getValues()[3]);
Assertions.assertEquals(true, root.getValues()[4]);
}
public class TestListNodeBooleanFunc {
private List<Boolean> values;
public List<Boolean> getValues() {
return this.values;
}
public void setValues(final List<Boolean> values) {
this.values = values;
}
}
@Test
public void testModelListNodeBooleanFunc() {
TestListNodeBooleanFunc elem = new TestListNodeBooleanFunc();
elem.setValues(List.of(false, false, true, false, true));
StringBuilder builder = new StringBuilder();
Assertions.assertDoesNotThrow(() -> Exml.generate(elem, ExmlTestIntrospectionBoolean.NODE_NAME, builder));
String dataTest = builder.toString();
Log.warning("data generated: " + builder.toString());
Assertions.assertEquals("<elem values=\"false;false;true;false;true\"/>", dataTest);
final TestListNodeBooleanFunc root = Assertions.assertDoesNotThrow(() -> Exml.parseOne(dataTest, TestListNodeBooleanFunc.class, ExmlTestIntrospectionBoolean.NODE_NAME));
Assertions.assertEquals(5, root.getValues().size());
Assertions.assertEquals(false, root.getValues().get(0));
Assertions.assertEquals(false, root.getValues().get(1));
Assertions.assertEquals(true, root.getValues().get(2));
Assertions.assertEquals(false, root.getValues().get(3));
Assertions.assertEquals(true, root.getValues().get(4));
}