[ 
https://issues.apache.org/jira/browse/WW-4889?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16716581#comment-16716581
 ] 

ASF GitHub Bot commented on WW-4889:
------------------------------------

yasserzamani closed pull request #287: [WW-4889] Adds XML handler based on 
Apache Juneau
URL: https://github.com/apache/struts/pull/287
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/plugins/rest/pom.xml b/plugins/rest/pom.xml
index 33324af2a..a149de6b5 100644
--- a/plugins/rest/pom.xml
+++ b/plugins/rest/pom.xml
@@ -55,6 +55,18 @@
             <optional>true</optional>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.juneau</groupId>
+            <artifactId>juneau-marshall</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <optional>true</optional>
+        </dependency>
+
         <dependency>
             <groupId>mockobjects</groupId>
             <artifactId>mockobjects-core</artifactId>
diff --git 
a/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
 
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
new file mode 100644
index 000000000..379c97a82
--- /dev/null
+++ 
b/plugins/rest/src/main/java/org/apache/struts2/rest/handler/JuneauXmlHandler.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.rest.handler;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.juneau.parser.ParseException;
+import org.apache.juneau.serializer.SerializeException;
+import org.apache.juneau.xml.XmlDocSerializer;
+import org.apache.juneau.xml.XmlParser;
+import org.apache.juneau.xml.XmlSerializer;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * Handles XML content using Apache Juneau
+ * http://juneau.apache.org/#marshall.html
+ */
+public class JuneauXmlHandler extends AbstractContentTypeHandler {
+
+    private static final Logger LOG = 
LogManager.getLogger(JuneauXmlHandler.class);
+
+    private static final String DEFAULT_CONTENT_TYPE = "application/xml";
+
+    private final XmlParser parser = XmlParser.DEFAULT;
+    private final XmlSerializer serializer = XmlDocSerializer.DEFAULT;
+
+    public void toObject(ActionInvocation invocation, Reader in, Object 
target) throws IOException {
+        LOG.debug("Converting input into an object of: {}", 
target.getClass().getName());
+        try {
+            Object result = parser.parse(in, target.getClass());
+            BeanUtils.copyProperties(target, result);
+        } catch (ParseException | IllegalAccessException | 
InvocationTargetException e) {
+            throw new IOException(e);
+        }
+    }
+
+    public String fromObject(ActionInvocation invocation, Object obj, String 
resultCode, Writer stream) throws IOException {
+        LOG.debug("Converting an object of {} into string", 
obj.getClass().getName());
+        try {
+            serializer
+                .builder()
+                .locale(invocation.getInvocationContext().getLocale())
+                .build()
+                .serialize(obj, stream);
+            return null;
+        } catch (SerializeException e) {
+            throw new IOException(e);
+        }
+    }
+
+    public String getContentType() {
+        return DEFAULT_CONTENT_TYPE;
+    }
+
+    public String getExtension() {
+        return "xml";
+    }
+
+}
diff --git 
a/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
 
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
new file mode 100644
index 000000000..c51ba6af6
--- /dev/null
+++ 
b/plugins/rest/src/test/java/org/apache/struts2/rest/handler/JuneauXmlHandlerTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.rest.handler;
+
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.XWorkTestCase;
+import com.opensymphony.xwork2.mock.MockActionInvocation;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Locale;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class JuneauXmlHandlerTest extends XWorkTestCase {
+
+    private String xml;
+    private JuneauXmlHandler handler;
+    private ActionInvocation ai;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        xml = "<object>" +
+            "<name>Jan</name>" +
+            "<age>12</age>" +
+            "<parents>" +
+            "<string>Adam</string>" +
+            "<string>Ewa</string>" +
+            "</parents>" +
+            "</object>";
+        handler = new JuneauXmlHandler();
+        ai = new MockActionInvocation();
+        ActionContext context = new ActionContext(new HashMap<String, 
Object>());
+        context.setLocale(Locale.US);
+        ((MockActionInvocation) ai).setInvocationContext(context);
+    }
+
+    public void testObjectToXml() throws Exception {
+        // given
+        SimpleBean obj = new SimpleBean();
+        obj.setName("Jan");
+        obj.setAge(12L);
+        obj.setParents(Arrays.asList("Adam", "Ewa"));
+
+        // when
+        Writer stream = new StringWriter();
+        handler.fromObject(ai, obj, null, stream);
+
+        // then
+        stream.flush();
+        assertThat(stream.toString())
+            .contains("<object>")
+            .contains("<name>Jan</name>")
+            .contains("<age>12</age>")
+            .contains("<parents><string>Adam</string>")
+            .contains("<string>Ewa</string></parents>")
+            .contains("</object>");
+    }
+
+    public void testXmlToObject() throws Exception {
+        // given
+        SimpleBean obj = new SimpleBean();
+
+        // when
+        Reader in = new StringReader(xml);
+        handler.toObject(ai, in, obj);
+
+        // then
+        assertNotNull(obj);
+        assertEquals("Jan", obj.getName());
+        assertEquals(12L, obj.getAge().longValue());
+        assertNotNull(obj.getParents());
+        assertThat(obj.getParents())
+                .hasSize(2)
+                .containsExactly("Adam", "Ewa");
+    }
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 2be2aae52..4dc3e8192 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1072,6 +1072,12 @@
                 <version>${jackson.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.juneau</groupId>
+                <artifactId>juneau-marshall</artifactId>
+                <version>7.2.2</version>
+            </dependency>
+
             <!-- CDI & Weld -->
             <dependency>
                 <groupId>javax.enterprise</groupId>


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> Implement REST content handlers using Apache Juneau
> ---------------------------------------------------
>
>                 Key: WW-4889
>                 URL: https://issues.apache.org/jira/browse/WW-4889
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Plugin - REST
>            Reporter: Lukasz Lenart
>            Priority: Major
>             Fix For: 2.6
>
>
> The Apache Juneau http://juneau.apache.org/#marshall.html provides a list of 
> serializers that can be used instead of XStream library. 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to