You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/11/14 13:39:06 UTC
svn commit: r1541891 - in /cxf/trunk:
core/src/main/java/org/apache/cxf/validation/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/
systests/jaxrs/src/test/java/org/apache/c...
Author: sergeyb
Date: Thu Nov 14 12:39:06 2013
New Revision: 1541891
URL: http://svn.apache.org/r1541891
Log:
[CXF-5309] Support for custom ParameterNameProviders (patch from Andriy Redko), and adding more configuration support
Added:
cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java (with props)
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java (with props)
Removed:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/swagger/
Modified:
cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java
Added: cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java?rev=1541891&view=auto
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java (added)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java Thu Nov 14 12:39:06 2013
@@ -0,0 +1,73 @@
+/**
+ * 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.cxf.validation;
+
+import java.util.Collections;
+import java.util.Map;
+
+import javax.validation.ConstraintValidatorFactory;
+import javax.validation.MessageInterpolator;
+import javax.validation.ParameterNameProvider;
+import javax.validation.TraversableResolver;
+
+public class ValidationConfiguration {
+ private ParameterNameProvider parameterNameProvider;
+ private MessageInterpolator messageInterpolator;
+ private TraversableResolver traversableResolver;
+ private ConstraintValidatorFactory constraintValidatorFactory;
+ private Map<String, String> properties = Collections.emptyMap();
+
+ public ValidationConfiguration() {
+
+ }
+ public ValidationConfiguration(ParameterNameProvider parameterNameProvider) {
+ this.parameterNameProvider = parameterNameProvider;
+ }
+
+ public ParameterNameProvider getParameterNameProvider() {
+ return parameterNameProvider;
+ }
+ public void setParameterNameProvider(ParameterNameProvider parameterNameProvider) {
+ this.parameterNameProvider = parameterNameProvider;
+ }
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+ public void setProperties(Map<String, String> properties) {
+ this.properties = properties;
+ }
+ public MessageInterpolator getMessageInterpolator() {
+ return messageInterpolator;
+ }
+ public void setMessageInterpolator(MessageInterpolator messageInterpolator) {
+ this.messageInterpolator = messageInterpolator;
+ }
+ public TraversableResolver getTraversableResolver() {
+ return traversableResolver;
+ }
+ public void setTraversableResolver(TraversableResolver traversableResolver) {
+ this.traversableResolver = traversableResolver;
+ }
+ public ConstraintValidatorFactory getConstraintValidatorFactory() {
+ return constraintValidatorFactory;
+ }
+ public void setConstraintValidatorFactory(ConstraintValidatorFactory constraintValidatorFactory) {
+ this.constraintValidatorFactory = constraintValidatorFactory;
+ }
+}
Propchange: cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationConfiguration.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationProvider.java?rev=1541891&r1=1541890&r2=1541891&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationProvider.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/validation/ValidationProvider.java Thu Nov 14 12:39:06 2013
@@ -19,12 +19,14 @@
package org.apache.cxf.validation;
import java.lang.reflect.Method;
+import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;
import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
+import javax.validation.ParameterNameProvider;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.ValidationProviderResolver;
@@ -42,38 +44,69 @@ public class ValidationProvider {
try {
factory = Validation.buildDefaultValidatorFactory();
} catch (final ValidationException ex) {
- LOG.severe("Bean Validation provider could be found, no validation will be performed");
+ LOG.severe("Bean Validation provider can not be found, no validation will be performed");
throw ex;
}
}
- public ValidationProvider(ValidationProviderResolver resolver) {
+ public ValidationProvider(ParameterNameProvider parameterNameProvider) {
+ this(new ValidationConfiguration(parameterNameProvider));
+ }
+
+ public ValidationProvider(ValidationConfiguration cfg) {
try {
- Configuration<?> cfg = Validation.byDefaultProvider().providerResolver(resolver).configure();
- factory = cfg.buildValidatorFactory();
+ Configuration<?> factoryCfg = Validation.byDefaultProvider().configure();
+ initFactoryConfig(factoryCfg, cfg);
+ factory = factoryCfg.buildValidatorFactory();
} catch (final ValidationException ex) {
- LOG.severe("Bean Validation provider could be found, no validation will be performed");
+ LOG.severe("Bean Validation provider can not be found, no validation will be performed");
throw ex;
}
}
+ public ValidationProvider(ValidatorFactory factory) {
+ if (factory == null) {
+ throw new NullPointerException("Factory is null");
+ }
+ this.factory = factory;
+ }
+
+ public ValidationProvider(ValidationProviderResolver resolver) {
+ this(resolver, null);
+ }
+
+ public <T extends Configuration<T>> ValidationProvider(
+ ValidationProviderResolver resolver,
+ Class<javax.validation.spi.ValidationProvider<T>> providerType) {
+ this(resolver, null, null);
+ }
+
public <T extends Configuration<T>> ValidationProvider(
- Class<javax.validation.spi.ValidationProvider<T>> providerType,
- ValidationProviderResolver resolver) {
+ ValidationProviderResolver resolver,
+ Class<javax.validation.spi.ValidationProvider<T>> providerType,
+ ValidationConfiguration cfg) {
try {
- Configuration<?> cfg = Validation.byProvider(providerType).providerResolver(resolver).configure();
- factory = cfg.buildValidatorFactory();
+ Configuration<?> factoryCfg = providerType != null
+ ? Validation.byProvider(providerType).providerResolver(resolver).configure()
+ : Validation.byDefaultProvider().providerResolver(resolver).configure();
+ initFactoryConfig(factoryCfg, cfg);
+ factory = factoryCfg.buildValidatorFactory();
} catch (final ValidationException ex) {
- LOG.severe("Bean Validation provider could be found, no validation will be performed");
+ LOG.severe("Bean Validation provider can not be found, no validation will be performed");
throw ex;
}
}
- public ValidationProvider(ValidatorFactory factory) {
- if (factory == null) {
- throw new NullPointerException("Factory is null");
+ private static void initFactoryConfig(Configuration<?> factoryCfg, ValidationConfiguration cfg) {
+ if (cfg != null) {
+ factoryCfg.parameterNameProvider(cfg.getParameterNameProvider());
+ factoryCfg.messageInterpolator(cfg.getMessageInterpolator());
+ factoryCfg.traversableResolver(cfg.getTraversableResolver());
+ factoryCfg.constraintValidatorFactory(cfg.getConstraintValidatorFactory());
+ for (Map.Entry<String, String> entry : cfg.getProperties().entrySet()) {
+ factoryCfg.addProperty(entry.getKey(), entry.getValue());
+ }
}
- this.factory = factory;
}
public< T > void validateParameters(final T instance, final Method method, final Object[] arguments) {
Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java?rev=1541891&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java Thu Nov 14 12:39:06 2013
@@ -0,0 +1,70 @@
+/**
+ * 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.cxf.jaxrs.validation;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.validation.ParameterNameProvider;
+
+import org.apache.cxf.jaxrs.model.Parameter;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
+
+public class JAXRSParameterNameProvider implements ParameterNameProvider {
+ @Override
+ public List<String> getParameterNames(final Constructor< ? > constructor) {
+ final List< String > parameterNames = new ArrayList< String >();
+
+ for (int i = 0; i < constructor.getParameterTypes().length; ++i) {
+ parameterNames.add("arg" + i);
+ }
+
+ return parameterNames;
+ }
+
+ @Override
+ public List<String> getParameterNames(final Method method) {
+ final List< Parameter > parameters = ResourceUtils.getParameters(method);
+ final List< String > parameterNames = new ArrayList< String >();
+
+ for (int i = 0; i < parameters.size(); ++i) {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("arg" + i);
+ sb.append("(");
+
+ Parameter parameter = parameters.get(i);
+ if (parameter.getName() != null) {
+ sb.append(parameter.getType().toString());
+ sb.append("(\"" + parameter.getName() + "\")");
+ sb.append(" ");
+ }
+ sb.append(method.getParameterTypes()[i].getSimpleName());
+
+ sb.append(")");
+ parameterNames.add(sb.toString());
+ }
+
+ return parameterNames;
+ }
+
+
+
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/JAXRSParameterNameProvider.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java?rev=1541891&r1=1541890&r2=1541891&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java Thu Nov 14 12:39:06 2013
@@ -23,22 +23,17 @@ import java.util.logging.Logger;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
-import javax.validation.Path;
import javax.validation.ValidationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.jaxrs.model.OperationResourceInfo;
-import org.apache.cxf.jaxrs.model.Parameter;
-import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.validation.ResponseConstraintViolationException;
@Provider
public class ValidationExceptionMapper implements ExceptionMapper< ValidationException > {
private static final Logger LOG = LogUtils.getL7dLogger(ValidationExceptionMapper.class);
- private boolean reportParameterInfo;
@Override
public Response toResponse(ValidationException exception) {
@@ -48,9 +43,9 @@ public class ValidationExceptionMapper i
final boolean isResponseException = constraint instanceof ResponseConstraintViolationException;
for (final ConstraintViolation< ? > violation: constraint.getConstraintViolations()) {
- LOG.log(Level.SEVERE,
+ LOG.log(Level.WARNING,
violation.getRootBeanClass().getSimpleName()
- + "." + getPropertyPathDescription(violation.getPropertyPath(), isResponseException)
+ + "." + violation.getPropertyPath()
+ ": " + violation.getMessage());
}
@@ -65,60 +60,4 @@ public class ValidationExceptionMapper i
}
-
- protected String getPropertyPathDescription(Path propertyPath, boolean isResponseException) {
- final String path = propertyPath.toString();
- if (isResponseException || !isReportParameterInfo()) {
- return path;
- }
- int index = path.lastIndexOf(".arg");
- if (index == -1 || index + 4 >= path.length()) {
- return path;
- }
-
- boolean compositePath = false;
-
- int argPos;
- try {
- String argPath = path.substring(index + 4);
- int infoIndex = argPath.indexOf('[');
- if (infoIndex == -1) {
- infoIndex = argPath.indexOf('.');
- }
- if (infoIndex > 0) {
- argPath = argPath.substring(0, infoIndex);
- compositePath = true;
- }
- argPos = Integer.valueOf(argPath);
- } catch (NumberFormatException ex) {
- return path;
- }
- final OperationResourceInfo ori = JAXRSUtils.getCurrentMessage().getExchange().get(OperationResourceInfo.class);
- if (argPos < 0 || argPos > ori.getParameters().size()) {
- return path;
- }
- Parameter param = ori.getParameters().get(argPos);
-
- StringBuilder sb = new StringBuilder();
- sb.append("(");
- if (compositePath) {
- sb.append("arg" + argPos + " ");
- }
- sb.append("JAXRS param is " + param.getType().toString());
- if (param.getName() != null) {
- sb.append("(\"" + param.getName() + "\")");
- }
- sb.append(", class: " + ori.getAnnotatedMethod().getParameterTypes()[argPos].getSimpleName());
- sb.append(")");
- return path + sb.toString();
-
- }
-
- public boolean isReportParameterInfo() {
- return reportParameterInfo;
- }
-
- public void setReportParameterInfo(boolean reportParameterInfo) {
- this.reportParameterInfo = reportParameterInfo;
- }
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java?rev=1541891&r1=1541890&r2=1541891&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java Thu Nov 14 12:39:06 2013
@@ -32,12 +32,14 @@ import org.apache.cxf.jaxrs.client.WebCl
import org.apache.cxf.jaxrs.interceptor.JAXRSOutExceptionMapperInterceptor;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
+import org.apache.cxf.jaxrs.validation.JAXRSParameterNameProvider;
import org.apache.cxf.jaxrs.validation.JAXRSValidationInInterceptor;
import org.apache.cxf.jaxrs.validation.JAXRSValidationOutInterceptor;
import org.apache.cxf.jaxrs.validation.ValidationExceptionMapper;
import org.apache.cxf.message.Message;
import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.validation.ValidationProvider;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -59,8 +61,10 @@ public class JAXRSClientServerValidation
sf.setProvider(new ValidationExceptionMapper());
sf.setAddress("http://localhost:" + PORT + "/");
+ JAXRSValidationInInterceptor in = new JAXRSValidationInInterceptor();
+ in.setProvider(new ValidationProvider(new JAXRSParameterNameProvider()));
sf.setInInterceptors(Arrays.< Interceptor< ? extends Message > >asList(
- new JAXRSValidationInInterceptor()));
+ in));
sf.setOutInterceptors(Arrays.< Interceptor< ? extends Message > >asList(
new JAXRSOutExceptionMapperInterceptor(),