You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2017/07/19 17:18:07 UTC

[1/2] aries-jax-rs-whiteboard git commit: Reimplement resource ordering

Repository: aries-jax-rs-whiteboard
Updated Branches:
  refs/heads/master 006c69efc -> 3a2d75820


Reimplement resource ordering


Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/398ad838
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/398ad838
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/398ad838

Branch: refs/heads/master
Commit: 398ad838a442f5941cb425b74cccfb97cb51c789
Parents: 006c69e
Author: Carlos Sierra <cs...@apache.org>
Authored: Wed Jul 19 19:11:27 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Wed Jul 19 19:11:27 2017 +0200

----------------------------------------------------------------------
 .../internal/CXFJaxRsServiceRegistrator.java    | 95 +++++++++++---------
 .../aries/jax/rs/whiteboard/internal/Utils.java | 93 +++++++++++--------
 2 files changed, 109 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/398ad838/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
index 43c9f1a..8d6ee29 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/CXFJaxRsServiceRegistrator.java
@@ -20,21 +20,24 @@ package org.apache.aries.jax.rs.whiteboard.internal;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.TreeSet;
 
 import javax.ws.rs.core.Application;
 
+import org.apache.aries.jax.rs.whiteboard.internal.Utils.ComparableResourceProvider;
 import org.apache.cxf.Bus;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.ext.ResourceComparator;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.provider.json.JSONProvider;
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
+import org.apache.cxf.message.Message;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.Destination;
 import org.apache.cxf.transport.DestinationFactory;
