You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/08/30 20:10:27 UTC

svn commit: r990886 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/ framework/cayenne-jd...

Author: aadamchik
Date: Mon Aug 30 18:10:26 2010
New Revision: 990886

URL: http://svn.apache.org/viewvc?rev=990886&view=rev
Log:
CAY-1479 EntitySorter refactoring: make it DI-based, internalize Ashowood lib

* removing extra DB metadata packages from Ashwood import... expression sorting as DbEntities
* trimming down of other Ashwood interfaces that are too generic for our purposes
* everything is generified

Removed:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/dbutil/Column.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/dbutil/DbUtils.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/dbutil/ForeignKey.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/dbutil/PrimaryKey.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/dbutil/Table.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Algorithm.java
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataPort.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DbGenerator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ArcIterator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstSearch.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstStampSearch.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Digraph.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DigraphIteration.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterArcIterator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterIteration.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/IndegreeTopologicalSort.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/MapDigraph.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ReversedIteration.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/StrongConnection.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterTest.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Mon Aug 30 18:10:26 2010
@@ -49,6 +49,7 @@ CAY-1446 Remove DataContextFactory, repl
 CAY-1447 Switch ROP client to dependency injection
 CAY-1474 Straightening CayenneModeler platform-specific builds
 CAY-1475 Move cayenne-modeler module out of framework/ and out of the assembly binary
