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 <[email protected]>
Authored: Fri Mar 24 14:56:41 2017 +0300
Committer: Nikita Timofeev <[email protected]>
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;

Reply via email to