@@ -51,8 +54,7 @@ public class CXFJaxRsServiceRegistrator {
     private final Map<String, Object> _properties;
     private final Collection<Object> _providers = new ArrayList<>();
     private Server _server;
-    private final Collection<ResourceInformation<ServiceReference<?>>>
-        _services = new TreeSet<>(Comparator.reverseOrder());
+    private final Collection<ResourceProvider> _services = new ArrayList<>();
 
     private static final String CXF_ENDPOINT_ADDRESS = "CXF_ENDPOINT_ADDRESS";
 
@@ -81,13 +83,12 @@ public class CXFJaxRsServiceRegistrator {
         return properties;
     }
 
-    public void add(
-        ResourceInformation<ServiceReference<?>> resourceInformation) {
+    public void add(ResourceProvider resourceProvider) {
         if (_closed) {
             return;
         }
 
-        _services.add(resourceInformation);
+        _services.add(resourceProvider);
 
         rewire();
     }
@@ -114,13 +115,12 @@ public class CXFJaxRsServiceRegistrator {
         _closed = true;
     }
 
-    public void remove(
-        ResourceInformation<ServiceReference<?>> resourceInformation) {
+    public void remove(ResourceProvider resourceProvider) {
         if (_closed) {
             return;
         }
 
-        _services.remove(resourceInformation);
+        _services.remove(resourceProvider);
 
         rewire();
     }
@@ -135,6 +135,44 @@ public class CXFJaxRsServiceRegistrator {
         rewire();
     }
 
+    private static class ComparableResourceComparator
+        implements ResourceComparator {
+
+        @Override
+        public int compare(
+            ClassResourceInfo cri1, ClassResourceInfo cri2, Message message) {
+
+            ResourceProvider rp1 = cri1.getResourceProvider();
+            ResourceProvider rp2 = cri2.getResourceProvider();
+
+            if (rp1 instanceof ComparableResourceProvider &&
+                rp2 instanceof ComparableResourceProvider) {
+
+                return -((ComparableResourceProvider) rp1).compareTo(
+                    (ComparableResourceProvider) rp2);
+            }
+
+            if (rp1 instanceof ComparableResourceProvider) {
+                return 1;
+            }
+
+            if (rp2 instanceof ComparableResourceProvider) {
+                return -1;
+            }
+
+            return 0;
+        }
+
+        @Override
+        public int compare(
+            OperationResourceInfo oper1, OperationResourceInfo oper2,
+            Message message) {
+
+            return 0;
+        }
+
+    }
+
     protected synchronized void rewire() {
         if (_server != null) {
             _server.destroy();
@@ -176,13 +214,15 @@ public class CXFJaxRsServiceRegistrator {
             jaxRsServerFactoryBean.setProvider(provider);
         }
 
-        for (ResourceInformation<?> resourceInformation : _services) {
-            jaxRsServerFactoryBean.setResourceProvider(
-                resourceInformation.getResourceProvider());
+        for (ResourceProvider resourceProvider: _services) {
+            jaxRsServerFactoryBean.setResourceProvider(resourceProvider);
         }
 
         jaxRsServerFactoryBean.setAddress(address);
 
+        jaxRsServerFactoryBean.setResourceComparator(
+            new ComparableResourceComparator());
+
         _server = jaxRsServerFactoryBean.create();
 
         _server.start();
@@ -198,35 +238,6 @@ public class CXFJaxRsServiceRegistrator {
         return endpointType.cast(server);
     }
 
-    public static class ResourceInformation<T extends Comparable<? super T>>
-        implements Comparable<ResourceInformation<T>> {
-
-        private final T _comparable;
-        private final ResourceProvider _resourceProvider;
-
-        public ResourceInformation(
-            T comparable, ResourceProvider resourceProvider) {
-            _comparable = comparable;
-
-            _resourceProvider = resourceProvider;
-        }
-
-        public ResourceProvider getResourceProvider() {
-            return _resourceProvider;
-        }
-
-        @Override
-        public int compareTo(ResourceInformation<T> resourceInformation) {
-
-            if (resourceInformation == null) {
-                return 1;
-            }
-
-            return _comparable.compareTo(resourceInformation._comparable);
-        }
-
-    }
-
     /**
      * This class exists as a workaround for
      * https://issues.apache.org/jira/browse/CXF-7409

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/398ad838/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
----------------------------------------------------------------------
diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
index 7b44394..69bbe93 100644
--- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
+++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/Utils.java
@@ -17,7 +17,6 @@
 
 package org.apache.aries.jax.rs.whiteboard.internal;
 
-import org.apache.aries.jax.rs.whiteboard.internal.CXFJaxRsServiceRegistrator.ResourceInformation;
 import org.apache.aries.osgi.functional.Event;
 import org.apache.aries.osgi.functional.OSGi;
 import org.apache.cxf.Bus;
@@ -127,17 +126,15 @@ public class Utils {
         return program.route(new RepeatInOrderRouter<>());
     }
 
-    public static <T> OSGi<ResourceInformation<ServiceReference<?>>>
+    public static <T> OSGi<ResourceProvider>
         registerEndpoint(
             ServiceReference<?> serviceReference,
             CXFJaxRsServiceRegistrator registrator,
             ServiceObjects<T> serviceObjects) {
 
         ResourceProvider resourceProvider = getResourceProvider(serviceObjects);
-        ResourceInformation<ServiceReference<?>> resourceInformation =
-            new ResourceInformation<>(serviceReference, resourceProvider);
-        registrator.add(resourceInformation);
-        return just(resourceInformation);
+        registrator.add(resourceProvider);
+        return just(resourceProvider);
     }
 
     public static String safeToString(Object object) {
@@ -147,43 +144,16 @@ public class Utils {
     public static <T> ResourceProvider getResourceProvider(
         ServiceObjects<T> serviceObjects) {
 
-        return new ResourceProvider() {
+        ServiceReference<T> serviceReference = serviceObjects.getServiceReference();
 
-            @Override
-            public Object getInstance(Message m) {
-                return serviceObjects.getService();
-            }
-
-            @Override
-            @SuppressWarnings("unchecked")
-            public void releaseInstance(Message m, Object o) {
-                serviceObjects.ungetService((T)o);
-            }
-
-            @Override
-            public Class<?> getResourceClass() {
-                T service = serviceObjects.getService();
-
-                try {
-                    return service.getClass();
-                }
-                finally {
-                    serviceObjects.ungetService(service);
-                }
-            }
-
-            @Override
-            public boolean isSingleton() {
-                return false;
-            }
-        };
+        return new ComparableResourceProvider(serviceReference, serviceObjects);
     }
 
     public static void unregisterEndpoint(
         CXFJaxRsServiceRegistrator registrator,
-        ResourceInformation<ServiceReference<?>> resourceInformation) {
+        ResourceProvider resourceProvider) {
 
-        registrator.remove(resourceInformation);
+        registrator.remove(resourceProvider);
     }
 
     private static class RepeatInOrderRouter<T extends Comparable<? super T>>
@@ -229,4 +199,53 @@ public class Utils {
 
     }
 
+    public static class ComparableResourceProvider
+        implements ResourceProvider, Comparable<ComparableResourceProvider> {
+
+        private ServiceReference<?> _serviceReference;
+        private final ServiceObjects<?> _serviceObjects;
+
+        public ComparableResourceProvider(
+            ServiceReference<?> serviceReference,
+            ServiceObjects<?> serviceObjects) {
+            _serviceReference = serviceReference;
+
+            _serviceObjects = serviceObjects;
+        }
+
+        @Override
+        public int compareTo(ComparableResourceProvider o) {
+            return _serviceReference.compareTo(o._serviceReference);
+        }
+
+        @Override
+        public Object getInstance(Message m) {
+            return _serviceObjects.getService();
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public void releaseInstance(Message m, Object o) {
+            ((ServiceObjects)_serviceObjects).ungetService(o);
+        }
+
+        @Override
+        public Class<?> getResourceClass() {
+            Object service = _serviceObjects.getService();
+
+            try {
+                return service.getClass();
+            }
+            finally {
+                ((ServiceObjects)_serviceObjects).ungetService(service);
+            }
+        }
+
+        @Override
+        public boolean isSingleton() {
+            return false;
+        }
+
+    }
+
 }


[2/2] aries-jax-rs-whiteboard git commit: Add test for endpoint override

Posted by cs...@apache.org.
Add test for endpoint override


Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/3a2d7582
Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/3a2d7582
Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/3a2d7582

Branch: refs/heads/master
Commit: 3a2d7582045e5e78d879eb323b942ec669373d31
Parents: 398ad83
Author: Carlos Sierra <cs...@apache.org>
Authored: Wed Jul 19 19:13:04 2017 +0200
Committer: Carlos Sierra <cs...@apache.org>
Committed: Wed Jul 19 19:13:04 2017 +0200

----------------------------------------------------------------------
 jax-rs.itests/src/main/java/test/JaxrsTest.java | 52 +++++++++++++++++++-
 .../main/java/test/types/TestAddonConflict.java | 37 ++++++++++++++
 .../java/test/types/TestAddonConflict2.java     | 36 ++++++++++++++
 3 files changed, 124 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/3a2d7582/jax-rs.itests/src/main/java/test/JaxrsTest.java
----------------------------------------------------------------------
diff --git a/jax-rs.itests/src/main/java/test/JaxrsTest.java b/jax-rs.itests/src/main/java/test/JaxrsTest.java
index 1c6e8e7..1f50052 100644
--- a/jax-rs.itests/src/main/java/test/JaxrsTest.java
+++ b/jax-rs.itests/src/main/java/test/JaxrsTest.java
@@ -36,6 +36,8 @@ import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.jaxrs.runtime.dto.FailedApplicationDTO;
 import org.osgi.util.tracker.ServiceTracker;
 import test.types.TestAddon;
+import test.types.TestAddonConflict;
+import test.types.TestAddonConflict2;
 import test.types.TestAddonLifecycle;
 import test.types.TestApplication;
 import test.types.TestApplicationConflict;
@@ -51,7 +53,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
 
-
 public class JaxrsTest {
 
     private ServiceTracker<ClientBuilder, ClientBuilder> _clientBuilderTracker;
@@ -430,6 +431,55 @@ public class JaxrsTest {
     }
 
     @Test
+    public void testEndpointsOverride() {
+        Client client = createClient();
+
+        WebTarget webTarget = client.
+            target("http://localhost:8080").
+            path("conflict");
+
+        ServiceRegistration<?> serviceRegistration = null;
+        ServiceRegistration<?> serviceRegistration2 = null;
+
+        try {
+            serviceRegistration = registerAddon(new TestAddonConflict());
+
+            Response response = webTarget.request().get();
+
+            assertEquals(
+                "This should say hello1", "hello1",
+                response.readEntity(String.class));
+
+            serviceRegistration2 = registerAddon(
+                new TestAddonConflict2(), "service.ranking", 1);
+
+            response = webTarget.request().get();
+
+            assertEquals(
+                "This should say hello2", "hello2",
+                response.readEntity(String.class));
+
+            serviceRegistration2.unregister();
+
+            serviceRegistration2 = null;
+
+            response = webTarget.request().get();
+
+            assertEquals(
+                "This should say hello1", "hello1",
+                response.readEntity(String.class));
+        }
+        finally {
+            if (serviceRegistration != null) {
+                serviceRegistration.unregister();
+            }
+            if (serviceRegistration2 != null) {
+                serviceRegistration2.unregister();
+            }
+        }
+    }
+
+    @Test
     public void testStandaloneEndPoint() {
         Client client = createClient();
 

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/3a2d7582/jax-rs.itests/src/main/java/test/types/TestAddonConflict.java
----------------------------------------------------------------------
diff --git a/jax-rs.itests/src/main/java/test/types/TestAddonConflict.java b/jax-rs.itests/src/main/java/test/types/TestAddonConflict.java
new file mode 100644
index 0000000..02f96a7
--- /dev/null
+++ b/jax-rs.itests/src/main/java/test/types/TestAddonConflict.java
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
+ * <p>
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ * <p>
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ */
+
+package test.types;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+/**
+ * @author Carlos Sierra Andrés
+ */
+@Path("/conflict")
+public class TestAddonConflict {
+
+    @GET
+    public String sayHello() {
+        return "hello1";
+    }
+
+    @GET
+    @Path("/conflict1")
+    public String conflict() {
+        return "conflict1";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/3a2d7582/jax-rs.itests/src/main/java/test/types/TestAddonConflict2.java
----------------------------------------------------------------------
diff --git a/jax-rs.itests/src/main/java/test/types/TestAddonConflict2.java b/jax-rs.itests/src/main/java/test/types/TestAddonConflict2.java
new file mode 100644
index 0000000..c402753
--- /dev/null
+++ b/jax-rs.itests/src/main/java/test/types/TestAddonConflict2.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
+ * <p>
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ * <p>
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ */
+
+package test.types;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+/**
+ * @author Carlos Sierra Andrés
+ */
+@Path("/conflict")
+public class TestAddonConflict2 {
+
+    @GET
+    public String sayHello() {
+        return "hello2";
+    }
+
+    @GET
+    @Path("/conflict2")
+    public String conflict() {
+        return "conflict2";
+    }
+}