Author: jrbauer
Date: Mon May 18 17:05:48 2009
New Revision: 776009

URL: http://svn.apache.org/viewvc?rev=776009&view=rev
Log:
OPENJPA-1068 Rev 1 of lifecycle validation

Added:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java
   (with props)
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java
   (with props)
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java
   (with props)
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java
   (with props)
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java
   (with props)
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/
    
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ExceptionInfo.java
    openjpa/trunk/openjpa-persistence/pom.xml
    openjpa/trunk/pom.xml

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ExceptionInfo.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ExceptionInfo.java?rev=776009&r1=776008&r2=776009&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ExceptionInfo.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ExceptionInfo.java
 Mon May 18 17:05:48 2009
@@ -32,6 +32,8 @@
     public static final int STORE = 2;
     public static final int UNSUPPORTED = 3;
     public static final int USER = 4;
+    public static final int WRAPPED = 5;
+
 
     /**
      * Exception message.

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,41 @@
+/*
+ * 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.openjpa.util;
+
+...@suppresswarnings("serial")
+/**
+ * Identifiable exception type which wraps an internal runtime exception.
+ */
+public class WrappedException extends OpenJPAException {
+        
+    private RuntimeException _wrappedException = null;
+    
+    public WrappedException(RuntimeException e) {
+        _wrappedException = e;
+    }
+    
+    public RuntimeException getWrapped() {
+        return _wrappedException;
+    }
+
+    @Override
+    public int getType() {
+        return WRAPPED;
+    }    
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/WrappedException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,37 @@
+/*
+ * 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.openjpa.validation;
+
+/**
+ * Abstract validation class which provides base validation methods.
+ */
+public abstract class AbstractValidator implements Validator {
+
+    public abstract <T> ValidationException validate(T arg0, int event);
+
+    public abstract <T> ValidationException validateProperty(T arg0, 
+            String property, int event); 
+
+    public abstract <T> ValidationException validateValue(Class<T> arg0, 
+        String arg1, Object arg2, int event);
+
+    public <T> boolean validating(T arg0, int event) {
+        return false;
+    }
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/AbstractValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,113 @@
+/*
+ * 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.openjpa.validation;
+
+import org.apache.openjpa.event.LifecycleEvent;
+import org.apache.openjpa.event.LifecycleEventManager;
+import org.apache.openjpa.meta.ClassMetaData;
+
+/**
+ * An extension of LifecycleEventManager which adds validation capabilities for
+ * specific lifecycle events.  Validation occurs after firing all lifecycle 
+ * events and callbacks.
+ * 
+ */
+...@suppresswarnings("serial")
+public class ValidatingLifecycleEventManager extends LifecycleEventManager {
+
+    private Validator _validator = null;
+
+    /**
+     * Constructor which accepts a reference to the validator to use.  If null,
+     * no validation will occur.
+     * @param validator
+     */
+    public ValidatingLifecycleEventManager(Validator validator) {
+        super();
+        _validator = validator;        
+    }
+        
+    @Override
+    public boolean hasUpdateListeners(Object source, ClassMetaData meta) {
+        if (_validator == null) {            
+            return super.hasUpdateListeners(source, meta);
+        }
+        return _validator.validating(source, LifecycleEvent.BEFORE_PERSIST) &&
+            super.hasUpdateListeners(source, meta);
+    }
+
+    @Override
+    public boolean hasPersistListeners(Object source, ClassMetaData meta) {
+        if (_validator == null) {            
+            return super.hasPersistListeners(source, meta);
+        }
+        return _validator.validating(source, LifecycleEvent.BEFORE_UPDATE) &&
+            super.hasPersistListeners(source, meta);        
+    }
+
+    @Override
+    public boolean hasDeleteListeners(Object source, ClassMetaData meta) {
+        if (_validator == null) {            
+            return super.hasDeleteListeners(source, meta);
+        }
+        return _validator.validating(source, LifecycleEvent.BEFORE_DELETE) &&
+            super.hasDeleteListeners(source, meta);
+    }
+
+    @Override
+    public Exception[] fireEvent(Object source,
+        ClassMetaData meta, int type) {
+        
+        return fireEvent(source, null, meta, type);
+    }
+    
+    @Override
+    public Exception[] fireEvent(Object source, Object related,
+        ClassMetaData meta, int type) {
+
+        // Fire all pre-validation events and handlers.
+        Exception[] evx = super.fireEvent(source, related, meta, type);
+
+        // If there are exceptions and the event manager is marked fail fast
+        // do not validate
+        if (evx != null && evx.length > 0 && isFailFast())
+            return evx;
+        
+        // If a validator is provided and the source object should be 
validated,
+        // validate it and return any exceptions
+        if (_validator != null && _validator.validating(source, type)) {
+            ValidationException vex = _validator.validate(source, type);
+            if (vex != null) {
+                if (evx == null || evx.length == 0) {
+                    evx = new Exception[1];
+                    evx[0] = vex;
+                }
+                else {
+                    // resize the exception array and add the validation
+                    // exception
+                    Exception[] vevx = new Exception[evx.length +1];
+                    System.arraycopy(vevx, 0, evx, 0, evx.length);
+                    vevx[evx.length+1] = vex;
+                    evx = vevx;
+                }
+            }
+        }
+        return evx;
+    }
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidatingLifecycleEventManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,29 @@
+/*
+ * 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.openjpa.validation;
+
+import org.apache.openjpa.util.WrappedException;
+
+...@suppresswarnings("serial")
+public class ValidationException extends WrappedException {
+    
+    public ValidationException(RuntimeException e) {
+        super(e);
+    }
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/ValidationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java
 (added)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,78 @@
+/*
+ * 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.openjpa.validation;
+
+/**
+ * Basic validation interface which defines the contract for
+ * event based validation.  Event values are defined in LifeCycleEvent.
+ */
+public interface Validator {
+
+    /**
+     * Validates a given instance
+     * 
+     * @param <T> The instance to validate
+     * @param arg0 The class, of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    public <T> ValidationException validate(T arg0, int event);
+
+    /**
+     * Validates a property of a given instance
+     * 
+     * @param <T> The instance to validate
+     * @param arg0 The class, of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    public <T> ValidationException validateProperty(T arg0, 
+            String property, int event); 
+
+    /**
+     * Validates a value based upon the constraints applied to a given class
+     * attribute.
+     * @param <T> The instance type to base validation upon
+     * @param arg0 The class of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    public <T> ValidationException validateValue(Class<T> arg0, 
+        String arg1, Object arg2, int event);
+
+    /**
+     * Method for determining whether validation is active for the given 
+     * type and event.
+     * 
+     * @param <T>
+     * @param arg0 Type being validated
+     * @param event event type
+     * @return true if validation is active for the specified event
+     */
+    public <T> boolean validating(T arg0, int event);
+}

Propchange: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/validation/Validator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence/pom.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/pom.xml?rev=776009&r1=776008&r2=776009&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/pom.xml (original)
+++ openjpa/trunk/openjpa-persistence/pom.xml Mon May 18 17:05:48 2009
@@ -43,6 +43,10 @@
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-jpa_2.0_spec</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-validation_1.0_spec</artifactId>
+        </dependency>        
     </dependencies>
     
     <profiles>

Added: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java?rev=776009&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
 Mon May 18 17:05:48 2009
@@ -0,0 +1,292 @@
+/*
+ * 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.openjpa.persistence.validation;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.persistence.ValidationMode;
+import javax.validation.BeanDescriptor;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+
+import org.apache.openjpa.event.LifecycleEvent;
+import org.apache.openjpa.validation.AbstractValidator;
+import org.apache.openjpa.validation.ValidationException;
+
+public class ValidatorImpl extends AbstractValidator {
+    
+    private ValidatorFactory _validatorFactory = null;
+    private Validator _validator = null;
+    private ValidationMode _mode = ValidationMode.AUTO;
+    
+    // A map storing the validation groups to use for a particular event type
+    private Map<Integer, Class<?>[]> _validationGroups = 
+        new HashMap<Integer,Class<?>[]>();
+        
+    // Lookup table for event to group property mapping 
+    private static HashMap<String, Integer> _vgMapping = 
+        new HashMap<String, Integer> ();
+            
+    public static final String VG_PRE_PERSIST = 
+        "javax.persistence.validation.group.pre-persist";
+    public static final String VG_PRE_REMOVE =
+        "javax.persistence.validation.group.pre-remove";
+    public static final String VG_PRE_UPDATE =
+        "javax.persistence.validation.group.pre-update";
+    
+    static {
+        _vgMapping.put(VG_PRE_PERSIST,
+            LifecycleEvent.BEFORE_STORE);
+        _vgMapping.put(VG_PRE_REMOVE,
+            LifecycleEvent.BEFORE_DELETE);
+        _vgMapping.put(VG_PRE_UPDATE,
+            LifecycleEvent.BEFORE_UPDATE); 
+    }
+
+    /**
+     * Default constructor.  Builds a default validator factory, if available
+     * and creates the validator.
+     */
+    public ValidatorImpl() {
+        // Add the default validation groups
+        _validatorFactory = getDefaultValidatorFactory();
+        if (_validatorFactory != null)
+            _validator = _validatorFactory.getValidator();
+        addDefaultValidationGroups();
+    }
+    
+    /**
+     * Type-specific constructor
+     * @param validatorFactory Instance of validator factory to use.  Specify
+     *        null to use the default factory.
+     * @param mode ValdiationMode enum value
+     */
+    public ValidatorImpl(ValidatorFactory validatorFactory,
+        ValidationMode mode) {
+        if (validatorFactory != null) {
+            _validatorFactory = validatorFactory;
+        } else {
+            _validatorFactory = getDefaultValidatorFactory();
+        }
+        if (_validatorFactory != null)
+            _validator = _validatorFactory.getValidator();
+        addDefaultValidationGroups();
+    }
+
+    /**
+     * Generic-type constructor 
+     * @param validatorFactory an instance to the validatorFactory
+     * @param mode validation mode enum as string value
+     */    
+    public ValidatorImpl(Object validatorFactory,
+        String mode) {        
+        if (validatorFactory != null && validatorFactory instanceof
+                ValidatorFactory) {
+            _validatorFactory = (ValidatorFactory)validatorFactory;
+        } else {
+            _validatorFactory = getDefaultValidatorFactory();
+        }
+        _mode = Enum.valueOf(ValidationMode.class, mode);
+        if (_validatorFactory != null)
+            _validator = _validatorFactory.getValidator();
+        addDefaultValidationGroups();
+    }
+
+    /**
+     * Add a validation group for the specific property.  The properties map
+     * to a specific lifecycle event.  To disable validation for a group, set
+     * the validation group to null.
+     * 
+     * @param validationGroupName
+     * @param vgs
+     */
+    public void addValidationGroup(String validationGroupName, Class<?>...vgs) 
{
+        Integer event = findEvent(validationGroupName);
+        if (event != null) {
+            _validationGroups.put(event, vgs);
+            return;
+        }
+        // TODO: Add a localized exception
+        throw new IllegalArgumentException();
+    }
+            
+    /**
+     * Add a validation group for a specified event.  Event definitions
+     * are defined in LifecycleEvent.  To disable validation for a group, set
+     * the validation group to null.
+     * 
+     * @param event
+     * @param validationGroup
+     */
+    public void addValidationGroup(Integer event, Class<?>... validationGroup) 
{
+        _validationGroups.put(event, validationGroup);        
+    }
+    
+    /**
+     * Return the validation groups to be validated for a specified event
+     * @param event Lifecycle event id
+     * @return An array of validation groups
+     */
+    public Class<?>[] getValidationGroup(Integer event) {
+        return _validationGroups.get(event);
+    }
+    
+    /**
+     * Returns whether the Validator is validating for the 
+     * specified event.  Based on whether validation groups are specified for
+     * the event.
+     * 
+     * @param event the event to check for validation
+     * @return returns true if validating for this particular event
+     */
+    public boolean isValidating(Integer event) {
+        return _validationGroups.get(event) != null;
+    }
+
+    /**
+     * Returns the validation constraints for the specified class
+     * 
+     * @param cls Class for which constraints to return
+     * @return The validation bean descriptor
+     */
+    public BeanDescriptor getConstraintsForClass(Class<?> cls) {
+        return _validator.getConstraintsForClass(cls);
+    }
+
+    /**
+     * Validates a given instance
+     * 
+     * @param <T> The instance to validate
+     * @param arg0 The class, of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    @Override
+    public <T> ValidationException validate(T arg0, int event) { 
+        if (!isValidating(event))
+            return null;
+        Set<ConstraintViolation<T>> violations = 
+            _validator.validate(arg0, getValidationGroup(event));
+        if (violations != null && violations.size() > 0) {
+            return new ValidationException(
+                new ConstraintViolationException(
+                    (Set)violations));
+        }
+        return null;
+    }
+
+    /**
+     * Validates a property of a given instance
+     * 
+     * @param <T> The instance to validate
+     * @param arg0 The class, of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    @Override
+    public <T> ValidationException validateProperty(T arg0, String property,
+        int event) {
+        if (!isValidating(event))
+            return null;
+        Set<ConstraintViolation<T>> violations = 
+            _validator.validateProperty(arg0, property, 
+                getValidationGroup(event));
+        if (violations != null && violations.size() > 0) {
+            return new ValidationException(
+                new ConstraintViolationException(
+                        (Set)violations));
+        }
+        return null;
+    }
+
+    /**
+     * Validates a value based upon the constraints applied to a given class
+     * attribute.
+     * @param <T> The instance type to base validation upon
+     * @param arg0 The class of type T to validate
+     * @param arg1 The property to validate
+     * @param arg2 The property value to validate
+     * @param event The event id
+     * @return A Validation exception if the validator produces one or more
+     *         constraint violations.
+     */
+    @Override
+    public <T> ValidationException validateValue(Class<T> arg0, 
+        String arg1, Object arg2, int event)  {
+        if (!isValidating(event))
+            return null;
+        Set<ConstraintViolation<T>> violations = 
+            _validator.validateValue(arg0, arg1, arg2, 
+                getValidationGroup(event));
+        if (violations != null && violations.size() > 0) {
+            return new ValidationException(
+                new ConstraintViolationException(
+                    (Set)violations));
+        }
+        return null;
+    }
+
+    /**
+     * Returns whether validation is active for the given event.
+     * 
+     * @param <T>
+     * @param arg0 Type being validated
+     * @param event event type
+     * @return true if validation is active for the specified event
+     */
+    @Override
+    public <T> boolean validating(T arg0, int event) {
+        // TODO: This method will also make a determination based upon which 
+        // groups are validating and the group defined on the class
+        return isValidating(event);
+    }
+    
+    // Lookup the lifecycle event id for the validationProperty
+    private Integer findEvent(String validationProperty) {
+        return _vgMapping.get(validationProperty);
+    }
+    
+    // Get the default validator factory
+    private ValidatorFactory getDefaultValidatorFactory() {
+        ValidatorFactory factory = 
+            Validation.buildDefaultValidatorFactory();
+        return factory;
+    }
+    
+    // Per JSR-317, the pre-persist and pre-update groups will validate using
+    // the default validation group and pre-remove will not validate (no 
+    // validation group)
+    private void addDefaultValidationGroups() {
+        addValidationGroup(VG_PRE_PERSIST, 
+            javax.validation.groups.Default.class);
+        addValidationGroup(VG_PRE_UPDATE, 
+                javax.validation.groups.Default.class);
+    }
+}

Propchange: 
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/pom.xml?rev=776009&r1=776008&r2=776009&view=diff
==============================================================================
--- openjpa/trunk/pom.xml (original)
+++ openjpa/trunk/pom.xml Mon May 18 17:05:48 2009
@@ -450,6 +450,11 @@
                 <version>1.1.1</version>
             </dependency>
             <dependency>
+              <groupId>org.apache.geronimo.specs</groupId>
+              <artifactId>geronimo-validation_1.0_spec</artifactId>
+              <version>1.0-SNAPSHOT</version>
+            </dependency>            
+            <dependency>
                 <groupId>org.apache.derby</groupId>
                 <artifactId>derby</artifactId>
                 <version>10.2.2.0</version>


Reply via email to