[maven-release-plugin]  copy for tag openjpa-parent-2.3.0

git-svn-id: https://svn.apache.org/repos/asf/openjpa/tags/openjpa-parent-2.3.0@1540826 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
index 51e2503..401129b 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
@@ -101,13 +101,12 @@
     protected void lockInternal(OpenJPAStateManager sm, int level, int timeout,
         Object sdata, boolean postVersionCheck) {
         // we can skip any already-locked instance regardless of level because
-        // we treat all locks the same (though super doesn't)
-        if (getLockLevel(sm) == LOCK_NONE) {
-            // only need to lock if not loaded from locking result
-            ConnectionInfo info = (ConnectionInfo) sdata;
-            if (info == null || info.result == null || !info.result.isLocking())
-                lockRow(sm, timeout, level);
-        }
+        // we treat all locks the same (though super doesn't).
+        
+        // only need to lock if not loaded from locking result
+        ConnectionInfo info = (ConnectionInfo) sdata;
+        if (info == null || info.result == null || !info.result.isLocking())
+            lockRow(sm, timeout, level);
         optimisticLockInternal(sm, level, timeout, sdata, postVersionCheck);
     }
 
@@ -128,7 +127,9 @@
         Object id = sm.getObjectId();
         ClassMapping mapping = (ClassMapping) sm.getMetaData();
 
-        List<SQLBuffer> sqls = getLockRows(dict, id, mapping, fetch, _store.getSQLFactory()); 
+        List<SQLBuffer> sqls = sm.getLock() == null
+            ?  getLockRows(dict, id, mapping, fetch, _store.getSQLFactory())
+            : new ArrayList<SQLBuffer>();
         if (ctx.getFetchConfiguration().getLockScope() == LockScopes.LOCKSCOPE_EXTENDED)
             lockJoinTables(sqls, dict, id, mapping, fetch, _store.getSQLFactory());
 
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
index d7b7ea5..abe3e91 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
@@ -327,8 +327,7 @@
             if (sm != null && sm.isDeleted())
                 sm = null;
             writeable = io.isAnyUpdatable(fk, sm == null);
-            orderWriteable = field.getOrderColumnIO().isUpdatable
-                (order, sm == null);
+            orderWriteable = field.getOrderColumnIO().isUpdatable(order, sm == null);
             action = Row.ACTION_UPDATE;
         }
         if (!writeable && !orderWriteable)
@@ -345,8 +344,11 @@
         // update the inverse pointer with our oid value
         if (writeable)
             row.setForeignKey(fk, io, sm);
-        if (orderWriteable)
+
+        if (orderWriteable) {
+            // set the OrderColumn value
             row.setInt(order, idx);
+        }
     }
 
     public Object toDataStoreValue(Object val, JDBCStore store) {
diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
index 230fcf8..fd04152 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
@@ -331,43 +331,50 @@
         boolean overrideDefault)
         throws SQLException {
         // make sure we're not setting two different values
-    	// unless the given column is an implicit relationship and value
-    	// changes from logical default to non-default
+        // unless the given column is an implicit relationship and value
+        // changes from logical default to non-default
         Object prev = getSet(col);
         if (prev != null) {
             if (prev == NULL)
                 prev = null;
             if (!rowValueEquals(prev, val)) {
-            	if (isDefaultValue(prev) || allowsUpdate(col, prev, val)) {
-            		super.setObject(col, val, metaType, overrideDefault);
-            	} else if (!isDefaultValue(prev)) {
-            		throw new InvalidStateException(_loc.get("diff-values",
-            				new Object[]{ col.getFullDBIdentifier().getName(),
-                            (prev == null) ? null : prev.getClass(), prev,
-                            (val == null) ? null : val.getClass(), val })).
-            				setFatal(true);
-            	} else {
-            	    // since not allow to update and the new value is 0 or null,
-            	    // just return.
-            	    return;
-            	}
+                if (isDefaultValue(prev) || allowsUpdate(col, prev, val)) {
+                    super.setObject(col, val, metaType, overrideDefault);
+                    return;
+                } else if (!isDefaultValue(val)) {
+                    throw new InvalidStateException(_loc.get("diff-values",
+                            new Object[]{ col.getFullDBIdentifier().getName(),
+                                    (prev == null) ? null : prev.getClass(), prev,
+                                    (val == null) ? null : val.getClass(), val })).
+                            setFatal(true);
+                } else {
+                    // since not allow to update and the new value is 0 or null,
+                    // just return.
+                    return;
+                }
             }
         }
         super.setObject(col, val, metaType, overrideDefault);
     }
     
     /**
-     * Allow the given column value to be updated only if old or current value
-     * is a default value or was not set and the column is not a primary key.
+     * Allow the given key column value to be updated if the old value is a default value
+     * or the new value is default.
+     * For primary keys we even disallow setting the current value to default
      */
     boolean allowsUpdate(Column col, Object old, Object cur) {
-    	return ((!col.isPrimaryKey() && col.isImplicitRelation()) ||
-    	   col.isUni1MFK()) && (isDefaultValue(old));
+        if (col.isPrimaryKey() && isDefaultValue(old) && !isDefaultValue(cur)) {
+            // for primary keys we disallow re-setting it to default
+            return false;
+        }
+
+        return !(col.isPrimaryKey() || col.isRelationId() || col.isImplicitRelation() || col.isUni1MFK())
+               || isDefaultValue(old) || isDefaultValue(cur);
     }
     
     boolean isDefaultValue(Object val) {
-    	return val == null || val == NULL
-    	    || (val instanceof Number && ((Number)val).longValue() == 0);
+        return val == null || val == NULL
+                || (val instanceof Number && ((Number)val).longValue() == 0);
     }
 
     /**
diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
index e11fefb..e8f03dd 100644
--- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
+++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
@@ -1381,9 +1381,9 @@
         if (fetch == null)
             fetch = _broker.getFetchConfiguration();
 
-        if (_readLockLevel == -1)
+        if (_readLockLevel == -1 || _readLockLevel < fetch.getReadLockLevel())
             _readLockLevel = fetch.getReadLockLevel();
-        if (_writeLockLevel == -1)
+        if (_writeLockLevel == -1 || _writeLockLevel < fetch.getWriteLockLevel())
             _writeLockLevel = fetch.getWriteLockLevel();
         return (forWrite) ? _writeLockLevel : _readLockLevel;
     }
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
index 45e41e6..db5cc13 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/TestOpenJPA2330.java
@@ -21,11 +21,14 @@
 import javax.persistence.EntityManager;
 import javax.persistence.spi.LoadState;
 
+import junit.framework.Assert;
 import org.apache.openjpa.persistence.entity.EntityA;
 import org.apache.openjpa.persistence.entity.EntityB;
 import org.apache.openjpa.persistence.entity.EntityC;
 import org.apache.openjpa.persistence.test.SingleEMFTestCase;
 
+import java.util.Iterator;
+
 /**
  *
  */
