You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/08/21 09:29:16 UTC

[3/9] cayenne git commit: CAY-2351 Remove commons-collections usage completely enable java 8 by default replace commons-collections with plain java

CAY-2351 Remove commons-collections usage completely
  enable java 8 by default
  replace commons-collections with plain java


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/fddb229d
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/fddb229d
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/fddb229d

Branch: refs/heads/master
Commit: fddb229d616d9cc29ea46da2a4b1994c73528755
Parents: 50801e6
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Aug 3 18:33:53 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Aug 17 12:41:56 2017 +0300

----------------------------------------------------------------------
 .../org/apache/cayenne/gen/DataMapUtils.java    |  5 +-
 cayenne-client/pom.xml                          |  5 --
 cayenne-lifecycle/pom.xml                       |  7 +++
 .../ObjectIdPropagatedValueFactory.java         |  8 ++-
 cayenne-server/pom.xml                          |  8 ++-
 .../cayenne/access/DataDomainSyncBucket.java    |  6 +-
 .../access/DataNodeSyncQualifierDescriptor.java | 49 +++++----------
 .../access/jdbc/RowDescriptorBuilder.java       | 24 +++----
 .../cayenne/access/jdbc/SQLTemplateAction.java  | 18 +++---
 .../access/translator/select/JoinStack.java     |  7 +--
 .../translator/select/QualifierTranslator.java  | 10 +--
 .../cayenne/ashwood/AshwoodEntitySorter.java    |  5 +-
 .../ashwood/WeightedAshwoodEntitySorter.java    |  5 +-
 .../org/apache/cayenne/cache/MapQueryCache.java |  5 +-
 .../dba/oracle/OracleQualifierTranslator.java   |  6 +-
 .../java/org/apache/cayenne/exp/Expression.java | 16 ++---
 .../org/apache/cayenne/exp/parser/ASTIn.java    |  5 +-
 .../org/apache/cayenne/exp/parser/ASTNotIn.java |  5 +-
 .../exp/parser/AggregateConditionNode.java      |  5 +-
 .../java/org/apache/cayenne/map/DbEntity.java   |  6 +-
 .../org/apache/cayenne/map/DbRelationship.java  | 24 +------
 .../org/apache/cayenne/map/ObjAttribute.java    | 12 ++--
 .../java/org/apache/cayenne/map/ObjEntity.java  |  6 +-
 .../org/apache/cayenne/query/BatchQueryRow.java |  6 +-
 .../apache/cayenne/query/InsertBatchQuery.java  |  2 +-
 .../java/org/apache/cayenne/query/Ordering.java | 10 ++-
 .../org/apache/cayenne/query/SQLTemplate.java   | 17 +++--
 .../java/org/apache/cayenne/ObjectIdTest.java   | 10 +--
 docs/doc/pom.xml                                |  5 --
 modeler/cayenne-modeler/pom.xml                 | 12 ++++
 .../org/apache/cayenne/modeler/Application.java | 17 +----
 .../modeler/action/ImportEOModelAction.java     | 66 +++++++++-----------
 .../InferRelationshipsControllerBase.java       | 11 ++--
 .../InferRelationshipsTabController.java        | 11 +---
 .../dialog/codegen/ClassesTabController.java    |  8 +--
 .../dialog/codegen/ClientModeController.java    | 21 +------
 .../dialog/codegen/CodeGeneratorController.java |  7 +--
 .../codegen/CodeGeneratorControllerBase.java    | 28 ++++-----
 .../dialog/codegen/GeneratorController.java     | 48 +++++---------
 .../dialog/pref/DataSourcePreferences.java      | 17 +----
 .../cayenne/modeler/editor/ObjEntityTab.java    | 27 +++-----
 .../cayenne/pref/UpgradeCayennePreference.java  | 46 ++++++--------
 .../org/apache/cayenne/swing/TableBinding.java  |  4 +-
 modeler/cayenne-wocompat/pom.xml                | 12 ++++
 .../apache/cayenne/wocompat/EOObjEntity.java    |  6 +-
 45 files changed, 265 insertions(+), 373 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
