Skip to content

Commit

Permalink
[#520] extends toStringPlugin to generate toString methods on enums
Browse files Browse the repository at this point in the history
  • Loading branch information
laurentschoelens authored and mattrpav committed Mar 19, 2024
1 parent 9cbd8e7 commit d4a51e5
Show file tree
Hide file tree
Showing 8 changed files with 224 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.jvnet.jaxb.lang;

import org.jvnet.jaxb.locator.ObjectLocator;

/**
* Original submission by Kevin Senechal (kevin.senechal@dooapp.com) on 30/07/15.
*/
public class EnumToStringStrategy extends JAXBToStringStrategy {

public StringBuilder appendStart(ObjectLocator parentLocator, Object parent, StringBuilder stringBuilder) {
if (parent instanceof Enum) {
return stringBuilder;
} else {
return super.appendStart(parentLocator, parent, stringBuilder);
}
}

public StringBuilder appendEnd(ObjectLocator parentLocator, Object parent, StringBuilder stringBuilder) {
if (parent instanceof Enum) {
return appendEnum((Enum) parent, stringBuilder);
} else {
return super.appendEnd(parentLocator, parent, stringBuilder);
}
}

protected StringBuilder appendEnum(Enum e, StringBuilder stringBuilder) {
stringBuilder.append(e.name());
return stringBuilder;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

import javax.xml.namespace.QName;

import com.sun.codemodel.JFieldVar;
import com.sun.tools.xjc.outline.EnumOutline;
import org.jvnet.jaxb.lang.JAXBToStringStrategy;
import org.jvnet.jaxb.lang.ToString;
import org.jvnet.jaxb.lang.ToStringStrategy;
Expand Down Expand Up @@ -57,7 +60,7 @@ public void setFieldAccessorFactory(
this.fieldAccessorFactory = fieldAccessorFactory;
}

private String toStringStrategyClass = JAXBToStringStrategy.class.getName();
private String toStringStrategyClass = JAXBToStringStrategy.class.getName();;

public void setToStringStrategyClass(String toStringStrategy) {
this.toStringStrategyClass = toStringStrategy;
Expand All @@ -67,7 +70,17 @@ public String getToStringStrategyClass() {
return toStringStrategyClass;
}

public JExpression createToStringStrategy(JCodeModel codeModel) {
private boolean toStringEnums = false;

public void setToStringEnums(boolean toStringEnums) {
this.toStringEnums = toStringEnums;
}

public boolean isToStringEnums() {
return toStringEnums;
}

public JExpression createToStringStrategy(JCodeModel codeModel) {
return StrategyClassUtils.createStrategyInstanceExpression(codeModel,
ToStringStrategy.class, getToStringStrategyClass());
}
Expand Down Expand Up @@ -102,32 +115,48 @@ public Collection<QName> getCustomizationElementNames() {
org.jvnet.jaxb.plugin.LegacyCustomizations.GENERATED_ELEMENT_NAME);
}

@Override
public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) {
for (final ClassOutline classOutline : outline.getClasses())
if (!getIgnoring().isIgnored(classOutline)) {
processClassOutline(classOutline);
}
return true;
}
@Override
public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) {
for (final ClassOutline classOutline : outline.getClasses()) {
if (!getIgnoring().isIgnored(classOutline)) {
processClassOutline(classOutline);
}
}
if (isToStringEnums()) {
for (final EnumOutline enumOutline : outline.getEnums()) {
if (!getIgnoring().isIgnored(enumOutline)) {
processEnumOutline(enumOutline);
}
}
}
return true;
}

protected void processClassOutline(ClassOutline classOutline) {
final JDefinedClass theClass = classOutline.implClass;
ClassUtils._implements(theClass, theClass.owner().ref(ToString.class));

@SuppressWarnings("unused")
final JMethod object$toString = generateObject$toString(classOutline,
theClass);
final JMethod object$toString = generateObject$toString(theClass);
@SuppressWarnings("unused")
final JMethod toString$append = generateToString$append(classOutline,
theClass);
final JMethod toString$append = generateToString$append(theClass);
@SuppressWarnings("unused")
final JMethod toString$appendFields = generateToString$appendFields(
classOutline, theClass);
final JMethod toString$appendFields = generateToString$appendFields(classOutline, theClass);
}

protected JMethod generateObject$toString(final ClassOutline classOutline,
final JDefinedClass theClass) {
protected void processEnumOutline(EnumOutline enumOutline) {
final JDefinedClass theClass = enumOutline.clazz;
ClassUtils._implements(theClass, theClass.owner().ref(ToString.class));

@SuppressWarnings("unused")
final JMethod object$toString = generateObject$toString(theClass);
@SuppressWarnings("unused")
final JMethod toString$append = generateToString$append(theClass);
@SuppressWarnings("unused")
final JMethod toString$appendFields = generateToString$appendFields(enumOutline, theClass);
}

protected JMethod generateObject$toString(final JDefinedClass theClass) {
final JCodeModel codeModel = theClass.owner();
final JMethod object$toString = theClass.method(JMod.PUBLIC,
codeModel.ref(String.class), "toString");
Expand All @@ -150,8 +179,7 @@ protected void processClassOutline(ClassOutline classOutline) {
return object$toString;
}

protected JMethod generateToString$append(final ClassOutline classOutline,
final JDefinedClass theClass) {
protected JMethod generateToString$append(final JDefinedClass theClass) {
final JCodeModel codeModel = theClass.owner();
final JMethod toString$append = theClass.method(JMod.PUBLIC,
codeModel.ref(StringBuilder.class), "append");
Expand Down Expand Up @@ -241,4 +269,23 @@ protected void processClassOutline(ClassOutline classOutline) {
return toString$appendFields;
}

protected JMethod generateToString$appendFields(EnumOutline enumOutline,
final JDefinedClass theClass) {
final JCodeModel codeModel = theClass.owner();

final JMethod toString$appendFields = theClass.method(JMod.PUBLIC,
codeModel.ref(StringBuilder.class), "appendFields");
{
final JVar locator = toString$appendFields.param(
ObjectLocator.class, "locator");
final JVar buffer = toString$appendFields.param(
StringBuilder.class, "buffer");
final JVar toStringStrategy = toString$appendFields.param(
ToStringStrategy.class, "strategy");
final JBlock body = toString$appendFields.body();

body._return(buffer);
}
return toString$appendFields;
}
}
47 changes: 47 additions & 0 deletions jaxb-plugins-parent/tests/enumtostring/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins-tests</artifactId>
<version>4.0.6-SNAPSHOT</version>
</parent>
<artifactId>jaxb-plugins-test-enumtostring</artifactId>
<packaging>jar</packaging>
<name>JAXB Tools :: JAXB Plugins :: Test [enum-toString]</name>
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin-testing</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins-runtime</artifactId>
</dependency>
</dependencies>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<configuration>
<extension>true</extension>
<args>
<arg>-XtoString</arg>
<arg>-XtoString-toStringStrategyClass=org.jvnet.jaxb.tests.enumtostring.MyEnumToStringStrategy</arg>
<arg>-XtoString-toStringEnums=true</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-plugins</artifactId>
</plugin>
</plugins>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.jvnet.jaxb.tests.enumtostring;

import generated.Model;
import org.jvnet.jaxb.lang.EnumToStringStrategy;

public class MyEnumToStringStrategy extends EnumToStringStrategy {
@Override
protected StringBuilder appendEnum(Enum e, StringBuilder stringBuilder) {
if (e instanceof Model) {
stringBuilder.append(((Model) e).value());
return stringBuilder;
}
return super.appendEnum(e, stringBuilder);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="console">
<xs:complexType>
<xs:attribute name="model" type="model" use="required"/>
<xs:attribute name="vendor" type="vendor" use="required"/>
</xs:complexType>
</xs:element>

<xs:simpleType name="model">
<xs:restriction base="xs:string">
<xs:enumeration value="PS3"/>
<xs:enumeration value="PS4"/>
<xs:enumeration value="PS5"/>
<xs:enumeration value="XBOX360"/>
<xs:enumeration value="XBOXONE"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="vendor">
<xs:restriction base="xs:string">
<xs:enumeration value="SONY"/>
<xs:enumeration value="MICROSOFT"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.jvnet.jaxb.tests.enumtostring;

import generated.Console;
import generated.Model;
import generated.Vendor;
import org.junit.Assert;
import org.junit.Test;

public class ConsoleTest {

@Test
public void testConsole() {
Console c = new Console();
c.setModel(Model.PS_5);
c.setVendor(Vendor.SONY);

String cToString = c.toString();
Assert.assertTrue(cToString.startsWith("generated.Console"));
Assert.assertTrue(cToString.endsWith("[model=PS5, vendor=SONY]"));
}

@Test
public void testModel() {
Model m = Model.PS_3;
Assert.assertEquals(Model.PS_3.value(), m.toString());
}

@Test
public void testVendor() {
Vendor v = Vendor.MICROSOFT;
Assert.assertEquals(Vendor.MICROSOFT.name(), v.toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
log4j.rootCategory=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=system.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
1 change: 1 addition & 0 deletions jaxb-plugins-parent/tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<module>commons_lang</module>
<module>defaultvalue</module>
<module>elementwrapper</module>
<module>enumtostring</module>
<module>episodes</module>
<module>fluentapi</module>
<module>ignoring</module>
Expand Down

0 comments on commit d4a51e5

Please sign in to comment.