@@ -55,4 +58,50 @@
 
         em.close();
     }
+
+    public void testOpenJPA2335() {
+        EntityManager em = emf.createEntityManager();
+
+        em.getTransaction().begin();
+        EntityA a = new EntityA();
+
+        EntityB b1 = new EntityB(a);
+        b1.setName("b1");
+        a.getBs().add(b1);
+
+        EntityB b2 = new EntityB(a);
+        b2.setName("b2");
+        a.getBs().add(b2);
+
+        EntityB b3 = new EntityB(a);
+        b3.setName("b3");
+        a.getBs().add(b3);
+
+        EntityB b4 = new EntityB(a);
+        b4.setName("b4");
+        a.getBs().add(b4);
+
+        em.persist(a);
+
+        em.getTransaction().commit();
+        em.close();
+
+        // now read all back in
+        em = emf.createEntityManager();
+        em.getTransaction().begin();
+        EntityA a2 = em.find(EntityA.class, a.getId());
+        Assert.assertNotNull(a2);
+        Assert.assertNotNull(a2.getBs());
+        Assert.assertEquals(4, a2.getBs().size());
+
+        Iterator<EntityB> it = a2.getBs().iterator();
+        for (int i = 1; i <= 4; i++) {
+            EntityB entityB = it.next();
+
+            Assert.assertEquals("b" + i, entityB.getName());
+        }
+
+        em.getTransaction().commit();
+        em.close();
+    }
 }
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
index 576073a..74e23c3 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Course.java
@@ -29,7 +29,6 @@
 
 @Entity
 @Table(name="CR_CRSE")
-
 public class Course {
     @Id
     @GeneratedValue
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
index 7dca955..2257d82 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityA.java
@@ -42,7 +42,7 @@
     private String name;
 
     @OneToMany(fetch = FetchType.EAGER, mappedBy = "center", orphanRemoval = true, cascade = CascadeType.ALL)
-    @OrderColumn
+    @OrderColumn(name="POSITION")
     private Set<EntityB> services = new LinkedHashSet<EntityB>();
 
     public EntityA() {
diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
index bd3c286..943aead 100644
--- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
+++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/entity/EntityB.java
@@ -22,6 +22,7 @@
 import java.util.Set;
 
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
diff --git a/openjpa-project/pom.xml b/openjpa-project/pom.xml
index 3c20eb0..7bdcd65 100644
--- a/openjpa-project/pom.xml
+++ b/openjpa-project/pom.xml
@@ -179,6 +179,13 @@
                 <configuration>
                     <siteDirectory>target/filtered-site</siteDirectory>
                 </configuration>
+                <dependencies>
+                    <dependency><!-- add support for ssh/scp -->
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-ssh</artifactId>
+                        <version>1.0</version>
+                    </dependency>
+                </dependencies>
             </plugin>
 
             <plugin>