index f0f8f69..490c040 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
@@ -34,12 +34,12 @@ import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
-import org.apache.commons.collections.set.ListOrderedSet;
 
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -131,8 +131,7 @@ public class DataMapUtils {
 	 * @return List of parameter names.
 	 */
 	private Set parseQualifier(String qualifierString) {
-		@SuppressWarnings("unchecked")
-		Set<String> result = (Set<String>)new ListOrderedSet();
+		Set<String> result = new LinkedHashSet<>();
 		Pattern pattern = Pattern.compile("\\$[\\w]+");
 		Matcher matcher = pattern.matcher(qualifierString);
 		while (matcher.find()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-client/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-client/pom.xml b/cayenne-client/pom.xml
index b591bd9..2821d94 100644
--- a/cayenne-client/pom.xml
+++ b/cayenne-client/pom.xml
@@ -40,11 +40,6 @@
 			<scope>compile</scope>
 		</dependency>
 		<dependency>
-			<groupId>commons-collections</groupId>
-			<artifactId>commons-collections</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
 			<groupId>com.caucho</groupId>
             <artifactId>hessian</artifactId>
 			<scope>compile</scope>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-lifecycle/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/pom.xml b/cayenne-lifecycle/pom.xml
index a9c6283..f112584 100644
--- a/cayenne-lifecycle/pom.xml
+++ b/cayenne-lifecycle/pom.xml
@@ -79,6 +79,13 @@
                     </execution>
                 </executions>
             </plugin>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
 		</plugins>
 	</build>
 	<profiles>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/relationship/ObjectIdPropagatedValueFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/relationship/ObjectIdPropagatedValueFactory.java b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/relationship/ObjectIdPropagatedValueFactory.java
index 23fa7a8..0e0f219 100644
--- a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/relationship/ObjectIdPropagatedValueFactory.java
+++ b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/relationship/ObjectIdPropagatedValueFactory.java
@@ -18,14 +18,15 @@
  ****************************************************************/
 package org.apache.cayenne.lifecycle.relationship;
 
+import java.util.function.Supplier;
+
 import org.apache.cayenne.Persistent;
 import org.apache.cayenne.lifecycle.id.IdCoder;
-import org.apache.commons.collections.Factory;
 
 /**
  * @since 3.1
  */
-class ObjectIdPropagatedValueFactory implements Factory {
+class ObjectIdPropagatedValueFactory implements Supplier {
 
     private IdCoder referenceableHandler;
     private Persistent to;
@@ -35,7 +36,8 @@ class ObjectIdPropagatedValueFactory implements Factory {
         this.to = to;
     }
 
-    public Object create() {
+    @Override
+    public String get() {
         return referenceableHandler.getStringId(to);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/pom.xml b/cayenne-server/pom.xml
index 4414f43..3644697 100644
--- a/cayenne-server/pom.xml
+++ b/cayenne-server/pom.xml
@@ -49,7 +49,6 @@
 			<artifactId>commons-collections</artifactId>
 			<scope>compile</scope>
 		</dependency>
-
 		<!-- Optional dependencies... things that might have been placed in submodules... -->
 		<dependency>
 			<groupId>com.caucho</groupId>
@@ -151,6 +150,13 @@
                 </executions>
             </plugin>
 			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+			<plugin>
 				<groupId>org.codehaus.mojo</groupId>
 				<artifactId>javacc-maven-plugin</artifactId>
 				<version>2.6</version>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
index 3bb8141..7c25ab5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainSyncBucket.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.PropertyException;
 import org.apache.cayenne.reflect.ToManyMapProperty;
-import org.apache.commons.collections.Factory;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -43,6 +42,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Supplier;
 
 /**
  * A superclass of batch query wrappers.
@@ -274,7 +274,7 @@ abstract class DataDomainSyncBucket {
     }
 
     // a factory for extracting PKs generated on commit.
-    final static class PropagatedValueFactory implements Factory {
+    final static class PropagatedValueFactory implements Supplier {
 
         ObjectId masterID;
         String masterKey;
@@ -284,7 +284,7 @@ abstract class DataDomainSyncBucket {
             this.masterKey = masterKey;
         }
 
-        public Object create() {
+        public Object get() {
             Object value = masterID.getIdSnapshot().get(masterKey);
             if (value == null) {
                 throw new CayenneRuntimeException("Can't extract a master key. "

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
index 6e48a59..e5cd484 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
@@ -32,7 +33,6 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Builds update qualifier snapshots, including optimistic locking.
@@ -42,7 +42,7 @@ import org.apache.commons.collections.Transformer;
 class DataNodeSyncQualifierDescriptor {
 
 	private List<DbAttribute> attributes;
-	private List<Transformer> valueTransformers;
+	private List<Function<ObjectDiff, Object>> valueTransformers;
 	private boolean usingOptimisticLocking;
 
 	public boolean isUsingOptimisticLocking() {
@@ -60,8 +60,7 @@ class DataNodeSyncQualifierDescriptor {
 		for (int i = 0; i < len; i++) {
 			DbAttribute attribute = attributes.get(i);
 			if (!map.containsKey(attribute.getName())) {
-
-				Object value = valueTransformers.get(i).transform(diff);
+				Object value = valueTransformers.get(i).apply(diff);
 				map.put(attribute.getName(), value);
 			}
 		}
@@ -79,13 +78,10 @@ class DataNodeSyncQualifierDescriptor {
 		if (descriptor.isMaster()) {
 			for (final DbAttribute attribute : descriptor.getDbEntity().getPrimaryKeys()) {
 				attributes.add(attribute);
-				valueTransformers.add(new Transformer() {
-
-					public Object transform(Object input) {
-						ObjectId id = (ObjectId) ((ObjectDiff) input).getNodeId();
-						return id.getIdSnapshot().get(attribute.getName());
-					}
-				});
+				valueTransformers.add(input -> {
+                    ObjectId id = (ObjectId) input.getNodeId();
+                    return id.getIdSnapshot().get(attribute.getName());
+                });
 			}
 		} else {
 
@@ -104,13 +100,10 @@ class DataNodeSyncQualifierDescriptor {
 					if (!attributes.contains(dbAttribute)) {
 
 						attributes.add(dbAttribute);
-						valueTransformers.add(new Transformer() {
-
-							public Object transform(Object input) {
-								ObjectId id = (ObjectId) ((ObjectDiff) input).getNodeId();
-								return id.getIdSnapshot().get(dbAttrPair.getSourceName());
-							}
-						});
+						valueTransformers.add(input -> {
+                            ObjectId id = (ObjectId) input.getNodeId();
+                            return id.getIdSnapshot().get(dbAttrPair.getSourceName());
+                        });
 					}
 				}
 			}
@@ -127,13 +120,7 @@ class DataNodeSyncQualifierDescriptor {
 					// only use qualifier if dbEntities match
 					if (dbAttribute.getEntity().equals(descriptor.getDbEntity()) && !attributes.contains(dbAttribute)) {
 						attributes.add(dbAttribute);
-
-						valueTransformers.add(new Transformer() {
-
-							public Object transform(Object input) {
-								return ((ObjectDiff) input).getSnapshotValue(attribute.getName());
-							}
-						});
+						valueTransformers.add(input -> input.getSnapshotValue(attribute.getName()));
 					}
 				}
 			}
@@ -154,14 +141,10 @@ class DataNodeSyncQualifierDescriptor {
 							continue;
 						}
 
-						Transformer transformer = new Transformer() {
-
-							public Object transform(Object input) {
-								ObjectId targetId = ((ObjectDiff) input).getArcSnapshotValue(relationship.getName());
-								return targetId != null ? targetId.getIdSnapshot().get(dbAttrPair.getTargetName())
-										: null;
-							}
-						};
+						Function<ObjectDiff, Object> transformer = input -> {
+                            ObjectId targetId = input.getArcSnapshotValue(relationship.getName());
+                            return targetId != null ? targetId.getIdSnapshot().get(dbAttrPair.getTargetName()) : null;
+                        };
 
 						if (index < 0) {
 							attributes.add(dbAttribute);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
index ab100af..39d39cf 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
@@ -27,12 +27,12 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
 import org.apache.cayenne.util.Util;
-import org.apache.commons.collections.Transformer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,24 +46,16 @@ public class RowDescriptorBuilder {
 
     private static final Logger logger = LoggerFactory.getLogger(RowDescriptorBuilder.class);
 
-    private static final Transformer UPPERCASE_TRANSFORMER = new Transformer() {
+    private static final Function<String, String> UPPERCASE_TRANSFORMER = input ->
+            input != null ? input.toUpperCase() : null;
 
-        public Object transform(Object input) {
-            return input != null ? input.toString().toUpperCase() : null;
-        }
-    };
-
-    private static final Transformer LOWERCASE_TRANSFORMER = new Transformer() {
-
-        public Object transform(Object input) {
-            return input != null ? input.toString().toLowerCase() : null;
-        }
-    };
+    private static final Function<String, String> LOWERCASE_TRANSFORMER = input ->
+            input != null ? input.toLowerCase() : null;
 
     protected ColumnDescriptor[] columns;
     protected ResultSetMetaData resultSetMetadata;
 
-    protected Transformer caseTransformer;
+    protected Function<String, String> caseTransformer;
     protected Map<String, String> typeOverrides;
 
     protected boolean validateDuplicateColumnNames;
@@ -204,8 +196,8 @@ public class RowDescriptorBuilder {
 
         if (caseTransformer != null) {
             for (ColumnDescriptor aColumnArray : columnArray) {
-                aColumnArray.setDataRowKey((String) caseTransformer.transform(aColumnArray.getDataRowKey()));
-                aColumnArray.setName((String) caseTransformer.transform(aColumnArray.getName()));
+                aColumnArray.setDataRowKey(caseTransformer.apply(aColumnArray.getDataRowKey()));
+                aColumnArray.setName(caseTransformer.apply(aColumnArray.getName()));
             }
         }
         if (typeOverrides != null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
index 8d9cf65..f5d8900 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
@@ -25,7 +25,6 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -51,7 +50,6 @@ import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.util.Util;
-import org.apache.commons.collections.IteratorUtils;
 
 /**
  * Implements a strategy for execution of SQLTemplates.
@@ -138,8 +136,9 @@ public class SQLTemplateAction implements SQLAction {
 		execute(connection, callback, compiled, counts);
 	}
 
+	@SuppressWarnings("unchecked")
 	private void runWithNamedParametersBatch(Connection connection, OperationObserver callback, String template,
-			Collection<Number> counts, boolean loggable) throws Exception {
+											 Collection<Number> counts, boolean loggable) throws Exception {
 
 		int size = query.parametersSize();
 
@@ -148,14 +147,17 @@ public class SQLTemplateAction implements SQLAction {
 		int batchSize = (size > 0) ? size : 1;
 
 		// for now supporting deprecated batch parameters...
-		@SuppressWarnings("unchecked")
-		Iterator<Map<String, ?>> it = (size > 0) ? query.parametersIterator()
-				: IteratorUtils.singletonIterator(Collections.emptyMap());
+		Iterator<Map<String, ?>> it;
+		if(size == 0) {
+			Iterator empty = Collections.singleton(Collections.emptyMap()).iterator();
+			it = empty;
+		} else {
+			it = query.parametersIterator();
+		}
+
 		for (int i = 0; i < batchSize; i++) {
 			Map<String, ?> nextParameters = it.next();
-
 			SQLStatement compiled = dataNode.getSqlTemplateProcessor().processTemplate(template, nextParameters);
-
 			if (loggable) {
 				dataNode.getJdbcEventLogger().logQuery(compiled.getSql(), compiled.getBindings());
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/JoinStack.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/JoinStack.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/JoinStack.java
index 5b11a3c..937b818 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/JoinStack.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/JoinStack.java
@@ -19,6 +19,7 @@
 package org.apache.cayenne.access.translator.select;
 
 import java.util.List;
+import java.util.function.Function;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.QuotingStrategy;
@@ -26,14 +27,12 @@ import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.parser.ASTDbPath;
 import org.apache.cayenne.exp.parser.ASTObjPath;
 import org.apache.cayenne.exp.parser.SimpleNode;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.JoinType;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Encapsulates join reuse/split logic used in SelectQuery processing. All
@@ -187,7 +186,7 @@ public class JoinStack {
 	 * to concatenated Db-paths to root entity and rejecting all original
 	 * Db-paths
 	 */
-	class JoinedDbEntityQualifierTransformer implements Transformer {
+	class JoinedDbEntityQualifierTransformer implements Function<Object, Object> {
 
 		StringBuilder pathToRoot;
 
@@ -211,7 +210,7 @@ public class JoinStack {
 			}
 		}
 
-		public Object transform(Object input) {
+		public Object apply(Object input) {
 			if (input instanceof ASTObjPath) {
 				return new ASTDbPath(pathToRoot.toString() + ((SimpleNode) input).getOperand(0));
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
index 51ebf52..81ec0ee 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslator.java
@@ -20,8 +20,10 @@
 package org.apache.cayenne.access.translator.select;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Function;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
@@ -42,8 +44,6 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.commons.collections.IteratorUtils;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Translates query qualifier to SQL. Used as a helper class by query
@@ -572,7 +572,7 @@ public class QualifierTranslator extends QueryAssemblerHelper implements Travers
 		if (list instanceof List) {
 			it = ((List<?>) list).iterator();
 		} else if (list instanceof Object[]) {
-			it = IteratorUtils.arrayIterator((Object[]) list);
+			it = Arrays.asList((Object[]) list).iterator();
 		} else {
 			String className = (list != null) ? list.getClass().getName() : "<null>";
 			throw new IllegalArgumentException("Unsupported type for the list expressions: " + className);
@@ -676,9 +676,9 @@ public class QualifierTranslator extends QueryAssemblerHelper implements Travers
 	 * qualifiers annotation This is done by changing all Obj-paths to Db-paths
 	 * and rejecting all original Db-paths
 	 */
-	class DbEntityQualifierTransformer implements Transformer {
+	class DbEntityQualifierTransformer implements Function<Object, Object> {
 
-		public Object transform(Object input) {
+		public Object apply(Object input) {
 			if (input instanceof ASTObjPath) {
 				return new ASTDbPath(((SimpleNode) input).getOperand(0));
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
index d299f28..13214a9 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
@@ -39,7 +39,6 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.query.ObjectIdQuery;
 import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.commons.collections.comparators.ReverseComparator;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -320,7 +319,7 @@ public class AshwoodEntitySorter implements EntitySorter {
 	protected Comparator<DbEntity> getDbEntityComparator(boolean dependantFirst) {
 		Comparator<DbEntity> c = dbEntityComparator;
 		if (dependantFirst) {
-			c = new ReverseComparator(c);
+			c = c.reversed();
 		}
 		return c;
 	}
@@ -328,7 +327,7 @@ public class AshwoodEntitySorter implements EntitySorter {
 	protected Comparator<ObjEntity> getObjEntityComparator(boolean dependantFirst) {
 		Comparator<ObjEntity> c = objEntityComparator;
 		if (dependantFirst) {
-			c = new ReverseComparator(c);
+			c = c.reversed();
 		}
 		return c;
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/ashwood/WeightedAshwoodEntitySorter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/WeightedAshwoodEntitySorter.java b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/WeightedAshwoodEntitySorter.java
index 99df6a6..97e6e87 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/WeightedAshwoodEntitySorter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/WeightedAshwoodEntitySorter.java
@@ -25,7 +25,6 @@ import java.util.Map;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.commons.collections.comparators.ReverseComparator;
 
 /**
  * EntitySorter that takes into account entity "weights", and otherwise delegating to
@@ -72,7 +71,7 @@ public class WeightedAshwoodEntitySorter extends AshwoodEntitySorter {
     protected Comparator<DbEntity> getDbEntityComparator(boolean dependantFirst) {
         Comparator<DbEntity> c = weightedDbEntityComparator;
         if (dependantFirst) {
-            c = new ReverseComparator(c);
+            c = c.reversed();
         }
         return c;
     }
@@ -82,7 +81,7 @@ public class WeightedAshwoodEntitySorter extends AshwoodEntitySorter {
     protected Comparator<ObjEntity> getObjEntityComparator(boolean dependantFirst) {
         Comparator<ObjEntity> c = weightedObjEntityComparator;
         if (dependantFirst) {
-            c = new ReverseComparator(c);
+            c = c.reversed();
         }
         return c;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java b/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
index ea48311..e2fb64d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
@@ -25,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.query.QueryMetadata;
-import org.apache.commons.collections.map.LRUMap;
+import org.apache.cayenne.util.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
 
 /**
  * A default implementation of the {@link QueryCache} interface that stores data in a
@@ -152,7 +152,8 @@ public class MapQueryCache implements QueryCache, Serializable {
         if(map != null) {
             return map;
         }
-        map = new LRUMap(maxSize);
+
+        map = new ConcurrentLinkedHashMap.Builder<String, List<?>>().maximumWeightedCapacity(maxSize).build();
         cacheGroups.put(cacheName, map);
         return map;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
index fadd468..078230f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
@@ -29,10 +29,10 @@ import org.apache.cayenne.exp.parser.ASTNegate;
 import org.apache.cayenne.exp.parser.ASTNotIn;
 import org.apache.cayenne.exp.parser.ASTPath;
 import org.apache.cayenne.exp.parser.Node;
-import org.apache.commons.collections.Transformer;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 
 /**
  * Oracle qualifier translator. In particular, trims INs with more than 1000
@@ -53,7 +53,7 @@ public class OracleQualifierTranslator extends TrimmingQualifierTranslator {
 		rootNode.traverse(this);
 	}
 
-	public static class INTrimmer implements Transformer {
+	public static class INTrimmer implements Function<Object, Object> {
 
 		public Expression trimmedInExpression(Expression exp, int maxInSize) {
 			Expression list = (Expression) exp.getOperand(1);
@@ -89,7 +89,7 @@ public class OracleQualifierTranslator extends TrimmingQualifierTranslator {
 			return res;
 		}
 
-		public Object transform(Object input) {
+		public Object apply(Object input) {
 			if (input instanceof ASTIn || input instanceof ASTNotIn) {
 				return trimmedInExpression((Expression) input, 1000);
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/exp/Expression.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/Expression.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/Expression.java
index 77a8cdf..6bfad77 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/Expression.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/Expression.java
@@ -29,6 +29,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
@@ -38,7 +39,6 @@ import org.apache.cayenne.util.HashCodeBuilder;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
 import org.apache.cayenne.util.XMLSerializable;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Superclass of Cayenne expressions that defines basic API for expressions use.
@@ -622,7 +622,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 	 * 
 	 * @since 1.1
 	 */
-	public Expression transform(Transformer transformer) {
+	public Expression transform(Function<Object, Object> transformer) {
 		Object transformed = transformExpression(transformer);
 
 		if (transformed == PRUNED_NODE || transformed == null) {
@@ -641,7 +641,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 	 * @return null, Expression.PRUNED_NODE or transformed expression.
 	 * @since 1.2
 	 */
-	protected Object transformExpression(Transformer transformer) {
+	protected Object transformExpression(Function<Object, Object> transformer) {
 		Expression copy = shallowCopy();
 		int count = getOperandCount();
 		for (int i = 0, j = 0; i < count; i++) {
@@ -651,7 +651,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 			if (operand instanceof Expression) {
 				transformedChild = ((Expression) operand).transformExpression(transformer);
 			} else if (transformer != null) {
-				transformedChild = transformer.transform(operand);
+				transformedChild = transformer.apply(operand);
 			} else {
 				transformedChild = operand;
 			}
@@ -672,7 +672,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 		}
 
 		// all the children are processed, only now transform this copy
-		return (transformer != null) ? (Expression) transformer.transform(copy) : copy;
+		return (transformer != null) ? (Expression) transformer.apply(copy) : copy;
 	}
 
 	/**
@@ -793,7 +793,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 		return toEJBQL(null, rootId);
 	}
 
-	final class NamedParamTransformer implements Transformer {
+	final class NamedParamTransformer implements Function<Object, Object> {
 
 		private Map<String, ?> parameters;
 		private boolean pruneMissing;
@@ -804,7 +804,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 		}
 
 		@Override
-		public Object transform(Object object) {
+		public Object apply(Object object) {
 			if (!(object instanceof ExpressionParameter)) {
 
 				// normally Object[] is an ASTList child
@@ -815,7 +815,7 @@ public abstract class Expression implements Serializable, XMLSerializable {
 					Object[] target = new Object[len];
 
 					for (int i = 0; i < len; i++) {
-						target[i] = transform(source[i]);
+						target[i] = apply(source[i]);
 					}
 
 					return target;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
index e91c5a3..d1801ce 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTIn.java
@@ -19,8 +19,9 @@
 
 package org.apache.cayenne.exp.parser;
 
+import java.util.function.Function;
+
 import org.apache.cayenne.exp.Expression;
-import org.apache.commons.collections.Transformer;
 
 /**
  * "In" expression.
@@ -91,7 +92,7 @@ public class ASTIn extends ConditionNode {
 	}
 
 	@Override
-	protected Object transformExpression(Transformer transformer) {
+	protected Object transformExpression(Function<Object, Object> transformer) {
 		Object transformed = super.transformExpression(transformer);
 
 		// transform empty ASTIn to ASTFalse

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
index 09afa6d..4ce7d46 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTNotIn.java
@@ -20,8 +20,9 @@
 
 package org.apache.cayenne.exp.parser;
 
+import java.util.function.Function;
+
 import org.apache.cayenne.exp.Expression;
-import org.apache.commons.collections.Transformer;
 
 /**
  * "Not In" expression.
@@ -83,7 +84,7 @@ public class ASTNotIn extends ConditionNode {
     }
     
     @Override
-    protected Object transformExpression(Transformer transformer) {
+    protected Object transformExpression(Function<Object, Object> transformer) {
         Object transformed = super.transformExpression(transformer);
         
         // transform empty ASTNotIn to ASTTrue

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/AggregateConditionNode.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/AggregateConditionNode.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/AggregateConditionNode.java
index 7574dfd..33d8c15 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/AggregateConditionNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/AggregateConditionNode.java
@@ -19,8 +19,9 @@
 
 package org.apache.cayenne.exp.parser;
 
+import java.util.function.Function;
+
 import org.apache.cayenne.exp.ExpressionException;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Superclass of aggregated conditional nodes such as NOT, AND, OR. Performs
@@ -43,7 +44,7 @@ public abstract class AggregateConditionNode extends SimpleNode {
 	}
 
 	@Override
-	protected Object transformExpression(Transformer transformer) {
+	protected Object transformExpression(Function<Object, Object> transformer) {
 		Object transformed = super.transformExpression(transformer);
 
 		if (!(transformed instanceof AggregateConditionNode)) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
index d3dda7e..f8071da 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.collections.Transformer;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -47,6 +46,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
+import java.util.function.Function;
 
 /**
  * A DbEntity is a mapping descriptor that defines a structure of a database
@@ -636,7 +636,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe
         return expression.transform(new RelationshipPathConverter(relationshipPath));
     }
 
-    final class RelationshipPathConverter implements Transformer {
+    final class RelationshipPathConverter implements Function<Object, Object> {
 
         String relationshipPath;
         boolean toMany;
@@ -656,7 +656,7 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe
             }
         }
 
-        public Object transform(Object input) {
+        public Object apply(Object input) {
             if (!(input instanceof Expression)) {
                 return input;
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
index 53d4c73..e3678d5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
@@ -24,8 +24,6 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Transformer;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -33,6 +31,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * A DbRelationship is a descriptor of a database inter-table relationship based
@@ -118,7 +117,7 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
             return Collections.emptyList();
         }
 
-        return CollectionUtils.collect(joins, JoinTransformers.targetExtractor);
+        return joins.stream().map(DbJoin::getTarget).collect(Collectors.toList());
     }
 
     /**
@@ -132,7 +131,7 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
             return Collections.emptyList();
         }
 
-        return CollectionUtils.collect(joins, JoinTransformers.sourceExtractor);
+        return joins.stream().map(DbJoin::getSource).collect(Collectors.toList());
     }
 
     /**
@@ -486,23 +485,6 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
         return false;
     }
 
-    static final class JoinTransformers {
-
-        static final Transformer targetExtractor = new Transformer() {
-
-            public Object transform(Object input) {
-                return (input instanceof DbJoin) ? ((DbJoin) input).getTarget() : input;
-            }
-        };
-
-        static final Transformer sourceExtractor = new Transformer() {
-
-            public Object transform(Object input) {
-                return (input instanceof DbJoin) ? ((DbJoin) input).getSource() : input;
-            }
-        };
-    }
-
     // a join used for comparison
     static final class TestJoin extends DbJoin {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
index ae03d13..ebafe84 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.map;
 
+import java.util.Collections;
 import java.util.Iterator;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -27,7 +28,6 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.collections.IteratorUtils;
 
 /**
  * An ObjAttribute is a mapping descriptor of a Java class property.
@@ -217,25 +217,25 @@ public class ObjAttribute extends Attribute implements ConfigurationNode {
     @SuppressWarnings("unchecked")
     public Iterator<CayenneMapEntry> getDbPathIterator(ObjEntity entity) {
         if (dbAttributePath == null) {
-            return IteratorUtils.EMPTY_ITERATOR;
+            return Collections.emptyIterator();
         }
 
         if (entity == null) {
-            return IteratorUtils.EMPTY_ITERATOR;
+            return Collections.emptyIterator();
         }
 
         DbEntity dbEnt = entity.getDbEntity();
         if (dbEnt == null) {
-            return IteratorUtils.EMPTY_ITERATOR;
+            return Collections.emptyIterator();
         }
 
         int lastPartStart = dbAttributePath.lastIndexOf('.');
         if (lastPartStart < 0) {
             DbAttribute attribute = dbEnt.getAttribute(dbAttributePath);
             if (attribute == null) {
-                return IteratorUtils.EMPTY_ITERATOR;
+                return Collections.emptyIterator();
             }
-            return IteratorUtils.singletonIterator(attribute);
+            return Collections.<CayenneMapEntry>singleton(attribute).iterator();
         }
 
         return dbEnt.resolvePathComponents(dbAttributePath);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
index 311f5ed..536d2cf 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
@@ -32,7 +32,6 @@ import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
-import org.apache.commons.collections.Transformer;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -45,6 +44,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.function.Function;
 
 /**
  * ObjEntity is a mapping descriptor for a DataObject Java class. It contains
@@ -1104,7 +1104,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         return res;
     }
 
-    final class DBPathConverter implements Transformer {
+    final class DBPathConverter implements Function<Object, Object> {
 
         // TODO: make it a public method - resolveDBPathComponents or
         // something...
@@ -1143,7 +1143,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
             return buf.toString();
         }
 
-        public Object transform(Object input) {
+        public Object apply(Object input) {
 
             if (!(input instanceof Expression)) {
                 return input;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java b/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
index 6fb2ddc..c19d0c2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
@@ -19,11 +19,11 @@
 package org.apache.cayenne.query;
 
 import java.util.Map;
+import java.util.function.Supplier;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.commons.collections.Factory;
 
 /**
  * Represents a single row of values in a BatchQuery.
@@ -60,8 +60,8 @@ public abstract class BatchQueryRow {
 
         // if a value is a Factory, resolve it here...
         // slight chance that a normal value will implement Factory interface???
-        if (value instanceof Factory) {
-            value = ((Factory) value).create();
+        if (value instanceof Supplier) {
+            value = ((Supplier) value).get();
             valueMap.put(attribute.getName(), value);
 
             // update replacement id

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/query/InsertBatchQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/InsertBatchQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/InsertBatchQuery.java
index 84b76ca..1aebb5f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/InsertBatchQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/InsertBatchQuery.java
@@ -50,7 +50,7 @@ public class InsertBatchQuery extends BatchQuery {
     /**
      * Adds a snapshot to batch. Optionally stores the object id for the
      * snapshot. Note that snapshot can hold either the real values or the
-     * instances of org.apache.commons.collections.Factory that will be resolved
+     * instances of java.util.Supplier that will be resolved
      * to the actual value on the spot, thus allowing deferred propagated keys
      * resolution.
      * 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/query/Ordering.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/Ordering.java b/cayenne-server/src/main/java/org/apache/cayenne/query/Ordering.java
index 5bd24bc..08417c4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/Ordering.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/Ordering.java
@@ -38,7 +38,6 @@ import org.apache.cayenne.util.ConversionUtil;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.util.XMLEncoder;
 import org.apache.cayenne.util.XMLSerializable;
-import org.apache.commons.collections.ComparatorUtils;
 
 /**
  * Defines object sorting criteria, used either for in-memory sorting of object
@@ -67,7 +66,14 @@ public class Ordering implements Comparator<Object>, Serializable, XMLSerializab
 	 */
 	@SuppressWarnings("unchecked")
 	public static void orderList(List<?> objects, List<? extends Ordering> orderings) {
-		Collections.sort(objects, ComparatorUtils.chainedComparator(orderings));
+		if(objects == null || orderings == null || orderings.isEmpty()) {
+			return;
+		}
+		Comparator<Object> comparator = orderings.get(0);
+		for(int i=1; i<orderings.size(); i++) {
+			comparator = comparator.thenComparing(orderings.get(i));
+		}
+		objects.sort(comparator);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
index 554bb8b..eed51c1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplate.java
@@ -30,8 +30,6 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SQLResult;
 import org.apache.cayenne.util.XMLEncoder;
 import org.apache.cayenne.util.XMLSerializable;
-import org.apache.commons.collections.IteratorUtils;
-import org.apache.commons.collections.Transformer;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -42,6 +40,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeSet;
+import java.util.function.Function;
+import java.util.stream.Stream;
 
 /**
  * A query that executes unchanged (except for template preprocessing) "raw" SQL
@@ -76,12 +76,8 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
 
 	public static final String COLUMN_NAME_CAPITALIZATION_PROPERTY = "cayenne.SQLTemplate.columnNameCapitalization";
 
-	private static final Transformer nullMapTransformer = new Transformer() {
-
-		public Object transform(Object input) {
-			return (input != null) ? input : Collections.EMPTY_MAP;
-		}
-	};
+	private static final Function<Map<String, ?>, Map<String, ?>> nullMapTransformer = input ->
+			(input != null) ? input : Collections.emptyMap();
 
 	protected String defaultTemplate;
 	protected Map<String, String> templates;
@@ -222,8 +218,9 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
 	 */
 	@SuppressWarnings("unchecked")
 	public Iterator<Map<String, ?>> parametersIterator() {
-		return (parameters == null || parameters.length == 0) ? IteratorUtils.emptyIterator() : IteratorUtils
-				.transformedIterator(IteratorUtils.arrayIterator(parameters), nullMapTransformer);
+		return (parameters == null || parameters.length == 0)
+				? Collections.emptyIterator()
+				: Stream.of(parameters).map(nullMapTransformer).iterator();
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/cayenne-server/src/test/java/org/apache/cayenne/ObjectIdTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/ObjectIdTest.java b/cayenne-server/src/test/java/org/apache/cayenne/ObjectIdTest.java
index 0dc4907..2ed72ad 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/ObjectIdTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/ObjectIdTest.java
@@ -20,11 +20,11 @@
 package org.apache.cayenne;
 
 import org.apache.cayenne.util.Util;
-import org.apache.commons.collections.map.LinkedMap;
 import org.junit.Test;
 
 import java.math.BigDecimal;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
@@ -168,12 +168,12 @@ public class ObjectIdTest {
         // create maps with guaranteed iteration order
 
         @SuppressWarnings("unchecked")
-        Map<String, Object> hm1 = new LinkedMap();
+        Map<String, Object> hm1 = new LinkedHashMap<>();
         hm1.put("KEY1", 1);
         hm1.put("KEY2", 2);
 
         @SuppressWarnings("unchecked")
-        Map<String, Object> hm2 = new LinkedMap();
+        Map<String, Object> hm2 = new LinkedHashMap();
         // put same keys but in different order
         hm2.put("KEY2", 2);
         hm2.put("KEY1", 1);
@@ -256,12 +256,12 @@ public class ObjectIdTest {
         // create maps with guaranteed iteration order
 
         @SuppressWarnings("unchecked")
-        Map<String, Object> hm1 = new LinkedMap();
+        Map<String, Object> hm1 = new LinkedHashMap();
         hm1.put("KEY1", 1);
         hm1.put("KEY2", 2);
 
         @SuppressWarnings("unchecked")
-        Map<String, Object> hm2 = new LinkedMap();
+        Map<String, Object> hm2 = new LinkedHashMap();
         // put same keys but in different order
         hm2.put("KEY2", new BigDecimal(2.00));
         hm2.put("KEY1", 1L);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/docs/doc/pom.xml
----------------------------------------------------------------------
diff --git a/docs/doc/pom.xml b/docs/doc/pom.xml
index d3daa0a..8daefb9 100644
--- a/docs/doc/pom.xml
+++ b/docs/doc/pom.xml
@@ -48,11 +48,6 @@
 		</dependency>
 
 		<dependency>
-			<groupId>commons-collections</groupId>
-			<artifactId>commons-collections</artifactId>
-		</dependency>
-
-		<dependency>
 			<groupId>com.caucho</groupId>
             <artifactId>hessian</artifactId>
 		</dependency>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/pom.xml
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/pom.xml b/modeler/cayenne-modeler/pom.xml
index bbc4645..d505bdb 100644
--- a/modeler/cayenne-modeler/pom.xml
+++ b/modeler/cayenne-modeler/pom.xml
@@ -103,6 +103,18 @@
 		</dependency>
 	</dependencies>
 
+	<build>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
     <profiles>
         <profile>
             <id>code-quality</id>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 3625df2..8bd18b4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -34,8 +34,6 @@ import org.apache.cayenne.pref.CayenneProjectPreferences;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.swing.BindingFactory;
 import org.apache.cayenne.util.IDUtil;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Transformer;
 
 import javax.swing.*;
 import java.io.File;
@@ -43,6 +41,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
+import java.util.stream.Collectors;
 
 /**
  * A main modeler application class that provides a number of services to the Modeler
@@ -241,7 +240,7 @@ public class Application {
                 ClasspathPreferences.class,
                 "");
 
-        Collection details = new ArrayList<>();
+        Collection<String> details = new ArrayList<>();
         String[] keys;
         ArrayList<String> values = new ArrayList<>();
 
@@ -256,17 +255,7 @@ public class Application {
         details.addAll(values);
 
         if (details.size() > 0) {
-
-            // transform preference to file...
-            Transformer transformer = new Transformer() {
-
-                public Object transform(Object object) {
-                    String pref = (String) object;
-                    return new File(pref);
-                }
-            };
-
-            classLoader.setPathFiles(CollectionUtils.collect(details, transformer));
+            classLoader.setPathFiles(details.stream().map(File::new).collect(Collectors.toList()));
         }
 
         this.modelerClassLoader = classLoader;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
index 369a8ed..9733f83 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
@@ -30,7 +30,8 @@ import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
@@ -44,7 +45,6 @@ import org.apache.cayenne.modeler.util.AdapterMapping;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.modeler.util.FileFilters;
 import org.apache.cayenne.wocompat.EOModelProcessor;
-import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -213,75 +213,67 @@ public class ImportEOModelAction extends CayenneAction {
             // merge with existing map... have to memorize map state before and after
             // to do the right events
 
-            Collection originalOE = new ArrayList(currentMap.getObjEntities());
-            Collection originalDE = new ArrayList(currentMap.getDbEntities());
-            Collection originalQueries = new ArrayList(currentMap.getQueryDescriptors());
+            Collection<ObjEntity> originalOE = new ArrayList<>(currentMap.getObjEntities());
+            Collection<DbEntity> originalDE = new ArrayList<>(currentMap.getDbEntities());
+            Collection<QueryDescriptor> originalQueries = new ArrayList<>(currentMap.getQueryDescriptors());
 
             currentMap.mergeWithDataMap(map);
             map = currentMap;
 
             // postprocess changes
-            Collection newOE = new ArrayList(currentMap.getObjEntities());
-            Collection newDE = new ArrayList(currentMap.getDbEntities());
-            Collection newQueries = new ArrayList(currentMap.getQueryDescriptors());
+            Collection<ObjEntity> newOE = new ArrayList<>(currentMap.getObjEntities());
+            Collection<DbEntity> newDE = new ArrayList<>(currentMap.getDbEntities());
+            Collection<QueryDescriptor> newQueries = new ArrayList<>(currentMap.getQueryDescriptors());
 
             EntityEvent entityEvent = new EntityEvent(Application.getFrame(), null);
             QueryEvent queryEvent = new QueryEvent(Application.getFrame(), null);
 
-            Collection addedOE = CollectionUtils.subtract(newOE, originalOE);
-            Iterator it = addedOE.iterator();
-            while (it.hasNext()) {
-                Entity e = (Entity) it.next();
+            // 1. ObjEntities
+            Collection<ObjEntity> addedOE = new ArrayList<>(newOE);
+            addedOE.removeAll(originalOE);
+            for (ObjEntity e : addedOE) {
                 entityEvent.setEntity(e);
                 entityEvent.setId(MapEvent.ADD);
                 mediator.fireObjEntityEvent(entityEvent);
             }
 
-            Collection removedOE = CollectionUtils.subtract(originalOE, newOE);
-            it = removedOE.iterator();
-            while (it.hasNext()) {
-                Entity e = (Entity) it.next();
+            Collection<ObjEntity> removedOE = new ArrayList<>(originalOE);
+            removedOE.removeAll(newOE);
+            for (ObjEntity e : removedOE) {
                 entityEvent.setEntity(e);
                 entityEvent.setId(MapEvent.REMOVE);
                 mediator.fireObjEntityEvent(entityEvent);
             }
 
-            Collection addedDE = CollectionUtils.subtract(newDE, originalDE);
-            it = addedDE.iterator();
-            while (it.hasNext()) {
-                Entity e = (Entity) it.next();
+            // 2. DbEntities
+            Collection<DbEntity> addedDE = new ArrayList<>(newDE);
+            addedDE.removeAll(originalDE);
+            for(DbEntity e: addedDE) {
                 entityEvent.setEntity(e);
                 entityEvent.setId(MapEvent.ADD);
                 mediator.fireDbEntityEvent(entityEvent);
             }
 
-            Collection removedDE = CollectionUtils.subtract(originalDE, newDE);
-            it = removedDE.iterator();
-            while (it.hasNext()) {
-                Entity e = (Entity) it.next();
+            Collection<DbEntity> removedDE = new ArrayList<>(originalDE);
+            removedDE.removeAll(newDE);
+            for(DbEntity e: removedDE) {
                 entityEvent.setEntity(e);
                 entityEvent.setId(MapEvent.REMOVE);
                 mediator.fireDbEntityEvent(entityEvent);
             }
 
-            // queries
-            Collection addedQueries = CollectionUtils.subtract(
-                    newQueries,
-                    originalQueries);
-            it = addedQueries.iterator();
-            while (it.hasNext()) {
-                QueryDescriptor q = (QueryDescriptor) it.next();
+            // 3. queries
+            Collection<QueryDescriptor> addedQueries = new ArrayList<>(newQueries);
+            addedQueries.removeAll(originalQueries);
+            for(QueryDescriptor q: addedQueries) {
                 queryEvent.setQuery(q);
                 queryEvent.setId(MapEvent.ADD);
                 mediator.fireQueryEvent(queryEvent);
             }
 
-            Collection removedQueries = CollectionUtils.subtract(
-                    originalQueries,
-                    newQueries);
-            it = removedQueries.iterator();
-            while (it.hasNext()) {
-                QueryDescriptor q = (QueryDescriptor) it.next();
+            Collection<QueryDescriptor> removedQueries = new ArrayList<>(originalQueries);
+            removedQueries.removeAll(newQueries);
+            for(QueryDescriptor q: removedQueries) {
                 queryEvent.setQuery(q);
                 queryEvent.setId(MapEvent.REMOVE);
                 mediator.fireQueryEvent(queryEvent);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
index fd7f59b..4a41b32 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsControllerBase.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.commons.collections.Predicate;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -33,6 +32,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Predicate;
 
 public class InferRelationshipsControllerBase extends CayenneController {
 
@@ -233,18 +233,17 @@ public class InferRelationshipsControllerBase extends CayenneController {
         return selected;
     }
 
-    public boolean updateSelection(Predicate predicate) {
+    public boolean updateSelection(Predicate<InferredRelationship> predicate) {
         boolean modified = false;
 
         for (InferredRelationship entity : inferredRelationships) {
-            boolean select = predicate.evaluate(entity);
+            boolean select = predicate.test(entity);
 
             if (select) {
                 if (selectedEntities.add(entity)) {
                     modified = true;
                 }
-            }
-            else {
+            } else {
                 if (selectedEntities.remove(entity)) {
                     modified = true;
                 }
@@ -259,7 +258,7 @@ public class InferRelationshipsControllerBase extends CayenneController {
     }
 
     public boolean isSelected() {
-        return currentEntity != null ? selectedEntities.contains(currentEntity) : false;
+        return currentEntity != null && selectedEntities.contains(currentEntity);
     }
 
     public void setSelected(boolean selectedFlag) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
index 5637b0c..a01bd9c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsTabController.java
@@ -24,8 +24,6 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.PredicateUtils;
 
 public class InferRelationshipsTabController extends CayenneController {
 
@@ -115,8 +113,7 @@ public class InferRelationshipsTabController extends CayenneController {
 
         if (selectedCount == 0) {
             view.getCheckAll().setSelected(false);
-        }
-        else if (selectedCount == getParentController().getEntities().size()) {
+        } else if (selectedCount == getParentController().getEntities().size()) {
             view.getCheckAll().setSelected(true);
         }
     }
@@ -126,11 +123,7 @@ public class InferRelationshipsTabController extends CayenneController {
      * change.
      */
     public void checkAllAction() {
-
-        Predicate predicate = view.getCheckAll().isSelected() ? PredicateUtils
-                .truePredicate() : PredicateUtils.falsePredicate();
-
-        if (getParentController().updateSelection(predicate)) {
+        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
index a4611a2..a5b2e6a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
@@ -28,8 +28,6 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.PredicateUtils;
 
 public class ClassesTabController extends CayenneController {
 
@@ -115,11 +113,7 @@ public class ClassesTabController extends CayenneController {
      * change.
      */
     public void checkAllAction() {
-
-        Predicate predicate = view.getCheckAll().isSelected() ? PredicateUtils
-                .truePredicate() : PredicateUtils.falsePredicate();
-
-        if (getParentController().updateSelection(predicate)) {
+        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
index 248b4b2..079d70c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
@@ -27,32 +27,17 @@ import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.validation.BeanValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.collections.Predicate;
 
 import java.util.ArrayList;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.function.Predicate;
 
 public class ClientModeController extends StandardModeController {
 
-    protected Predicate checkPredicate;
-
     public ClientModeController(CodeGeneratorControllerBase parent) {
         super(parent);
-
-        this.checkPredicate = new Predicate() {
-
-            public boolean evaluate(Object object) {
-                if (object instanceof ObjEntity) {
-                    ObjEntity entity = (ObjEntity) object;
-                    return entity.isClientAllowed()
-                            && getParentController().getProblem(entity.getName()) == null;
-                }
-
-                return false;
-            }
-        };
     }
 
     public void validateEntity(ValidationResult validationBuffer, ObjEntity entity) {
@@ -117,8 +102,4 @@ public class ClientModeController extends StandardModeController {
     protected ClassGenerationAction newGenerator() {
         return new ClientClassGenerationAction();
     }
-
-    public Predicate getDefaultEntityFilter() {
-        return checkPredicate;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
index 731cc61..d471682 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
@@ -24,14 +24,13 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.commons.collections.Predicate;
-import org.apache.commons.collections.PredicateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.swing.JOptionPane;
 import java.awt.Component;
 import java.util.Collection;
+import java.util.function.Predicate;
 
 /**
  * A controller for the class generator dialog.
@@ -91,9 +90,9 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         GeneratorController controller = generatorSelector.getGeneratorController();
         validate(controller);
 
-        Predicate predicate = controller != null
+        Predicate<Object> predicate = controller != null
                 ? controller.getDefaultClassFilter()
-                : PredicateUtils.falsePredicate();
+                : o -> false;
 
         updateSelection(predicate);
         classesSelector.classSelectedAction();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
index ad8c306..563de6a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.collections.Predicate;
 
 import javax.swing.Icon;
 import javax.swing.JLabel;
@@ -36,6 +35,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Predicate;
 
 /**
  * A base superclass of a top controller for the code generator. Defines all common model
@@ -52,8 +52,8 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     protected List<Object> classes;
 
-    protected Set selectedEntities;
-    protected Set selectedEmbeddables;
+    protected Set<String> selectedEntities;
+    protected Set<String> selectedEmbeddables;
 
     protected transient Object currentClass;
 
@@ -61,14 +61,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         super(parent);
 
         this.dataMaps = dataMaps;
-        this.classes = new ArrayList();
+        this.classes = new ArrayList<>();
 
         for(DataMap dataMap:dataMaps){
-            this.classes.addAll(new ArrayList(dataMap.getObjEntities()));
-            this.classes.addAll(new ArrayList(dataMap.getEmbeddables()));
+            this.classes.addAll(new ArrayList<>(dataMap.getObjEntities()));
+            this.classes.addAll(new ArrayList<>(dataMap.getEmbeddables()));
         }
-        this.selectedEntities = new HashSet();
-        this.selectedEmbeddables = new HashSet();
+        this.selectedEntities = new HashSet<>();
+        this.selectedEmbeddables = new HashSet<>();
     }
 
     public List<Object> getClasses() {
@@ -99,12 +99,12 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         this.validation = validationBuffer;
     }
 
-    public boolean updateSelection(Predicate predicate) {
+    public boolean updateSelection(Predicate<Object> predicate) {
 
         boolean modified = false;
 
         for (Object classObj : classes) {
-            boolean select = predicate.evaluate(classObj);
+            boolean select = predicate.test(classObj);
             if (classObj instanceof ObjEntity) {
 
                 if (select) {
@@ -205,12 +205,12 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     public boolean isSelected() {
         if (currentClass instanceof ObjEntity) {
-            return currentClass != null ? selectedEntities
-                    .contains(((ObjEntity) currentClass).getName()) : false;
+            return selectedEntities
+                    .contains(((ObjEntity) currentClass).getName());
         }
         if (currentClass instanceof Embeddable) {
-            return currentClass != null ? selectedEmbeddables
-                    .contains(((Embeddable) currentClass).getClassName()) : false;
+            return selectedEmbeddables
+                    .contains(((Embeddable) currentClass).getClassName());
         }
         return false;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
index 962601d..e105445 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
@@ -41,7 +41,6 @@ import org.apache.cayenne.validation.BeanValidationFailure;
 import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.collections.Predicate;
 
 import javax.swing.JButton;
 import javax.swing.JFileChooser;
@@ -54,6 +53,7 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 
 /**
@@ -479,44 +479,26 @@ public abstract class GeneratorController extends CayenneController {
         final Embeddable selectedEmbeddable = Application.getInstance().getFrameController().getProjectController()
                 .getCurrentEmbeddable();
 
-        // select a single entity
         if (selectedEntity != null) {
+            // select a single entity
             final boolean hasProblem = getParentController().getProblem(selectedEntity.getName()) != null;
-
-            return new Predicate() {
-
-                public boolean evaluate(Object object) {
-                    return !hasProblem && object == selectedEntity;
-                }
-            };
-        }
-        // select a single embeddable
-        else if (selectedEmbeddable != null) {
+            return object -> !hasProblem && object == selectedEntity;
+        } else if (selectedEmbeddable != null) {
+            // select a single embeddable
             final boolean hasProblem = getParentController().getProblem(selectedEmbeddable.getClassName()) != null;
-
-            return new Predicate() {
-
-                public boolean evaluate(Object object) {
-                    return !hasProblem && object == selectedEmbeddable;
+            return object -> !hasProblem && object == selectedEmbeddable;
+        } else {
+            // select all entities
+            return object -> {
+                if (object instanceof ObjEntity) {
+                    return getParentController().getProblem(((ObjEntity) object).getName()) == null;
                 }
-            };
-        }
-        // select all entities
-        else {
-
-            return new Predicate() {
-
-                public boolean evaluate(Object object) {
-                    if (object instanceof ObjEntity) {
-                        return getParentController().getProblem(((ObjEntity) object).getName()) == null;
-                    }
-
-                    if (object instanceof Embeddable) {
-                        return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
-                    }
 
-                    return false;
+                if (object instanceof Embeddable) {
+                    return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
                 }
+
+                return false;
             };
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
index 151d56c..149fb8d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/DataSourcePreferences.java
@@ -27,11 +27,11 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.prefs.Preferences;
+import java.util.stream.Collectors;
 
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JOptionPane;
@@ -39,7 +39,6 @@ import javax.swing.JOptionPane;
 import org.apache.cayenne.datasource.DriverDataSource;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.FileClassLoadingService;
-import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.DataSourceModificationEvent;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.util.CayenneController;
@@ -48,8 +47,6 @@ import org.apache.cayenne.pref.ChildrenMapPreference;
 import org.apache.cayenne.pref.PreferenceEditor;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Transformer;
 
 /**
  * Editor for the local DataSources configured in preferences.
@@ -260,17 +257,7 @@ public class DataSourcePreferences extends CayenneController {
 			}
 
 			if (details.size() > 0) {
-
-				// transform preference to file...
-				Transformer transformer = new Transformer() {
-
-					public Object transform(Object object) {
-						String pref = (String) object;
-						return new File(pref);
-					}
-				};
-
-				classLoader.setPathFiles(CollectionUtils.collect(details, transformer));
+				classLoader.setPathFiles(details.stream().map(File::new).collect(Collectors.toList()));
 			}
 
 			Class<Driver> driverClass = classLoader.loadClass(Driver.class, currentDataSource.getJdbcDriver());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fddb229d/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
index 1b2b18c..8c6272f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
@@ -31,6 +31,8 @@ import java.util.Collection;
 import java.util.EventObject;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 import javax.swing.BorderFactory;
 import javax.swing.DefaultComboBoxModel;
@@ -74,8 +76,6 @@ import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.Predicate;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -424,23 +424,14 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         toggleClientFieldsVisible(map.isClientSupported());
         toggleEnabled(entity.getSuperEntityName() == null, !entity.isServerOnly());
 
-        // init ObjEntities for inheritance
-        Predicate inheritanceFilter = new Predicate() {
-            public boolean evaluate(Object object) {
-                // do not show this entity or any of the subentities
-                return entity != object && !((ObjEntity) object).isSubentityOf(entity);
-            }
-        };
-
-        @SuppressWarnings("unchecked")
-        ObjEntity[] objEntities = ((Collection<ObjEntity>)CollectionUtils.select(map.getObjEntities(), inheritanceFilter))
-                .toArray(new ObjEntity[0]);
-        Arrays.sort(objEntities, Comparators.getDataMapChildrenComparator());
-        ObjEntity[] finalObjEntities = new ObjEntity[objEntities.length + 1];
-        finalObjEntities[0] = NO_INHERITANCE;
-        System.arraycopy(objEntities, 0, finalObjEntities, 1, objEntities.length);
+        // do not show this entity or any of the subentities
+        List<ObjEntity> objEntities = map.getObjEntities().stream()
+                .filter(object -> entity != object && !object.isSubentityOf(entity))
+                .sorted(Comparators.getDataMapChildrenComparator())
+                .collect(Collectors.toList());
+        objEntities.add(0, NO_INHERITANCE);
 
-        DefaultComboBoxModel<ObjEntity> superEntityModel = new DefaultComboBoxModel<>(finalObjEntities);
+        DefaultComboBoxModel<ObjEntity> superEntityModel = new DefaultComboBoxModel<>(objEntities.toArray(new ObjEntity[0]));
         superEntityModel.setSelectedItem(entity.getSuperEntity());
         superEntityCombo.setRenderer(CellRenderers.entityListRendererWithIcons(map));
         superEntityCombo.setModel(superEntityModel);