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/05/14 23:14:47 UTC

svn commit: r774930 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/conf/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/ openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/...

Author: dwoods
Date: Thu May 14 21:14:45 2009
New Revision: 774930

URL: http://svn.apache.org/viewvc?rev=774930&view=rev
Log:
OPENJPA-1077 Validation-mode element support added to persistence.xml and to createEMF properties Map

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/
    openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml   (with props)
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-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceUnitInfoImpl.java

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=774930&r1=774929&r2=774930&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 Thu May 14 21:14:45 2009
@@ -1645,4 +1645,20 @@
      * @since 2.0.0
      */
     public void setFinderCache(String cache);
+    
+    /**
+     * The bean validation mode to use for managed classes.
+     * Defaults to <code>AUTO</code>.
+     *
+     * @since 2.0.0
+     */
+    public String getValidationMode();
+
+    /**
+     * Set the bean validation mode to use for managed classes.
+     * If not set, defaults to <code>AUTO</code>.
+     *
+     * @since 2.0.0
+     */
+    public void setValidationMode(String mode);
 }

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=774930&r1=774929&r2=774930&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 Thu May 14 21:14:45 2009
@@ -152,6 +152,7 @@
     public PluginValue preparedQueryCachePlugin;
     public PluginValue finderCachePlugin;
     public ObjectValue specification;
+    public StringValue validationMode;
     
     // custom values
     public BrokerFactoryValue brokerFactoryPlugin;
@@ -550,7 +551,21 @@
         queryTimeout = addInt("javax.persistence.query.timeout");
         queryTimeout.setDefault("-1");
         queryTimeout.setDynamic(true);
-        
+
+        // kernel can't access javax.persistence.ValidationMode enums here
+        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);
+
         // initialize supported options that some runtimes may not support
         supportedOptions.add(OPTION_NONTRANS_READ);
         supportedOptions.add(OPTION_OPTIMISTIC);
@@ -1509,6 +1524,14 @@
     	eagerInitialization.set(retry);
     }
 
