You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/10/03 09:18:46 UTC

svn commit: r1528735 - in /tomee/tomee/trunk/server/openejb-cxf-rs/src: main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java

Author: rmannibucau
Date: Thu Oct  3 07:18:46 2013
New Revision: 1528735

URL: http://svn.apache.org/r1528735
Log:
adding getWadl in cxf-rs mbeans

Modified:
    tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java

Modified: tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1528735&r1=1528734&r2=1528735&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Thu Oct  3 07:18:46 2013
@@ -20,12 +20,15 @@ import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.JAXRSServiceImpl;
+import org.apache.cxf.jaxrs.ext.RequestHandler;
 import org.apache.cxf.jaxrs.ext.ResourceComparator;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.MethodDispatcher;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
+import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
 import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.jaxrs.provider.json.JSONProvider;
 import org.apache.cxf.service.invoker.Invoker;
@@ -38,9 +41,11 @@ import org.apache.openejb.api.internal.I
 import org.apache.openejb.api.jmx.Description;
 import org.apache.openejb.api.jmx.MBean;
 import org.apache.openejb.api.jmx.ManagedAttribute;
+import org.apache.openejb.api.jmx.ManagedOperation;
 import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
 import org.apache.openejb.assembler.classic.util.ServiceInfos;
+import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.monitoring.LocalMBeanServer;
 import org.apache.openejb.monitoring.ObjectNameBuilder;
@@ -70,6 +75,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -114,6 +121,16 @@ public class CxfRsHttpListener implement
         STATIC_CONTENT_TYPES.put("ico", "image/ico");
         STATIC_CONTENT_TYPES.put("pdf", "application/pdf");
         STATIC_CONTENT_TYPES.put("xsd", "application/xml");
+
+        // bug in CXF? it prevents to get the wadl as json otherwise
+        if ("true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cxf-rs.wadl-generator.ignoreMessageWriters", "true"))) {
+            for (final ProviderInfo<RequestHandler> rh : org.apache.cxf.jaxrs.provider.ProviderFactory.getSharedInstance().getRequestHandlers()) {
+                final RequestHandler provider = rh.getProvider();
+                if (WadlGenerator.class.isInstance(provider)) {
+                    WadlGenerator.class.cast(provider).setIgnoreMessageWriters(false);
+                }
+            }
+        }
     }
 
     public CxfRsHttpListener(final HTTPTransportFactory httpTransportFactory, final String star) {
@@ -648,6 +665,41 @@ public class CxfRsHttpListener implement
 
         @ManagedAttribute
         @Description("The type of the REST service")
+        public String getWadlUrl() {
+            if (address.endsWith("?_wadl")) {
+                return address;
+            }
+            return address + "?_wadl";
+        }
+
+        @ManagedOperation
+        @Description("The type of the REST service")
+        public String getWadl(final String format) {
+            if (format != null && format.toLowerCase().contains("json")) {
+                InputStream inputStream = null;
+                try {
+                    final URL url = new URL(getWadlUrl() + "&_type=json");
+                    final HttpURLConnection connection = HttpURLConnection.class.cast(url.openConnection());
+                    connection.setRequestProperty("Accept", "application/json");
+                    connection.setRequestProperty("Content-type", "application/json");
+                    inputStream = connection.getInputStream();
+                    return IO.slurp(inputStream);
+                } catch (final Exception e) {
+                    return e.getMessage();
+                } finally {
+                    IO.close(inputStream);
+                }
+            } else { // xml
+                try {
+                    return IO.slurp(new URL(getWadlUrl()));
+                } catch (final IOException e) {
+                    return e.getMessage();
+                }
+            }
+        }
+
+        @ManagedAttribute
+        @Description("The type of the REST service")
         public String getType() {
             return type;
         }

Modified: tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java?rev=1528735&r1=1528734&r2=1528735&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java (original)
+++ tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsJMXTest.java Thu Oct  3 07:18:46 2013
@@ -22,6 +22,7 @@ import org.apache.openejb.monitoring.Loc
 import org.apache.openejb.testing.Classes;
 import org.apache.openejb.testing.EnableServices;
 import org.apache.openejb.testing.Module;
+import org.hamcrest.CoreMatchers;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -33,6 +34,7 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 @EnableServices("jax-rs")
@@ -54,6 +56,12 @@ public class RsJMXTest {
     @Test
     public void checkServiceWasDeployed() throws Exception {
         assertTrue(LocalMBeanServer.get().isRegistered(name));
+
+        final String wadlXml = String.class.cast(LocalMBeanServer.get().invoke(name, "getWadl", new Object[]{null}, new String[0]));
+        assertThat(wadlXml, wadlXml, CoreMatchers.containsString("<resources base=\"http://127.0.0.1:4204/app/foo/"));
+
+        final String wadlJson = String.class.cast(LocalMBeanServer.get().invoke(name, "getWadl", new Object[]{"json"}, new String[0]));
+        assertThat(wadlJson, wadlJson, CoreMatchers.containsString("{\"application\":{"));
     }
 
     @AfterClass
@@ -61,11 +69,17 @@ public class RsJMXTest {
         assertFalse(LocalMBeanServer.get().isRegistered(name));
     }
 
-    @Path("/foo")
+    @Path("foo")
     public static class AnEndpoint {
         @GET
         public String bar() {
             return "bar";
         }
+
+        @GET
+        @Path("babar")
+        public String babar() {
+            return "babar";
+        }
     }
 }