You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2015/12/14 18:59:48 UTC

cxf git commit: [CXF-6706] Make use of the support code in the ServiceMix hibernate bundle, plus add some tccl management to the BeanValidationProvider, to get BeanValidation to work with OSGi.

Repository: cxf
Updated Branches:
  refs/heads/3.1.x-fixes 1770c6f6c -> 1dea643ba


[CXF-6706] Make use of the support code in the ServiceMix hibernate bundle,
plus add some tccl management to the BeanValidationProvider, to get
BeanValidation to work with OSGi.


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/1dea643b
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/1dea643b
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/1dea643b

Branch: refs/heads/3.1.x-fixes
Commit: 1dea643baf6193e9a94abe8b1900c139bf273121
Parents: 1770c6f
Author: Benson Margulies <be...@basistech.com>
Authored: Mon Dec 14 12:58:47 2015 -0500
Committer: Benson Margulies <be...@basistech.com>
Committed: Mon Dec 14 12:58:47 2015 -0500

----------------------------------------------------------------------
 .../cxf/validation/BeanValidationProvider.java  | 24 ++++++++++--
 osgi/itests/pom.xml                             | 12 ++++++
 .../cxf/osgi/itests/CXFOSGiTestSupport.java     |  7 ++--
 .../org/apache/cxf/osgi/itests/jaxrs/Book.java  |  4 ++
 .../apache/cxf/osgi/itests/jaxrs/BookStore.java | 40 ++++++++++++++++++++
 .../cxf/osgi/itests/jaxrs/JaxRsServiceTest.java | 22 ++++++++++-
 .../features/src/main/resources/features.xml    |  4 ++
 parent/pom.xml                                  |  2 +-
 8 files changed, 107 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java b/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java
