You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by dw...@apache.org on 2009/06/01 18:26:43 UTC

svn commit: r780706 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/conf/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ openjpa-persistence/src/main/java/o...

Author: dwoods
Date: Mon Jun  1 16:26:43 2009
New Revision: 780706

URL: http://svn.apache.org/viewvc?rev=780706&view=rev
Log:
OPENJPA-1068 Use validation mode to determine if we should setup a ValidatingLifecycleEventManager or not.  Based on patch from Jeremy with one config scenario still to be addressed in OPENJPA-1111.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java
    openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java?rev=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java Mon Jun  1 16:26:43 2009
@@ -26,6 +26,7 @@
 import org.apache.openjpa.ee.ManagedRuntime;
 import org.apache.openjpa.enhance.RuntimeUnenhancedClasssesModes;
 import org.apache.openjpa.event.BrokerFactoryEventManager;
+import org.apache.openjpa.event.LifecycleEventManager;
 import org.apache.openjpa.event.OrphanedKeyAction;
 import org.apache.openjpa.event.RemoteCommitEventManager;
 import org.apache.openjpa.event.RemoteCommitProvider;
@@ -1676,7 +1677,7 @@
      *
      * @since 2.0.0
      */
-    public Object getValidationFactory();
+    public Object getValidationFactoryInstance();
 
     /**
      * Set the container or application provided ValidatorFactory instance.
@@ -1685,4 +1686,18 @@
      * @since 2.0.0
      */
     public void setValidationFactory(Object factory);
+    
+   /**
+     * Gets the lifecycle event manager instance
+     * 
+     * @since 2.0.0
+     */
+    public LifecycleEventManager getLifecycleEventManagerInstance();
+
+    /**
+     * Sets the lifecycle event manager instance.
+     * 
+     * @since 2.0.0
+     */
+    public void setLifecycleEventManager(LifecycleEventManager eventMgr);
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java?rev=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java Mon Jun  1 16:26:43 2009
@@ -31,6 +31,7 @@
 import org.apache.openjpa.enhance.PCEnhancerAgent;
 import org.apache.openjpa.enhance.RuntimeUnenhancedClasssesModes;
 import org.apache.openjpa.event.BrokerFactoryEventManager;
+import org.apache.openjpa.event.LifecycleEventManager;
 import org.apache.openjpa.event.OrphanedKeyAction;
 import org.apache.openjpa.event.RemoteCommitEventManager;
 import org.apache.openjpa.event.RemoteCommitProvider;
@@ -155,6 +156,8 @@
     public ObjectValue specification;
     public StringValue validationMode;
     public ObjectValue validationFactory;
+    public ObjectValue lifecycleEventManager;
+
     
     // custom values
     public BrokerFactoryValue brokerFactoryPlugin;
@@ -557,17 +560,8 @@
         queryTimeout.setDynamic(true);
 
         // kernel can't access javax.persistence.ValidationMode enums here
+        // so the config will be done in PersistenceProductDerivation
         validationMode = addString("javax.persistence.validation.mode");
-        aliases =
-            new String[] {
-                "AUTO", "auto",
-                "CALLBACK", "callback",
-                "NONE", "none"
-            };
-        validationMode.setAliases(aliases);
-        validationMode.setAliasListComprehensive(true);
-        validationMode.setDefault(aliases[0]);
-        validationMode.set(aliases[0]);
         validationMode.setDynamic(true);
 
         validationFactory = addObject("javax.persistence.validation.factory");
@@ -575,6 +569,10 @@
             "getValidationFactoryInstance");
         validationFactory.setDynamic(true);
 
+        lifecycleEventManager = addObject("LifecycleEventManager");
+        lifecycleEventManager.setInstantiatingGetter(
+                "getLifecycleEventManagerInstance");
+
         dynamicEnhancementAgent  = addBoolean("DynamicEnhancementAgent");
         dynamicEnhancementAgent.setDefault("true");
         dynamicEnhancementAgent.set(true);
