You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/03/24 11:56:53 UTC

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
index 192e342..d299f28 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java
@@ -267,8 +267,8 @@ public class AshwoodEntitySorter implements EntitySorter {
 		while (sorter.hasNext()) {
 			Persistent o = sorter.next();
 			if (o == null)
-				throw new CayenneRuntimeException("Sorting objects for " + objEntity.getClassName()
-						+ " failed. Cycles found.");
+				throw new CayenneRuntimeException("Sorting objects for %s failed. Cycles found."
+						, objEntity.getClassName());
 			sorted.add(o);
 		}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/cache/EhCacheQueryCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/cache/EhCacheQueryCache.java b/cayenne-server/src/main/java/org/apache/cayenne/cache/EhCacheQueryCache.java
index 3de6456..454e5fe 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/cache/EhCacheQueryCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/cache/EhCacheQueryCache.java
@@ -125,7 +125,7 @@ public class EhCacheQueryCache implements QueryCache {
             // object to the cache ourselves
             List object = factory.createObject();
             if (object == null) {
-                throw new CayenneRuntimeException("Null object created: " + metadata.getCacheKey());
+                throw new CayenneRuntimeException("Null object created: %s", metadata.getCacheKey());
             }
 
             cache.put(new Element(key, object));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java b/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
index 6950051..3c60e1e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/cache/MapQueryCache.java
@@ -75,7 +75,7 @@ public class MapQueryCache implements QueryCache, Serializable {
         if (result == null) {
             List newObject = factory.createObject();
             if (newObject == null) {
-                throw new CayenneRuntimeException("Null on cache rebuilding: " + metadata.getCacheKey());
+                throw new CayenneRuntimeException("Null on cache rebuilding: %s", metadata.getCacheKey());
             }
 
             result = newObject;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/cache/OSQueryCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/cache/OSQueryCache.java b/cayenne-server/src/main/java/org/apache/cayenne/cache/OSQueryCache.java
index 0d36242..67777f3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/cache/OSQueryCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/cache/OSQueryCache.java
@@ -283,27 +283,14 @@ public class OSQueryCache implements QueryCache {
         catch (NeedsRefreshException e) {
             boolean updated = false;
             try {
-                Object result = factory.createObject();
-
-                if (!(result instanceof List)) {
-                    if (result == null) {
-                        throw new CayenneRuntimeException("Null on cache rebuilding: "
-                                + metadata.getCacheKey());
-                    }
-                    else {
-                        throw new CayenneRuntimeException(
-                                "Invalid query result, expected List, got "
-                                        + result.getClass().getName());
-                    }
+                List result = factory.createObject();
+                if (result == null) {
+                    throw new CayenneRuntimeException("Null on cache rebuilding: %s", metadata.getCacheKey());
                 }
-
-                List list = (List) result;
-
-                put(metadata, list);
+                put(metadata, result);
                 updated = true;
-                return list;
-            }
-            finally {
+                return result;
+            } finally {
                 if (!updated) {
                     // It is essential that cancelUpdate is called if the
                     // cached content could not be rebuilt

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java
index 2873a0e..f03ab29 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DataSourceBuilder.java
@@ -97,15 +97,15 @@ public class DataSourceBuilder {
 			// note: implicitly using current class's ClassLoader ....
 			driverClass = Class.forName(driverClassName);
 		} catch (Exception ex) {
-			throw new CayenneRuntimeException("Can not load JDBC driver named '" + driverClassName + "': "
-					+ ex.getMessage());
+			throw new CayenneRuntimeException("Can not load JDBC driver named '%s': %s"
+					, driverClassName, ex.getMessage());
 		}
 
 		try {
 			return (Driver) driverClass.newInstance();
 		} catch (Exception ex) {
-			throw new CayenneRuntimeException("Error instantiating driver '" + driverClassName + "': "
-					+ ex.getMessage());
+			throw new CayenneRuntimeException("Error instantiating driver '%s': %s"
+					, driverClassName, ex.getMessage());
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/datasource/DriverDataSource.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DriverDataSource.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DriverDataSource.java
index 316a4f8..f692a26 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/DriverDataSource.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/DriverDataSource.java
@@ -60,15 +60,13 @@ public class DriverDataSource implements DataSource {
 		try {
 			driverClass = Util.getJavaClass(driverClassName);
 		} catch (Exception ex) {
-			throw new CayenneRuntimeException("Can not load JDBC driver named '" + driverClassName + "': "
-					+ ex.getMessage());
+			throw new CayenneRuntimeException("Can not load JDBC driver named '%s': %s", driverClassName, ex.getMessage());
 		}
 
 		try {
 			return (Driver) driverClass.newInstance();
 		} catch (Exception ex) {
-			throw new CayenneRuntimeException("Error instantiating driver '" + driverClassName + "': "
-					+ ex.getMessage());
+			throw new CayenneRuntimeException("Error instantiating driver '%s': %s", driverClassName, ex.getMessage());
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSourceBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSourceBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSourceBuilder.java
index dc07d5d..b860230 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSourceBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSourceBuilder.java
@@ -71,13 +71,13 @@ public class PoolingDataSourceBuilder {
 
 		// sanity checks...
 		if (poolParameters.getMaxConnections() < 0) {
-			throw new CayenneRuntimeException("Maximum number of connections can not be negative ("
-					+ poolParameters.getMaxConnections() + ").");
+			throw new CayenneRuntimeException("Maximum number of connections can not be negative (%d)."
+					, poolParameters.getMaxConnections());
 		}
 
 		if (poolParameters.getMinConnections() < 0) {
-			throw new CayenneRuntimeException("Minimum number of connections can not be negative ("
-					+ poolParameters.getMinConnections() + ").");
+			throw new CayenneRuntimeException("Minimum number of connections can not be negative (%d)"
+					, poolParameters.getMinConnections());
 		}
 
 		if (poolParameters.getMinConnections() > poolParameters.getMaxConnections()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index 74f9035..01e244e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -319,8 +319,8 @@ public class JdbcAdapter implements DbAdapter {
 
 				// attribute may not be fully valid, do a simple check
 				if (column.getType() == TypesMapping.NOT_DEFINED) {
-					throw new CayenneRuntimeException("Undefined type for attribute '" + entity.getFullyQualifiedName()
-							+ "." + column.getName() + "'.");
+					throw new CayenneRuntimeException("Undefined type for attribute '%s.%s'."
+							, entity.getFullyQualifiedName(), column.getName());
 				}
 
 				createTableAppendColumn(sqlBuffer, column);
@@ -397,8 +397,8 @@ public class JdbcAdapter implements DbAdapter {
 		String[] types = adapter.externalTypesForJdbcType(column.getType());
 		if (types == null || types.length == 0) {
 			String entityName = column.getEntity() != null ? column.getEntity().getFullyQualifiedName() : "<null>";
-			throw new CayenneRuntimeException("Undefined type for attribute '" + entityName + "." + column.getName()
-					+ "': " + column.getType());
+			throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s."
+					, entityName, column.getName(), column.getType());
 		}
 		return types[0];
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
index c223273..0d9e1fc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java
@@ -323,7 +323,7 @@ public class JdbcPkGenerator implements PkGenerator {
 
 		public long getId() {
 			if (id == null) {
-				throw new CayenneRuntimeException("No key was retrieved for entity " + entityName);
+				throw new CayenneRuntimeException("No key was retrieved for entity %s", entityName);
 			}
 
 			return id.longValue();
@@ -332,11 +332,11 @@ public class JdbcPkGenerator implements PkGenerator {
 		public void nextRows(Query query, List<?> dataRows) {
 			// process selected object, issue an update query
 			if (dataRows == null || dataRows.size() == 0) {
-				throw new CayenneRuntimeException("Error generating PK : entity not supported: " + entityName);
+				throw new CayenneRuntimeException("Error generating PK : entity not supported: %s", entityName);
 			}
 
 			if (dataRows.size() > 1) {
-				throw new CayenneRuntimeException("Error generating PK : too many rows for entity: " + entityName);
+				throw new CayenneRuntimeException("Error generating PK : too many rows for entity: %s", entityName);
 			}
 
 			DataRow lastPk = (DataRow) dataRows.get(0);
@@ -345,8 +345,8 @@ public class JdbcPkGenerator implements PkGenerator {
 
 		public void nextCount(Query query, int resultCount) {
 			if (resultCount != 1) {
-				throw new CayenneRuntimeException("Error generating PK for entity '" + entityName
-						+ "': update count is wrong - " + resultCount);
+				throw new CayenneRuntimeException("Error generating PK for entity '%s': update count is wrong - %d"
+						, entityName, resultCount);
 			}
 		}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
index 6e9245a..d1415bf 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
@@ -99,8 +99,8 @@ public class DB2Adapter extends JdbcAdapter {
         String[] types = externalTypesForJdbcType(column.getType());
         if (types == null || types.length == 0) {
             String entityName = column.getEntity() != null ? column.getEntity().getFullyQualifiedName() : "<null>";
-            throw new CayenneRuntimeException("Undefined type for attribute '"
-                    + entityName + "." + column.getName() + "': " + column.getType());
+            throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+                    , entityName, column.getName(), column.getType());
         }
         String type = types[0];
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2QualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2QualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2QualifierTranslator.java
index 6a60233..99e019f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2QualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2QualifierTranslator.java
@@ -79,8 +79,8 @@ public class DB2QualifierTranslator extends TrimmingQualifierTranslator {
 			String[] types = queryAssembler.getAdapter().externalTypesForJdbcType(jdbcType);
 
 			if (types == null || types.length == 0) {
-				throw new CayenneRuntimeException("Can't find database type for JDBC type '"
-						+ TypesMapping.getSqlNameByType(jdbcType));
+				throw new CayenneRuntimeException("Can't find database type for JDBC type '%s'"
+						, TypesMapping.getSqlNameByType(jdbcType));
 			}
 
 			out.append(types[0]);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
index 916eb9e..bca04a1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
@@ -115,10 +115,9 @@ public class DerbyAdapter extends JdbcAdapter {
 
         String[] types = externalTypesForJdbcType(column.getType());
         if (types == null || types.length == 0) {
-            String entityName = column.getEntity() != null ? ((DbEntity) column
-                    .getEntity()).getFullyQualifiedName() : "<null>";
-            throw new CayenneRuntimeException("Undefined type for attribute '"
-                    + entityName + "." + column.getName() + "': " + column.getType());
+            String entityName = column.getEntity() != null ? (column.getEntity()).getFullyQualifiedName() : "<null>";
+            throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+                    , entityName, column.getName(), column.getType());
         }
 
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyQualifierTranslator.java
index 2767417..4b4cc51 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyQualifierTranslator.java
@@ -132,7 +132,8 @@ public class DerbyQualifierTranslator extends TrimmingQualifierTranslator {
 			case DAY_OF_WEEK:
 			case DAY_OF_YEAR:
 			case WEEK:
-				throw new CayenneRuntimeException("Function " + functionExpression.getPartCamelCaseName() + "() is unsupported in Derby.");
+				throw new CayenneRuntimeException("Function %s() is unsupported in Derby."
+						, functionExpression.getPartCamelCaseName());
 			default:
 				super.appendExtractFunction(functionExpression);
 		}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
index 6bc26be..ae754d5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdAdapter.java
@@ -83,8 +83,8 @@ public class FirebirdAdapter extends JdbcAdapter {
         String[] types = externalTypesForJdbcType(column.getType());
         if (types == null || types.length == 0) {
             String entityName = column.getEntity() != null ? column.getEntity().getFullyQualifiedName() : "<null>";
-            throw new CayenneRuntimeException("Undefined type for attribute '" + entityName + "." + column.getName()
-                    + "': " + column.getType());
+            throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+                    , entityName, column.getName(), column.getType());
         }
 
         sqlBuffer.append(quotingStrategy.quotedName(column));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
index d6131bb..564e0ed 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseAdapter.java
@@ -132,14 +132,14 @@ public class FrontBaseAdapter extends JdbcAdapter {
 
 			// attribute may not be fully valid, do a simple check
 			if (at.getType() == TypesMapping.NOT_DEFINED) {
-				throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-						+ at.getName() + "'.");
+				throw new CayenneRuntimeException("Undefined type for attribute '%s.%s'."
+						, ent.getFullyQualifiedName(), at.getName());
 			}
 
 			String[] types = externalTypesForJdbcType(at.getType());
 			if (types == null || types.length == 0) {
-				throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-						+ at.getName() + "': " + at.getType());
+				throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+						, ent.getFullyQualifiedName(), at.getName(), at.getType());
 			}
 
 			String type = types[0];

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
index 9fb1df9..3b8ac43 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java
@@ -123,7 +123,7 @@ public class FrontBasePkGenerator extends JdbcPkGenerator {
 			@Override
 			public void nextRows(Query query, List<?> dataRows) {
 				if (dataRows.size() != 1) {
-					throw new CayenneRuntimeException("Error fetching PK. Expected one row, got " + dataRows.size());
+					throw new CayenneRuntimeException("Error fetching PK. Expected one row, got %d", dataRows.size());
 				}
 
 				DataRow row = (DataRow) dataRows.get(0);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseQualifierTranslator.java
index 8315a4c..fa97c6d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBaseQualifierTranslator.java
@@ -122,7 +122,7 @@ public class FrontBaseQualifierTranslator extends QualifierTranslator {
             case DAY_OF_WEEK:
             case DAY_OF_YEAR:
             case WEEK:
-                throw new CayenneRuntimeException("Function " + functionExpression.getPartCamelCaseName() + "() is unsupported in FrontBase.");
+                throw new CayenneRuntimeException("Function %s() is unsupported in FrontBase.", functionExpression.getPartCamelCaseName());
             case DAY_OF_MONTH:
                 out.append("DAY");
                 break;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLQualifierTranslator.java
index 513a707..fce980c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLQualifierTranslator.java
@@ -44,8 +44,7 @@ public class HSQLQualifierTranslator extends TrimmingQualifierTranslator {
         char escapeChar = patternMatchNode.getEscapeChar();
 
         if ('?' == escapeChar) {
-            throw new CayenneRuntimeException(
-                    "the escape character of '?' is illegal for LIKE clauses.");
+            throw new CayenneRuntimeException("the escape character of '?' is illegal for LIKE clauses.");
         }
 
         if (0 != escapeChar) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
index 3808bed..3fc8f07 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresAdapter.java
@@ -124,8 +124,8 @@ public class IngresAdapter extends JdbcAdapter {
 
 		String[] types = externalTypesForJdbcType(at.getType());
 		if (types == null || types.length == 0) {
-			throw new CayenneRuntimeException("Undefined type for attribute '" + at.getEntity().getFullyQualifiedName()
-					+ "." + at.getName() + "': " + at.getType());
+			throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+					, at.getEntity().getFullyQualifiedName(), at.getName(), at.getType());
 		}
 
 		String type = types[0];

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
index bc4191d..1981c2a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
@@ -307,10 +307,10 @@ public class MySQLAdapter extends JdbcAdapter {
 
 		String[] types = externalTypesForJdbcType(column.getType());
 		if (types == null || types.length == 0) {
-			String entityName = column.getEntity() != null ? ((DbEntity) column.getEntity()).getFullyQualifiedName()
-					: "<null>";
-			throw new CayenneRuntimeException("Undefined type for attribute '" + entityName + "." + column.getName()
-					+ "': " + column.getType());
+			String entityName = column.getEntity() != null
+					? column.getEntity().getFullyQualifiedName() : "<null>";
+			throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+					, entityName, column.getName(), column.getType());
 		}
 
 		String type = types[0];

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLQualifierTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLQualifierTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLQualifierTranslator.java
index ac520e2..2b93c22 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLQualifierTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLQualifierTranslator.java
@@ -40,8 +40,7 @@ class MySQLQualifierTranslator extends QualifierTranslator {
         char escapeChar = patternMatchNode.getEscapeChar();
 
         if ('?' == escapeChar) {
-            throw new CayenneRuntimeException(
-                    "the escape character of '?' is illegal for LIKE clauses.");
+            throw new CayenneRuntimeException("the escape character of '?' is illegal for LIKE clauses.");
         }
 
         if (0 != escapeChar) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
index 2f244f1..04d54cc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBaseAdapter.java
@@ -168,14 +168,14 @@ public class OpenBaseAdapter extends JdbcAdapter {
 
             // attribute may not be fully valid, do a simple check
             if (at.getType() == TypesMapping.NOT_DEFINED) {
-                throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-                        + at.getName() + "'.");
+                throw new CayenneRuntimeException("Undefined type for attribute '%s.%s'"
+                        , ent.getFullyQualifiedName(), at.getName());
             }
 
             String[] types = externalTypesForJdbcType(at.getType());
             if (types == null || types.length == 0) {
-                throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-                        + at.getName() + "': " + at.getType());
+                throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+                        , ent.getFullyQualifiedName(), at.getName(), at.getType());
             }
 
             String type = types[0];
@@ -233,7 +233,7 @@ public class OpenBaseAdapter extends JdbcAdapter {
 
         int joinsLen = rel.getJoins().size();
         if (joinsLen == 0) {
-            throw new CayenneRuntimeException("Relationship has no joins: " + rel.getName());
+            throw new CayenneRuntimeException("Relationship has no joins: %s", rel.getName());
         } else if (joinsLen > 1) {
             // ignore extra joins
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java
index 305add2..7bf2a48 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java
@@ -99,7 +99,7 @@ public class OpenBasePkGenerator extends JdbcPkGenerator {
 				try (ResultSet rs = st.executeQuery(sql)) {
 					// Object pk = null;
 					if (!rs.next()) {
-						throw new CayenneRuntimeException("Error generating pk for DbEntity " + entity.getName());
+						throw new CayenneRuntimeException("Error generating pk for DbEntity %s", entity.getName());
 					}
 					return rs.getLong(1);
 				}
@@ -116,8 +116,8 @@ public class OpenBasePkGenerator extends JdbcPkGenerator {
 	 */
 	protected String newIDString(DbEntity ent) {
 		if (ent.getPrimaryKeys() == null || ent.getPrimaryKeys().size() != 1) {
-			throw new CayenneRuntimeException("Error generating pk for DbEntity " + ent.getName()
-					+ ": pk must be single attribute");
+			throw new CayenneRuntimeException("Error generating pk for DbEntity %s"
+					+ ": pk must be single attribute", ent.getName());
 		}
 		DbAttribute primaryKeyAttribute = ent.getPrimaryKeys().iterator().next();
 
@@ -193,7 +193,7 @@ public class OpenBasePkGenerator extends JdbcPkGenerator {
 		Collection<DbAttribute> pk = entity.getPrimaryKeys();
 
 		if (pk == null || pk.size() == 0) {
-			throw new CayenneRuntimeException("Entity '" + entity.getName() + "' has no PK defined.");
+			throw new CayenneRuntimeException("Entity '%s' has no PK defined.", entity.getName());
 		}
 
 		StringBuilder buffer = new StringBuilder();
@@ -230,7 +230,7 @@ public class OpenBasePkGenerator extends JdbcPkGenerator {
 
 		QuotingStrategy context = getAdapter().getQuotingStrategy();
 		if (pk == null || pk.size() == 0) {
-			throw new CayenneRuntimeException("Entity '" + entity.getName() + "' has no PK defined.");
+			throw new CayenneRuntimeException("Entity '%s' has no PK defined.", entity.getName());
 		}
 
 		StringBuilder buffer = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
index c9fcce5..5392c55 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java
@@ -188,10 +188,10 @@ class Oracle8LOBBatchAction implements SQLAction {
 							writeBlob(blob, (byte[]) blobVal);
 						} else {
 							String className = (blobVal != null) ? blobVal.getClass().getName() : null;
-							throw new CayenneRuntimeException("Unsupported class of BLOB value: " + className);
+							throw new CayenneRuntimeException("Unsupported class of BLOB value: %s", className);
 						}
 					} else {
-						throw new CayenneRuntimeException("Only BLOB or CLOB is expected here, got: " + type);
+						throw new CayenneRuntimeException("Only BLOB or CLOB is expected here, got: %s", type);
 					}
 				}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
index 4900ec0..02c61e2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java
@@ -104,8 +104,8 @@ abstract class Oracle8LOBBatchTranslator extends DefaultBatchTranslator {
             } else if (type == Types.BLOB) {
                 buf.append(newBlobFunction);
             } else {
-                throw new CayenneRuntimeException("Unknown LOB column type: " + type + "("
-                        + TypesMapping.getSqlNameByType(type) + "). Query buffer: " + buf);
+                throw new CayenneRuntimeException("Unknown LOB column type: %s(%s). Query buffer: %s."
+                         , type, TypesMapping.getSqlNameByType(type), buf);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
index b6593ef..1236c6a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java
@@ -170,7 +170,7 @@ public class OraclePkGenerator extends JdbcPkGenerator {
 
 				try (ResultSet rs = st.executeQuery(sql)) {
 					if (!rs.next()) {
-						throw new CayenneRuntimeException("Error generating pk for DbEntity " + entity.getName());
+						throw new CayenneRuntimeException("Error generating pk for DbEntity %s", entity.getName());
 					}
 					return rs.getLong(1);
 				}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
index 98c9944..b43eb7e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresAdapter.java
@@ -210,14 +210,14 @@ public class PostgresAdapter extends JdbcAdapter {
 	private void createAttribute(DbEntity ent, QuotingStrategy context, StringBuilder buf, DbAttribute at) {
 		// attribute may not be fully valid, do a simple check
 		if (at.getType() == TypesMapping.NOT_DEFINED) {
-			throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-					+ at.getName() + "'.");
+			throw new CayenneRuntimeException("Undefined type for attribute '%s.%s'"
+					, ent.getFullyQualifiedName(), at.getName());
 		}
 
 		String[] types = externalTypesForJdbcType(at.getType());
 		if (types == null || types.length == 0) {
-			throw new CayenneRuntimeException("Undefined type for attribute '" + ent.getFullyQualifiedName() + "."
-					+ at.getName() + "': " + at.getType());
+			throw new CayenneRuntimeException("Undefined type for attribute '%s.%s': %s"
+					, ent.getFullyQualifiedName(), at.getName(), at.getType());
 		}
 
 		// Checking that attribute is generated and we have alternative types in types.xml.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
index 9c24f1a..c815473 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java
@@ -171,12 +171,12 @@ public class SybasePkGenerator extends JdbcPkGenerator {
 						if (rs.next()) {
 							return rs.getLong(1);
 						} else {
-							throw new CayenneRuntimeException("Error generating pk for DbEntity " + entity.getName());
+							throw new CayenneRuntimeException("Error generating pk for DbEntity %s", entity.getName());
 						}
 					}
 				} else {
-					throw new CayenneRuntimeException("Error generating pk for DbEntity " + entity.getName()
-							+ ", no result set from stored procedure.");
+					throw new CayenneRuntimeException("Error generating pk for DbEntity %s"
+							+ ", no result set from stored procedure.", entity.getName());
 				}
 			}
 		} finally {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/exp/LikeExpressionHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/LikeExpressionHelper.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/LikeExpressionHelper.java
index ad07386..6727d85 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/LikeExpressionHelper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/LikeExpressionHelper.java
@@ -104,7 +104,7 @@ class LikeExpressionHelper {
 		if (escapeChar == 0) {
 			// if we start seeing this this error in the wild, I guess we'll
 			// need to extend escape char set beyond ASCII
-			throw new CayenneRuntimeException("Could not properly escape pattern: " + pattern);
+			throw new CayenneRuntimeException("Could not properly escape pattern: %s", pattern);
 		}
 		
 		exp.setEscapeChar(escapeChar);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTExtract.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTExtract.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTExtract.java
index 184d298..9c25eb7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTExtract.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTExtract.java
@@ -82,7 +82,7 @@ public class ASTExtract extends ASTFunctionCall {
     void setPartToken(String partToken) {
         part = NAME_TO_PART.get(partToken);
         if(part == null) {
-            throw new CayenneRuntimeException("Unknown timestamp part: " + partToken);
+            throw new CayenneRuntimeException("Unknown timestamp part: %s", partToken);
         }
         this.partName = partToken;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
index c23e8f8..2bfc307 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java
@@ -281,9 +281,9 @@ public class ChildDiffLoader implements GraphChangeHandler {
 		List<?> objects = response.firstList();
 
 		if (objects.size() == 0) {
-			throw new CayenneRuntimeException("No object for ID exists: " + nodeId);
+			throw new CayenneRuntimeException("No object for ID exists: %s", nodeId);
 		} 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 (Persistent) objects.get(0);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
index 27a9d65..8e1cf53 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/CommonsJdbcEventLogger.java
@@ -428,11 +428,8 @@ public class CommonsJdbcEventLogger implements JdbcEventLogger {
 		}
 
 		if (queryExecutionTimeLoggingThreshold > 0 && time > queryExecutionTimeLoggingThreshold) {
-			StringBuilder buf = new StringBuilder();
-			buf.append("Query time exceeded threshold (").append(time).append(" ms): ");
-			buf.append(sql);
-			String message = buf.toString();
-			logger.warn(message, new CayenneRuntimeException(message));
+			String message = "Query time exceeded threshold (" + time + " ms): ";
+			logger.warn(message + sql, new CayenneRuntimeException(message + "%s", sql));
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
index d9d0502..b3002df 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
@@ -373,15 +373,8 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 		encodeDBRelationshipsAsXML(getDbEntityMap(), encoder);
 		encodeOBJRelationshipsAsXML(getObjEntityMap(), encoder);
 
-		// since Queries are not XMLSerializable by default, check for
-		// non-serilaizable
-		// queries and throws if they are not..
 		for (QueryDescriptor query : getQueryDescriptors()) {
-			if (query instanceof XMLSerializable) {
-				((XMLSerializable) query).encodeAsXML(encoder);
-			} else {
-				throw new CayenneRuntimeException("Query is not XMLSerilaizable: " + query);
-			}
+			query.encodeAsXML(encoder);
 		}
 
 		encoder.indent(-1);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
index 3989b19..3c3af26 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbEntity.java
@@ -821,9 +821,8 @@ public class DbEntity extends Entity implements ConfigurationNode, DbEntityListe
             DbRelationship revNextDBR = relationship.getReverseRelationship();
 
             if (revNextDBR == null) {
-                throw new CayenneRuntimeException("Unable to find reverse DbRelationship for "
-                        + relationship.getSourceEntity().getName() + Entity.PATH_SEPARATOR + relationship.getName()
-                        + ".");
+                throw new CayenneRuntimeException("Unable to find reverse DbRelationship for %s.%s."
+                        , relationship.getSourceEntity().getName(), relationship.getName());
             }
 
             finalPath.addFirst(revNextDBR.getName());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
index d932364..0d58cd0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
@@ -418,7 +418,7 @@ public class DbRelationship extends Relationship implements ConfigurationNode {
         } else if (foundNulls == numJoins) {
             return null;
         } else {
-            throw new CayenneRuntimeException("Some parts of FK are missing in snapshot," + " relationship: " + this);
+            throw new CayenneRuntimeException("Some parts of FK are missing in snapshot, relationship: %s", this);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
index d26113e..1eeaa2e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
@@ -240,9 +240,7 @@ public class EmbeddedAttribute extends ObjAttribute {
     final MappingNamespace getNonNullNamespace() {
 
         if (entity == null) {
-            throw new CayenneRuntimeException("Embedded attribute '"
-                    + getName()
-                    + "' has no parent Entity.");
+            throw new CayenneRuntimeException("Embedded attribute '%s' has no parent Entity.", getName());
         }
 
         return entity.getNonNullNamespace();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java b/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
index ad4bc89..0d08d08 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/MappingCache.java
@@ -171,8 +171,8 @@ class MappingCache implements MappingNamespace {
         ObjEntity entity = objEntitiesByClassName.get(entityClass.getName());
 
         if (entity == OBJ_DUPLICATE_MARKER) {
-            throw new CayenneRuntimeException("Can't perform lookup. There is more than one ObjEntity mapped to "
-                    + entityClass.getName());
+            throw new CayenneRuntimeException("Can't perform lookup. There is more than one ObjEntity mapped to %s"
+                    , entityClass.getName());
         }
 
         return entity;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
index 6ea1f62..36ae437 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
@@ -665,7 +665,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
 
     private Collection<ObjAttribute> getMutablePrimaryKeys() {
         if (getDbEntity() == null) {
-            throw new CayenneRuntimeException("No DbEntity for ObjEntity: " + getName());
+            throw new CayenneRuntimeException("No DbEntity for ObjEntity: %s", getName());
         }
 
         Collection<DbAttribute> pkAttributes = getDbEntity().getPrimaryKeys();
@@ -1070,8 +1070,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         }
 
         if (getDbEntity() == null) {
-            throw new CayenneRuntimeException("Can't translate expression to DB_PATH, no DbEntity for '" + getName()
-                    + "'.");
+            throw new CayenneRuntimeException("Can't translate expression to DB_PATH, no DbEntity for '%s'.", getName());
         }
 
         // converts all OBJ_PATH expressions to DB_PATH expressions
@@ -1097,7 +1096,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         }
 
         if (getDbEntity() == null) {
-            throw new CayenneRuntimeException("Can't transform expression, no DbEntity for '" + getName() + "'.");
+            throw new CayenneRuntimeException("Can't transform expression, no DbEntity for '%s'.", getName());
         }
 
         // converts all OBJ_PATH expressions to DB_PATH expressions
@@ -1145,7 +1144,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
                 } else if (component.getRelationship() != null) {
                     dbSubpath = ((ObjRelationship) component.getRelationship()).getDbRelationships().iterator();
                 } else {
-                    throw new CayenneRuntimeException("Unknown path component: " + component);
+                    throw new CayenneRuntimeException("Unknown path component: %s", component);
                 }
 
                 while (dbSubpath.hasNext()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
index 5ce2c0d..6163684 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
@@ -272,9 +272,9 @@ public class ObjRelationship extends Relationship implements ConfigurationNode {
         if (numDbRelationships > 0) {
             DbRelationship lastRel = dbRelationships.get(numDbRelationships - 1);
             if (!lastRel.getTargetEntityName().equals(dbRel.getSourceEntity().getName())) {
-                throw new CayenneRuntimeException("Error adding db relationship " + dbRel + " to ObjRelationship "
-                        + this + " because the source of the newly added relationship "
-                        + "is not the target of the previous relationship " + "in the chain");
+                throw new CayenneRuntimeException("Error adding db relationship %s to ObjRelationship %s"
+                        + " because the source of the newly added relationship"
+                        + " is not the target of the previous relationship in the chain.", dbRel, this);
             }
         }
 
@@ -538,7 +538,7 @@ public class ObjRelationship extends Relationship implements ConfigurationNode {
 
             // another sanity check
             if (reverse == null) {
-                throw new CayenneRuntimeException("No reverse relationship exist for " + relationship);
+                throw new CayenneRuntimeException("No reverse relationship exist for %s", relationship);
             }
 
             if (buffer.length() > 0) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
index 64e6533..25695cd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
@@ -145,9 +145,7 @@ public abstract class Relationship implements CayenneMapEntry, XMLSerializable,
         Entity entity = getSourceEntity();
 
         if (entity == null) {
-            throw new CayenneRuntimeException("Relationship '"
-                    + getName()
-                    + "' has no parent Entity.");
+            throw new CayenneRuntimeException("Relationship '%s' has no parent Entity.", getName());
         }
 
         return entity.getNonNullNamespace();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/AbstractQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/AbstractQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/AbstractQuery.java
index 3b1dc21..1d91eeb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/AbstractQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/AbstractQuery.java
@@ -152,8 +152,7 @@ public abstract class AbstractQuery extends CacheableQuery {
         DataMap map = getMetaData(resolver).getDataMap();
 
         if (map == null) {
-            throw new CayenneRuntimeException("No DataMap found, can't route query "
-                    + this);
+            throw new CayenneRuntimeException("No DataMap found, can't route query %s", this);
         }
 
         router.route(router.engineForDataMap(map), this, substitutedQuery);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java b/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
index e49e379..6fb2ddc 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/BatchQueryRow.java
@@ -69,7 +69,7 @@ public abstract class BatchQueryRow {
                 // sanity check
                 if (value == null) {
                     String name = attribute.getEntity() != null ? attribute.getEntity().getName() : "<null>";
-                    throw new CayenneRuntimeException("Failed to generate PK: " + name + "." + attribute.getName());
+                    throw new CayenneRuntimeException("Failed to generate PK: %s.%s", name, attribute.getName());
                 }
 
                 ObjectId id = getObjectId();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/EJBQLQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
index 14c09c0..18732c7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
@@ -105,8 +105,7 @@ public class EJBQLQuery extends CacheableQuery implements XMLSerializable {
         DataMap map = getMetaData(resolver).getDataMap();
 
         if (map == null) {
-            throw new CayenneRuntimeException("No DataMap found, can't route query "
-                    + this);
+            throw new CayenneRuntimeException("No DataMap found, can't route query %s", this);
         }
 
         router.route(router.engineForDataMap(map), this, substitutedQuery);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
index 7f3303a..91204af 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
@@ -76,7 +76,7 @@ public abstract class FluentSelect<T, S extends FluentSelect<T, S>> extends Indi
 
             ObjEntity entity = resolver.getObjEntity(entityName);
             if (entity == null) {
-                throw new CayenneRuntimeException("Unrecognized ObjEntity name: " + entityName);
+                throw new CayenneRuntimeException("Unrecognized ObjEntity name: %s", entityName);
             }
 
             replacement.setRoot(entity);
@@ -84,7 +84,7 @@ public abstract class FluentSelect<T, S extends FluentSelect<T, S>> extends Indi
 
             DbEntity entity = resolver.getDbEntity(dbEntityName);
             if (entity == null) {
-                throw new CayenneRuntimeException("Unrecognized DbEntity name: " + dbEntityName);
+                throw new CayenneRuntimeException("Unrecognized DbEntity name: %s", dbEntityName);
             }
 
             replacement.setRoot(entity);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/IndirectQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/IndirectQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/IndirectQuery.java
index c916972..ec711ec 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/IndirectQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/IndirectQuery.java
@@ -111,8 +111,7 @@ public abstract class IndirectQuery implements Query {
 	 */
 	@Override
 	public SQLAction createSQLAction(SQLActionVisitor visitor) {
-		throw new CayenneRuntimeException(this.getClass().getName()
-				+ " is an indirect query and doesn't support its own sql actions. "
-				+ "It should've been delegated to another " + "query during resolution or routing phase.");
+		throw new CayenneRuntimeException("%s is an indirect query and doesn't support its own sql actions. "
+				+ "It should've been delegated to another query during resolution or routing phase.", getClass().getName());
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/MappedSelect.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/MappedSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/MappedSelect.java
index aaf58b6..befd073 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/MappedSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/MappedSelect.java
@@ -258,7 +258,7 @@ public class MappedSelect<T> extends AbstractMappedQuery implements Select<T> {
                 }
                 break;
             default:
-                throw new CayenneRuntimeException("Unknown query type: " + descriptor.getType());
+                throw new CayenneRuntimeException("Unknown query type: %s", descriptor.getType());
         }
 
         return query;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/NamedQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/NamedQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/NamedQuery.java
index 3ae8cca..b8544fa 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/NamedQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/NamedQuery.java
@@ -40,6 +40,7 @@ import java.util.Map;
  * @since 1.2
  * @deprecated since 4.0 you should use {@link MappedSelect} or {@link MappedExec} instead.
  */
+@SuppressWarnings("deprecation")
 @Deprecated
 public class NamedQuery extends IndirectQuery {
 
@@ -162,15 +163,10 @@ public class NamedQuery extends IndirectQuery {
      */
     protected Query resolveQuery(EntityResolver resolver) {
         QueryDescriptor queryDescriptor = resolver.getQueryDescriptor(getName());
-
         Query query = queryDescriptor.buildQuery();
 
-        Object root = queryDescriptor.getRoot();
-
         if (query == this) {
-            throw new CayenneRuntimeException("Named query resolves to self: '"
-                    + getName()
-                    + "'");
+            throw new CayenneRuntimeException("Named query resolves to self: '%s'", getName());
         }
 
         return query;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
index 42f594c..96968c5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
@@ -121,11 +121,10 @@ public class ObjectIdQuery extends IndirectQuery {
         }
 
         if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) {
-            throw new CayenneRuntimeException("Can't build a query for temporary id: "
-                    + objectId);
+            throw new CayenneRuntimeException("Can't build a query for temporary id: %s", objectId);
         }
 
-        SelectQuery<Object> query = new SelectQuery<Object>(objectId.getEntityName(), ExpressionFactory
+        SelectQuery<Object> query = new SelectQuery<>(objectId.getEntityName(), ExpressionFactory
                 .matchAllDbExp(objectId.getIdSnapshot(), Expression.EQUAL_TO));
 
         // if we got to the point of fetch, always force refresh....

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
index 0e00e1b..276e6d8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
@@ -110,10 +110,8 @@ public class RelationshipQuery extends IndirectQuery {
     protected Query createReplacementQuery(EntityResolver resolver) {
 
         if (objectId.isTemporary() && !objectId.isReplacementIdAttached()) {
-            throw new CayenneRuntimeException("Can't build a query for relationship '"
-                    + relationshipName
-                    + "' for temporary id: "
-                    + objectId);
+            throw new CayenneRuntimeException("Can't build a query for relationship '%s' for temporary id: %s"
+                    , relationshipName, objectId);
         }
 
         ObjRelationship relationship = getRelationship(resolver);
@@ -142,8 +140,7 @@ public class RelationshipQuery extends IndirectQuery {
         if (metadataResolver != resolver) {
 
             if (objectId == null) {
-                throw new CayenneRuntimeException(
-                        "Can't resolve query - objectID is null.");
+                throw new CayenneRuntimeException("Can't resolve query - objectID is null.");
             }
 
             ClassDescriptor descriptor = resolver.getClassDescriptor(objectId
@@ -151,12 +148,8 @@ public class RelationshipQuery extends IndirectQuery {
             this.arc = (ArcProperty) descriptor.getProperty(relationshipName);
 
             if (arc == null) {
-                throw new CayenneRuntimeException("No relationship named "
-                        + relationshipName
-                        + " found in entity "
-                        + objectId.getEntityName()
-                        + "; object id: "
-                        + objectId);
+                throw new CayenneRuntimeException("No relationship named %s found in entity %s; object id: %s"
+                        , relationshipName, objectId.getEntityName(), objectId);
             }
 
             this.metadata = new DefaultQueryMetadata() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/SQLExec.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLExec.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLExec.java
index 7ce8044..d6b782f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLExec.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLExec.java
@@ -181,7 +181,7 @@ public class SQLExec extends IndirectQuery {
         QueryResult results = execute(context);
 
         if (results.size() != 1) {
-            throw new CayenneRuntimeException("Expected a single update result. Got a total of " + results.size());
+            throw new CayenneRuntimeException("Expected a single update result. Got a total of %d", results.size());
         }
 
         return results.firstUpdateCount();
@@ -192,7 +192,7 @@ public class SQLExec extends IndirectQuery {
         QueryResult results = execute(context);
 
         if (results.size() != 1) {
-            throw new CayenneRuntimeException("Expected a single update result. Got a total of " + results.size());
+            throw new CayenneRuntimeException("Expected a single update result. Got a total of %d", results.size());
         }
 
         return results.firstBatchUpdateCount();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
index b6e8c58..e4ee041 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
@@ -125,7 +125,7 @@ public class SelectById<T> extends IndirectQuery implements Select<T> {
 
 	private static void checkObjectId(ObjectId id) {
 		if (id.isTemporary() && !id.isReplacementIdAttached()) {
-			throw new CayenneRuntimeException("Can't build a query for temporary id: " + id);
+			throw new CayenneRuntimeException("Can't build a query for temporary id: %s", id);
 		}
 	}
 
@@ -315,7 +315,7 @@ public class SelectById<T> extends IndirectQuery implements Select<T> {
 
 		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 pk = pkAttributes.iterator().next();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
index cb4d195..85de9a8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
@@ -340,8 +340,8 @@ class SelectQueryMetadata extends BaseQueryMetadata {
 				ASTDbPath dbPrefetch = (ASTDbPath) oe.translateToDbPath(prefetchExp);
 				DbRelationship r = findRelationByPath(table, dbPrefetch);
 				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());
 				}
 
 				// go via target OE to make sure that Java types are mapped correctly...

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
index 79df033..0610cb0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
@@ -77,10 +77,8 @@ class SelectQueryPrefetchRouterAction implements PrefetchProcessor {
         }
 
         if (relationship == null) {
-            throw new CayenneRuntimeException(
-                    "Invalid prefetch '%s' for entity '%s'",
-                    prefetchPath,
-                    classDescriptor.getEntity().getName());
+            throw new CayenneRuntimeException("Invalid prefetch '%s' for entity '%s'"
+                    , prefetchPath, classDescriptor.getEntity().getName());
         }
 
         // chain query and entity qualifiers

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptorMap.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptorMap.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptorMap.java
index c5d42e9..73992a6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptorMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/ClassDescriptorMap.java
@@ -133,6 +133,6 @@ public class ClassDescriptorMap {
             }
         }
 
-        throw new CayenneRuntimeException("Failed to create descriptor for entity: " + entityName);
+        throw new CayenneRuntimeException("Failed to create descriptor for entity: %s", entityName);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/reflect/FieldAccessor.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/FieldAccessor.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/FieldAccessor.java
index f49270e..83561b0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/FieldAccessor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/FieldAccessor.java
@@ -128,14 +128,8 @@ public class FieldAccessor implements Accessor {
                 // allow primitive to object conversions...
                 if (!PropertyUtils.normalizeType(field.getType()).isAssignableFrom(
                         PropertyUtils.normalizeType(propertyType))) {
-                    throw new CayenneRuntimeException("Expected property type '"
-                            + propertyType.getName()
-                            + "', got '"
-                            + field.getType().getName()
-                            + "'. Property: '"
-                            + beanClass.getName()
-                            + "'.'"
-                            + propertyName + "'");
+                    throw new CayenneRuntimeException("Expected property type '%s', got '%s'. Property: '%s.%s'."
+                            , propertyType.getName(), field.getType().getName(), beanClass.getName(), propertyName);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
index 9f0503d..c31d754 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/reflect/PersistentDescriptorFactory.java
@@ -49,7 +49,7 @@ public abstract class PersistentDescriptorFactory implements ClassDescriptorFact
     public ClassDescriptor getDescriptor(String entityName) {
         ObjEntity entity = descriptorMap.getResolver().getObjEntity(entityName);
         if (entity == null) {
-            throw new CayenneRuntimeException("Unmapped entity: " + entityName);
+            throw new CayenneRuntimeException("Unmapped entity: %s", entityName);
         }
 
         Class<?> entityClass = entity.getJavaClass();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java b/cayenne-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
index 52a3331..7ed1004 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
@@ -199,8 +199,7 @@ public class RemoteIncrementalFaultList implements List {
         }
 
         if (context == null) {
-            throw new CayenneRuntimeException(
-                    "No ObjectContext set, can't resolve objects.");
+            throw new CayenneRuntimeException("No ObjectContext set, can't resolve objects.");
         }
 
         // bounds checking
@@ -261,10 +260,8 @@ public class RemoteIncrementalFaultList implements List {
 
         // sanity check
         if (sublist.size() != fetchLimit) {
-            throw new CayenneRuntimeException("Resolved range size '"
-                    + sublist.size()
-                    + "' is not the same as expected: "
-                    + fetchLimit);
+            throw new CayenneRuntimeException("Resolved range size %d is not the same as expected: %d"
+                    , sublist.size(), fetchLimit);
         }
 
         for (int i = 0; i < fetchLimit; i++) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java b/cayenne-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java
index ef7367b..83b23e2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java
@@ -37,17 +37,13 @@ class DispatchHelper {
         // do most common messages first...
         if (message instanceof QueryMessage) {
             return channel.onQuery(null, ((QueryMessage) message).getQuery());
-        }
-        else if (message instanceof SyncMessage) {
+        } else if (message instanceof SyncMessage) {
             SyncMessage sync = (SyncMessage) message;
             return channel.onSync(null, sync.getSenderChanges(), sync.getType());
-        }
-        else if (message instanceof BootstrapMessage) {
+        } else if (message instanceof BootstrapMessage) {
             return channel.getEntityResolver().getClientEntityResolver();
-        }
-        else {
-            throw new CayenneRuntimeException(
-                    "Message dispatch error. Unsupported message: " + message);
+        } else {
+            throw new CayenneRuntimeException("Message dispatch error. Unsupported message: %s", message);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
index e87ca34..622f132 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/tx/TransactionFilter.java
@@ -76,7 +76,7 @@ public class TransactionFilter implements DataChannelFilter {
 
                 break;
             default:
-                throw new CayenneRuntimeException("Invalid synchronization type: " + syncType);
+                throw new CayenneRuntimeException("Invalid synchronization type: %d", syncType);
         }
 
         callbackAction.applyPostCommit();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java b/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java
index 32bcd78..e61f396 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/DeepMergeOperation.java
@@ -70,8 +70,7 @@ public class DeepMergeOperation {
 
         // sanity check
         if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: "
-                    + peerInParentContext);
+            throw new CayenneRuntimeException("Server returned an object without an id: %s", peerInParentContext);
         }
 
         Persistent seenTarget = seen.get(id);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/IndexPropertyList.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/IndexPropertyList.java b/cayenne-server/src/main/java/org/apache/cayenne/util/IndexPropertyList.java
index 34048b2..c4f0a37 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/IndexPropertyList.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/IndexPropertyList.java
@@ -237,10 +237,8 @@ public class IndexPropertyList extends AbstractList implements ValueHolder {
     protected int getIndexValue(Object object) {
         Number n = (Number) PropertyUtils.getProperty(object, indexProperty);
         if (n == null) {
-            throw new CayenneRuntimeException("Null index property '"
-                    + indexProperty
-                    + "' for object "
-                    + object);
+            throw new CayenneRuntimeException("Null index property '%s' for object %s"
+                    , indexProperty, object);
         }
 
         return n.intValue();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/MemoryClob.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/MemoryClob.java b/cayenne-server/src/main/java/org/apache/cayenne/util/MemoryClob.java
index f06b06b..b8cef86 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/MemoryClob.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/MemoryClob.java
@@ -92,11 +92,11 @@ public class MemoryClob implements Clob {
         pos--;
 
         if (pos < 0 || pos > dlen) {
-            throw new CayenneRuntimeException("Invalid position: " + (pos + 1L));
+            throw new CayenneRuntimeException("Invalid position: %d", (pos + 1L));
         }
 
         if (length < 0 || length > dlen - pos) {
-            throw new CayenneRuntimeException("Invalid length: " + length);
+            throw new CayenneRuntimeException("Invalid length: %s", length);
         }
 
         if (pos == 0 && length == dlen) {
@@ -261,16 +261,12 @@ public class MemoryClob implements Clob {
         final long chars = len >> 1;
 
         if (chars == dlen) {
-
             // nothing has changed, so there's nothing to be done
-        }
-        else if (len < 0 || chars > dlen) {
-            throw new CayenneRuntimeException("Invalid length: " + len);
-        }
-        else {
-
+        } else if (len < 0 || chars > dlen) {
+            throw new CayenneRuntimeException("Invalid length: %d", len);
+        } else {
             // use new String() to ensure we get rid of slack
-            data = new String(ldata.substring(0, (int) chars));
+            data = ldata.substring(0, (int) chars);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java b/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
index c415859..5b6d886 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
@@ -70,7 +70,7 @@ public class ObjectDetachOperation {
             ClassDescriptor descriptor,
             final PrefetchTreeNode prefetchTree) {
         if (!(object instanceof Persistent)) {
-            throw new CayenneRuntimeException("Expected Persistent, got: " + object);
+            throw new CayenneRuntimeException("Expected Persistent, got: %s", object);
         }
 
         final Persistent source = (Persistent) object;
@@ -78,8 +78,7 @@ public class ObjectDetachOperation {
 
         // sanity check
         if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: "
-                    + source);
+            throw new CayenneRuntimeException("Server returned an object without an id: %s", source);
         }
 
         Object seenTarget = seen.get(id);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
index bac3147..a5da8df 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectHolder.java
@@ -125,10 +125,8 @@ public class PersistentObjectHolder extends RelationshipFault implements ValueHo
         }
 
         if (relationshipOwner.getObjectContext() != persistent.getObjectContext()) {
-            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);
         }
 
         return persistent;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectList.java b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
index f5dd977..48760af 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectList.java
@@ -94,10 +94,8 @@ public class PersistentObjectList extends RelationshipFault implements List, Val
             Object old = this.objectList;
             setObjectList((List) value);
             return old;
-        }
-        else {
-            throw new CayenneRuntimeException("Value must be a list, got: "
-                    + value.getClass().getName());
+        } else {
+            throw new CayenneRuntimeException("Value must be a list, got: %s", value.getClass().getName());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
index 8949d76..b46a5e2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectMap.java
@@ -101,16 +101,13 @@ public class PersistentObjectMap extends RelationshipFault implements Map, Value
 
         if (value == null || value instanceof Map) {
             setObjectMap((Map) value);
-        }
-        // we can index collections on the fly - this is needed for prefetch handling...
-        // although it seems to be breaking the contract for 'setValueDirectly' ???
-        else if (value instanceof Collection) {
-            setObjectMap(indexCollection((Collection) value));
-        }
-        else {
-            throw new CayenneRuntimeException(
-                    "Value must be a Map, a Collection or null, got: "
-                            + value.getClass().getName());
+        } else if (value instanceof Collection) {
+            // we can index collections on the fly - this is needed for prefetch handling...
+            // although it seems to be breaking the contract for 'setValueDirectly' ???
+            setObjectMap(indexCollection((Collection<Object>) value));
+        } else {
+            throw new CayenneRuntimeException("Value must be a Map, a Collection or null, got: %s"
+                            , value.getClass().getName());
         }
 
         return old;
@@ -166,12 +163,9 @@ public class PersistentObjectMap extends RelationshipFault implements Map, Value
                 Object key = mapKeyAccessor.getValue(next);
                 Object previous = map.put(key, next);
                 if (previous != null && previous != next) {
-                    throw new CayenneRuntimeException("Duplicate key '"
-                            + key
-                            + "' in relationship map. Relationship: "
-                            + relationshipName
-                            + ", source object: "
-                            + relationshipOwner.getObjectId());
+                    throw new CayenneRuntimeException("Duplicate key '%s' in relationship map. "
+                            + "Relationship: %s, source object: %s"
+                            , key, relationshipName, relationshipOwner.getObjectId());
                 }
             }
         }