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/03/24 11:56:54 UTC

[3/3] cayenne git commit: CAY-2077 Bug in CayenneRuntimeException using wrong specified string in Formatter plus cleanup

CAY-2077 Bug in CayenneRuntimeException using wrong specified string in Formatter
plus cleanup


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

Branch: refs/heads/master
Commit: 2be06d62b2626dea132d6eb891e6242983dfd16b
Parents: 8733147
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Mar 24 14:56:41 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Mar 24 14:56:41 2017 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ClassGenerationAction.java      |  2 +-
 .../org/apache/cayenne/gen/EntityUtils.java     |  3 +-
 .../apache/cayenne/remote/ClientChannel.java    | 10 ++--
 .../cayenne/jcache/JCacheEntryLoader.java       |  2 +-
 .../java/org/apache/cayenne/BaseContext.java    | 18 +++----
 .../main/java/org/apache/cayenne/Cayenne.java   | 20 +++----
 .../java/org/apache/cayenne/CayenneContext.java |  2 +-
 .../org/apache/cayenne/CayenneDataObject.java   | 10 ++--
 .../cayenne/ObjectContextDeleteAction.java      | 57 +++++++-------------
 .../access/ClientServerChannelQueryAction.java  |  6 +--
 .../org/apache/cayenne/access/DataContext.java  |  6 +--
 .../org/apache/cayenne/access/DataDomain.java   | 11 ++--
 .../cayenne/access/DataDomainFlushObserver.java |  7 ++-
 .../access/DataDomainIndirectDiffBuilder.java   |  9 ++--
 .../cayenne/access/DataDomainInsertBucket.java  |  2 +-
 .../access/DataDomainLegacyQueryAction.java     |  4 +-
 .../cayenne/access/DataDomainQueryAction.java   |  4 +-
 .../cayenne/access/DataDomainSyncBucket.java    |  8 +--
 .../org/apache/cayenne/access/DataNode.java     |  2 +-
 .../access/DataNodeSyncQualifierDescriptor.java |  4 +-
 .../access/DefaultObjectMapRetainStrategy.java  |  2 +-
 .../apache/cayenne/access/FlattenedArcKey.java  | 17 +++---
 .../access/HierarchicalObjectResolver.java      |  6 +--
 .../access/HierarchicalObjectResolverNode.java  |  2 +-
 .../cayenne/access/IncrementalFaultList.java    |  4 +-
 .../JoinedIdParentAttachementStrategy.java      |  9 +---
 .../apache/cayenne/access/ObjectResolver.java   |  7 ++-
 .../org/apache/cayenne/access/ObjectStore.java  |  2 +-
 .../access/PrefetchProcessorJointNode.java      |  3 +-
 .../access/PrefetchProcessorTreeBuilder.java    |  4 +-
 .../org/apache/cayenne/access/ToOneFault.java   | 13 ++---
 .../jdbc/ConnectionAwareResultIterator.java     | 10 ++--
 .../cayenne/access/jdbc/JDBCResultIterator.java |  2 +-
 .../cayenne/access/jdbc/ProcedureAction.java    |  3 +-
 .../access/jdbc/RowDescriptorBuilder.java       | 30 ++++-------
 .../cayenne/access/jdbc/reader/IdRowReader.java |  2 +-
 .../batch/DefaultBatchTranslatorFactory.java    |  2 +-
 .../ejbql/EJBQLIdentifierColumnsTranslator.java | 17 +++---
 .../ejbql/EJBQLSelectColumnsTranslator.java     |  2 +-
 .../select/DefaultSelectTranslator.java         |  8 +--
 .../translator/select/OrderingTranslator.java   |  2 +-
 .../translator/select/QueryAssemblerHelper.java | 26 ++++-----
 .../cayenne/access/types/CalendarType.java      | 14 ++---
 .../cayenne/access/types/ExtendedEnumType.java  | 14 ++---
 .../access/util/IteratedSelectObserver.java     |  2 +-
 .../cayenne/ashwood/AshwoodEntitySorter.java    |  4 +-
 .../apache/cayenne/cache/EhCacheQueryCache.java |  2 +-
 .../org/apache/cayenne/cache/MapQueryCache.java |  2 +-
 .../org/apache/cayenne/cache/OSQueryCache.java  | 25 +++------
 .../cayenne/datasource/DataSourceBuilder.java   |  8 +--
 .../cayenne/datasource/DriverDataSource.java    |  6 +--
 .../datasource/PoolingDataSourceBuilder.java    |  8 +--
 .../org/apache/cayenne/dba/JdbcAdapter.java     |  8 +--
 .../org/apache/cayenne/dba/JdbcPkGenerator.java | 10 ++--
 .../org/apache/cayenne/dba/db2/DB2Adapter.java  |  4 +-
 .../cayenne/dba/db2/DB2QualifierTranslator.java |  4 +-
 .../apache/cayenne/dba/derby/DerbyAdapter.java  |  7 ++-
 .../dba/derby/DerbyQualifierTranslator.java     |  3 +-
 .../cayenne/dba/firebird/FirebirdAdapter.java   |  4 +-
 .../cayenne/dba/frontbase/FrontBaseAdapter.java |  8 +--
 .../dba/frontbase/FrontBasePkGenerator.java     |  2 +-
 .../frontbase/FrontBaseQualifierTranslator.java |  2 +-
 .../dba/hsqldb/HSQLQualifierTranslator.java     |  3 +-
 .../cayenne/dba/ingres/IngresAdapter.java       |  4 +-
 .../apache/cayenne/dba/mysql/MySQLAdapter.java  |  8 +--
 .../dba/mysql/MySQLQualifierTranslator.java     |  3 +-
 .../cayenne/dba/openbase/OpenBaseAdapter.java   | 10 ++--
 .../dba/openbase/OpenBasePkGenerator.java       | 10 ++--
 .../dba/oracle/Oracle8LOBBatchAction.java       |  4 +-
 .../dba/oracle/Oracle8LOBBatchTranslator.java   |  4 +-
 .../cayenne/dba/oracle/OraclePkGenerator.java   |  2 +-
 .../cayenne/dba/postgres/PostgresAdapter.java   |  8 +--
 .../cayenne/dba/sybase/SybasePkGenerator.java   |  6 +--
 .../cayenne/exp/LikeExpressionHelper.java       |  2 +-
 .../apache/cayenne/exp/parser/ASTExtract.java   |  2 +-
 .../apache/cayenne/graph/ChildDiffLoader.java   |  4 +-
 .../cayenne/log/CommonsJdbcEventLogger.java     |  7 +--
 .../java/org/apache/cayenne/map/DataMap.java    |  9 +---
 .../java/org/apache/cayenne/map/DbEntity.java   |  5 +-
 .../org/apache/cayenne/map/DbRelationship.java  |  2 +-
 .../apache/cayenne/map/EmbeddedAttribute.java   |  4 +-
 .../org/apache/cayenne/map/MappingCache.java    |  4 +-
 .../java/org/apache/cayenne/map/ObjEntity.java  |  9 ++--
 .../org/apache/cayenne/map/ObjRelationship.java |  8 +--
 .../org/apache/cayenne/map/Relationship.java    |  4 +-
 .../org/apache/cayenne/query/AbstractQuery.java |  3 +-
 .../org/apache/cayenne/query/BatchQueryRow.java |  2 +-
 .../org/apache/cayenne/query/EJBQLQuery.java    |  3 +-
 .../org/apache/cayenne/query/FluentSelect.java  |  4 +-
 .../org/apache/cayenne/query/IndirectQuery.java |  5 +-
 .../org/apache/cayenne/query/MappedSelect.java  |  2 +-
 .../org/apache/cayenne/query/NamedQuery.java    |  8 +--
 .../org/apache/cayenne/query/ObjectIdQuery.java |  5 +-
 .../apache/cayenne/query/RelationshipQuery.java | 17 ++----
 .../java/org/apache/cayenne/query/SQLExec.java  |  4 +-
 .../org/apache/cayenne/query/SelectById.java    |  4 +-
 .../cayenne/query/SelectQueryMetadata.java      |  4 +-
 .../query/SelectQueryPrefetchRouterAction.java  |  6 +--
 .../cayenne/reflect/ClassDescriptorMap.java     |  2 +-
 .../apache/cayenne/reflect/FieldAccessor.java   | 10 +---
 .../reflect/PersistentDescriptorFactory.java    |  2 +-
 .../remote/RemoteIncrementalFaultList.java      |  9 ++--
 .../cayenne/remote/service/DispatchHelper.java  | 12 ++---
 .../apache/cayenne/tx/TransactionFilter.java    |  2 +-
 .../apache/cayenne/util/DeepMergeOperation.java |  3 +-
 .../apache/cayenne/util/IndexPropertyList.java  |  6 +--
 .../org/apache/cayenne/util/MemoryClob.java     | 16 +++---
 .../cayenne/util/ObjectDetachOperation.java     |  5 +-
 .../cayenne/util/PersistentObjectHolder.java    |  6 +--
 .../cayenne/util/PersistentObjectList.java      |  6 +--
 .../cayenne/util/PersistentObjectMap.java       | 26 ++++-----
 .../cayenne/util/PersistentObjectSet.java       | 14 ++---
 .../velocity/VelocitySQLTemplateProcessor.java  |  7 ++-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 .../org/apache/cayenne/event/XMPPBridge.java    | 44 ++++-----------
 .../dialog/ResolveDbRelationshipDialog.java     |  7 ++-
 .../cayenne/pref/CayenneProjectPreferences.java | 18 +++----
 .../cayenne/pref/ChildrenMapPreference.java     | 51 ++++++------------
 .../apache/cayenne/swing/BeanActionBinding.java |  3 +-
 119 files changed, 362 insertions(+), 574 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index 2c3fbda..c07a3cb 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -291,7 +291,7 @@ public class ClassGenerationAction {
 		}
 
 		if (!destDir.canWrite()) {
-			throw new CayenneRuntimeException("Do not have write permissions for " + destDir);
+			throw new CayenneRuntimeException("Do not have write permissions for %s", destDir);
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
index ecf2a3f..cd814db 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
@@ -257,8 +257,7 @@ public class EntityUtils {
         // its type.
         ObjAttribute attribute = targetEntity.getAttribute(relationship.getMapKey());
         if (attribute == null) {
-            throw new CayenneRuntimeException("Invalid map key '" + relationship.getMapKey()
-                    + "', no matching attribute found");
+            throw new CayenneRuntimeException("Invalid map key '%s', no matching attribute found", relationship.getMapKey());
         }
 
         return attribute.getType();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
index ef17e3a..8353bc4 100644
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
+++ b/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
@@ -173,8 +173,7 @@ public class ClientChannel implements DataChannel {
 
         // sanity check
         if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: "
-                    + object);
+            throw new CayenneRuntimeException("Server returned an object without an id: %s", object);
         }
 
         return merger.merge(object);
@@ -300,10 +299,9 @@ public class ClientChannel implements DataChannel {
 
         if (result != null && !resultClass.isInstance(result)) {
             String resultString = new ToStringBuilder(result).toString();
-            throw new CayenneRuntimeException("Expected result type: "
-                    + resultClass.getName()
-                    + ", actual: "
-                    + resultString);
+            throw new CayenneRuntimeException("Expected result type: %s, actual: %s"
+                    , resultClass.getName()
+                    , resultString);
         }
 
         return resultClass.cast(result);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheEntryLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheEntryLoader.java b/cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheEntryLoader.java
index 1dbf3c1..4d247ae 100644
--- a/cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheEntryLoader.java
+++ b/cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheEntryLoader.java
@@ -44,7 +44,7 @@ public class JCacheEntryLoader implements EntryProcessor<String, List, List> {
             List result = (List)entryFactory.createObject();
             // sanity checking value
             if (result == null) {
-                throw new CayenneRuntimeException("Null object created: " + entry.getKey());
+                throw new CayenneRuntimeException("Null object created: %s", entry.getKey());
             }
             entry.setValue(result);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java
index 0ff58e1..ac9cc7a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/BaseContext.java
@@ -253,19 +253,19 @@ public abstract class BaseContext implements ObjectContext {
 
 		// first look for the ID in the local GraphManager
 		synchronized (getGraphManager()) {
+			@SuppressWarnings("unchecked")
 			T localObject = (T) getGraphManager().getNode(id);
 			if (localObject != null) {
 				return localObject;
 			}
 
-			// create a hollow object, optimistically assuming that the ID we
-			// got from
-			// 'objectFromAnotherContext' is a valid ID either in the parent
-			// context or in
-			// the DB. This essentially defers possible FaultFailureExceptions.
+			// create a hollow object, optimistically assuming that the ID we got from
+			// 'objectFromAnotherContext' is a valid ID either in the parent context or in the DB.
+			// This essentially defers possible FaultFailureExceptions.
 
 			ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(id.getEntityName());
-			Persistent persistent = (Persistent) descriptor.createObject();
+			@SuppressWarnings("unchecked")
+			T persistent = (T) descriptor.createObject();
 
 			persistent.setObjectContext(this);
 			persistent.setObjectId(id);
@@ -273,7 +273,7 @@ public abstract class BaseContext implements ObjectContext {
 
 			getGraphManager().registerNode(id, persistent);
 
-			return (T) persistent;
+			return persistent;
 		}
 	}
 
@@ -317,7 +317,7 @@ public abstract class BaseContext implements ObjectContext {
 		if (objects.size() == 0) {
 			return null;
 		} else if (objects.size() > 1) {
-			throw new CayenneRuntimeException("Expected zero or one object, instead query matched: " + objects.size());
+			throw new CayenneRuntimeException("Expected zero or one object, instead query matched: %d", objects.size());
 		}
 
 		return objects.get(0);
@@ -501,7 +501,7 @@ public abstract class BaseContext implements ObjectContext {
 		case DataChannel.FLUSH_CASCADE_SYNC:
 			return onContextFlush(originatingContext, changes, true);
 		default:
-			throw new CayenneRuntimeException("Unrecognized SyncMessage type: " + syncType);
+			throw new CayenneRuntimeException("Unrecognized SyncMessage type: %d", syncType);
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/Cayenne.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/Cayenne.java b/cayenne-server/src/main/java/org/apache/cayenne/Cayenne.java
index 0b34b49..8098bf5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/Cayenne.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/Cayenne.java
@@ -270,7 +270,7 @@ public class Cayenne {
         Object value = pkForObject(dataObject);
 
         if (!(value instanceof Number)) {
-            throw new CayenneRuntimeException("PK is not a number: " + dataObject.getObjectId());
+            throw new CayenneRuntimeException("PK is not a number: %s", dataObject.getObjectId());
         }
 
         return ((Number) value).longValue();
@@ -285,7 +285,7 @@ public class Cayenne {
         Object value = pkForObject(dataObject);
 
         if (!(value instanceof Number)) {
-            throw new CayenneRuntimeException("PK is not a number: " + dataObject.getObjectId());
+            throw new CayenneRuntimeException("PK is not a number: %s", dataObject.getObjectId());
         }
 
         return ((Number) value).intValue();
@@ -300,7 +300,7 @@ public class Cayenne {
         Map<String, Object> pk = extractObjectId(dataObject);
 
         if (pk.size() != 1) {
-            throw new CayenneRuntimeException("Expected single column PK, got " + pk.size() + " columns, ID: " + pk);
+            throw new CayenneRuntimeException("Expected single column PK, got %d columns, ID: %s", pk.size(), pk);
         }
 
         return pk.entrySet().iterator().next().getValue();
@@ -389,7 +389,7 @@ public class Cayenne {
 
         ObjEntity entity = context.getEntityResolver().getObjEntity(dataObjectClass);
         if (entity == null) {
-            throw new CayenneRuntimeException("Non-existent ObjEntity for class: " + dataObjectClass);
+            throw new CayenneRuntimeException("Non-existent ObjEntity for class: %s", dataObjectClass);
         }
 
         return (T) objectForPK(context, new ObjectId(entity.getName(), pk));
@@ -407,7 +407,7 @@ public class Cayenne {
      * @see #objectForPK(ObjectContext, ObjectId)
      */
     public static Object objectForPK(ObjectContext context, String objEntityName, int pk) {
-        return objectForPK(context, buildId(context, objEntityName, Integer.valueOf(pk)));
+        return objectForPK(context, buildId(context, objEntityName, pk));
     }
 
     /**
@@ -469,7 +469,7 @@ public class Cayenne {
         if (objects.size() == 0) {
             return null;
         } else if (objects.size() > 1) {
-            throw new CayenneRuntimeException("Expected zero or one object, instead query matched: " + objects.size());
+            throw new CayenneRuntimeException("Expected zero or one object, instead query matched: %d", objects.size());
         }
 
         return objects.get(0);
@@ -486,12 +486,12 @@ public class Cayenne {
 
         ObjEntity entity = context.getEntityResolver().getObjEntity(objEntityName);
         if (entity == null) {
-            throw new CayenneRuntimeException("Non-existent ObjEntity: " + objEntityName);
+            throw new CayenneRuntimeException("Non-existent ObjEntity: %s", objEntityName);
         }
 
         Collection<String> pkAttributes = entity.getPrimaryKeyNames();
         if (pkAttributes.size() != 1) {
-            throw new CayenneRuntimeException("PK contains " + pkAttributes.size() + " columns, expected 1.");
+            throw new CayenneRuntimeException("PK contains %d columns, expected 1.", pkAttributes.size());
         }
 
         String attr = pkAttributes.iterator().next();
@@ -509,12 +509,12 @@ public class Cayenne {
 
         ObjEntity entity = context.getEntityResolver().getObjEntity(dataObjectClass);
         if (entity == null) {
-            throw new CayenneRuntimeException("Unmapped DataObject Class: " + dataObjectClass.getName());
+            throw new CayenneRuntimeException("Unmapped DataObject Class: %s", dataObjectClass.getName());
         }
 
         Collection<String> pkAttributes = entity.getPrimaryKeyNames();
         if (pkAttributes.size() != 1) {
-            throw new CayenneRuntimeException("PK contains " + pkAttributes.size() + " columns, expected 1.");
+            throw new CayenneRuntimeException("PK contains %d columns, expected 1.", pkAttributes.size());
         }
 
         String attr = pkAttributes.iterator().next();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/CayenneContext.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneContext.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneContext.java
index 856d77b..c352ae0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneContext.java
@@ -245,7 +245,7 @@ public class CayenneContext extends BaseContext {
 
         ObjEntity entity = getEntityResolver().getObjEntity(persistentClass);
         if (entity == null) {
-            throw new CayenneRuntimeException("No entity mapped for class: " + persistentClass);
+            throw new CayenneRuntimeException("No entity mapped for class: %s", persistentClass);
         }
 
         ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(entity.getName());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
index 0aca689..6a0c23e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
@@ -396,8 +396,8 @@ public class CayenneDataObject extends PersistentObject implements DataObject, V
 		} else if (this.getObjectContext() != null && object.getObjectContext() == null) {
 			this.getObjectContext().registerNewObject(object);
 		} else {
-			throw new CayenneRuntimeException("Cannot set object as destination of relationship " + relationshipName
-					+ " because it is in a different ObjectContext");
+			throw new CayenneRuntimeException("Cannot set object as destination of relationship %s"
+					+ " because it is in a different ObjectContext",  relationshipName);
 		}
 	}
 
@@ -581,7 +581,7 @@ public class CayenneDataObject extends PersistentObject implements DataObject, V
 
 		ObjEntity objEntity = getObjectContext().getEntityResolver().getObjEntity(this);
 		if (objEntity == null) {
-			throw new CayenneRuntimeException("No ObjEntity mapping found for DataObject " + getClass().getName());
+			throw new CayenneRuntimeException("No ObjEntity mapping found for DataObject %s", getClass().getName());
 		}
 
 		// validate mandatory attributes
@@ -607,8 +607,8 @@ public class CayenneDataObject extends PersistentObject implements DataObject, V
 			DbAttribute dbAttribute = next.getDbAttribute();
 
 			if (dbAttribute == null) {
-				throw new CayenneRuntimeException("ObjAttribute '" + next.getName()
-						+ "' does not have a corresponding DbAttribute");
+				throw new CayenneRuntimeException("ObjAttribute '%s"
+						+ "' does not have a corresponding DbAttribute", next.getName());
 			}
 
 			// pk may still be generated

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java b/cayenne-server/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
index 907a7b7..e38868c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ObjectContextDeleteAction.java
@@ -22,7 +22,6 @@ package org.apache.cayenne;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.cayenne.map.DeleteRule;
@@ -63,15 +62,13 @@ class ObjectContextDeleteAction {
 
         if (object.getObjectContext() == null) {
             throw new CayenneRuntimeException(
-                    "Attempt to delete unregistered non-TRANSIENT object: " + object);
+                    "Attempt to delete unregistered non-TRANSIENT object: %s", object);
         }
 
         if (object.getObjectContext() != context) {
             throw new CayenneRuntimeException(
-                    "Attempt to delete object regsitered in a different ObjectContext. Object: "
-                            + object
-                            + ", context: "
-                            + context);
+                    "Attempt to delete object regsitered in a different ObjectContext. Object: %s, context: %s"
+                            , object, context);
         }
 
         // must resolve HOLLOW objects before delete... needed
@@ -108,21 +105,20 @@ class ObjectContextDeleteAction {
         context.getGraphManager().nodeRemoved(object.getObjectId());
     }
 
-    private Collection toCollection(Object object) {
+    @SuppressWarnings("unchecked")
+    private Collection<Persistent> toCollection(Object object) {
 
         if (object == null) {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
 
         // create copies of collections to avoid iterator exceptions
         if (object instanceof Collection) {
-            return new ArrayList((Collection) object);
-        }
-        else if (object instanceof Map) {
-            return new ArrayList(((Map) object).values());
-        }
-        else {
-            return Collections.singleton(object);
+            return new ArrayList<>((Collection<Persistent>) object);
+        } else if (object instanceof Map) {
+            return new ArrayList<>(((Map<?, Persistent>) object).values());
+        } else {
+            return Collections.singleton((Persistent)object);
         }
     }
 
@@ -143,9 +139,8 @@ class ObjectContextDeleteAction {
                 continue;
             }
 
-            ArcProperty property = (ArcProperty) descriptor.getProperty(relationship
-                    .getName());
-            Collection relatedObjects = toCollection(property.readProperty(object));
+            ArcProperty property = (ArcProperty) descriptor.getProperty(relationship.getName());
+            final Collection<Persistent> relatedObjects = toCollection(property.readProperty(object));
 
             // no related object, bail out
             if (relatedObjects.size() == 0) {
@@ -166,11 +161,9 @@ class ObjectContextDeleteAction {
             // joins must be removed even if they are non-existent or ignored in the
             // object graph
             if (processFlattened) {
-                Iterator iterator = relatedObjects.iterator();
-                while (iterator.hasNext()) {
-                    Persistent relatedObject = (Persistent) iterator.next();
-                    context.getGraphManager().arcDeleted(object.getObjectId(), relatedObject
-                            .getObjectId(), relationship.getName());
+                for (Persistent relatedObject : relatedObjects) {
+                    context.getGraphManager().arcDeleted(object.getObjectId()
+                            , relatedObject.getObjectId(), relationship.getName());
                 }
             }
 
@@ -186,8 +179,6 @@ class ObjectContextDeleteAction {
                         break;
                     }
 
-                    final Collection finalRelatedObjects = relatedObjects;
-
                     reverseArc.visit(new PropertyVisitor() {
 
                         public boolean visitAttribute(AttributeProperty property) {
@@ -195,21 +186,16 @@ class ObjectContextDeleteAction {
                         }
 
                         public boolean visitToMany(ToManyProperty property) {
-                            Iterator iterator = finalRelatedObjects.iterator();
-                            while (iterator.hasNext()) {
-                                Object relatedObject = iterator.next();
+                            for (Persistent relatedObject : relatedObjects) {
                                 property.removeTarget(relatedObject, object, true);
                             }
-
                             return false;
                         }
 
                         public boolean visitToOne(ToOneProperty property) {
                             // Inverse is to-one - find all related objects and
                             // nullify the reverse relationship
-                            Iterator iterator = finalRelatedObjects.iterator();
-                            while (iterator.hasNext()) {
-                                Object relatedObject = iterator.next();
+                            for (Persistent relatedObject : relatedObjects) {
                                 property.setTarget(relatedObject, null, true);
                             }
                             return false;
@@ -219,17 +205,14 @@ class ObjectContextDeleteAction {
                     break;
                 case DeleteRule.CASCADE:
                     // Delete all related objects
-                    Iterator iterator = relatedObjects.iterator();
-                    while (iterator.hasNext()) {
-                        Persistent relatedObject = (Persistent) iterator.next();
+                    for (Persistent relatedObject : relatedObjects) {
                         performDelete(relatedObject);
                     }
 
                     break;
                 default:
                     object.setPersistenceState(oldState);
-                    throw new CayenneRuntimeException("Invalid delete rule "
-                            + relationship.getDeleteRule());
+                    throw new CayenneRuntimeException("Invalid delete rule %s", relationship.getDeleteRule());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
index 0fbd203..af88e0f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
@@ -92,8 +92,7 @@ class ClientServerChannelQueryAction {
 
                     cachedList = channel.getQueryCache().get(serverMetadata);
                     if (cachedList == null) {
-                        throw new CayenneRuntimeException("No cached list for "
-                                + serverMetadata.getCacheKey());
+                        throw new CayenneRuntimeException("No cached list for %s", serverMetadata.getCacheKey());
                     }
                 } else {
                     return !DONE;
@@ -260,8 +259,7 @@ class ClientServerChannelQueryAction {
 
         // sanity check
         if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: "
-                    + object);
+            throw new CayenneRuntimeException("Server returned an object without an id: %s", object);
         }
 
         // have to resolve descriptor here for every object, as

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
index ca7a3d9..de66464 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
@@ -347,8 +347,8 @@ public class DataContext extends BaseContext {
                 if (targetObject instanceof Fault) {
                     DataRow storedSnapshot = getObjectStore().getSnapshot(object.getObjectId());
                     if (storedSnapshot == null) {
-                        throw new CayenneRuntimeException("No matching objects found for ObjectId "
-                                + object.getObjectId() + ". Object may have been deleted externally.");
+                        throw new CayenneRuntimeException("No matching objects found for ObjectId %s"
+                                + ". Object may have been deleted externally.", object.getObjectId());
                     }
 
                     DbRelationship dbRel = rel.getDbRelationships().get(0);
@@ -433,7 +433,7 @@ public class DataContext extends BaseContext {
         ObjEntity entity = this.getEntityResolver().getObjEntity(objectClass);
 
         if (entity == null) {
-            throw new CayenneRuntimeException("Unmapped Java class: " + objectClass);
+            throw new CayenneRuntimeException("Unmapped Java class: %s", objectClass);
         }
 
         ClassDescriptor descriptor = getEntityResolver().getClassDescriptor(entity.getName());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
index 13746f1..9caa59d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomain.java
@@ -486,8 +486,8 @@ public class DataDomain implements QueryEngine, DataChannel {
 					nodesByDataMapName.put(map.getName(), defaultNode);
 					node = defaultNode;
 				} else {
-					throw new CayenneRuntimeException("No DataNode configured for DataMap '" + map.getName()
-							+ "' and no default DataNode set");
+					throw new CayenneRuntimeException("No DataNode configured for DataMap '%s'"
+							+ " and no default DataNode set", map.getName());
 				}
 			}
 		}
@@ -603,7 +603,7 @@ public class DataDomain implements QueryEngine, DataChannel {
 			result =  onSyncFlush(originatingContext, changes);
 			break;
 		default:
-			throw new CayenneRuntimeException("Invalid synchronization type: " + syncType);
+			throw new CayenneRuntimeException("Invalid synchronization type: %d", syncType);
 		}
 
 		return result;
@@ -623,9 +623,8 @@ public class DataDomain implements QueryEngine, DataChannel {
 	GraphDiff onSyncFlush(ObjectContext originatingContext, GraphDiff childChanges) {
 
 		if (!(originatingContext instanceof DataContext)) {
-			throw new CayenneRuntimeException(
-					"No support for committing ObjectContexts that are not DataContexts yet. "
-							+ "Unsupported context: " + originatingContext);
+			throw new CayenneRuntimeException("No support for committing ObjectContexts that are not DataContexts yet. "
+							+ "Unsupported context: %s", originatingContext);
 		}
 
 		DataDomainFlushAction action = new DataDomainFlushAction(this);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
index 64dd41a..44923dc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainFlushObserver.java
@@ -76,8 +76,7 @@ class DataDomainFlushObserver implements OperationObserver {
         }
 
         if (!(query instanceof InsertBatchQuery)) {
-            throw new CayenneRuntimeException("Generated keys only supported for InsertBatchQuery, instead got "
-                    + query);
+            throw new CayenneRuntimeException("Generated keys only supported for InsertBatchQuery, instead got %s", query);
         }
 
         if (idToUpdate == null || !idToUpdate.isTemporary()) {
@@ -86,7 +85,7 @@ class DataDomainFlushObserver implements OperationObserver {
         }
 
         if (keys.size() != 1) {
-            throw new CayenneRuntimeException("One and only one PK row is expected, instead got " + keys.size());
+            throw new CayenneRuntimeException("One and only one PK row is expected, instead got %d",  keys.size());
         }
 
         DataRow key = keys.get(0);
@@ -107,7 +106,7 @@ class DataDomainFlushObserver implements OperationObserver {
         // infer the key name and currently will only support a single column...
         if (key.size() > 1) {
             throw new CayenneRuntimeException("Only a single column autogenerated PK is supported. "
-                    + "Generated key: " + key);
+                    + "Generated key: %s", key);
         }
 
         BatchQuery batch = (BatchQuery) query;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
index ab06059..c703ef9 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainIndirectDiffBuilder.java
@@ -87,9 +87,8 @@ final class DataDomainIndirectDiffBuilder implements GraphChangeHandler {
 
             if (relationship.isFlattened()) {
                 if (relationship.isReadOnly()) {
-                    throw new CayenneRuntimeException("Cannot set the read-only flattened relationship '"
-                            + relationship.getName() + "' in ObjEntity '" + relationship.getSourceEntity().getName()
-                            + "'.");
+                    throw new CayenneRuntimeException("Cannot set the read-only flattened relationship '%s' in ObjEntity '%s'."
+                            , relationship.getName(), relationship.getSourceEntity().getName());
                 }
 
                 // Register this combination (so we can remove it later if an
@@ -121,8 +120,8 @@ final class DataDomainIndirectDiffBuilder implements GraphChangeHandler {
 
             if (relationship.isFlattened()) {
                 if (relationship.isReadOnly()) {
-                    throw new CayenneRuntimeException("Cannot unset the read-only flattened relationship "
-                            + relationship.getName());
+                    throw new CayenneRuntimeException("Cannot unset the read-only flattened relationship %s"
+                            , relationship.getName());
                 }
 
                 // Register this combination (so we can remove it later if an

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
index dbe9a70..6f37109 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainInsertBucket.java
@@ -166,7 +166,7 @@ class DataDomainInsertBucket extends DataDomainSyncBucket {
                     idMap.put(dbAttrName, pkValue);
                     autoPkDone = true;
                 } catch (Exception ex) {
-                    throw new CayenneRuntimeException("Error generating PK: " + ex.getMessage(), ex);
+                    throw new CayenneRuntimeException("Error generating PK: %s", ex,  ex.getMessage());
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java
index 42fd089..7715c12 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java
@@ -120,7 +120,7 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver {
         QueryEngine node = domain.lookupDataNode(map);
 
         if (node == null) {
-            throw new CayenneRuntimeException("No DataNode exists for DataMap " + map);
+            throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map);
         }
 
         return node;
@@ -137,7 +137,7 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver {
         if (name != null) {
             node = domain.getDataNode(name);
             if (node == null) {
-                throw new CayenneRuntimeException("No DataNode exists for name " + name);
+                throw new CayenneRuntimeException("No DataNode exists for name %s", name);
             }
         } else {
             node = domain.getDefaultNode();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
index 7e00cca..a87de83 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
@@ -542,7 +542,7 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver {
         QueryEngine node = domain.lookupDataNode(map);
 
         if (node == null) {
-            throw new CayenneRuntimeException("No DataNode exists for DataMap " + map);
+            throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map);
         }
 
         return node;
@@ -559,7 +559,7 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver {
         if (name != null) {
             node = domain.getDataNode(name);
             if (node == null) {
-                throw new CayenneRuntimeException("No DataNode exists for name " + name);
+                throw new CayenneRuntimeException("No DataNode exists for name %s", name);
             }
         } else {
             node = domain.getDefaultNode();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/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 588a0d2..780e492 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
@@ -226,7 +226,7 @@ abstract class DataDomainSyncBucket {
                     }
                     else if (id.isTemporary()) {
                         throw new CayenneRuntimeException(
-                                "Temporary ID hasn't been replaced on commit: " + object);
+                                "Temporary ID hasn't been replaced on commit: %s", object);
                     }
                     else {
                         finalId = id;
@@ -307,11 +307,7 @@ abstract class DataDomainSyncBucket {
             Object value = masterID.getIdSnapshot().get(masterKey);
             if (value == null) {
                 throw new CayenneRuntimeException("Can't extract a master key. "
-                        + "Missing key ("
-                        + masterKey
-                        + "), master ID ("
-                        + masterID
-                        + ")");
+                        + "Missing key (%s), master ID (%s)", masterKey, masterID);
             }
 
             return value;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java
index 88b864b..e02ea39 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java
@@ -257,7 +257,7 @@ public class DataNode implements QueryEngine {
 		}
 
 		if (callback.isIteratedResult() && listSize > 1) {
-			throw new CayenneRuntimeException("Iterated queries are not allowed in a batch. Batch size: " + listSize);
+			throw new CayenneRuntimeException("Iterated queries are not allowed in a batch. Batch size: %d", listSize);
 		}
 
 		// do this meaningless inexpensive operation to trigger AutoAdapter lazy

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/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 8ec6705..2f10d01 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
@@ -93,8 +93,8 @@ class DataNodeSyncQualifierDescriptor {
 			// supported...
 			if (descriptor.getPathFromMaster().size() != 1) {
 				throw new CayenneRuntimeException(
-						"Only single step dependent relationships are currently supported. Actual path length: "
-								+ descriptor.getPathFromMaster().size());
+				        "Only single step dependent relationships are currently supported. Actual path length: %d"
+                        , descriptor.getPathFromMaster().size());
 			}
 
 			DbRelationship masterDependentDbRel = descriptor.getPathFromMaster().get(0);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultObjectMapRetainStrategy.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultObjectMapRetainStrategy.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultObjectMapRetainStrategy.java
index 85c8913..7fe338c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultObjectMapRetainStrategy.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DefaultObjectMapRetainStrategy.java
@@ -57,7 +57,7 @@ public class DefaultObjectMapRetainStrategy implements ObjectMapRetainStrategy {
         } else if (HARD_RETAIN_STRATEGY.equals(strategy)) {
             return new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.HARD);
         } else {
-            throw new CayenneRuntimeException("Unsupported retain strategy " + strategy);
+            throw new CayenneRuntimeException("Unsupported retain strategy %s", strategy);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java b/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
index 97e7ec8..ab5698d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
@@ -121,7 +121,7 @@ final class FlattenedArcKey {
 				snapshot.put(dbAttrName, pkValue);
 				autoPkDone = true;
 			} catch (Exception ex) {
-				throw new CayenneRuntimeException("Error generating PK: " + ex.getMessage(), ex);
+				throw new CayenneRuntimeException("Error generating PK: %s", ex,  ex.getMessage());
 			}
 		}
 
@@ -134,7 +134,7 @@ final class FlattenedArcKey {
 	 * theoretically possible, so the return value is a list.
 	 */
 	List buildJoinSnapshotsForDelete(DataNode node) {
-		Map snapshot = eagerJoinSnapshot();
+		Map<String, Object> snapshot = eagerJoinSnapshot();
 
 		DbEntity joinEntity = getJoinEntity();
 
@@ -299,12 +299,12 @@ final class FlattenedArcKey {
 		return false;
 	}
 
-	private Map eagerJoinSnapshot() {
+	private Map<String, Object> eagerJoinSnapshot() {
 
 		List<DbRelationship> relList = relationship.getDbRelationships();
 		if (relList.size() != 2) {
 			throw new CayenneRuntimeException(
-					"Only single-step flattened relationships are supported in this operation: " + relationship);
+					"Only single-step flattened relationships are supported in this operation: %s", relationship);
 		}
 
 		DbRelationship firstDbRel = relList.get(0);
@@ -332,7 +332,7 @@ final class FlattenedArcKey {
 		List<DbRelationship> relList = relationship.getDbRelationships();
 		if (relList.size() != 2) {
 			throw new CayenneRuntimeException(
-					"Only single-step flattened relationships are supported in this operation: " + relationship);
+					"Only single-step flattened relationships are supported in this operation: %s", relationship);
 		}
 
 		DbRelationship firstDbRel = relList.get(0);
@@ -346,15 +346,12 @@ final class FlattenedArcKey {
 		// here ordering of ids is determined by 'relationship', so use id1, id2
 		// instead of orderedIds
 
-		for (int i = 0, numJoins = fromSourceJoins.size(); i < numJoins; i++) {
-			DbJoin join = fromSourceJoins.get(i);
-
+		for (DbJoin join : fromSourceJoins) {
 			Object value = new PropagatedValueFactory(id1.getSourceId(), join.getSourceName());
 			snapshot.put(join.getTargetName(), value);
 		}
 
-		for (int i = 0, numJoins = toTargetJoins.size(); i < numJoins; i++) {
-			DbJoin join = toTargetJoins.get(i);
+		for (DbJoin join : toTargetJoins) {
 			Object value = new PropagatedValueFactory(id2.getSourceId(), join.getTargetName());
 			snapshot.put(join.getSourceName(), value);
 		}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index d75f232..a747e9d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -307,7 +307,7 @@ class HierarchicalObjectResolver {
 
         @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
-            throw new CayenneRuntimeException("Unknown prefetch node: " + node);
+            throw new CayenneRuntimeException("Unknown prefetch node: %s", node);
         }
 
         @Override
@@ -404,7 +404,7 @@ class HierarchicalObjectResolver {
 
         @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
-            throw new CayenneRuntimeException("Unknown prefetch node: " + node);
+            throw new CayenneRuntimeException("Unknown prefetch node: %s", node);
         }
 
         @Override
@@ -456,7 +456,7 @@ class HierarchicalObjectResolver {
 
         @Override
         public boolean startUnknownPrefetch(PrefetchTreeNode node) {
-            throw new CayenneRuntimeException("Unknown prefetch node: " + node);
+            throw new CayenneRuntimeException("Unknown prefetch node: %s", node);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolverNode.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolverNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolverNode.java
index 940567e..861533c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolverNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolverNode.java
@@ -59,7 +59,7 @@ class HierarchicalObjectResolverNode extends PrefetchObjectResolver {
 
             Persistent object = objectFromDataRow(row, anId, classDescriptor);
             if (object == null) {
-                throw new CayenneRuntimeException("Can't build Object from row: " + row);
+                throw new CayenneRuntimeException("Can't build Object from row: %s", row);
             }
 
             // keep the dupe objects (and data rows) around, as there maybe an

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java b/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
index bdfce69..0611514 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
@@ -327,7 +327,7 @@ public class IncrementalFaultList<E> implements List<E>, Serializable {
 
 			throw new CayenneRuntimeException(buffer.toString());
 		} else if (objects.size() > ids.size()) {
-			throw new CayenneRuntimeException("Expected " + ids.size() + " objects, retrieved " + objects.size());
+			throw new CayenneRuntimeException("Expected %d objects, retrieved %d", ids.size(), objects.size());
 		}
 	}
 
@@ -659,7 +659,7 @@ public class IncrementalFaultList<E> implements List<E>, Serializable {
 			}
 
 			if (!found) {
-				throw new CayenneRuntimeException("Can't find id for " + object);
+				throw new CayenneRuntimeException("Can't find id for %s", object);
 			}
 		}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/JoinedIdParentAttachementStrategy.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/JoinedIdParentAttachementStrategy.java b/cayenne-server/src/main/java/org/apache/cayenne/access/JoinedIdParentAttachementStrategy.java
index 7640b91..1162f8c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/JoinedIdParentAttachementStrategy.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/JoinedIdParentAttachementStrategy.java
@@ -68,16 +68,11 @@ class JoinedIdParentAttachementStrategy implements ParentAttachmentStrategy {
 
             ObjectId id = node.getResolver().createObjectId(row, entity, relatedIdPrefix);
             if (id == null) {
-                throw new CayenneRuntimeException("Can't build ObjectId from row: "
-                        + row
-                        + ", entity: "
-                        + entity.getName()
-                        + ", prefix: "
-                        + relatedIdPrefix);
+                throw new CayenneRuntimeException("Can't build ObjectId from row: %s, entity: %s, prefix: %s"
+                        , row, entity.getName(), relatedIdPrefix);
             }
 
             parentObject = (Persistent) graphManager.getNode(id);
-
             if (parentObject != null) {
                 break;
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
index 9d55272..56b52b5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectResolver.java
@@ -66,14 +66,13 @@ class ObjectResolver {
 
 		DbEntity dbEntity = descriptor.getEntity().getDbEntity();
 		if (dbEntity == null) {
-			throw new CayenneRuntimeException("ObjEntity '" + descriptor.getEntity().getName() + "' has no DbEntity.");
+			throw new CayenneRuntimeException("ObjEntity '%s' has no DbEntity.", descriptor.getEntity().getName());
 		}
 
 		this.primaryKey = dbEntity.getPrimaryKeys();
 		if (primaryKey.size() == 0) {
-			throw new CayenneRuntimeException("Won't be able to create ObjectId for '"
-					+ descriptor.getEntity().getName() + "'. Reason: DbEntity '" + dbEntity.getName()
-					+ "' has no Primary Key defined.");
+			throw new CayenneRuntimeException("Won't be able to create ObjectId for '%s'. Reason: DbEntity " +
+					"'%s' has no Primary Key defined.", descriptor.getEntity().getName(), dbEntity.getName());
 		}
 
 		this.context = context;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectStore.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectStore.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectStore.java
index 6901b77..bebada0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectStore.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ObjectStore.java
@@ -158,7 +158,7 @@ public class ObjectStore implements Serializable, SnapshotEventListener, GraphMa
 
             Persistent object = objectMap.get(nodeId);
             if (object == null) {
-                throw new CayenneRuntimeException("No object is registered in context with Id " + nodeId);
+                throw new CayenneRuntimeException("No object is registered in context with Id %s", nodeId);
             }
 
             if (object.getPersistenceState() == PersistenceState.COMMITTED) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
index be7e1ed..784453a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorJointNode.java
@@ -283,8 +283,7 @@ class PrefetchProcessorJointNode extends PrefetchProcessorNode {
 
             // sanity check
             if (idIndices[i] == -1) {
-                throw new CayenneRuntimeException("PK column is not part of result row: "
-                        + pk.getName());
+                throw new CayenneRuntimeException("PK column is not part of result row: %s", pk.getName());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilder.java
index 9aad5e6..dc2ea91 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/PrefetchProcessorTreeBuilder.java
@@ -158,8 +158,8 @@ final class PrefetchProcessorTreeBuilder implements PrefetchProcessor {
             arc = (ArcProperty) currentNode.getResolver().getDescriptor().getProperty(node.getName());
 
             if (arc == null) {
-                throw new CayenneRuntimeException("No relationship with name '" + node.getName() + "' found in entity "
-                        + currentNode.getResolver().getEntity().getName());
+                throw new CayenneRuntimeException("No relationship with name '%s' found in entity '%s'"
+                        , node.getName(), currentNode.getResolver().getEntity().getName());
             }
 
             descriptor = arc.getTargetDescriptor();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/ToOneFault.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ToOneFault.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ToOneFault.java
index 2f99fd1..1fefe42 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ToOneFault.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/ToOneFault.java
@@ -82,17 +82,12 @@ public class ToOneFault extends Fault {
 
         if (objects.isEmpty()) {
             return null;
-        }
-        else if (objects.size() == 1) {
+        } else if (objects.size() == 1) {
             return objects.get(0);
-        }
-        else {
+        } else {
             throw new CayenneRuntimeException("Error resolving to-one fault. "
-                    + "More than one object found. "
-                    + "Source Id: "
-                    + sourceObject.getObjectId()
-                    + ", relationship: "
-                    + relationshipName);
+                    + "More than one object found. Source Id: %s, relationship: %s"
+                    , sourceObject.getObjectId(), relationshipName);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
index b821d8e..be846e9 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ConnectionAwareResultIterator.java
@@ -61,10 +61,8 @@ public class ConnectionAwareResultIterator<T> implements ResultIterator<T> {
         try {
             delegate.close();
         } catch (Exception e1) {
-            if (errors == null) {
-                errors = new StringBuilder();
-            }
-            errors.append("Error closing ResultSet: " + e1);
+            errors = new StringBuilder();
+            errors.append("Error closing ResultSet: ").append(e1);
         }
 
         try {
@@ -74,11 +72,11 @@ public class ConnectionAwareResultIterator<T> implements ResultIterator<T> {
                 errors = new StringBuilder();
             }
 
-            errors.append("Error closing connection: " + e2);
+            errors.append("Error closing connection: ").append(e2);
         }
 
         if (errors != null) {
-            throw new CayenneRuntimeException("Error closing ResultIterator: " + errors.toString());
+            throw new CayenneRuntimeException("Error closing ResultIterator: %s", errors);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
index ffa1ad3..d6a4a34 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
@@ -144,7 +144,7 @@ public class JDBCResultIterator<T> implements ResultIterator<T> {
             }
 
             if (errors.length() > 0) {
-                throw new CayenneRuntimeException("Error closing ResultIterator: " + errors.toString());
+                throw new CayenneRuntimeException("Error closing ResultIterator: %s", errors);
             }
 
             closed = true;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
index 67ee201..0022587 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/ProcedureAction.java
@@ -152,8 +152,7 @@ public class ProcedureAction extends BaseSQLAction {
 
 			// if one result is described, all of them must be present...
 			if (setIndex >= descriptors.size() || descriptors.get(setIndex) == null) {
-				throw new CayenneRuntimeException("No descriptor for result set at index '" + setIndex
-						+ "' configured.");
+				throw new CayenneRuntimeException("No descriptor for result set at index '%d' configured.", setIndex);
 			}
 
 			ColumnDescriptor[] columns = descriptors.get(setIndex);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/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 86c1fb7..8cf71e8 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
@@ -60,8 +60,7 @@ public class RowDescriptorBuilder {
     /**
      * Returns a RowDescriptor built based on the builder internal state.
      */
-    public RowDescriptor getDescriptor(ExtendedTypeMap typeMap) throws SQLException,
-            IllegalStateException {
+    public RowDescriptor getDescriptor(ExtendedTypeMap typeMap) throws SQLException, IllegalStateException {
 
         ColumnDescriptor[] columnsForRD;
 
@@ -69,12 +68,10 @@ public class RowDescriptorBuilder {
             // do merge between explicitly-set columns and ResultSetMetadata
             // explicitly-set columns take precedence
             columnsForRD = mergeResultSetAndPresetColumns();
-        }
-        else if (this.columns != null) {
+        } else if (this.columns != null) {
             // use explicitly-set columns
             columnsForRD = this.columns;
-        }
-        else {
+        } else {
             throw new IllegalStateException(
                     "Can't build RowDescriptor, both 'columns' and 'resultSetMetadata' are null");
         }
@@ -102,10 +99,8 @@ public class RowDescriptorBuilder {
         int columnLen = (columns != null) ? columns.length : 0;
 
         if (rsLen < columnLen) {
-            throw new CayenneRuntimeException(
-                    "'ResultSetMetadata' has less elements then 'columns'.");
-        }
-        else if (rsLen == columnLen) {
+            throw new CayenneRuntimeException("'ResultSetMetadata' has less elements then 'columns'.");
+        } else if (rsLen == columnLen) {
             // 'columns' contains ColumnDescriptor for every column
             // in resultSetMetadata. This return is for optimization.
             return columns;
@@ -177,19 +172,16 @@ public class RowDescriptorBuilder {
         int len = columnArray.length;
 
         if (caseTransformer != null) {
-            for (int i = 0; i < len; i++) {
-
-                columnArray[i].setDataRowKey((String) caseTransformer
-                        .transform(columnArray[i].getDataRowKey()));
-                columnArray[i].setName((String) caseTransformer.transform(columnArray[i]
-                        .getName()));
+            for (ColumnDescriptor aColumnArray : columnArray) {
+                aColumnArray.setDataRowKey((String) caseTransformer.transform(aColumnArray.getDataRowKey()));
+                aColumnArray.setName((String) caseTransformer.transform(aColumnArray.getName()));
             }
         }
         if (typeOverrides != null) {
-            for (int i = 0; i < len; i++) {
-                String type = typeOverrides.get(columnArray[i].getName());
+            for (ColumnDescriptor aColumnArray : columnArray) {
+                String type = typeOverrides.get(aColumnArray.getName());
                 if (type != null) {
-                    columnArray[i].setJavaClass(type);
+                    aColumnArray.setJavaClass(type);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
index 7ad539d..2ee015d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/IdRowReader.java
@@ -51,7 +51,7 @@ class IdRowReader<T> extends BaseRowReader<T> {
 
         // sanity check
         if (len == 0) {
-            throw new CayenneRuntimeException("Root DBEntity has no PK defined: " + dbEntity);
+            throw new CayenneRuntimeException("Root DBEntity has no PK defined: %s", dbEntity);
         }
 
         int[] pk = new int[len];

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DefaultBatchTranslatorFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DefaultBatchTranslatorFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DefaultBatchTranslatorFactory.java
index b39837e..a441fe2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DefaultBatchTranslatorFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/batch/DefaultBatchTranslatorFactory.java
@@ -41,7 +41,7 @@ public class DefaultBatchTranslatorFactory implements BatchTranslatorFactory {
         } else if (query instanceof DeleteBatchQuery) {
             return deleteTranslator((DeleteBatchQuery) query, adapter, trimFunction);
         } else {
-            throw new CayenneRuntimeException("Unsupported batch query: " + query);
+            throw new CayenneRuntimeException("Unsupported batch query: %s", query);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLIdentifierColumnsTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLIdentifierColumnsTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLIdentifierColumnsTranslator.java
index 38dcd9b..59ea77e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLIdentifierColumnsTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLIdentifierColumnsTranslator.java
@@ -95,7 +95,7 @@ class EJBQLIdentifierColumnsTranslator extends EJBQLBaseVisitor {
                     Object pathPart = dbPathIterator.next();
 
                     if (pathPart == null) {
-                        throw new CayenneRuntimeException("ObjAttribute has no component: " + oa.getName());
+                        throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName());
                     } else if (pathPart instanceof DbRelationship) {
 
                         if (marker == null) {
@@ -174,21 +174,16 @@ class EJBQLIdentifierColumnsTranslator extends EJBQLBaseVisitor {
                     for (PathComponent<DbAttribute, DbRelationship> component : table.resolvePath(dbPrefetch, context
                             .getMetadata().getPathSplitAliases())) {
                         r = component.getRelationship();
-
                     }
 
                     if (r == null) {
-                        throw new CayenneRuntimeException("Invalid joint prefetch '" + prefetch + "' for entity: "
-                                + objectEntity.getName());
+                        throw new CayenneRuntimeException("Invalid joint prefetch '%s' for entity: %s"
+                                , prefetch, objectEntity.getName());
                     }
 
-                    Iterator<DbAttribute> targetAttributes = (Iterator<DbAttribute>) r.getTargetEntity()
-                            .getAttributes().iterator();
-                    while (targetAttributes.hasNext()) {
-                        DbAttribute attribute = targetAttributes.next();
+                    for (DbAttribute attribute : r.getTargetEntity().getAttributes()) {
                         appendColumn(prefetch.getEjbqlPathEntityId() + "." + prefetch.getPath(), attribute, "",
                                 prefetch.getPath() + "." + attribute.getName(), null);
-
                     }
                 }
             }
@@ -211,7 +206,7 @@ class EJBQLIdentifierColumnsTranslator extends EJBQLBaseVisitor {
     public void appendColumn(String identifier, DbAttribute column, String columnAlias, String dataRowKey,
             String javaType) {
 
-        DbEntity table = (DbEntity) column.getEntity();
+        DbEntity table = column.getEntity();
         String alias = context.getTableAlias(identifier, context.getQuotingStrategy().quotedFullyQualifiedName(table));
         String columnName = alias + "." + context.getQuotingStrategy().quotedName(column);
 
@@ -244,7 +239,7 @@ class EJBQLIdentifierColumnsTranslator extends EJBQLBaseVisitor {
     private Set<String> getColumns() {
 
         if (columns == null) {
-            columns = new HashSet<String>();
+            columns = new HashSet<>();
         }
 
         return columns;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectColumnsTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectColumnsTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectColumnsTranslator.java
index c0f5eaf..dbe2726 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectColumnsTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLSelectColumnsTranslator.java
@@ -182,7 +182,7 @@ public class EJBQLSelectColumnsTranslator extends EJBQLBaseVisitor {
                         // processed
                         // later when appending table
                         if (pathPart == null) {
-                            throw new CayenneRuntimeException("ObjAttribute has no component: " + attribute.getName());
+                            throw new CayenneRuntimeException("ObjAttribute has no component: %s", attribute.getName());
                         } else if (pathPart instanceof DbAttribute) {
                             DbAttribute dbAttribute = (DbAttribute) pathPart;
                             appendColumn(attribute.getType(),

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
index 61aec97..76af339 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
@@ -530,7 +530,7 @@ public class DefaultSelectTranslator extends QueryAssembler implements SelectTra
 					Object pathPart = dbPathIterator.next();
 
 					if (pathPart == null) {
-						throw new CayenneRuntimeException("ObjAttribute has no component: " + oa.getName());
+						throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName());
 					} else if (pathPart instanceof DbRelationship) {
 						DbRelationship rel = (DbRelationship) pathPart;
 						dbRelationshipAdded(rel, JoinType.LEFT_OUTER, null);
@@ -657,8 +657,8 @@ public class DefaultSelectTranslator extends QueryAssembler implements SelectTra
 				}
 
 				if (r == null) {
-					throw new CayenneRuntimeException("Invalid joint prefetch '" + prefetch + "' for entity: "
-							+ oe.getName());
+					throw new CayenneRuntimeException("Invalid joint prefetch '%s' for entity: %s"
+							, prefetch, oe.getName());
 				}
 
 				// add columns from the target entity, including those that are
@@ -679,7 +679,7 @@ public class DefaultSelectTranslator extends QueryAssembler implements SelectTra
 						Object pathPart = dbPathIterator.next();
 
 						if (pathPart == null) {
-							throw new CayenneRuntimeException("ObjAttribute has no component: " + oa.getName());
+							throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName());
 						} else if (pathPart instanceof DbRelationship) {
 							DbRelationship rel = (DbRelationship) pathPart;
 							dbRelationshipAdded(rel, JoinType.INNER, null);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/OrderingTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/OrderingTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/OrderingTranslator.java
index 4079b0a..59602f0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/OrderingTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/OrderingTranslator.java
@@ -83,7 +83,7 @@ public class OrderingTranslator extends QueryAssemblerHelper {
 				} else if (exp.getType() == Expression.FUNCTION_CALL) {
 					appendFunction(exp);
 				} else {
-					throw new CayenneRuntimeException("Unsupported ordering expression: " + exp);
+					throw new CayenneRuntimeException("Unsupported ordering expression: %s", exp);
 				}
 
 				// Close UPPER() modifier

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssemblerHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssemblerHelper.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssemblerHelper.java
index 2fc6078..fcdad65 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssemblerHelper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/QueryAssemblerHelper.java
@@ -178,7 +178,7 @@ public abstract class QueryAssemblerHelper {
 					Object pathPart = dbPathIterator.next();
 
 					if (pathPart == null) {
-						throw new CayenneRuntimeException("ObjAttribute has no component: " + attribute.getName());
+						throw new CayenneRuntimeException("ObjAttribute has no component: %s", attribute.getName());
 					} else if (pathPart instanceof DbRelationship) {
 						queryAssembler.dbRelationshipAdded((DbRelationship) pathPart, JoinType.INNER, joinSplitAlias);
 					} else if (pathPart instanceof DbAttribute) {
@@ -287,11 +287,8 @@ public abstract class QueryAssemblerHelper {
 
 			Map<String, Object> snap = id.getIdSnapshot();
 			if (snap.size() != 1) {
-				StringBuilder msg = new StringBuilder();
-				msg.append("Object must have a single primary key column ").append("to serve as a query parameter. ")
-						.append("This object has ").append(snap.size()).append(": ").append(snap);
-
-				throw new CayenneRuntimeException(msg.toString());
+				throw new CayenneRuntimeException("Object must have a single primary key column to serve " +
+						"as a query parameter. This object has %s: %s", snap.size(), snap);
 			}
 
 			// checks have been passed, use id value
@@ -306,11 +303,8 @@ public abstract class QueryAssemblerHelper {
 
 			Map<String, Object> snap = id.getIdSnapshot();
 			if (snap.size() != 1) {
-				StringBuilder msg = new StringBuilder();
-				msg.append("Object must have a single primary key column ").append("to serve as a query parameter. ")
-						.append("This object has ").append(snap.size()).append(": ").append(snap);
-
-				throw new CayenneRuntimeException(msg.toString());
+				throw new CayenneRuntimeException("Object must have a single primary key column to serve " +
+						"as a query parameter. This object has %s: %s", snap.size(), snap);
 			}
 
 			// checks have been passed, use id value
@@ -459,9 +453,8 @@ public abstract class QueryAssemblerHelper {
 		List<DbJoin> joins = rel.getJoins();
 		if (joins.size() != 1) {
 			String msg = "OBJ_PATH expressions are only supported for a single-join relationships. " +
-					"This relationship has " + joins.size() + " joins.";
-
-			throw new CayenneRuntimeException(msg);
+					"This relationship has %s joins.";
+			throw new CayenneRuntimeException(msg, joins.size());
 		}
 
 		DbJoin join = joins.get(0);
@@ -473,9 +466,8 @@ public abstract class QueryAssemblerHelper {
 			Collection<DbAttribute> pk = ent.getPrimaryKeys();
 			if (pk.size() != 1) {
 				String msg = "DB_NAME expressions can only support targets with a single column PK. " +
-						"This entity has " + pk.size() + " columns in primary key.";
-
-				throw new CayenneRuntimeException(msg);
+						"This entity has %d columns in primary key.";
+				throw new CayenneRuntimeException(msg, pk.size());
 			}
 
 			attribute = pk.iterator().next();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
index 0b60548..044605f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/CalendarType.java
@@ -77,11 +77,8 @@ public class CalendarType<T extends Calendar> implements ExtendedType<Calendar>
                 Object object = rs.getObject(index);
 
                 if (object != null && !(object instanceof Date)) {
-                    throw new CayenneRuntimeException(
-                            "Expected an instance of java.util.Date, instead got "
-                                    + object.getClass().getName()
-                                    + ", column index: "
-                                    + index);
+                    throw new CayenneRuntimeException("Expected an instance of java.util.Date, " +
+                            "instead got %s, column index: %d", object.getClass().getName(), index);
                 }
 
                 val = (Date) object;
@@ -118,11 +115,8 @@ public class CalendarType<T extends Calendar> implements ExtendedType<Calendar>
                 Object object = rs.getObject(index);
 
                 if (object != null && !(object instanceof Date)) {
-                    throw new CayenneRuntimeException(
-                            "Expected an instance of java.util.Date, instead got "
-                                    + object.getClass().getName()
-                                    + ", column index: "
-                                    + index);
+                    throw new CayenneRuntimeException("Expected an instance of java.util.Date, " +
+                            "instead got %s, column index: %d", object.getClass().getName(), index);
                 }
 
                 val = (Date) object;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
index 3ac8dc9..ed819fb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/ExtendedEnumType.java
@@ -128,8 +128,7 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType<T> {
         // Check for duplicates.
         if (enumerationMappings.containsKey(databaseValue)
                 || enumerationMappings.containsValue(enumeration))
-            throw new CayenneRuntimeException(
-                    "Enumerations/values may not be duplicated.");
+            throw new CayenneRuntimeException("Enumerations/values may not be duplicated.");
 
         // Store by database value/enum because we have to lookup by db value later.
         enumerationMappings.put(databaseValue, enumeration);
@@ -141,13 +140,10 @@ public class ExtendedEnumType<T extends Enum<T>> implements ExtendedType<T> {
     private T lookup(Object databaseValue) {
         if (!enumerationMappings.containsKey(databaseValue)) {
             // All integers enums are mapped. Not necessarily all strings.
-            if (databaseValue instanceof Integer)
-                throw new CayenneRuntimeException("Missing enumeration mapping for "
-                        + getClassName()
-                        + " with value "
-                        + databaseValue
-                        + ".");
-
+            if (databaseValue instanceof Integer) {
+                throw new CayenneRuntimeException("Missing enumeration mapping for %s with value %s."
+                        , getClassName(), databaseValue);
+            }
             // Use the database value (a String) as the enum value.
             return Enum.valueOf(enumerationClass, (String) databaseValue);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java b/cayenne-server/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
index 1c501f6..4b1a313 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/util/IteratedSelectObserver.java
@@ -66,7 +66,7 @@ public class IteratedSelectObserver extends DefaultOperationObserver {
                 // this should never happen
             }
 
-            throw new CayenneRuntimeException("Error getting ResultIterator: " + str.getBuffer());
+            throw new CayenneRuntimeException("Error getting ResultIterator: %s", str.getBuffer());
         }
 
         return resultIterator;