+ * {@code HibernateValidatorPermission} is thread-safe and immutable.
+ *
+ * @author Guillaume Smet
+ */
+public class HibernateValidatorPermission extends BasicPermission {
+
+ public static final HibernateValidatorPermission ACCESS_PRIVATE_MEMBERS = new HibernateValidatorPermission( "accessPrivateMembers" );
+
+ public HibernateValidatorPermission(String name) {
+ super( name );
+ }
+
+ public HibernateValidatorPermission(String name, String actions) {
+ super( name, actions );
+ }
+}
diff --git a/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java b/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java
index a4112b38d6..7115622572 100644
--- a/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java
+++ b/engine/src/main/java/org/hibernate/validator/constraints/NotEmpty.java
@@ -14,6 +14,8 @@
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import javax.validation.constraintvalidation.SupportedValidationTarget;
+import javax.validation.constraintvalidation.ValidationTarget;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
@@ -30,6 +32,7 @@
*/
@Documented
@Constraint(validatedBy = { })
+@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
diff --git a/engine/src/main/java/org/hibernate/validator/constraints/Range.java b/engine/src/main/java/org/hibernate/validator/constraints/Range.java
index 1ec6abab73..676c03fb0c 100644
--- a/engine/src/main/java/org/hibernate/validator/constraints/Range.java
+++ b/engine/src/main/java/org/hibernate/validator/constraints/Range.java
@@ -15,6 +15,8 @@
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
+import javax.validation.constraintvalidation.SupportedValidationTarget;
+import javax.validation.constraintvalidation.ValidationTarget;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
@@ -31,6 +33,7 @@
*/
@Documented
@Constraint(validatedBy = { })
+@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Min(0)
diff --git a/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java b/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java
index 435ca54372..2c21049af1 100644
--- a/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java
+++ b/engine/src/main/java/org/hibernate/validator/constraints/br/TituloEleitoral.java
@@ -13,6 +13,8 @@
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Pattern;
+import javax.validation.constraintvalidation.SupportedValidationTarget;
+import javax.validation.constraintvalidation.ValidationTarget;
import org.hibernate.validator.constraints.Mod11Check;
import org.hibernate.validator.constraints.Mod11Check.List;
@@ -42,6 +44,7 @@
@ReportAsSingleViolation
@Documented
@Constraint(validatedBy = { })
+@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface TituloEleitoral {
diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java b/engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java
index d65277818f..19dd8075a9 100644
--- a/engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java
+++ b/engine/src/main/java/org/hibernate/validator/internal/engine/ValidatorImpl.java
@@ -40,6 +40,7 @@
import javax.validation.groups.Default;
import javax.validation.metadata.BeanDescriptor;
+import org.hibernate.validator.HibernateValidatorPermission;
import org.hibernate.validator.internal.engine.ValidationContext.ValidationContextBuilder;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager;
import org.hibernate.validator.internal.engine.groups.Group;
@@ -1739,6 +1740,11 @@ private Member getAccessible(Member original) {
return member;
}
+ SecurityManager sm = System.getSecurityManager();
+ if ( sm != null ) {
+ sm.checkPermission( HibernateValidatorPermission.ACCESS_PRIVATE_MEMBERS );
+ }
+
Class> clazz = original.getDeclaringClass();
if ( original instanceof Field ) {
diff --git a/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java b/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java
index e4eba77281..aeb0b1d8d7 100644
--- a/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java
+++ b/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintTree.java
@@ -6,11 +6,18 @@
*/
package org.hibernate.validator.internal.engine.constraintvalidation;
+import static org.hibernate.validator.constraints.CompositionType.ALL_FALSE;
+import static org.hibernate.validator.constraints.CompositionType.AND;
+import static org.hibernate.validator.constraints.CompositionType.OR;
+import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
+import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
+
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
import java.util.Set;
+
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintViolation;
@@ -23,12 +30,6 @@
import org.hibernate.validator.internal.util.logging.LoggerFactory;
import org.hibernate.validator.spi.valuehandling.ValidatedValueUnwrapper;
-import static org.hibernate.validator.constraints.CompositionType.ALL_FALSE;
-import static org.hibernate.validator.constraints.CompositionType.AND;
-import static org.hibernate.validator.constraints.CompositionType.OR;
-import static org.hibernate.validator.internal.util.CollectionHelper.newArrayList;
-import static org.hibernate.validator.internal.util.CollectionHelper.newHashSet;
-
/**
* Due to constraint composition a single constraint annotation can lead to a whole constraint tree being validated.
* This class encapsulates such a tree.
@@ -104,6 +105,9 @@ private
+ * This test makes sure that the Karaf features provided by this project are installable.
+ *
+ * Note that if a feature is not installable, the test gets stuck for a while but it is a
+ * good indication that something is wrong.
+ *
+ * @author Toni Menzel (toni@rebaze.com)
+ */
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerClass.class)
+public class KarafFeaturesAreInstallableTest {
+
+ @Inject
+ private FeaturesService featuresService;
+
+ private static final boolean DEBUG = false;
+
+ @Configuration
+ public Option[] config() {
+ MavenArtifactUrlReference hibernateValidatorFeature = maven()
+ .groupId( "org.hibernate" )
+ .artifactId( "hibernate-validator-osgi-karaf-features" )
+ .classifier( "features" )
+ .type( "xml" )
+ .versionAsInProject();
+
+ return options(
+ when( DEBUG ).useOptions( debugConfiguration( "5005", true ) ),
+ karafDistributionConfiguration()
+ .frameworkUrl(
+ maven()
+ .groupId( "org.apache.karaf" )
+ .artifactId( "apache-karaf" )
+ .type( "tar.gz" )
+ .versionAsInProject()
+ )
+ .unpackDirectory( new File( "target/exam" ) )
+ .useDeployFolder( false ),
+ configureConsole()
+ .ignoreLocalConsole()
+ .ignoreRemoteShell(),
+ when( DEBUG ).useOptions( keepRuntimeFolder() ),
+ logLevel( LogLevelOption.LogLevel.INFO ),
+ // avoiding additional boot features; specifically "enterprise" which already comes with a HV feature
+ // "system" is the absolute minimum, but enough for our purposes
+ editConfigurationFilePut(
+ "etc/org.apache.karaf.features.cfg",
+ "featuresBoot",
+ "system"
+ ),
+ systemProperty( "validatorRepositoryUrl" ).value( hibernateValidatorFeature.getURL() )
+ );
+ }
+
+ @BeforeClass
+ public static void setLocaleToEnglish() {
+ Locale.setDefault( Locale.ENGLISH );
+ }
+
+ @Test
+ public void canInstallFeatureHibernateValidator() throws Exception {
+ featuresService.addRepository( new URI( System.getProperty( "validatorRepositoryUrl" ) ) );
+ canInstallFeature( "hibernate-validator" );
+ }
+
+ @Test
+ public void canInstallFeatureHibernateValidatorParanamer() throws Exception {
+ featuresService.addRepository( new URI( System.getProperty( "validatorRepositoryUrl" ) ) );
+ canInstallFeature( "hibernate-validator-paranamer" );
+ }
+
+ public void canInstallFeature(String featureName) throws Exception {
+ Feature feature = featuresService.getFeature( featureName );
+ assertNotNull( "Feature " + featureName + " is not available from features list", feature );
+ featuresService.installFeature( featureName );
+ assertTrue( "Feature " + featureName + " isn't installed, though available from features list", featuresService.isInstalled( feature ) );
+ }
+}
diff --git a/osgi/karaf-features/pom.xml b/osgi/karaf-features/pom.xml
index 0d135bca71..057991dcb1 100644
--- a/osgi/karaf-features/pom.xml
+++ b/osgi/karaf-features/pom.xml
@@ -11,7 +11,7 @@