@@ -1538,11 +1536,15 @@
     }
 
     public void setValidationMode(String mode) {
+        Thread.dumpStack();
         validationMode.setString(mode);
     }
 
     public String getValidationMode() {
-        return validationMode.getString();
+        String mode = validationMode.getString();
+        if (mode == null)
+            mode = validationMode.getDefault();
+        return mode;
     }
 
     public void instantiateAll() {
@@ -1601,10 +1603,6 @@
         return (FinderCache)finderCachePlugin.get();
     }
 
-    public Object getValidationFactory() {
-        return validationFactory.get();
-    }
-
     public Object getValidationFactoryInstance() {
         return validationFactory.get();
     }
@@ -1612,10 +1610,24 @@
     public void setValidationFactory(Object factory) {
         validationFactory.set(factory);                            
     }
+    
+    public LifecycleEventManager getLifecycleEventManagerInstance() {
+        if (lifecycleEventManager.get() == null) {
+            lifecycleEventManager.set(new LifecycleEventManager());
+        }
+        return (LifecycleEventManager)lifecycleEventManager.get();
+    }
+
+    public void setLifecycleEventManager(LifecycleEventManager eventMgr) {
+        lifecycleEventManager.set(eventMgr);
+    }
+
     public boolean getDynamicEnhancementAgent() {
         return dynamicEnhancementAgent.get();
     }
+
     public void setDynamicEnhancementAgent(boolean dynamic) {
         dynamicEnhancementAgent.set(dynamic);
     }    
 }
+

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?rev=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Mon Jun  1 16:26:43 2009
@@ -89,6 +89,7 @@
 import org.apache.openjpa.util.StoreException;
 import org.apache.openjpa.util.UnsupportedException;
 import org.apache.openjpa.util.UserException;