+CAY-1479 EntitySorter refactoring: make it DI-based, internalize Ashowood lib
 
 Bug Fixes Since 3.0:
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataPort.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataPort.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataPort.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataPort.java Mon Aug 30 18:10:26 2010
@@ -102,7 +102,8 @@ public class DataPort {
 
         // sort entities for insertion
         List sorted = new ArrayList(entities);
-        EntitySorter sorter = new AshwoodEntitySorter(destinationNode.getDataMaps());
+        EntitySorter sorter = new AshwoodEntitySorter();
+        sorter.setDataMaps(destinationNode.getDataMaps());
         sorter.sortDbEntities(sorted, false);
 
         if (cleaningDestination) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DbGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DbGenerator.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DbGenerator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DbGenerator.java Mon Aug 30 18:10:26 2010
@@ -568,7 +568,8 @@ public class DbGenerator {
 
         // sort table list
         if (tables.size() > 1) {
-            EntitySorter sorter = new AshwoodEntitySorter(Collections.singleton(map));
+            EntitySorter sorter = new AshwoodEntitySorter();
+            sorter.setDataMaps(Collections.singleton(map));
             sorter.sortDbEntities(tables, false);
         }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java Mon Aug 30 18:10:26 2010
@@ -33,9 +33,6 @@ import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.ashwood.dbutil.DbUtils;
-import org.apache.cayenne.ashwood.dbutil.ForeignKey;
-import org.apache.cayenne.ashwood.dbutil.Table;
 import org.apache.cayenne.ashwood.graph.Digraph;
 import org.apache.cayenne.ashwood.graph.IndegreeTopologicalSort;
 import org.apache.cayenne.ashwood.graph.MapDigraph;
@@ -62,24 +59,25 @@ import org.apache.commons.collections.co
 public class AshwoodEntitySorter implements EntitySorter {
 
     protected Collection<DataMap> dataMaps;
-    protected Map<DbEntity, Table> dbEntityToTableMap;
-    protected Map<Table, ComponentRecord> components;
+    protected Map<DbEntity, ComponentRecord> components;
     protected Map<DbEntity, List<DbRelationship>> reflexiveDbEntities;
 
-    protected TableComparator tableComparator;
     protected DbEntityComparator dbEntityComparator;
     protected ObjEntityComparator objEntityComparator;
 
     private volatile boolean dirty;
 
     public AshwoodEntitySorter() {
-        tableComparator = new TableComparator();
         dbEntityComparator = new DbEntityComparator();
         objEntityComparator = new ObjEntityComparator();
-        dirty = true;
         dataMaps = Collections.EMPTY_LIST;
+        dirty = true;
     }
 
+    /**
+     * @deprecated since 3.1. Use {@link #AshwoodEntitySorter()} constructor together with
+     *             {@link #setDataMaps(Collection)} instead.
+     */
     public AshwoodEntitySorter(Collection<DataMap> dataMaps) {
         this();
         setDataMaps(dataMaps);
@@ -109,43 +107,80 @@ public class AshwoodEntitySorter impleme
 
     private void doIndexSorter() {
 
-        Collection<Table> tables = new ArrayList<Table>(64);
-        dbEntityToTableMap = new HashMap<DbEntity, Table>(64);
-        reflexiveDbEntities = new HashMap<DbEntity, List<DbRelationship>>(32);
+        Map<DbEntity, List<DbRelationship>> reflexiveDbEntities = new HashMap<DbEntity, List<DbRelationship>>(
+                32);
+
+        Digraph<DbEntity, List<DbAttribute>> referentialDigraph = new MapDigraph<DbEntity, List<DbAttribute>>();
 
+        Map<String, DbEntity> tableMap = new HashMap<String, DbEntity>();
         for (DataMap map : dataMaps) {
             for (DbEntity entity : map.getDbEntities()) {
-                Table table = new Table(entity.getCatalog(), entity.getSchema(), entity
-                        .getName());
-                fillInMetadata(table, entity);
-                dbEntityToTableMap.put(entity, table);
-                tables.add(table);
+                tableMap.put(entity.getFullyQualifiedName(), entity);
+                referentialDigraph.addVertex(entity);
             }
         }
 
-        Digraph<Table, List<ForeignKey>> referentialDigraph = new MapDigraph<Table, List<ForeignKey>>();
-        DbUtils.buildReferentialDigraph(referentialDigraph, tables);
+        for (DbEntity destination : tableMap.values()) {
+            for (DbRelationship candidate : destination.getRelationships()) {
+                if ((!candidate.isToMany() && !candidate.isToDependentPK())
+                        || candidate.isToMasterPK()) {
+                    DbEntity origin = (DbEntity) candidate.getTargetEntity();
+                    boolean newReflexive = destination.equals(origin);
+
+                    for (DbJoin join : candidate.getJoins()) {
+                        DbAttribute targetAttribute = join.getTarget();
+                        if (targetAttribute.isPrimaryKey()) {
+
+                            if (newReflexive) {
+                                List<DbRelationship> reflexiveRels = reflexiveDbEntities
+                                        .get(destination);
+                                if (reflexiveRels == null) {
+                                    reflexiveRels = new ArrayList<DbRelationship>(1);
+                                    reflexiveDbEntities.put(destination, reflexiveRels);
+                                }
+                                reflexiveRels.add(candidate);
+                                newReflexive = false;
+                            }
+
+                            List<DbAttribute> fks = referentialDigraph.getArc(
+                                    origin,
+                                    destination);
+                            if (fks == null) {
+                                fks = new ArrayList<DbAttribute>();
+                                referentialDigraph.putArc(origin, destination, fks);
+                            }
+
+                            fks.add(targetAttribute);
+                        }
+                    }
+                }
+            }
 
-        StrongConnection<Table, List<ForeignKey>> contractor = new StrongConnection<Table, List<ForeignKey>>(
+        }
+
+        StrongConnection<DbEntity, List<DbAttribute>> contractor = new StrongConnection<DbEntity, List<DbAttribute>>(
                 referentialDigraph);
 
-        Digraph<Collection<Table>, Collection<List<ForeignKey>>> contractedReferentialDigraph = new MapDigraph<Collection<Table>, Collection<List<ForeignKey>>>();
+        Digraph<Collection<DbEntity>, Collection<List<DbAttribute>>> contractedReferentialDigraph = new MapDigraph<Collection<DbEntity>, Collection<List<DbAttribute>>>();
         contractor.contract(contractedReferentialDigraph);
 
-        IndegreeTopologicalSort<Collection<Table>> sorter = new IndegreeTopologicalSort<Collection<Table>>(
+        IndegreeTopologicalSort<Collection<DbEntity>> sorter = new IndegreeTopologicalSort<Collection<DbEntity>>(
                 contractedReferentialDigraph);
 
-        components = new HashMap<Table, ComponentRecord>(contractedReferentialDigraph
-                .order());
+        Map<DbEntity, ComponentRecord> components = new HashMap<DbEntity, ComponentRecord>(
+                contractedReferentialDigraph.order());
         int componentIndex = 0;
         while (sorter.hasNext()) {
-            Collection<Table> component = sorter.next();
+            Collection<DbEntity> component = sorter.next();
             ComponentRecord rec = new ComponentRecord(componentIndex++, component);
 
-            for (Table table : component) {
+            for (DbEntity table : component) {
                 components.put(table, rec);
             }
         }
+
+        this.reflexiveDbEntities = reflexiveDbEntities;
+        this.components = components;
     }
 
     /**
@@ -275,44 +310,6 @@ public class AshwoodEntitySorter impleme
         }
     }
 
-    protected void fillInMetadata(Table table, DbEntity entity) {
-        // in this case quite a dummy
-        short keySequence = 1;
-
-        for (DbRelationship candidate : entity.getRelationships()) {
-            if ((!candidate.isToMany() && !candidate.isToDependentPK())
-                    || candidate.isToMasterPK()) {
-                DbEntity target = (DbEntity) candidate.getTargetEntity();
-                boolean newReflexive = entity.equals(target);
-
-                for (DbJoin join : candidate.getJoins()) {
-                    DbAttribute targetAttribute = join.getTarget();
-                    if (targetAttribute.isPrimaryKey()) {
-                        ForeignKey fk = new ForeignKey();
-                        fk.setPkTableCatalog(target.getCatalog());
-                        fk.setPkTableSchema(target.getSchema());
-                        fk.setPkTableName(target.getName());
-                        fk.setPkColumnName(targetAttribute.getName());
-                        fk.setColumnName(join.getSourceName());
-                        fk.setKeySequence(keySequence++);
-                        table.addForeignKey(fk);
-
-                        if (newReflexive) {
-                            List<DbRelationship> reflexiveRels = reflexiveDbEntities
-                                    .get(entity);
-                            if (reflexiveRels == null) {
-                                reflexiveRels = new ArrayList<DbRelationship>(1);
-                                reflexiveDbEntities.put(entity, reflexiveRels);
-                            }
-                            reflexiveRels.add(candidate);
-                            newReflexive = false;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     protected Object findReflexiveMaster(
             Persistent object,
             ObjRelationship toOneRel,
@@ -361,43 +358,24 @@ public class AshwoodEntitySorter impleme
         return c;
     }
 
-    protected Table getTable(DbEntity dbEntity) {
-        return (dbEntity != null) ? dbEntityToTableMap.get(dbEntity) : null;
-    }
-
-    protected Table getTable(ObjEntity objEntity) {
-        return getTable(objEntity.getDbEntity());
-    }
-
     protected boolean isReflexive(DbEntity metadata) {
         return reflexiveDbEntities.containsKey(metadata);
     }
 
-    private final class DbEntityComparator implements Comparator<DbEntity> {
-
-        public int compare(DbEntity o1, DbEntity o2) {
-            if (o1 == o2)
-                return 0;
-            Table t1 = getTable(o1);
-            Table t2 = getTable(o2);
-            return tableComparator.compare(t1, t2);
-        }
-    }
-
     private final class ObjEntityComparator implements Comparator<ObjEntity> {
 
         public int compare(ObjEntity o1, ObjEntity o2) {
             if (o1 == o2)
                 return 0;
-            Table t1 = getTable(o1);
-            Table t2 = getTable(o2);
-            return tableComparator.compare(t1, t2);
+            DbEntity t1 = o1.getDbEntity();
+            DbEntity t2 = o2.getDbEntity();
+            return dbEntityComparator.compare(t1, t2);
         }
     }
 
-    private final class TableComparator implements Comparator<Table> {
+    private final class DbEntityComparator implements Comparator<DbEntity> {
 
-        public int compare(Table t1, Table t2) {
+        public int compare(DbEntity t1, DbEntity t2) {
             int result = 0;
 
             if (t1 == t2)

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ArcIterator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ArcIterator.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ArcIterator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ArcIterator.java Mon Aug 30 18:10:26 2010
@@ -62,6 +62,9 @@ package org.apache.cayenne.ashwood.graph
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+/**
+ * @since 3.1
+ */
 public interface ArcIterator<E, V> extends Iterator<V> {
 
     @SuppressWarnings("all")

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstSearch.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstSearch.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstSearch.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstSearch.java Mon Aug 30 18:10:26 2010
@@ -60,26 +60,30 @@
 package org.apache.cayenne.ashwood.graph;
 
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 
 import org.apache.commons.collections.ArrayStack;
 
-public class DepthFirstSearch<E> extends Algorithm<E> {
+/**
+ * @since 3.1
+ */
+public class DepthFirstSearch<E> implements Iterator<E> {
 
-    protected DigraphIteration factory;
-    protected Object firstVertex;
+    protected DigraphIteration<E, ?> factory;
+    protected E firstVertex;
 
     protected ArrayStack stack = new ArrayStack();
-    protected Set seen = new HashSet();
+    protected Set<E> seen = new HashSet<E>();
 
-    public DepthFirstSearch(DigraphIteration factory, Object firstVertex) {
+    public DepthFirstSearch(DigraphIteration<E, ?> factory, E firstVertex) {
         this.factory = factory;
         this.firstVertex = firstVertex;
         stack.push(factory.outgoingIterator(firstVertex));
         seen.add(firstVertex);
     }
 
-    public void reset(Object newFirstVertex) {
+    public void reset(E newFirstVertex) {
         stack.clear();
         seen.clear();
         firstVertex = newFirstVertex;
@@ -92,15 +96,19 @@ public class DepthFirstSearch<E> extends
     }
 
     public E next() {
-        ArcIterator i = (ArcIterator) stack.pop();
+        ArcIterator<E, ?> i = (ArcIterator<E, ?>) stack.pop();
         Object origin = i.getOrigin();
         while (i.hasNext()) {
             i.next();
-            // origin = i.getOrigin();
-            Object dst = i.getDestination();
-            if (seen.add(dst))
+            E dst = i.getDestination();
+            if (seen.add(dst)) {
                 stack.push(factory.outgoingIterator(dst));
+            }
         }
         return (E) origin;
     }
+
+    public void remove() {
+        throw new UnsupportedOperationException("Method remove() not supported.");
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstStampSearch.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstStampSearch.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstStampSearch.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DepthFirstStampSearch.java Mon Aug 30 18:10:26 2010
@@ -59,103 +59,63 @@
  */
 package org.apache.cayenne.ashwood.graph;
 
-import java.util.Map;
+/**
+ * @since 3.1
+ */
+public class DepthFirstStampSearch<E> extends DepthFirstSearch<E> {
 
-public class DepthFirstStampSearch extends DepthFirstSearch {
-  public static final int UNDEFINED_STAMP = -1;
-  public static final int GROW_DEPTH_STAMP = 0;
-  public static final int GROW_BREADTH_STAMP = 1;
-  public static final int SHRINK_STAMP = 2;
-  public static final int LEAF_STAMP = 3;
-
-  private int stamp = UNDEFINED_STAMP;
-
-  public DepthFirstStampSearch(DigraphIteration factory, Object firstVertex) {
-    super(factory, firstVertex);
-  }
-
-  public int getStamp() {
-    return stamp;
-  }
-
-  public Object next() {
-    ArcIterator i = (ArcIterator)stack.peek();
-    Object origin = i.getOrigin();
-    Object dst = i.getDestination();
-    if (dst == null) {
-      if (i.hasNext()) {
-        i.next();
-        dst = i.getDestination();
-      } else {
-        stack.pop();
-        //shrink
-        stamp = LEAF_STAMP;
+    public static final int UNDEFINED_STAMP = -1;
+    public static final int GROW_DEPTH_STAMP = 0;
+    public static final int GROW_BREADTH_STAMP = 1;
+    public static final int SHRINK_STAMP = 2;
+    public static final int LEAF_STAMP = 3;
+
+    private int stamp = UNDEFINED_STAMP;
+
+    public DepthFirstStampSearch(DigraphIteration<E, ?> factory, E firstVertex) {
+        super(factory, firstVertex);
+    }
+
+    public int getStamp() {
+        return stamp;
+    }
+
+    @Override
+    public E next() {
+        ArcIterator<E, ?> i = (ArcIterator<E, ?>) stack.peek();
+        E origin = i.getOrigin();
+        E dst = i.getDestination();
+        if (dst == null) {
+            if (i.hasNext()) {
+                i.next();
+                dst = i.getDestination();
+            }
+            else {
+                stack.pop();
+                // shrink
+                stamp = LEAF_STAMP;
+                return origin;
+            }
+        }
+        if (seen.add(dst)) {
+            stack.push(factory.outgoingIterator(dst));
+            // grow depth
+            stamp = GROW_DEPTH_STAMP;
+            if (i.hasNext())
+                i.next();
+        }
+        else {
+            if (i.hasNext()) {
+                i.next();
+                // grow breadth
+                stamp = GROW_BREADTH_STAMP;
+            }
+            else {
+                stack.pop();
+                // shrink
+                stamp = SHRINK_STAMP;
+            }
+        }
         return origin;
-      }
-    }
-    if (seen.add(dst)) {
-      stack.push(factory.outgoingIterator(dst));
-      //grow depth
-      stamp = GROW_DEPTH_STAMP;
-      if (i.hasNext()) i.next();
-    }
-    else {
-      if (i.hasNext()) {
-        i.next();
-        //grow breadth
-        stamp = GROW_BREADTH_STAMP;
-      } else {
-        stack.pop();
-        //shrink
-        stamp = SHRINK_STAMP;
-      }
-    }
-    return origin;
-  }
-
-  public Map traverse(Map orders) {
-    int preOrder = 0;
-    int postOrder = 0;
-    while (hasNext()) {
-      Object vertex = next();
-      int stamp = getStamp();
-      if (stamp == SHRINK_STAMP) {
-        postOrder++;
-        OrderPair pair = (OrderPair)orders.get(vertex);
-        if (pair == null) {
-          preOrder++;
-          orders.put(vertex, new OrderPair(preOrder, postOrder));
-        } else pair.postOrder = postOrder;
-      } else if (stamp == LEAF_STAMP) {
-        preOrder++;
-        postOrder++;
-        orders.put(vertex, new OrderPair(preOrder, postOrder));
-      } else if (!orders.containsKey(vertex)) {
-        preOrder++;
-        orders.put(vertex, new OrderPair(preOrder, -1));
-      }
-    }
-    return orders;
-  }
-
-  public static class OrderPair {
-    private int preOrder;
-    private int postOrder;
-
-    public OrderPair(int preOrder, int postOrder) {
-      this.preOrder = preOrder;
-      this.postOrder = postOrder;
-    }
-
-    public int getPreOrder() {
-      return preOrder;
-    }
-    public int getPostOrder() {
-      return postOrder;
-    }
-
-    public String toString() {
-      return "(" + preOrder + ", " + postOrder + ")";
     }
-  }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Digraph.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Digraph.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Digraph.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/Digraph.java Mon Aug 30 18:10:26 2010
@@ -61,6 +61,9 @@ package org.apache.cayenne.ashwood.graph
 
 import java.util.Collection;
 
+/**
+ * @since 3.1
+ */
 public interface Digraph<E, V> extends DigraphIteration<E, V> {
 
     boolean addVertex(E vertex);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DigraphIteration.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DigraphIteration.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DigraphIteration.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/DigraphIteration.java Mon Aug 30 18:10:26 2010
@@ -61,6 +61,9 @@ package org.apache.cayenne.ashwood.graph
 
 import java.util.Iterator;
 
+/**
+ * @since 3.1
+ */
 public interface DigraphIteration<E, V> {
 
     Iterator<E> vertexIterator();

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterArcIterator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterArcIterator.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterArcIterator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterArcIterator.java Mon Aug 30 18:10:26 2010
@@ -62,20 +62,24 @@ package org.apache.cayenne.ashwood.graph
 import java.util.NoSuchElementException;
 
 import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.functors.TruePredicate;
-import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
 
-public class FilterArcIterator extends AbstractIteratorDecorator implements ArcIterator {
+/**
+ * @since 3.1
+ */
+public class FilterArcIterator<E, V> implements ArcIterator<E, V> {
 
+    private ArcIterator<E, V> iterator;
     private Predicate acceptOrigin, acceptDestination;
     private Predicate acceptArc;
 
-    private Object nextArc, nextOrigin, nextDst;
+    private E nextOrigin, nextDst;
+    private V nextArc;
     private boolean nextObjectSet = false;
 
-    public FilterArcIterator(ArcIterator iterator, Predicate acceptOrigin,
+    public FilterArcIterator(ArcIterator<E, V> iterator, Predicate acceptOrigin,
             Predicate acceptDestination, Predicate acceptArc) {
-        super(iterator);
+
+        this.iterator = iterator;
         this.acceptOrigin = acceptOrigin;
         this.acceptDestination = acceptDestination;
         this.acceptArc = acceptArc;
@@ -87,20 +91,11 @@ public class FilterArcIterator extends A
             nextDst = null;
     }
 
-    public FilterArcIterator(ArcIterator iterator, Predicate acceptVertex,
-            Predicate acceptArc) {
-        this(iterator, acceptVertex, acceptVertex, acceptArc);
-    }
-
-    public FilterArcIterator(ArcIterator iterator, Predicate acceptVertex) {
-        this(iterator, acceptVertex, acceptVertex, TruePredicate.INSTANCE);
-    }
-
-    public Object getOrigin() {
+    public E getOrigin() {
         return nextOrigin;
     }
 
-    public Object getDestination() {
+    public E getDestination() {
         return nextDst;
     }
 
@@ -113,7 +108,7 @@ public class FilterArcIterator extends A
         }
     }
 
-    public Object next() {
+    public V next() {
         if (!nextObjectSet) {
             if (!setNextObject()) {
                 throw new NoSuchElementException();
@@ -128,11 +123,11 @@ public class FilterArcIterator extends A
     }
 
     private boolean setNextObject() {
-        ArcIterator iterator = (ArcIterator) getIterator();
+
         while (iterator.hasNext()) {
-            Object arc = iterator.next();
-            Object origin = iterator.getOrigin();
-            Object dst = iterator.getDestination();
+            V arc = iterator.next();
+            E origin = iterator.getOrigin();
+            E dst = iterator.getDestination();
             if (acceptOrigin.evaluate(origin)
                     && acceptArc.evaluate(arc)
                     && acceptDestination.evaluate(dst)) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterIteration.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterIteration.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterIteration.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/FilterIteration.java Mon Aug 30 18:10:26 2010
@@ -59,35 +59,57 @@
  */
 package org.apache.cayenne.ashwood.graph;
 
-import java.io.Serializable;
 import java.util.Iterator;
 
 import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.collections.Predicate;
 import org.apache.commons.collections.functors.TruePredicate;
 
-public class FilterIteration implements DigraphIteration, Serializable {
-  private DigraphIteration digraph;
-  private Predicate acceptVertex;
-  private Predicate acceptArc;
-
-  public FilterIteration(DigraphIteration digraph, Predicate acceptVertex, Predicate acceptArc) {
-    this.digraph = digraph;
-    this.acceptVertex = acceptVertex;
-    this.acceptArc = acceptArc;
-  }
-  public Iterator vertexIterator() {
-    return IteratorUtils.filteredIterator(digraph.vertexIterator(), acceptVertex);
-  }
-  public ArcIterator arcIterator() {
-    return new FilterArcIterator(digraph.arcIterator(), acceptVertex, acceptVertex, acceptArc);
-  }
-  public ArcIterator outgoingIterator(Object vertex) {
-    if (!acceptVertex.evaluate(vertex)) return ArcIterator.EMPTY_ITERATOR;
-    return new FilterArcIterator(digraph.outgoingIterator(vertex), TruePredicate.INSTANCE, acceptVertex, acceptArc);
-  }
-  public ArcIterator incomingIterator(Object vertex) {
-    if (!acceptVertex.evaluate(vertex)) return ArcIterator.EMPTY_ITERATOR;
-    return new FilterArcIterator(digraph.incomingIterator(vertex), acceptVertex, TruePredicate.INSTANCE, acceptArc);
-  }
+/**
+ * @since 3.1
+ */
+public class FilterIteration<E, V> implements DigraphIteration<E, V> {
+
+    private DigraphIteration<E, V> digraph;
+    private Predicate acceptVertex;
+    private Predicate acceptArc;
+
+    public FilterIteration(DigraphIteration<E, V> digraph, Predicate acceptVertex,
+            Predicate acceptArc) {
+        this.digraph = digraph;
+        this.acceptVertex = acceptVertex;
+        this.acceptArc = acceptArc;
+    }
+
+    public Iterator<E> vertexIterator() {
+        return IteratorUtils.filteredIterator(digraph.vertexIterator(), acceptVertex);
+    }
+
+    public ArcIterator<E, V> arcIterator() {
+        return new FilterArcIterator<E, V>(
+                digraph.arcIterator(),
+                acceptVertex,
+                acceptVertex,
+                acceptArc);
+    }
+
+    public ArcIterator<E, V> outgoingIterator(E vertex) {
+        if (!acceptVertex.evaluate(vertex))
+            return ArcIterator.EMPTY_ITERATOR;
+        return new FilterArcIterator<E, V>(
+                digraph.outgoingIterator(vertex),
+                TruePredicate.INSTANCE,
+                acceptVertex,
+                acceptArc);
+    }
+
+    public ArcIterator<E, V> incomingIterator(E vertex) {
+        if (!acceptVertex.evaluate(vertex))
+            return ArcIterator.EMPTY_ITERATOR;
+        return new FilterArcIterator<E, V>(
+                digraph.incomingIterator(vertex),
+                acceptVertex,
+                TruePredicate.INSTANCE,
+                acceptArc);
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/IndegreeTopologicalSort.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/IndegreeTopologicalSort.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/IndegreeTopologicalSort.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/IndegreeTopologicalSort.java Mon Aug 30 18:10:26 2010
@@ -66,7 +66,10 @@ import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
 
-public class IndegreeTopologicalSort<E> extends Algorithm<E> {
+/**
+ * @since 3.1
+ */
+public class IndegreeTopologicalSort<E> implements Iterator<E> {
 
     private Digraph<E, ?> digraph;
     private List<E> vertices = new LinkedList<E>();
@@ -83,12 +86,10 @@ public class IndegreeTopologicalSort<E> 
         current = vertices.listIterator();
     }
 
-    @Override
     public boolean hasNext() {
         return !vertices.isEmpty();
     }
 
-    @Override
     public E next() {
         boolean progress = true;
         while (hasNext()) {
@@ -118,6 +119,10 @@ public class IndegreeTopologicalSort<E> 
         }
     }
 
+    public void remove() {
+        throw new UnsupportedOperationException("Method remove() not supported.");
+    }
+
     private static class InDegree {
 
         int value;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/MapDigraph.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/MapDigraph.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/MapDigraph.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/MapDigraph.java Mon Aug 30 18:10:26 2010
@@ -65,6 +65,9 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
+/**
+ * @since 3.1
+ */
 public class MapDigraph<E, V> implements Digraph<E, V> {
 
     private Map<E, Map<E, V>> graph;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ReversedIteration.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ReversedIteration.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ReversedIteration.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/ReversedIteration.java Mon Aug 30 18:10:26 2010
@@ -59,49 +59,61 @@
  */
 package org.apache.cayenne.ashwood.graph;
 
-import java.io.Serializable;
 import java.util.Iterator;
 
-public class ReversedIteration implements DigraphIteration, Serializable {
-  private DigraphIteration wrappedIteration;
+/**
+ * @since 3.1
+ */
+public class ReversedIteration<E, V> implements DigraphIteration<E, V> {
+
+    private DigraphIteration<E, V> wrappedIteration;
 
-  public ReversedIteration(DigraphIteration wrappedIteration) {
-    this.wrappedIteration = wrappedIteration;
-  }
-  public Iterator vertexIterator() {
-    return wrappedIteration.vertexIterator();
-  }
-  public ArcIterator arcIterator() {
-    return new ReversedArcIterator(wrappedIteration.arcIterator());
-  }
-  public ArcIterator outgoingIterator(Object vertex) {
-    return new ReversedArcIterator(wrappedIteration.incomingIterator(vertex));
-  }
-  public ArcIterator incomingIterator(Object vertex) {
-    return new ReversedArcIterator(wrappedIteration.outgoingIterator(vertex));
-  }
-
-  public static class ReversedArcIterator implements ArcIterator {
-    private ArcIterator wrappedIterator;
-
-    public ReversedArcIterator(ArcIterator wrappedIterator) {
-      ReversedArcIterator.this.wrappedIterator = wrappedIterator;
-    }
-
-    public Object getOrigin() {
-      return wrappedIterator.getDestination();
-    }
-    public Object getDestination() {
-      return wrappedIterator.getOrigin();
-    }
-    public boolean hasNext() {
-      return wrappedIterator.hasNext();
+    public ReversedIteration(DigraphIteration<E, V> wrappedIteration) {
+        this.wrappedIteration = wrappedIteration;
     }
-    public Object next() {
-      return wrappedIterator.next();
+
+    public Iterator<E> vertexIterator() {
+        return wrappedIteration.vertexIterator();
+    }
+
+    public ArcIterator<E, V> arcIterator() {
+        return new ReversedArcIterator<E, V>(wrappedIteration.arcIterator());
+    }
+
+    public ArcIterator<E, V> outgoingIterator(E vertex) {
+        return new ReversedArcIterator<E, V>(wrappedIteration.incomingIterator(vertex));
+    }
+
+    public ArcIterator<E, V> incomingIterator(E vertex) {
+        return new ReversedArcIterator<E, V>(wrappedIteration.outgoingIterator(vertex));
     }
-    public void remove() {
-      wrappedIterator.remove();
+
+    public static class ReversedArcIterator<S, T> implements ArcIterator<S, T> {
+
+        private ArcIterator<S, T> wrappedIterator;
+
+        public ReversedArcIterator(ArcIterator<S, T> wrappedIterator) {
+            ReversedArcIterator.this.wrappedIterator = wrappedIterator;
+        }
+
+        public S getOrigin() {
+            return wrappedIterator.getDestination();
+        }
+
+        public S getDestination() {
+            return wrappedIterator.getOrigin();
+        }
+
+        public boolean hasNext() {
+            return wrappedIterator.hasNext();
+        }
+
+        public T next() {
+            return wrappedIterator.next();
+        }
+
+        public void remove() {
+            wrappedIterator.remove();
+        }
     }
-  }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/StrongConnection.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/StrongConnection.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/StrongConnection.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ashwood/graph/StrongConnection.java Mon Aug 30 18:10:26 2010
@@ -73,46 +73,52 @@ import org.apache.commons.collections.Co
 import org.apache.commons.collections.Predicate;
 import org.apache.commons.collections.functors.TruePredicate;
 
-public class StrongConnection<E, V> extends Algorithm<Collection<E>> {
+/**
+ * @since 3.1
+ */
+public class StrongConnection<E, V> implements Iterator<Collection<E>> {
 
     private DigraphIteration<E, V> digraph;
     private DigraphIteration<E, V> reverseDigraph;
     private DigraphIteration<E, V> filteredDigraph;
-    private DepthFirstStampSearch directDfs;
-    private DepthFirstSearch reverseDfs;
-    private Set seen = new HashSet();
-    private Iterator vertexIterator;
+    private DepthFirstStampSearch<E> directDfs;
+    private DepthFirstSearch<E> reverseDfs;
+    private Set<E> seen = new HashSet<E>();
+    private Iterator<E> vertexIterator;
     private ArrayStack dfsStack = new ArrayStack();
     private DFSSeenVerticesPredicate reverseDFSFilter = new DFSSeenVerticesPredicate();
 
     public StrongConnection(DigraphIteration<E, V> digraph) {
         this.digraph = digraph;
-        filteredDigraph = new FilterIteration(
+        filteredDigraph = new FilterIteration<E, V>(
                 digraph,
                 new NotSeenPredicate(),
                 TruePredicate.INSTANCE);
-        reverseDigraph = new FilterIteration(
-                new ReversedIteration(digraph),
+        reverseDigraph = new FilterIteration<E, V>(
+                new ReversedIteration<E, V>(digraph),
                 reverseDFSFilter,
                 TruePredicate.INSTANCE);
         vertexIterator = filteredDigraph.vertexIterator();
         runDirectDFS();
     }
 
-    @Override
     public boolean hasNext() {
         return !dfsStack.isEmpty();
     }
 
-    @Override
     public Collection<E> next() {
-        Collection component = buildStronglyConnectedComponent();
+        Collection<E> component = buildStronglyConnectedComponent();
         if (dfsStack.isEmpty())
             runDirectDFS();
         return component;
     }
 
-    public Digraph<Collection<E>, Collection<V>> contract(Digraph<Collection<E>, Collection<V>> contractedDigraph) {
+    public void remove() {
+        throw new UnsupportedOperationException("Method remove() not supported.");
+    }
+
+    public Digraph<Collection<E>, Collection<V>> contract(
+            Digraph<Collection<E>, Collection<V>> contractedDigraph) {
 
         Collection<Collection<E>> components = new ArrayList<Collection<E>>();
         CollectionUtils.addAll(components, this);
@@ -138,7 +144,9 @@ public class StrongConnection<E, V> exte
                         continue;
                     Collection<E> destination = memberToComponent.get(dst);
 
-                    Collection<V> contractedArc = contractedDigraph.getArc(origin, destination);
+                    Collection<V> contractedArc = contractedDigraph.getArc(
+                            origin,
+                            destination);
                     if (contractedArc == null) {
                         contractedArc = Collections.singletonList(arc);
                         contractedDigraph.putArc(origin, destination, contractedArc);
@@ -159,22 +167,22 @@ public class StrongConnection<E, V> exte
         return contractedDigraph;
     }
 
-    private Object nextDFSRoot() {
-        return (vertexIterator.hasNext() ? vertexIterator.next() : null);
+    private E nextDFSRoot() {
+        return vertexIterator.hasNext() ? vertexIterator.next() : null;
     }
 
     private boolean runDirectDFS() {
         dfsStack.clear();
         reverseDFSFilter.seenVertices.clear();
-        Object root = nextDFSRoot();
+        E root = nextDFSRoot();
         if (root == null)
             return false;
         if (directDfs == null)
-            directDfs = new DepthFirstStampSearch(filteredDigraph, root);
+            directDfs = new DepthFirstStampSearch<E>(filteredDigraph, root);
         else
             directDfs.reset(root);
         int stamp;
-        Object vertex;
+        E vertex;
         while (directDfs.hasNext()) {
             vertex = directDfs.next();
             stamp = directDfs.getStamp();
@@ -190,19 +198,19 @@ public class StrongConnection<E, V> exte
         return true;
     }
 
-    private Collection buildStronglyConnectedComponent() {
-        Object root = dfsStack.pop();
-        Collection component = Collections.singletonList(root);
+    private Collection<E> buildStronglyConnectedComponent() {
+        E root = (E) dfsStack.pop();
+        Collection<E> component = Collections.singletonList(root);
         boolean singleton = true;
         if (reverseDfs == null)
-            reverseDfs = new DepthFirstSearch(reverseDigraph, root);
+            reverseDfs = new DepthFirstSearch<E>(reverseDigraph, root);
         else
             reverseDfs.reset(root);
         while (reverseDfs.hasNext()) {
-            Object vertex = reverseDfs.next();
+            E vertex = reverseDfs.next();
             if (vertex != root) {
                 if (singleton) {
-                    Collection tmp = component;
+                    Collection<E> tmp = component;
                     component = new ArrayList<E>();
                     component.addAll(tmp);
                     singleton = false;
@@ -217,7 +225,7 @@ public class StrongConnection<E, V> exte
 
     private class DFSSeenVerticesPredicate implements Predicate {
 
-        private Set seenVertices = new HashSet();
+        private Set<E> seenVertices = new HashSet<E>();
 
         public boolean evaluate(Object vertex) {
             return seenVertices.contains(vertex);

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterTest.java?rev=990886&r1=990885&r2=990886&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ashwood/AshwoodEntitySorterTest.java Mon Aug 30 18:10:26 2010
@@ -22,7 +22,6 @@ package org.apache.cayenne.ashwood;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.cayenne.ashwood.AshwoodEntitySorter;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.testdo.relationship.ReflexiveAndToOne;
@@ -30,19 +29,18 @@ import org.apache.cayenne.unit.Relations
 
 public class AshwoodEntitySorterTest extends RelationshipCase {
 
-    protected AshwoodEntitySorter sorter;
-
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-
         deleteTestData();
-        sorter = new AshwoodEntitySorter(getDomain().getDataMaps());
     }
 
     public void testSortObjectsForEntityReflexiveWithFaults() throws Exception {
         createTestData("testSortObjectsForEntityDeletedWithFaults");
 
+        AshwoodEntitySorter sorter = new AshwoodEntitySorter();
+        sorter.setDataMaps(getDomain().getDataMaps());
+
         ObjEntity entity = getDomain().getEntityResolver().lookupObjEntity(
                 ReflexiveAndToOne.class);