index 2efc7a1..31e12e1 100644
--- a/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java
+++ b/core/src/main/java/org/apache/cxf/validation/BeanValidationProvider.java
@@ -39,6 +39,7 @@ public class BeanValidationProvider {
     private static final Logger LOG = LogUtils.getL7dLogger(BeanValidationProvider.class);
     
     private final ValidatorFactory factory;
+    private ClassLoader validateContextClassloader;
     
     public BeanValidationProvider() {
         try {
@@ -80,7 +81,7 @@ public class BeanValidationProvider {
         Class<javax.validation.spi.ValidationProvider<T>> providerType) {
         this(resolver, providerType, null);
     }
-    
+
     public <T extends Configuration<T>> BeanValidationProvider(
         ValidationProviderResolver resolver,
         Class<javax.validation.spi.ValidationProvider<T>> providerType,
@@ -96,7 +97,15 @@ public class BeanValidationProvider {
             throw ex;
         }
     }
-    
+
+    public ClassLoader getValidateContextClassloader() {
+        return validateContextClassloader;
+    }
+
+    public void setValidateContextClassloader(ClassLoader validateContextClassloader) {
+        this.validateContextClassloader = validateContextClassloader;
+    }
+
     private static void initFactoryConfig(Configuration<?> factoryCfg, ValidationConfiguration cfg) {
         if (cfg != null) {
             factoryCfg.parameterNameProvider(cfg.getParameterNameProvider());
@@ -145,7 +154,16 @@ public class BeanValidationProvider {
     }
     
     private< T > Set<ConstraintViolation< T > > doValidateBean(final T bean) {
-        return factory.getValidator().validate(bean);
+        ClassLoader oldTccl = Thread.currentThread().getContextClassLoader();
+        try {
+            // In OSGi, hibernate's hunt for an EL provided can fail without this.
+            if (validateContextClassloader != null) {
+                Thread.currentThread().setContextClassLoader(validateContextClassloader);
+            }
+            return factory.getValidator().validate(bean);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldTccl);
+        }
     }
     
     private ExecutableValidator getExecutableValidator() {

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/itests/pom.xml
----------------------------------------------------------------------
diff --git a/osgi/itests/pom.xml b/osgi/itests/pom.xml
index 9ddf1fd..9d62eff 100644
--- a/osgi/itests/pom.xml
+++ b/osgi/itests/pom.xml
@@ -91,6 +91,18 @@
             <version>${cxf.karaf.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.servicemix.specs</groupId>
+            <artifactId>org.apache.servicemix.specs.jsr303-api-1.1.0</artifactId>
+            <version>${cxf.servicemix.specs.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.hibernate-validator</artifactId>
+            <version>5.0.2.Final_1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
----------------------------------------------------------------------
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
index 138b996..812eb18 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
@@ -138,9 +138,10 @@ public class CXFOSGiTestSupport {
                              .name("Apache Karaf")
                              .useDeployFolder(false)
                              .unpackDirectory(new File("target/paxexam/")),
-                         //DO NOT COMMIT WITH THIS LINE ENABLED!!!    
-                         //KarafDistributionOption.keepRuntimeFolder(),                         
-                         systemProperty("java.awt.headless").value("true"),
+                         //DO NOT COMMIT WITH THIS LINE ENABLED!!!
+                         //KarafDistributionOption.keepRuntimeFolder(),
+                         //debugConfiguration(), // nor this
+                systemProperty("java.awt.headless").value("true"),
                          when(localRepo != null)
                              .useOptions(editConfigurationFilePut("etc/org.ops4j.pax.url.mvn.cfg",
                                                                   "org.ops4j.pax.url.mvn.localRepository",

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/Book.java
----------------------------------------------------------------------
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/Book.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/Book.java
index a244633..10bab48 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/Book.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/Book.java
@@ -19,11 +19,15 @@
 
 package org.apache.cxf.osgi.itests.jaxrs;
 
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 
 @XmlRootElement(name = "Book")
 public class Book {
+    @NotNull
     private String name;
+    @Min(0)
     private long id;
     
     public Book() {

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
----------------------------------------------------------------------
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
index 416c341..ebe3a02 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
@@ -24,6 +24,10 @@ import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.Validation;
+import javax.validation.ValidatorFactory;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -40,6 +44,10 @@ import javax.ws.rs.core.SecurityContext;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 
+import org.apache.cxf.validation.BeanValidationProvider;
+import org.hibernate.validator.HibernateValidator;
+import org.hibernate.validator.HibernateValidatorConfiguration;
+
 @Path("/bookstore")
 @Produces("application/xml")
 public class BookStore {
@@ -84,6 +92,38 @@ public class BookStore {
             return Response.ok().build();
         }
     }
+
+    @POST
+    @Path("/books-validate")
+    public Response createBookValidate(Book book) {
+        assertInjections();
+        BeanValidationProvider prov;
+        ClassLoader oldtccl = Thread.currentThread().getContextClassLoader();
+        try {
+            Thread.currentThread().setContextClassLoader(HibernateValidator.class.getClassLoader());
+            HibernateValidatorConfiguration configuration =
+                    Validation.byProvider(HibernateValidator.class)
+                            .configure();
+            ValidatorFactory factory = configuration.buildValidatorFactory();
+            prov = new BeanValidationProvider(factory);
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldtccl);
+        }
+        prov.setValidateContextClassloader(getClass().getClassLoader());
+        try {
+            prov.validateBean(book);
+        } catch (ConstraintViolationException cve) {
+            StringBuilder violationMessages = new StringBuilder();
+            for (ConstraintViolation<?> constraintViolation : cve.getConstraintViolations()) {
+                violationMessages.append(constraintViolation.getPropertyPath())
+                        .append(": ").append(constraintViolation.getMessage()).append("\n");
+            }
+            return Response.status(Response.Status.BAD_REQUEST).type("text/plain")
+                    .entity(violationMessages.toString()).build();
+        }
+        return createBook(book);
+    }
+
     
     @POST
     @Path("/books")

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
----------------------------------------------------------------------
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
index 9be4b45..dab117b 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
@@ -73,6 +73,23 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         Assert.assertNotNull(response.getLocation());
     }
 
+    //@Ignore("this passes with Karaf 4, but not with the test rig here.")
+    @Test
+    public void postWithValidation() throws Exception {
+        Book book = new Book();
+        book.setId(-1);
+        book.setName(null);
+        Response response = wt.path("/books-validate/").request("application/xml").post(Entity.xml(book));
+        Assert.assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+
+        book = new Book();
+        book.setId(3212);
+        book.setName("A Book");
+        response = wt.path("/books-validate/").request("application/xml").post(Entity.xml(book));
+        Assert.assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+        Assert.assertNotNull(response.getLocation());
+    }
+
     @Test
     public void testJaxRsDelete() throws Exception {
         Response response = wt.path("/books/123").request("application/xml").delete();
@@ -93,7 +110,9 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
     public Option[] config() {
         return new Option[] {
             cxfBaseConfig(),
-            features(cxfUrl, "cxf-core", "cxf-wsdl", "cxf-jaxrs", "http"),
+            features(cxfUrl, "cxf-core", "cxf-wsdl", "cxf-jaxrs", "http",
+                    "cxf-bean-validation-core",
+                    "cxf-bean-validation"),
             testUtils(),
             logLevel(LogLevel.INFO),
             provision(serviceBundle())
@@ -102,6 +121,7 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
 
     private InputStream serviceBundle() {
         return TinyBundles.bundle()
+                  .set(Constants.DYNAMICIMPORT_PACKAGE, "*")
                   .add(JaxRsTestActivator.class)
                   .add(Book.class)
                   .add(BookStore.class)

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/osgi/karaf/features/src/main/resources/features.xml
----------------------------------------------------------------------
diff --git a/osgi/karaf/features/src/main/resources/features.xml b/osgi/karaf/features/src/main/resources/features.xml
index ebd32d1..2312881 100644
--- a/osgi/karaf/features/src/main/resources/features.xml
+++ b/osgi/karaf/features/src/main/resources/features.xml
@@ -441,6 +441,8 @@
     </feature>
 
     <feature name="cxf-bean-validation-core" version="${project.version}" resolver="(obr)">
+        <!-- This feature has the wrong name; it's hibernate-only. Fix up in 3.2.0? Move all this to the
+        hibernate-bean-validation-helper feature -->
         <bundle start-level="10" dependency="true">mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jsr303-api-${cxf.osgi.validation.api.version}/${cxf.servicemix.specs.version}</bundle>
         <bundle start-level="30" dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.hibernate-validator/${cxf.hibernate-validator.bundle.version}</bundle>
         <!-- The hibernate bundle demands 1.1.0 of javax.validator, but servicemix only provides 1.0.0. So
@@ -461,6 +463,8 @@
         <bundle start-level="30" dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.cglib/${cxf.servicemix.cglib.version}</bundle>
         <bundle start-level="30" dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aspectj/${cxf.servicemix.aspectj.version}</bundle>
     </feature>
+
+
     
     <feature name="cxf-bean-validation" version="${project.version}" resolver="(obr)">
         <feature version="${project.version}">cxf-bean-validation-core</feature>

http://git-wip-us.apache.org/repos/asf/cxf/blob/1dea643b/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index f417940..52c225b 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -177,7 +177,7 @@
         <cxf.osgi.version>4.2.0</cxf.osgi.version>
         <cxf.karaf.version>3.0.2</cxf.karaf.version>
         <cxf.pax.logging.version>1.6.0</cxf.pax.logging.version>
-        <cxf.pax.exam.version>4.5.0</cxf.pax.exam.version>
+        <cxf.pax.exam.version>4.7.0</cxf.pax.exam.version>
         <cxf.felix.framework.version>2.0.5</cxf.felix.framework.version>
         <cxf.felix.configadmin.version>1.2.4</cxf.felix.configadmin.version>
         <cxf.xmlbeans.bundle.version>2.6.0_2</cxf.xmlbeans.bundle.version>