+import org.apache.openjpa.util.WrappedException;
 
 /**
  * Concrete {@link Broker}. The broker handles object-level behavior,
@@ -301,7 +302,7 @@
             _runtime = new LocalManagedRuntime(this);
 
         if (!fromDeserialization) {
-            _lifeEventManager = new LifecycleEventManager();
+            _lifeEventManager = _conf.getLifecycleEventManagerInstance();
             _transEventManager = new TransactionEventManager();
             int cmode = _conf.getMetaDataRepositoryInstance().
                 getMetaDataFactory().getDefaults().getCallbackMode();
@@ -315,7 +316,7 @@
         // make sure to do this after configuring broker so that store manager
         // can look to broker configuration; we set both store and lock managers
         // before initializing them because they may each try to access the
-        // other in thier initialization
+        // other in their initialization
         _store = sm;
         _lm = _conf.newLockManagerInstance();
         _im = _conf.newInverseManagerInstance();
@@ -800,11 +801,17 @@
             return;
 
         OpenJPAException ce;
-        if (exceps.length == 1)
-            ce = new CallbackException(exceps[0]);
-        else 
+        if (exceps.length == 1) {
+            // If the exception is already a wrapped exception throw the 
+            // exception instead of wrapping it with a callback exception
+            if (exceps[0] instanceof WrappedException)
+                throw (WrappedException)exceps[0];
+            else
+                ce = new CallbackException(exceps[0]);
+        } else {
             ce = new CallbackException(_loc.get("callback-err")).
                 setNestedThrowables(exceps);
+        }
         if ((mode & CALLBACK_ROLLBACK) != 0 && (_flags & FLAG_ACTIVE) != 0) {
             ce.setFatal(true);
             setRollbackOnlyInternal(ce);

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java?rev=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java Mon Jun  1 16:26:43 2009
@@ -44,7 +44,6 @@
 import org.apache.openjpa.conf.OpenJPAConfigurationImpl;
 import org.apache.openjpa.conf.OpenJPAProductDerivation;
 import org.apache.openjpa.conf.Specification;
-import org.apache.openjpa.kernel.LockLevels;
 import org.apache.openjpa.kernel.MixedLockLevels;
 import org.apache.openjpa.lib.conf.AbstractProductDerivation;
 import org.apache.openjpa.lib.conf.Configuration;
@@ -57,6 +56,10 @@
 import org.apache.openjpa.lib.meta.XMLVersionParser;
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.persistence.validation.ValidatorImpl;
+import org.apache.openjpa.validation.Validator;
+import org.apache.openjpa.validation.ValidationException;
+import org.apache.openjpa.validation.ValidatingLifecycleEventManager;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -142,6 +145,18 @@
         conf.lockManagerPlugin.setAlias("mixed",
             "org.apache.openjpa.jdbc.kernel.MixedLockManager");
 
+        String[] aliases = new String[] {
+            String.valueOf(ValidationMode.AUTO),
+            String.valueOf(ValidationMode.AUTO).toLowerCase(),
+            String.valueOf(ValidationMode.CALLBACK),
+            String.valueOf(ValidationMode.CALLBACK).toLowerCase(),
+            String.valueOf(ValidationMode.NONE),
+            String.valueOf(ValidationMode.NONE).toLowerCase()
+        };
+        conf.validationMode.setAliases(aliases);
+        conf.validationMode.setAliasListComprehensive(true);
+        conf.validationMode.setDefault(aliases[0]);
+
         return true;
     }
 
@@ -164,6 +179,39 @@
             Compatibility compatibility = conf.getCompatibilityInstance();
             compatibility.setFlushBeforeDetach(true);
             compatibility.setCopyOnDetach(true);
+        } else {
+            // only try creating a ValidatingLifecycleEventManager if needed
+            if (!ValidatorImpl.skipValidation(conf.getValidationMode())) {
+                try {
+                    Validator val = new ValidatorImpl(
+                        conf.getValidationFactoryInstance(),
+                        conf.getValidationMode());
+                    // we have a Validator, so try to create a VLEM
+                    conf.setLifecycleEventManager(
+                        new ValidatingLifecycleEventManager(val));
+                } catch (RuntimeException e) {
+                    if (ValidatorImpl.validationRequired(
+                        conf.getValidationMode())) {
+                        // fatal error - ValidationMode requires a Validator
+                        conf.getConfigurationLog().error(
+                            _loc.get("vlem-creation-error"), e);
+                        // rethrow as a WrappedException
+                        throw new ValidationException(e);
+                    } else {
+                        // unexpected, but validation is optional,
+                        // so just log it as a warning
+                        conf.getConfigurationLog().warn(
+                            _loc.get("vlem-creation-warn"));
+                        // if tracing, log the exception details
+                        conf.getConfigurationLog().trace(e);
+                    }
+                }
+            } else {
+                conf.getConfigurationLog().trace(
+                    "Validation has been disabled by supplied mode.");
+            }
+            // make sure we have at least a LifecycleEventManager created
+            conf.getLifecycleEventManagerInstance();
         }
         return true;
     }

Modified: 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=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/validation/ValidatorImpl.java Mon Jun  1 16:26:43 2009
@@ -65,55 +65,104 @@
     }
 
     /**
+     * Is a Validator required based on the given validation mode?
+     * Keeping validation mode logic in a single class...
+     * @param mode
+     * @return true if a Validator is required
+     */
+    public static boolean validationRequired(String mode) {
+        return String.valueOf(ValidationMode.CALLBACK).equalsIgnoreCase(mode);
+    }
+    
+    /**
+     * Skip creating a Validator based on the given validation mode?
+     * Keeping validation mode logic in a single class...
+     * @param mode
+     * @return true if a Validator should not be created
+     */
+    public static boolean skipValidation(String mode) {
+        return String.valueOf(ValidationMode.NONE).equalsIgnoreCase(mode);
+    }
+    
+    /**
      * Default constructor.  Builds a default validator factory, if available
      * and creates the validator.
+     * Returns an Exception if a Validator could not be created.
      */
     public ValidatorImpl() {
-        // Add the default validation groups
-        _validatorFactory = getDefaultValidatorFactory();
-        if (_validatorFactory != null)
-            _validator = _validatorFactory.getValidator();
-        addDefaultValidationGroups();
+        initialize();
     }
     
     /**
      * Type-specific constructor
+     * Returns an Exception if a Validator could not be created.
      * @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 (mode != null) {
+            _mode = mode;
+        }
         if (validatorFactory != null) {
             _validatorFactory = validatorFactory;
-        } else {
-            _validatorFactory = getDefaultValidatorFactory();
         }
-        if (_validatorFactory != null)
-            _validator = _validatorFactory.getValidator();
-        addDefaultValidationGroups();
+        initialize();
     }
 
     /**
      * Generic-type constructor 
+     * Returns an Exception if a Validator could not be created.
      * @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();
+        if (validatorFactory != null) {
+            if (validatorFactory instanceof ValidatorFactory) {
+                _validatorFactory = (ValidatorFactory)validatorFactory;
+            } else {
+                // TODO: Add a localized exception
+                throw new IllegalArgumentException();                
+            }
+        }
+        initialize();
     }
 
     /**
+     * Common setup code factored out of the constructors
+     */
+    private void initialize() {
+        // only try setting up a validator if mode is not NONE
+        if (_mode != ValidationMode.NONE) {
+            if (_validatorFactory == null) {
+                _validatorFactory = getDefaultValidatorFactory();
+            }
+            if (_validatorFactory != null) {
+                _validator = _validatorFactory.getValidator();
+            } else {
+                // TODO: Add a localized exception
+                throw new RuntimeException("No default ValidatorFactory");
+            }
+            
+            // throw an exception if we have no Validator
+            if (_validator == null) {
+                // TODO: Add a localized exception
+                throw new RuntimeException("No Validator provider");
+            }
+
+            // add in default validation groups, which can be over-ridden later
+            addDefaultValidationGroups();
+        } else {
+            // TODO: Add a localized exception
+            throw new RuntimeException("No Validator should be created based " +
+                "on the supplied Validation Mode.");
+        }
+    }
+    
+    /**
      * 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.
@@ -126,9 +175,11 @@
         if (event != null) {
             _validationGroups.put(event, vgs);
             return;
+        } else {
+            // TODO: Add a localized exception
+            throw new IllegalArgumentException("There were no events found " +
+                "for the supplied group name.");
         }
-        // TODO: Add a localized exception
-        throw new IllegalArgumentException();
     }
             
     /**
@@ -161,7 +212,7 @@
      * @return returns true if validating for this particular event
      */
     public boolean isValidating(Integer event) {
-        return _validationGroups.get(event) != null;
+        return (_validationGroups.get(event) != null);
     }
 
     /**
@@ -275,8 +326,12 @@
     
     // Get the default validator factory
     private ValidatorFactory getDefaultValidatorFactory() {
-        ValidatorFactory factory = 
-            Validation.buildDefaultValidatorFactory();
+        ValidatorFactory factory = null;
+        try {
+            factory = Validation.buildDefaultValidatorFactory();
+        } catch (javax.validation.ValidationException e) {
+            // no validation providers found
+        }
         return factory;
     }
     

Modified: openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties?rev=780706&r1=780705&r2=780706&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties (original)
+++ openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties Mon Jun  1 16:26:43 2009
@@ -195,4 +195,8 @@
     for "{0}".
 dynamic-agent: OpenJPA dynamically loaded the class enhancer. Any classes \
     that were not enhanced at build time will be enhanced when the are \
-    loaded by the JVM
+    loaded by the JVM.
+vlem-creation-warn: Failed to create the optional Validation Provider.
+vlem-creation-error: A fatal error occurred while trying to \
+    create the required Validation Provider.
+