+    public void setValidationMode(String mode) {
+        validationMode.setString(mode);
+    }
+
+    public String getValidationMode() {
+        return validationMode.getString();
+    }
+
     public void instantiateAll() {
         super.instantiateAll();
         getMetaDataRepositoryInstance();

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java?rev=774930&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java Thu May 14 21:14:45 2009
@@ -0,0 +1,226 @@
+/*
+ * 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 javax.persistence.ValidationMode;
+
+import org.apache.openjpa.conf.OpenJPAConfiguration;
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.query.SimpleEntity;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests the new Bean Validation Mode support in the JPA 2.0 spec.
+ * Basic (no provider) Validation scenarios being tested:
+ *   1) By default, validation mode is AUTO
+ *   2) Validation mode of AUTO in persistence.xml is the same as default
+ *   3) Validation mode of NONE in persistence.xml overrides default AUTO
+ *   4) Validation mode of CALLBACK in persistence.xml overrides default AUTO
+ *   5) Validation mode in createEMF(Map props) overrides no persistence.xml
+ *   6) Validation mode in createEMF(Map props) overrides persistence.xml
+ *   7) Validation mode in createEMF(Map props) can be a ValidationMode enum
+ * 
+ * @version $Rev$ $Date$
+ */
+public class TestValidationMode extends SingleEMFTestCase {
+
+    @Override
+    public void setUp() {
+        super.setUp(CLEAR_TABLES, SimpleEntity.class);
+    }
+
+    /**
+     * Scenario being tested:
+     *   1) By default, validation mode == AUTO
+     */
+    public void testValidationMode1() {
+        getLog().trace("testValidationMode1() - Default mode is AUTO");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple",
+            "org/apache/openjpa/persistence/validation/persistence.xml");
+        assertNotNull(emf);
+        // verify default validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Default validation mode", 
+            String.valueOf(ValidationMode.AUTO),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   2) Validation mode of AUTO in persistence.xml is the same as default
+     */
+    public void testValidationMode2() {
+        getLog().trace("testValidationMode1() - AUTO in persistence.xml");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple-auto-mode",
+            "org/apache/openjpa/persistence/validation/persistence.xml");
+        assertNotNull(emf);
+        // verify expected validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.AUTO),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   3) Validation mode of NONE in persistence.xml overrides default
+     */
+    public void testValidationMode3() {
+        getLog().trace("testValidationMode3() - persistence.xml overrides " +
+            "Default");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple-none-mode",
+            "org/apache/openjpa/persistence/validation/persistence.xml");
+        assertNotNull(emf);
+        // verify validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.NONE),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   4) Validation mode of CALLBACK in persistence.xml overrides default
+     */
+    public void testValidationMode4() {
+        getLog().trace("testValidationMode4() - persistence.xml overrides " +
+            "Default");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple-callback-mode",
+            "org/apache/openjpa/persistence/validation/persistence.xml");
+        assertNotNull(emf);
+        // verify validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.CALLBACK),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   5) Validation mode in createEMF(Map props) overrides no persistence.xml
+     */
+    public void testValidationMode5() {
+        getLog().trace("testValidationMode5() - Map(NONE) overrides default");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create the Map to test overrides
+        Map<String,String> props = new HashMap<String,String>();
+        props.put("javax.persistence.validation.mode",
+            String.valueOf(ValidationMode.NONE));
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple",
+            "org/apache/openjpa/persistence/validation/persistence.xml",
+            props);
+        assertNotNull(emf);
+        // verify validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.NONE),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   6) Validation mode in createEMF(Map props) overrides persistence.xml
+     */
+    public void testValidationMode6() {
+        getLog().trace("testValidationMode6() - Map(NONE) overrides PU " +
+            "provided mode=callback");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create the Map to test overrides
+        Map<String,String> props = new HashMap<String,String>();
+        props.put("javax.persistence.validation.mode",
+            String.valueOf(ValidationMode.NONE));
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple-callback-mode",
+            "org/apache/openjpa/persistence/validation/persistence.xml",
+            props);
+        assertNotNull(emf);
+        // verify validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.NONE),
+            conf.getValidationMode());
+    }
+
+    /**
+     * Scenario being tested:
+     *   7) Validation mode in createEMF(Map props) can be a ValidationMode enum
+     */
+    public void testValidationMode7() {
+        getLog().trace("testValidationMode7() - Map(ValidationMode.NONE) " +
+            "overrides PU provided mode=callback");
+        OpenJPAEntityManagerFactory emf = null;
+
+        // create the Map to test overrides
+        Map<String,Object> props = new HashMap<String,Object>();
+        props.put("javax.persistence.validation.mode",
+            ValidationMode.NONE);
+
+        // create our EMF
+        emf = OpenJPAPersistence.createEntityManagerFactory(
+            "simple-callback-mode",
+            "org/apache/openjpa/persistence/validation/persistence.xml",
+            props);
+        assertNotNull(emf);
+        // verify validation mode
+        OpenJPAConfiguration conf = emf.getConfiguration();
+        assertNotNull(conf);
+        assertEquals("Validation mode", 
+            String.valueOf(ValidationMode.NONE),
+            conf.getValidationMode());
+    }
+
+
+    /**
+     * Internal convenience method for getting the OpenJPA logger
+     * 
+     * @return
+     */
+    private Log getLog() {
+        return emf.getConfiguration().getLog("Tests");
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/validation/TestValidationMode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml?rev=774930&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml Thu May 14 21:14:45 2009
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.   
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    version="2.0">
+    
+    <!-- Following PUs are used by TestValidationMode -->
+    <persistence-unit name="simple">
+    	<class>org.apache.openjpa.persistence.query.SimpleEntity</class>
+    </persistence-unit>
+
+    <persistence-unit name="simple-auto-mode">
+        <validation-mode>AUTO</validation-mode>
+    	<class>org.apache.openjpa.persistence.query.SimpleEntity</class>
+    </persistence-unit>
+
+    <persistence-unit name="simple-callback-mode" validation-mode="CALLBACK">
+        <validation-mode>CALLBACK</validation-mode>
+    	<class>org.apache.openjpa.persistence.query.SimpleEntity</class>
+    </persistence-unit>
+
+    <persistence-unit name="simple-none-mode" validation-mode="NONE">
+        <validation-mode>NONE</validation-mode>
+    	<class>org.apache.openjpa.persistence.query.SimpleEntity</class>
+    </persistence-unit>
+    
+</persistence>

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/validation/persistence.xml
------------------------------------------------------------------------------
    svn:eol-style = native

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=774930&r1=774929&r2=774930&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 Thu May 14 21:14:45 2009
@@ -34,6 +34,7 @@
 import java.util.MissingResourceException;
 import java.util.Set;
 
+import javax.persistence.ValidationMode;
 import javax.persistence.spi.PersistenceUnitInfo;
 import javax.persistence.spi.PersistenceUnitTransactionType;
 
@@ -43,6 +44,7 @@
 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;
@@ -686,7 +688,12 @@
                 //      startPersistenceUnit()
                 // case 'property' for 'properties' is handled in startElement()
                 case 'c': // class
-                    _info.addManagedClassName(currentText());
+                    if ("class".equals(name))
+                        _info.addManagedClassName(currentText());
+                    else // FIXME - caching
+                        throw new javax.persistence.PersistenceException(
+                            "Not implemented yet");
+                    break;
                 case 'e': // exclude-unlisted-classes
                     _info.setExcludeUnlistedClasses("true".equalsIgnoreCase
                         (currentText()));
@@ -713,6 +720,10 @@
                     if ("provider".equals(name))
                         _info.setPersistenceProviderClassName(currentText());
                     break;
+                case 'v': // validation-mode
+                    _info.setValidationMode(Enum.valueOf(ValidationMode.class,
+                        currentText()));
+                    break;
             }
         }
 

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceUnitInfoImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceUnitInfoImpl.java?rev=774930&r1=774929&r2=774930&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceUnitInfoImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceUnitInfoImpl.java Thu May 14 21:14:45 2009
@@ -60,6 +60,8 @@
     implements PersistenceUnitInfo, SourceTracker {
 
     public static final String KEY_PROVIDER = "javax.persistence.provider";
+    public static final String VALIDATION_MODE =
+        "javax.persistence.validation.mode";
 
     private static final Localizer s_loc = Localizer.forPackage
         (PersistenceUnitInfoImpl.class);
@@ -80,6 +82,7 @@
     private boolean _excludeUnlisted;
     private URL _persistenceXmlFile;
     private String _schemaVersion = "1.0";
+    private ValidationMode _validationMode;
 
     // A persistence unit is defined by a persistence.xml file. The jar
     // file or directory whose META-INF directory contains the
@@ -311,6 +314,11 @@
                     setNonJtaDataSourceName((String) val);
                 else
                     setNonJtaDataSource((DataSource) val);
+            } else if (VALIDATION_MODE.equals(key)) {
+                if (val instanceof String)
+                    setValidationMode((String) val);
+                else
+                    setValidationMode((ValidationMode) val);
             } else
                 _props.put(key, val);
         }
@@ -447,6 +455,11 @@
         // always record provider name for product derivations to access
         if (info.getPersistenceProviderClassName() != null)
             map.put(KEY_PROVIDER, info.getPersistenceProviderClassName());
+        
+        // convert validation-mode enum to a StringValue
+        if (info.getValidationMode() != null)
+            map.put(VALIDATION_MODE, String.valueOf(info.getValidationMode()));
+
         return map;
     }
 
@@ -517,9 +530,21 @@
         throw new UnsupportedOperationException(
             "JPA 2.0 - Method not yet implemented");
     }
+    
+    public void setCaching(Caching cache) {
+        throw new UnsupportedOperationException(
+        "JPA 2.0 - Method not yet implemented");
+    }
 
     public ValidationMode getValidationMode() {
-        throw new UnsupportedOperationException(
-            "JPA 2.0 - Method not yet implemented");
+        return _validationMode;
+    }
+    
+    protected void setValidationMode(String mode) {
+        setValidationMode(Enum.valueOf(ValidationMode.class, mode));
+    }
+
+    public void setValidationMode(ValidationMode mode) {
+        _validationMode = mode;
     }
 }