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:52 UTC

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

Repository: cayenne
Updated Branches:
  refs/heads/master 873314765 -> 2be06d62b


http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
index 0f15550..0275e5a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/PersistentObjectSet.java
@@ -82,16 +82,12 @@ public class PersistentObjectSet extends RelationshipFault
 
         if (value == null || value instanceof Set) {
             setObjectSet((Set) value);
-        }
-        // we can wrap non-set 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) {
+        } else if (value instanceof Collection) {
+            // we can wrap non-set collections on the fly - this is needed for prefetch handling...
+            // although it seems to be breaking the contract for 'setValueDirectly' ???
             setObjectSet(new HashSet((Collection) value));
-        }
-        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());
         }
 
         return old;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java b/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java
index 49fac9d..1fc4f14 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/velocity/VelocitySQLTemplateProcessor.java
@@ -192,16 +192,15 @@ public class VelocitySQLTemplateProcessor implements SQLTemplateProcessor {
 
 	private SimpleNode parse(String template) {
 
-		SimpleNode nodeTree = null;
-
+		SimpleNode nodeTree;
 		try {
 			nodeTree = velocityRuntime.parse(new StringReader(template), template);
 		} catch (ParseException pex) {
-			throw new CayenneRuntimeException("Error parsing template '" + template + "' : " + pex.getMessage());
+			throw new CayenneRuntimeException("Error parsing template '%s' : %s", template, pex.getMessage());
 		}
 
 		if (nodeTree == null) {
-			throw new CayenneRuntimeException("Error parsing template " + template);
+			throw new CayenneRuntimeException("Error parsing template %s", template);
 		}
 
 		return nodeTree;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 4be4483..2e54c9f 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -28,6 +28,7 @@ CAY-2272 ColumnSelect: methods to manually control DISTINCT clause
 
 Bug Fixes:
 
+CAY-2077 Bug in CayenneRuntimeException using wrong specified string in Formatter
 CAY-2094 SelectById query doesn't work from ROP client
 CAY-2240 Modeler: issue with cursor rendering for EJBQL query
 CAY-2243 ObjectContext.getGraphManager().unregisterObject() inconsistencies

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/eventbridges/cayenne-xmpp/src/main/java/org/apache/cayenne/event/XMPPBridge.java
----------------------------------------------------------------------
diff --git a/eventbridges/cayenne-xmpp/src/main/java/org/apache/cayenne/event/XMPPBridge.java b/eventbridges/cayenne-xmpp/src/main/java/org/apache/cayenne/event/XMPPBridge.java
index 5a2b339..d506d6c 100644
--- a/eventbridges/cayenne-xmpp/src/main/java/org/apache/cayenne/event/XMPPBridge.java
+++ b/eventbridges/cayenne-xmpp/src/main/java/org/apache/cayenne/event/XMPPBridge.java
@@ -117,12 +117,10 @@ public class XMPPBridge extends EventBridge {
 
         String portString = properties.get(XMPP_PORT_PROPERTY);
         if (portString != null) {
-
             try {
                 this.xmppPort = Integer.parseInt(portString);
-            }
-            catch (NumberFormatException e) {
-                throw new CayenneRuntimeException("Invalid port: " + portString);
+            } catch (NumberFormatException e) {
+                throw new CayenneRuntimeException("Invalid port: %s", portString);
             }
         }
     }
@@ -201,8 +199,7 @@ public class XMPPBridge extends EventBridge {
             if (secureConnection) {
                 int port = xmppPort > 0 ? xmppPort : DEFAULT_XMPP_SECURE_PORT;
                 this.connection = new SSLXMPPConnection(xmppHost, port);
-            }
-            else {
+            } else {
                 int port = xmppPort > 0 ? xmppPort : DEFAULT_XMPP_PORT;
                 this.connection = new XMPPConnection(xmppHost, port);
             }
@@ -212,33 +209,20 @@ public class XMPPBridge extends EventBridge {
                 // third argument ("sessionHandle" is such string); without it same
                 // loginId can not be reused from the same machine.
                 connection.login(loginId, password, sessionHandle);
-            }
-            else {
+            } else {
                 connection.loginAnonymously();
             }
+        } catch (XMPPException e) {
+            throw new CayenneRuntimeException("Error connecting to XMPP Server: %s", e.getLocalizedMessage());
         }
-        catch (XMPPException e) {
-            throw new CayenneRuntimeException("Error connecting to XMPP Server"
-                    + e.getLocalizedMessage());
-        }
-
-        String service = this.chatService != null
-                ? this.chatService
-                : DEFAULT_CHAT_SERVICE;
 
+        String service = chatService != null ? chatService : DEFAULT_CHAT_SERVICE;
         try {
-            this.groupChat = connection.createGroupChat(externalSubject
-                    + '@'
-                    + service
-                    + "."
-                    + connection.getHost());
-
+            groupChat = connection.createGroupChat(externalSubject + '@' + service + "." + connection.getHost());
             groupChat.join(sessionHandle);
             groupChat.addMessageListener(new XMPPListener());
-        }
-        catch (XMPPException e) {
-            throw new CayenneRuntimeException("Error setting up a group chat: "
-                    + e.getLocalizedMessage());
+        } catch (XMPPException e) {
+            throw new CayenneRuntimeException("Error setting up a group chat: %s", e.getLocalizedMessage());
         }
 
         this.connected = true;
@@ -280,19 +264,13 @@ public class XMPPBridge extends EventBridge {
 
                 // filter our own messages
                 if (sessionHandle.equals(message.getThread())) {
-                    // discarding
-                }
-                else {
-
                     String payload = message.getBody();
-
                     try {
                         Object event = deserializeFromString(payload);
                         if (event instanceof CayenneEvent) {
                             onExternalEvent((CayenneEvent) event);
                         }
-                    }
-                    catch (Exception ex) {
+                    } catch (Exception ex) {
                         // ignore for now... need to add logging.
                     }
                 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
index 6c09638..4e252dd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
@@ -151,16 +151,15 @@ public class ResolveDbRelationshipDialog extends CayenneDialog {
     private void initWithModel(DbRelationship aRelationship) {
         // sanity check
         if (aRelationship.getSourceEntity() == null) {
-            throw new CayenneRuntimeException("Null source entity: " + aRelationship);
+            throw new CayenneRuntimeException("Null source entity: %s", aRelationship);
         }
 
         if (aRelationship.getTargetEntity() == null) {
-            throw new CayenneRuntimeException("Null target entity: " + aRelationship);
+            throw new CayenneRuntimeException("Null target entity: %s", aRelationship);
         }
 
         if (aRelationship.getSourceEntity().getDataMap() == null) {
-            throw new CayenneRuntimeException("Null DataMap: "
-                    + aRelationship.getSourceEntity());
+            throw new CayenneRuntimeException("Null DataMap: %s", aRelationship.getSourceEntity());
         }
 
         // Once assigned, can reference relationship directly. Would it be

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/CayenneProjectPreferences.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/CayenneProjectPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/CayenneProjectPreferences.java
index f3b70f8..bc5a50a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/CayenneProjectPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/CayenneProjectPreferences.java
@@ -37,10 +37,7 @@ public class CayenneProjectPreferences {
 
     public CayenneProjectPreferences() {
         cayennePreferences = new HashMap<>();
-
-        cayennePreferences.put(DBConnectionInfo.class, new ChildrenMapPreference(
-                new DBConnectionInfo()));
-
+        cayennePreferences.put(DBConnectionInfo.class, new ChildrenMapPreference(new DBConnectionInfo()));
         projectCayennePreferences = new HashMap<>();
 
         for (ChildrenMapPreference value : cayennePreferences.values()) {
@@ -60,13 +57,11 @@ public class CayenneProjectPreferences {
 
         if (preference == null) {
             try {
-                Constructor<? extends CayennePreference> ct = objectClass
-                        .getConstructor(Preferences.class);
+                Constructor<? extends CayennePreference> ct = objectClass.getConstructor(Preferences.class);
                 preference = ct.newInstance(preferences);
                 projectCayennePreferences.put(preferences, preference);
-            }
-            catch (Throwable e) {
-                new CayenneRuntimeException("Error initialzing preference", e);
+            } catch (Throwable e) {
+                throw new CayenneRuntimeException("Error initializing preferences", e);
             }
         }
 
@@ -78,9 +73,8 @@ public class CayenneProjectPreferences {
         try {
             preference.removeNode();
             projectCayennePreferences.remove(preference);
-        }
-        catch (BackingStoreException e) {
-            new CayenneRuntimeException("error delete preferences " + e);
+        } catch (BackingStoreException e) {
+            throw new CayenneRuntimeException("Error delete preferences", e);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/ChildrenMapPreference.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/ChildrenMapPreference.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/ChildrenMapPreference.java
index 5e433cf..01f8757 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/ChildrenMapPreference.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/ChildrenMapPreference.java
@@ -18,10 +18,8 @@
  ****************************************************************/
 package org.apache.cayenne.pref;
 
-import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.prefs.BackingStoreException;
@@ -50,21 +48,14 @@ public class ChildrenMapPreference extends PreferenceDecorator {
 		Map<String, Object> children = new HashMap<>();
 		try {
 			String[] names = getCurrentPreference().childrenNames();
-			for (int i = 0; i < names.length; i++) {
-
+			for (String name : names) {
 				try {
-					Class cls = delegate.getClass();
-					Class partypes[] = new Class[2];
-					partypes[0] = String.class;
-					partypes[1] = boolean.class;
-					Constructor ct = cls.getConstructor(partypes);
-					Object arglist[] = new Object[2];
-					arglist[0] = names[i];
-					arglist[1] = true;
-					Object retobj = ct.newInstance(arglist);
-					children.put(names[i], retobj);
+					Object newInstance = delegate.getClass()
+							.getConstructor(String.class, boolean.class)
+							.newInstance(name, true);
+					children.put(name, newInstance);
 				} catch (Throwable e) {
-					new CayenneRuntimeException("Error initializing preference", e);
+					throw new CayenneRuntimeException("Error initializing preference", e);
 				}
 			}
 
@@ -89,18 +80,12 @@ public class ChildrenMapPreference extends PreferenceDecorator {
 
 	public CayennePreference create(String nodeName) {
 		try {
-			Class cls = delegate.getClass();
-			Class partypes[] = new Class[2];
-			partypes[0] = String.class;
-			partypes[1] = boolean.class;
-			Constructor ct = cls.getConstructor(partypes);
-			Object arglist[] = new Object[2];
-			arglist[0] = nodeName;
-			arglist[1] = false;
-			Object retobj = ct.newInstance(arglist);
-			children.put(nodeName, retobj);
+			Object newInstance = delegate.getClass()
+					.getConstructor(String.class, boolean.class)
+					.newInstance(nodeName, false);
+			children.put(nodeName, newInstance);
 		} catch (Throwable e) {
-			new CayenneRuntimeException("Error creating preference");
+			throw new CayenneRuntimeException("Error creating preference");
 		}
 		return (CayennePreference) children.get(nodeName);
 	}
@@ -111,22 +96,18 @@ public class ChildrenMapPreference extends PreferenceDecorator {
 
 	public void save() {
 		if (removeObject.size() > 0) {
-			for (int i = 0; i < removeObject.size(); i++) {
+			for (String aRemoveObject : removeObject) {
 				try {
-					delegate.getCurrentPreference().node(removeObject.get(i)).removeNode();
+					delegate.getCurrentPreference().node(aRemoveObject).removeNode();
 				} catch (BackingStoreException e) {
-					new CayenneRuntimeException("Error saving preference");
+					throw new CayenneRuntimeException("Error saving preference");
 				}
 			}
 		}
 
-		Iterator it = children.entrySet().iterator();
-		while (it.hasNext()) {
-			Map.Entry pairs = (Map.Entry) it.next();
-
-			delegate.getCurrentPreference().node((String) pairs.getKey());
+		for (Map.Entry<String, Object> pairs : children.entrySet()) {
+			delegate.getCurrentPreference().node(pairs.getKey());
 			((CayennePreference) pairs.getValue()).saveObjectPreference();
-
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BeanActionBinding.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BeanActionBinding.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BeanActionBinding.java
index 5184788..dfccc74 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BeanActionBinding.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/BeanActionBinding.java
@@ -70,8 +70,7 @@ public class BeanActionBinding extends BindingBase {
         }
 
         if (!foundActionEvents) {
-            throw new CayenneRuntimeException("Component does not define action events: "
-                    + component);
+            throw new CayenneRuntimeException("Component does not define action events: %s", component);
         }
     }
 


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

Posted by nt...@apache.org.
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());
                 }
             }
         }


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

Posted by nt...@apache.org.
CAY-2077 Bug in CayenneRuntimeException using wrong specified string in Formatter
plus cleanup


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2be06d62/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
index 8ec6705..2f10d01 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNodeSyncQualifierDescriptor.java
@@ -93,8 +93,8 @@ class DataNodeSyncQualifierDescriptor {
 			// supported...
 			if (descriptor.getPathFromMaster().size() != 1) {
 				throw new CayenneRuntimeException(
-						"Only single step dependent relationships are currently supported. Actual path length: "
-								+ descriptor.getPathFromMaster().size());
+				        "Only single step dependent relationships are currently supported. Actual path length: %d"
+                        , descriptor.getPathFromMaster().size());
 			}
 
 			DbRelationship masterDependentDbRel = descriptor.getPathFromMaster().get(0);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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