You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/10/07 00:31:31 UTC

svn commit: r453796 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-kernel/src/ma...

Author: awhite
Date: Fri Oct  6 15:31:28 2006
New Revision: 453796

URL: http://svn.apache.org/viewvc?view=rev&rev=453796
Log:
Merge fixes from Kodo 4.0 line.


Modified:
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java
    incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java Fri Oct  6 15:31:28 2006
@@ -1634,7 +1634,7 @@
         if (col.getDefaultString() != null)
             copy.setDefaultString(col.getDefaultString());
         if (col.isNotNull() && !col.isPrimaryKey()
-            && !isPrimitive(col.getJavaType()))
+            && (!isPrimitive(col.getJavaType()) || isForeignKey(col)))
             copy.setNotNull(true);
 
         // set type name if not default
@@ -1672,6 +1672,21 @@
             copy.setType(col.getType());
 
         return copy;
+    }
+
+    /** 
+     * Return whether the given column belongs to a foreign key.
+     */ 
+    private static boolean isForeignKey(Column col) 
+    {       
+        if (col.getTable() == null)
+            return false;
+        ForeignKey[] fks = col.getTable().getForeignKeys();
+        for (int i = 0; i < fks.length; i++) 
+            if (fks[i].containsColumn(col) 
+                || fks[i].containsConstantColumn(col))
+                return true;
+        return false;
     }
 
     /**

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java Fri Oct  6 15:31:28 2006
@@ -180,7 +180,7 @@
         OpenJPAStateManager rel = RelationStrategies.getStateManager
             (sm.fetchObjectField(field.getIndex()), store.getContext());
         if (field.getJoinDirection() == field.JOIN_INVERSE)
-            updateInverse(sm, rel, store, rm, sm);
+            updateInverse(sm, rel, store, rm);
         else {
             Row row = field.getRow(sm, store, rm, Row.ACTION_INSERT);
             if (row != null)
@@ -198,7 +198,7 @@
 
         if (field.getJoinDirection() == field.JOIN_INVERSE) {
             nullInverse(sm, rm);
-            updateInverse(sm, rel, store, rm, sm);
+            updateInverse(sm, rel, store, rm);
         } else {
             Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE);
             if (row != null)
@@ -215,7 +215,7 @@
             if (sm.getLoaded().get(field.getIndex())) {
                 OpenJPAStateManager rel = RelationStrategies.getStateManager(sm.
                     fetchObjectField(field.getIndex()), store.getContext());
-                updateInverse(sm, rel, store, rm, null);
+                updateInverse(sm, rel, store, rm);
             } else
                 nullInverse(sm, rm);
         } else {
@@ -241,6 +241,9 @@
      */
     private void nullInverse(OpenJPAStateManager sm, RowManager rm)
         throws SQLException {
+        if (field.getUseClassCriteria())
+            return;
+
         ForeignKey fk = field.getForeignKey();
         ColumnIO io = field.getColumnIO();
         if (!io.isAnyUpdatable(fk, true))
@@ -260,11 +263,9 @@
      * with the given object.
      */
     private void updateInverse(OpenJPAStateManager sm, OpenJPAStateManager rel,
-        JDBCStore store, RowManager rm, OpenJPAStateManager sm2)
+        JDBCStore store, RowManager rm)
         throws SQLException {
-        // nothing to do if inverse is null or about to be deleted
-        //### should we throw an exception if the inverse is null?
-        if (rel == null || rel.isDeleted())
+        if (rel == null)
             return;
 
         ForeignKey fk = field.getForeignKey();
@@ -272,11 +273,17 @@
 
         int action;
         if (rel.isNew() && !rel.isFlushed()) {
-            if (sm2 == null || !io.isAnyInsertable(fk, false))
+            if (sm.isDeleted() || !io.isAnyInsertable(fk, false))
                 return;
             action = Row.ACTION_INSERT;
+        } else if (rel.isDeleted()) {
+            if (rel.isFlushed() || !sm.isDeleted())
+                return;
+            action = Row.ACTION_DELETE;
         } else {
-            if (!io.isAnyUpdatable(fk, sm2 == null))
+            if (sm.isDeleted())
+                sm = null;
+            if (!io.isAnyUpdatable(fk, sm == null))
                 return;
             action = Row.ACTION_UPDATE;
         }
@@ -306,7 +313,7 @@
             row.wherePrimaryKey(rel);
 
         // update the inverse pointer with our oid value
-        row.setForeignKey(fk, io, sm2);
+        row.setForeignKey(fk, io, sm);
     }
 
     public int supportsSelect(Select sel, int type, OpenJPAStateManager sm,

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java Fri Oct  6 15:31:28 2006
@@ -216,23 +216,32 @@
 
     public void delete(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
         throws SQLException {
-        if (field.getMappedBy() != null
-            || field.getElementMapping().getUseClassCriteria())
+        if (field.getMappedBy() != null)
             return;
 
+        // if nullable, null any existing inverse columns that refer to this obj
         ValueMapping elem = field.getElementMapping();
         ColumnIO io = elem.getColumnIO();
         ForeignKey fk = elem.getForeignKey();
-        if (!io.isAnyUpdatable(fk, true)) 
+        if (!elem.getUseClassCriteria() && io.isAnyUpdatable(fk, true)) { 
+            assertInversable();
+            Row row = rm.getAllRows(fk.getTable(), Row.ACTION_UPDATE);
+            row.setForeignKey(fk, io, null);
+            row.whereForeignKey(fk, sm);
+            rm.flushAllRows(row);
             return;
+        }
 
-        // if the fk doesn't enforce it, null any existing inverse columns 
-        // that refer to this obj
-        assertInversable();
-        Row row = rm.getAllRows(fk.getTable(), Row.ACTION_UPDATE);
-        row.setForeignKey(fk, io, null);
-        row.whereForeignKey(fk, sm);
-        rm.flushAllRows(row);
+        if (!sm.getLoaded().get(field.getIndex()))
+            return;
+
+        // update fk on each field value row
+        ClassMapping rel = field.getElementMapping().getTypeMapping();
+        StoreContext ctx = store.getContext();
+        Collection objs = toCollection(sm.fetchObject(field.getIndex()));
+        if (objs != null && !objs.isEmpty())
+            for (Iterator itr = objs.iterator(); itr.hasNext();)
+                updateInverse (ctx, itr.next(), rel, rm, sm, 0);
     }
 
     /**
@@ -244,7 +253,7 @@
         throws SQLException {
         OpenJPAStateManager invsm = RelationStrategies.getStateManager(inverse,
             ctx);
-        if (invsm == null || invsm.isDeleted())
+        if (invsm == null)
             return;
 
         ValueMapping elem = field.getElementMapping();
@@ -257,12 +266,21 @@
         boolean orderWriteable;
         if (invsm.isNew() && !invsm.isFlushed()) {
             // no need to null inverse columns of new instance
-            if (sm == null)
+            if (sm == null || sm.isDeleted())
                 return;
             writeable = io.isAnyInsertable(fk, false);
             orderWriteable = _orderInsert;
             action = Row.ACTION_INSERT;
+        } else if (invsm.isDeleted()) {
+            // no need to null inverse columns of deleted instance
+            if (invsm.isFlushed() || sm == null || !sm.isDeleted())
+                return;
+            writeable = true;
+            orderWriteable = false;
+            action = Row.ACTION_DELETE;
         } else {
+            if (sm != null && sm.isDeleted())
+                sm = null;
             writeable = io.isAnyUpdatable(fk, sm == null);
             orderWriteable = field.getOrderColumnIO().isUpdatable
                 (order, sm == null);

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java Fri Oct  6 15:31:28 2006
@@ -80,7 +80,8 @@
      * Return true if any columns for the given key are insertable.
      */
     public boolean isAnyInsertable(ForeignKey fk, boolean nullValue) {
-        return isAny(fk, _unInsertable, _unNullInsertable, nullValue);
+        return isAny(fk, _unInsertable, _unNullInsertable, nullValue)
+            && (!nullValue || fk.isLogical() || isNullable(fk));
     }
 
     /**
@@ -101,7 +102,8 @@
      * Return true if all columns for the given key are insertable.
      */
     public boolean isAllInsertable(ForeignKey fk, boolean nullValue) {
-        return isAll(fk, _unInsertable, _unNullInsertable, nullValue);
+        return isAll(fk, _unInsertable, _unNullInsertable, nullValue)
+            && (!nullValue || fk.isLogical() || isNullable(fk));
     }
 
     /**
@@ -152,7 +154,8 @@
      * Return true if any columns for the given key are updatable.
      */
     public boolean isAnyUpdatable(ForeignKey fk, boolean nullValue) {
-        return isAny(fk, _unUpdatable, _unNullUpdatable, nullValue);
+        return isAny(fk, _unUpdatable, _unNullUpdatable, nullValue)
+            && (!nullValue || fk.isLogical() || isNullable(fk));
     }
 
     /**
@@ -173,7 +176,8 @@
      * Return true if all columns for the given key are updatable.
      */
     public boolean isAllUpdatable(ForeignKey fk, boolean nullValue) {
-        return isAll(fk, _unUpdatable, _unNullUpdatable, nullValue);
+        return isAll(fk, _unUpdatable, _unNullUpdatable, nullValue)
+            && (!nullValue || fk.isLogical() || isNullable(fk));
     }
 
     /**
@@ -283,5 +287,16 @@
         if (is)
             return property & ~(2 << col);
         return property | (2 << col);
+    }
+
+    /**
+     * Whether the given foreign key is nullable.
+     */
+    private boolean isNullable(ForeignKey fk) {
+        Column[] cols = fk.getColumns();
+        for (int i = 0; i < cols.length; i++)
+            if (cols[i].isNotNull() || cols[i].isPrimaryKey())
+                return false;
+        return true;
     }
 }

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java Fri Oct  6 15:31:28 2006
@@ -203,7 +203,7 @@
         seen.add(this);
         for (int i = 0; i < cols.length; i++) {
             for (int j = 0; j < fks.length; j++) {
-                if (fks[j].getPrimaryKeyColumn(cols[i]) == null)
+                if (!fks[j].containsColumn(cols[i]))
                     continue;
                 if (!seen.contains(fks[j])
                     && fks[j].isPrimaryKeyAutoAssigned(seen)) {

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Fri Oct  6 15:31:28 2006
@@ -390,10 +390,11 @@
             setter = _pc.getDeclaredMethod(getSetterName(fmds[i]),
                 new Class[]{ fmds[i].getDeclaredType() });
             if (setter == null) {
-                if (returned == null)
+                if (returned == null) {
                     addViolation("property-no-setter",
                         new Object[]{ fmds[i] }, true);
-                else {
+                    continue;
+                } else {
                     // create synthetic setter
                     setter = _pc.declareMethod(getSetterName(fmds[i]),
                         void.class, new Class[]{ fmds[i].getDeclaredType() });
@@ -419,10 +420,9 @@
                     _backingFields.put(setter.getName(), assigned.getName());
 
                 if (assigned != returned)
-                    addViolation("property-setter-getter-mismatch",
-                        new Object[]{ fmds[i], assigned.getName(),
-                            (returned == null) ? null : returned.getName() },
-                        false);
+                    addViolation("property-setter-getter-mismatch", new Object[]
+                        { fmds[i], assigned.getName(), (returned == null) 
+                        ? null : returned.getName() }, false);
             }
         }
     }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Fri Oct  6 15:31:28 2006
@@ -1928,8 +1928,7 @@
                 exceps = add(exceps,
                     newFlushException(_store.flush(transactional)));
             }
-        }
-        finally {
+        } finally {
             _flags &= ~FLAG_STORE_FLUSHING;
 
             if (reason == FLUSH_ROLLBACK)
@@ -1942,21 +1941,24 @@
                 StateManagerImpl sm;
                 for (Iterator itr = transactional.iterator(); itr.hasNext();) {
                     sm = (StateManagerImpl) itr.next();
+                    try {
+                        // the state may have become transient, such as if
+                        // it is embedded and the owner has been deleted during
+                        // this flush process; bug #1100
+                        if (sm.getPCState() == PCState.TRANSIENT)
+                            continue;
 
-                    // the state may have become transient, such as if
-                    // it is embedded and the owner has been deleted during
-                    // this flush process; bug #1100
-                    if (sm.getPCState() == PCState.TRANSIENT)
-                        continue;
-
-                    sm.afterFlush(reason);
-                    if (reason == FLUSH_INC) {
-                        // if not about to clear trans cache for commit anyway,
-                        // re-cache dirty objects with default soft refs; we
-                        // don't need hard refs now that the changes have been
-                        // flushed
-                        sm.proxyFields(true, false);
-                        _transCache.flushed(sm);
+                        sm.afterFlush(reason);
+                        if (reason == FLUSH_INC) {
+                            // if not about to clear trans cache for commit 
+                            // anyway, re-cache dirty objects with default soft
+                            // refs; we don't need hard refs now that the 
+                            // changes have been flushed
+                            sm.proxyFields(true, false);
+                            _transCache.flushed(sm);
+                        }
+                    } catch (Exception e) {
+                        exceps = add(exceps, e);
                     }
                 }
             }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java Fri Oct  6 15:31:28 2006
@@ -194,7 +194,7 @@
      * needed. Return true if flushed/stored, false otherwise.
      */
     private static boolean flushDirty(StateManagerImpl sm) {
-        if (!sm.isDirty())
+        if (!sm.isDirty() || !sm.getBroker().isActive())
             return false;
 
         // only flush if there are actually any dirty non-flushed fields

Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java Fri Oct  6 15:31:28 2006
@@ -332,7 +332,6 @@
         // even if we want to validate, specify that it won't happen
         // if we have neither a DocType not a Schema
         Object schemaSource = getSchemaSource();
-
         if (schemaSource != null && _schemaBug) {
             if (_log != null && _log.isInfoEnabled())
                 _log.info(_loc.get("parser-schema-bug"));