You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/03/11 15:19:26 UTC

svn commit: r921861 [1/2] - in /cayenne/main/trunk/framework: cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ cayenne-project-unpublished/src/main/java/org/apache/cayenne/projec...

Author: aadamchik
Date: Thu Mar 11 14:19:25 2010
New Revision: 921861

URL: http://svn.apache.org/viewvc?rev=921861&view=rev
Log:
CAY-1339 Remove org.apache.cayenne.project package from runtime

* cleaning up validation API
* fixing use of deprecated DataSourceFactories

Added:
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ConfigurationNodeValidator.java
      - copied, changed from r921859, cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProjectValidator.java
Modified:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataChannelValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataMapValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataNodeValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbAttributeValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbEntityValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbRelationshipValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DefaultProjectValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EJBQLQueryValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableAttributeValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/NameValidationHelper.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjAttributeValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjEntityValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjRelationshipValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProcedureParameterValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProcedureQueryValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProcedureValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProjectValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/SQLTemplateValidator.java
    cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/SelectQueryValidator.java

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java Thu Mar 11 14:19:25 2010
@@ -238,9 +238,13 @@ public class Application {
     }
 
     public static Preferences getMainPreferenceForProject() {
-        String path = CayennePreference
-                .filePathToPrefereceNodePath(((DataChannelDescriptor) getProject()
-                        .getRootNode()).getConfigurationSource().getURL().getPath());
+
+        DataChannelDescriptor descriptor = (DataChannelDescriptor) getProject()
+                .getRootNode();
+        String path = CayennePreference.filePathToPrefereceNodePath(descriptor
+                .getConfigurationSource()
+                .getURL()
+                .getPath());
         Preferences pref = Application.getInstance().getPreferencesNode(
                 getProject().getClass(),
                 "");

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java Thu Mar 11 14:19:25 2010
@@ -22,10 +22,10 @@ package org.apache.cayenne.modeler.actio
 import java.awt.event.ActionEvent;
 
 import org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy;
-import org.apache.cayenne.conf.DriverDataSourceFactory;
-import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.XMLPoolingDataSourceFactory;
+import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
@@ -104,7 +104,7 @@ public class CreateNodeAction extends Ca
         node.setDataSourceDescriptor(src);
         
         // by default create JDBC Node
-        node.setDataSourceFactoryType(DriverDataSourceFactory.class.getName());
+        node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName());
         node.setSchemaUpdateStrategyType(SkipSchemaUpdateStrategy.class.getName());
 
         return node;

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java Thu Mar 11 14:19:25 2010
@@ -33,10 +33,10 @@ import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.filechooser.FileFilter;
 
-import org.apache.cayenne.conf.DriverDataSourceFactory;
-import org.apache.cayenne.conf.JNDIDataSourceFactory;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.JNDIDataSourceFactory;
+import org.apache.cayenne.configuration.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.configuration.event.DataNodeEvent;
 import org.apache.cayenne.configuration.event.QueryEvent;
 import org.apache.cayenne.conn.DataSourceInfo;
@@ -171,7 +171,7 @@ public class ImportEOModelAction extends
                     }
                 }
 
-                node.setDataSourceFactoryType(DriverDataSourceFactory.class.getName());
+                node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName());
 
                 DataSourceInfo dsi = node.getDataSourceDescriptor();
                 

Copied: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ConfigurationNodeValidator.java (from r921859, cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProjectValidator.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ConfigurationNodeValidator.java?p2=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ConfigurationNodeValidator.java&p1=cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProjectValidator.java&r1=921859&r2=921861&rev=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ProjectValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ConfigurationNodeValidator.java Thu Mar 11 14:19:25 2010
@@ -18,10 +18,23 @@
  ****************************************************************/
 package org.apache.cayenne.project2.validation;
 
-import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-public interface ProjectValidator {
+/**
+ * A base superclass of various node validators.
+ * 
+ * @since 3.1
+ */
+abstract class ConfigurationNodeValidator {
 
-    public ValidationResult validate(ConfigurationNode node);
+    void addFailure(
+            ValidationResult validationResult,
+            Object source,
+            String messageFormat,
+            Object... messageParameters) {
+
+        String message = String.format(messageFormat, messageParameters);
+        validationResult.addFailure(new SimpleValidationFailure(source, message));
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataChannelValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataChannelValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataChannelValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataChannelValidator.java Thu Mar 11 14:19:25 2010
@@ -20,19 +20,15 @@ package org.apache.cayenne.project2.vali
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DataChannelValidator {
+class DataChannelValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
+    void validate(DataChannelDescriptor domain, ValidationResult validationResult) {
 
-        // check for empty name
-        DataChannelDescriptor domain = (DataChannelDescriptor) object;
         String name = domain.getName();
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed DataDomain.", object);
-
-            // no more name assertions
-            return;
+            addFailure(validationResult, domain, "Unnamed DataDomain");
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataMapValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataMapValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataMapValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataMapValidator.java Thu Mar 11 14:19:25 2010
@@ -22,18 +22,16 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DataMapValidator {
+class DataMapValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        DataMap map = (DataMap) object;
-        validateName(map, object, validationVisitor);
-
-        // check if data map is not attached to any nodes
-        validateNodeLinks(map, object, validationVisitor);
+    void validate(DataMap map, ValidationResult validationResult) {
+        validateName(map, validationResult);
+        validateNodeLinks(map, validationResult);
     }
 
-    void validateNodeLinks(DataMap map, Object object, ValidationVisitor validationVisitor) {
+    void validateNodeLinks(DataMap map, ValidationResult validationResult) {
         DataChannelDescriptor domain = map.getDataChannelDescriptor();
         if (domain == null) {
             return;
@@ -41,7 +39,7 @@ class DataMapValidator {
 
         boolean unlinked = true;
         int nodeCount = 0;
-        for (final DataNodeDescriptor node : domain.getNodeDescriptors()) {
+        for (DataNodeDescriptor node : domain.getNodeDescriptors()) {
             nodeCount++;
             if (node.getDataMapNames().contains(map.getName())) {
                 unlinked = false;
@@ -50,17 +48,15 @@ class DataMapValidator {
         }
 
         if (unlinked && nodeCount > 0) {
-            validationVisitor.registerWarning(
-                    "DataMap is not linked to any DataNodes.",
-                    object);
+            addFailure(validationResult, map, "DataMap is not linked to any DataNodes");
         }
     }
 
-    void validateName(DataMap map, Object object, ValidationVisitor validationVisitor) {
+    void validateName(DataMap map, ValidationResult validationResult) {
         String name = map.getName();
 
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed DataMap.", object);
+            addFailure(validationResult, map, "Unnamed DataMap");
             return;
         }
 
@@ -70,18 +66,15 @@ class DataMapValidator {
         }
 
         // check for duplicate names in the parent context
-        for (final DataMap otherMap : domain.getDataMaps()) {
+        for (DataMap otherMap : domain.getDataMaps()) {
             if (otherMap == map) {
                 continue;
             }
 
             if (name.equals(otherMap.getName())) {
-                validationVisitor.registerError(
-                        "Duplicate DataMap name: " + name + ".",
-                        object);
+                addFailure(validationResult, map, "Duplicate DataMap name: %s", name);
                 return;
             }
         }
     }
-
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataNodeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataNodeValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataNodeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DataNodeValidator.java Thu Mar 11 14:19:25 2010
@@ -18,63 +18,56 @@
  ****************************************************************/
 package org.apache.cayenne.project2.validation;
 
-import org.apache.cayenne.conf.DriverDataSourceFactory;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DataNodeValidator {
+class DataNodeValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        DataNodeDescriptor node = (DataNodeDescriptor) object;
-        validateName(node, object, validationVisitor);
-        validateConnection(node, object, validationVisitor);
+    void validate(DataNodeDescriptor node, ValidationResult validationResult) {
+        validateName(node, validationResult);
+        validateConnection(node, validationResult);
     }
 
-    void validateConnection(
-            DataNodeDescriptor node,
-            Object object,
-            ValidationVisitor validationVisitor) {
+    void validateConnection(DataNodeDescriptor node, ValidationResult validationResult) {
+
         String factory = node.getDataSourceFactoryType();
 
-        // If direct factory, make sure the location is a valid file name.
-        if (Util.isEmptyString(factory)) {
-            validationVisitor.registerError("No DataSource factory.", object);
-        }
-        else if (!DriverDataSourceFactory.class.getName().equals(factory)) {
-            String location = node.getParameters();
-            if (Util.isEmptyString(location)) {
-                validationVisitor.registerError(
-                        "DataNode has no location parameter.",
-                        object);
+        // TODO: andrus 03/10/2010 - null factory is allowed, however
+        // 'getDataSourceDescriptor' must ne not null in this case
+
+        if (factory != null
+                && !XMLPoolingDataSourceFactory.class.getName().equals(factory)) {
+            String parameters = node.getParameters();
+            if (Util.isEmptyString(parameters)) {
+                addFailure(
+                        validationResult,
+                        node,
+                        "DataNode has empty 'parameters' string");
             }
         }
     }
 
-    void validateName(
-            DataNodeDescriptor node,
-            Object object,
-            ValidationVisitor validationVisitor) {
+    void validateName(DataNodeDescriptor node, ValidationResult validationResult) {
         String name = node.getName();
 
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed DataNode.", object);
+            addFailure(validationResult, node, "Unnamed DataNode");
             return;
         }
 
         DataChannelDescriptor dataChannelDescriptor = node.getDataChannelDescriptor();
-        
+
         // check for duplicate names in the parent context
-        for (final DataNodeDescriptor otherNode : dataChannelDescriptor
-                .getNodeDescriptors()) {
+        for (DataNodeDescriptor otherNode : dataChannelDescriptor.getNodeDescriptors()) {
             if (otherNode == node) {
                 continue;
             }
 
             if (name.equals(otherNode.getName())) {
-                validationVisitor.registerError(
-                        "Duplicate DataNode name: " + name + ".",
-                        object);
+                addFailure(validationResult, node, "Duplicate DataNode name: %s", name);
                 break;
             }
         }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbAttributeValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbAttributeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbAttributeValidator.java Thu Mar 11 14:19:25 2010
@@ -21,15 +21,15 @@ package org.apache.cayenne.project2.vali
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DbAttributeValidator {
+class DbAttributeValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        DbAttribute attribute = (DbAttribute) object;
+    void validate(DbAttribute attribute, ValidationResult validationResult) {
 
         // Must have name
         if (Util.isEmptyString(attribute.getName())) {
-            validationVisitor.registerError("Unnamed DbAttribute.", object);
+            addFailure(validationResult, attribute, "Unnamed DbAttribute");
         }
         else {
             NameValidationHelper helper = NameValidationHelper.getInstance();
@@ -37,24 +37,29 @@ class DbAttributeValidator {
                     .getName());
 
             if (invalidChars != null) {
-                validationVisitor.registerWarning(
-                        "DbAttribute name contains invalid characters: " + invalidChars,
-                        object);
+                addFailure(
+                        validationResult,
+                        attribute,
+                        "DbAttribute name '%s' contains invalid characters: %s",
+                        attribute.getName(),
+                        invalidChars);
             }
         }
 
         // all attributes must have type
         if (attribute.getType() == TypesMapping.NOT_DEFINED) {
-            validationVisitor.registerWarning("DbAttribute has no type.", object);
+            addFailure(validationResult, attribute, "DbAttribute has no type");
         }
 
         // VARCHAR and CHAR attributes must have max length
         else if (attribute.getMaxLength() < 0
                 && (attribute.getType() == java.sql.Types.VARCHAR || attribute.getType() == java.sql.Types.CHAR)) {
 
-            validationVisitor.registerWarning(
-                    "Character DbAttribute doesn't have max length.",
-                    object);
+            addFailure(
+                    validationResult,
+                    attribute,
+                    "Character DbAttribute '%s' doesn't have max length",
+                    attribute.getName());
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbEntityValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbEntityValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbEntityValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbEntityValidator.java Thu Mar 11 14:19:25 2010
@@ -20,31 +20,32 @@ package org.apache.cayenne.project2.vali
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DbEntityValidator {
+class DbEntityValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        DbEntity ent = (DbEntity) object;
-        validateName(ent, object, validationVisitor);
-        validateAttributes(ent, object, validationVisitor);
-        validatePK(ent, object, validationVisitor);
+    void validate(DbEntity entity, ValidationResult validationResult) {
+        validateName(entity, validationResult);
+        validateAttributes(entity, validationResult);
+        validatePK(entity, validationResult);
     }
 
     /**
      * Validates the presence of the primary key. A warning is given only if the parent
-     * map also conatins an ObjEntity mapped to this entity, since unmapped primary key is
+     * map also contains an ObjEntity mapped to this entity, since unmapped primary key is
      * ok if working with data rows.
      */
-    void validatePK(DbEntity ent, Object object, ValidationVisitor validationVisitor) {
-        if (ent.getAttributes().size() > 0 && ent.getPrimaryKeys().size() == 0) {
-            DataMap map = ent.getDataMap();
-            if (map != null && map.getMappedEntities(ent).size() > 0) {
-                // there is an objentity, so complain about no pk
-                validationVisitor.registerWarning("DbEntity \""
-                        + ent.getName()
-                        + "\" has no primary key attributes defined.", object);
+    void validatePK(DbEntity entity, ValidationResult validationResult) {
+        if (entity.getAttributes().size() > 0 && entity.getPrimaryKeys().size() == 0) {
+            DataMap map = entity.getDataMap();
+            if (map != null && map.getMappedEntities(entity).size() > 0) {
+
+                addFailure(
+                        validationResult,
+                        entity,
+                        "DbEntity '%s' has no primary key attributes defined",
+                        entity.getName());
             }
         }
     }
@@ -52,45 +53,39 @@ class DbEntityValidator {
     /**
      * Tables must have columns.
      */
-    void validateAttributes(
-            DbEntity ent,
-            Object object,
-            ValidationVisitor validationVisitor) {
-        if (ent.getAttributes().size() == 0) {
-            // complain about missing attributes
-            validationVisitor.registerWarning("DbEntity \""
-                    + ent.getName()
-                    + "\" has no attributes defined.", object);
+    void validateAttributes(DbEntity entity, ValidationResult validationResult) {
+        if (entity.getAttributes().size() == 0) {
+            addFailure(
+                    validationResult,
+                    entity,
+                    "DbEntity '%s' has no attributes defined",
+                    entity.getName());
         }
     }
 
-    void validateName(DbEntity ent, Object object, ValidationVisitor validationVisitor) {
-        String name = ent.getName();
+    void validateName(DbEntity entity, ValidationResult validationResult) {
+        String name = entity.getName();
 
         // Must have name
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed DbEntity.", object);
+            addFailure(validationResult, entity, "Unnamed DbEntity");
             return;
         }
 
-        if (object instanceof Entity) {
-            DataMap map = ((Entity) object).getDataMap();
-            if (map == null) {
-                return;
+        DataMap map = entity.getDataMap();
+        if (map == null) {
+            return;
+        }
+
+        // check for duplicate names in the parent context
+        for (DbEntity otherEntity : map.getDbEntities()) {
+            if (otherEntity == entity) {
+                continue;
             }
 
-            // check for duplicate names in the parent context
-            for (final DbEntity otherEnt : map.getDbEntities()) {
-                if (otherEnt == ent) {
-                    continue;
-                }
-
-                if (name.equals(otherEnt.getName())) {
-                    validationVisitor.registerError("Duplicate DbEntity name: "
-                            + name
-                            + ".", object);
-                    break;
-                }
+            if (name.equals(otherEntity.getName())) {
+                addFailure(validationResult, entity, "Duplicate DbEntity name: %s", name);
+                break;
             }
         }
     }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbRelationshipValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbRelationshipValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbRelationshipValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DbRelationshipValidator.java Thu Mar 11 14:19:25 2010
@@ -21,73 +21,86 @@ package org.apache.cayenne.project2.vali
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class DbRelationshipValidator {
+class DbRelationshipValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        DbRelationship rel = (DbRelationship) object;
+    void validate(DbRelationship relationship, ValidationResult validationResult) {
 
-        if (rel.getTargetEntity() == null) {
-            validationVisitor.registerWarning("DbRelationship "
-                    + dbRelationshipIdentifier(rel)
-                    + " has no target entity.", object);
-        }
-        else if (rel.getJoins().size() == 0) {
-            validationVisitor.registerWarning("DbRelationship "
-                    + dbRelationshipIdentifier(rel)
-                    + " has no joins.", object);
+        if (relationship.getTargetEntity() == null) {
+            addFailure(
+                    validationResult,
+                    relationship,
+                    "DbRelationship '%s' has no target entity",
+                    toString(relationship));
+        }
+        else if (relationship.getJoins().isEmpty()) {
+            addFailure(
+                    validationResult,
+                    relationship,
+                    "DbRelationship '%s' has no joins",
+                    toString(relationship));
         }
         else {
             // validate joins
-            for (final DbJoin join : rel.getJoins()) {
+            for (DbJoin join : relationship.getJoins()) {
                 if (join.getSource() == null && join.getTarget() == null) {
-                    validationVisitor
-                            .registerWarning(
-                                    "DbRelationship "
-                                            + dbRelationshipIdentifier(rel)
-                                            + " join has no source and target attributes selected.",
-                                    object);
+                    addFailure(
+                            validationResult,
+                            relationship,
+                            "DbRelationship '%s' has a join with no source and target attributes selected",
+                            toString(relationship));
                 }
                 else if (join.getSource() == null) {
-                    validationVisitor.registerWarning("DbRelationship "
-                            + dbRelationshipIdentifier(rel)
-                            + " join has no source attribute selected.", object);
+                    addFailure(
+                            validationResult,
+                            relationship,
+                            "DbRelationship '%s' has a join with no source attribute selected",
+                            toString(relationship));
                 }
                 else if (join.getTarget() == null) {
-                    validationVisitor.registerWarning("DbRelationship "
-                            + dbRelationshipIdentifier(rel)
-                            + " join has no target attribute selected.", object);
+                    addFailure(
+                            validationResult,
+                            relationship,
+                            "DbRelationship '%s' has a join with no target attribute selected",
+                            toString(relationship));
                 }
             }
         }
 
-        if (Util.isEmptyString(rel.getName())) {
-            validationVisitor.registerError("Unnamed DbRelationship.", object);
+        if (Util.isEmptyString(relationship.getName())) {
+            addFailure(validationResult, relationship, "Unnamed DbRelationship");
         }
         // check if there are attributes having the same name
-        else if (rel.getSourceEntity().getAttribute(rel.getName()) != null) {
-            validationVisitor.registerError("DbRelationship "
-                    + dbRelationshipIdentifier(rel)
-                    + " has the same name as one of DbAttributes", object);
+        else if (relationship.getSourceEntity().getAttribute(relationship.getName()) != null) {
+            addFailure(
+                    validationResult,
+                    relationship,
+                    "Name of DbRelationship '%s' conflicts with the name of one of DbAttributes in the same entity",
+                    toString(relationship));
         }
         else {
             NameValidationHelper helper = NameValidationHelper.getInstance();
-            String invalidChars = helper.invalidCharsInDbPathComponent(rel.getName());
+            String invalidChars = helper.invalidCharsInDbPathComponent(relationship
+                    .getName());
 
             if (invalidChars != null) {
-                validationVisitor.registerWarning("DbRelationship "
-                        + dbRelationshipIdentifier(rel)
-                        + " name contains invalid characters: "
-                        + invalidChars, object);
+                addFailure(
+                        validationResult,
+                        relationship,
+                        "Name of DbRelationship '%s' contains invalid characters: %s",
+                        toString(relationship),
+                        invalidChars);
             }
         }
     }
 
-    String dbRelationshipIdentifier(DbRelationship rel) {
-        if (null == rel.getSourceEntity()) {
-            return "<[null source entity]." + rel.getName() + ">";
+    private String toString(DbRelationship relationship) {
+        if (relationship.getSourceEntity() == null) {
+            return "[null source entity]." + relationship.getName();
         }
-        return "<" + rel.getSourceEntity().getName() + "." + rel.getName() + ">";
+
+        return relationship.getSourceEntity().getName() + "." + relationship.getName();
     }
 
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DefaultProjectValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DefaultProjectValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DefaultProjectValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/DefaultProjectValidator.java Thu Mar 11 14:19:25 2010
@@ -40,12 +40,13 @@ import org.apache.cayenne.query.Procedur
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
+/**
+ * @since 3.1
+ */
 public class DefaultProjectValidator implements ProjectValidator {
 
-    /* Validators */
     private DataChannelValidator dataChannelValidator;
     private DataNodeValidator nodeValidator;
     private DataMapValidator mapValidator;
@@ -85,288 +86,187 @@ public class DefaultProjectValidator imp
     }
 
     public ValidationResult validate(ConfigurationNode node) {
-        ValidationVisitor vis = new ValidationVisitor(this);
-        return node.acceptVisitor(vis);
+        return node.acceptVisitor(new ValidationVisitor());
     }
 
-    DataChannelValidator getDataChannelValidator() {
-        return dataChannelValidator;
-    }
-
-    DataNodeValidator getNodeValidator() {
-        return nodeValidator;
-    }
-
-    DataMapValidator getMapValidator() {
-        return mapValidator;
-    }
-
-    ObjEntityValidator getObjEntityValidator() {
-        return objEntityValidator;
-    }
-
-    ObjAttributeValidator getObjAttrValidator() {
-        return objAttrValidator;
-    }
-
-    ObjRelationshipValidator getObjRelValidator() {
-        return objRelValidator;
-    }
-
-    DbEntityValidator getDbEntityValidator() {
-        return dbEntityValidator;
-    }
-
-    DbAttributeValidator getDbAttrValidator() {
-        return dbAttrValidator;
-    }
-
-    DbRelationshipValidator getDbRelValidator() {
-        return dbRelValidator;
-    }
+    class ValidationVisitor implements ConfigurationNodeVisitor<ValidationResult> {
 
-    EmbeddableAttributeValidator getEmbeddableAttributeValidator() {
-        return embeddableAttributeValidator;
-    }
+        private ValidationResult validationResult;
 
-    EmbeddableValidator getEmbeddableValidator() {
-        return embeddableValidator;
-    }
+        ValidationVisitor() {
+            validationResult = new ValidationResult();
+        }
 
-    ProcedureValidator getProcedureValidator() {
-        return procedureValidator;
-    }
+        public ValidationResult visitDataChannelDescriptor(
+                DataChannelDescriptor channelDescriptor) {
 
-    ProcedureParameterValidator getProcedureParameterValidator() {
-        return procedureParameterValidator;
-    }
+            dataChannelValidator.validate(channelDescriptor, validationResult);
 
-    SelectQueryValidator getSelectQueryValidator() {
-        return selectQueryValidator;
-    }
+            for (DataNodeDescriptor node : channelDescriptor.getNodeDescriptors()) {
+                visitDataNodeDescriptor(node);
+            }
 
-    ProcedureQueryValidator getProcedureQueryValidator() {
-        return procedureQueryValidator;
-    }
+            for (DataMap map : channelDescriptor.getDataMaps()) {
+                visitDataMap(map);
+            }
 
-    EJBQLQueryValidator getEjbqlQueryValidator() {
-        return ejbqlQueryValidator;
-    }
+            return validationResult;
+        }
 
-    SQLTemplateValidator getSqlTemplateValidator() {
-        return sqlTemplateValidator;
-    }
-}
+        public ValidationResult visitDataMap(DataMap dataMap) {
+            mapValidator.validate(dataMap, validationResult);
+            Iterator<Embeddable> itEmb = dataMap.getEmbeddables().iterator();
+            while (itEmb.hasNext()) {
+                Embeddable emb = itEmb.next();
+                visitEmbeddable(emb);
+            }
 
-class ValidationVisitor implements ConfigurationNodeVisitor<ValidationResult> {
+            Iterator<ObjEntity> itObjEnt = dataMap.getObjEntities().iterator();
+            while (itObjEnt.hasNext()) {
+                ObjEntity ent = itObjEnt.next();
+                visitObjEntity(ent);
+            }
 
-    private ValidationResult validationResults = new ValidationResult();
+            Iterator<DbEntity> itDbEnt = dataMap.getDbEntities().iterator();
+            while (itDbEnt.hasNext()) {
+                DbEntity ent = itDbEnt.next();
+                visitDbEntity(ent);
+            }
 
-    private DefaultProjectValidator defaultProjectValidator;
+            Iterator<Procedure> itProc = dataMap.getProcedures().iterator();
+            while (itProc.hasNext()) {
+                Procedure proc = itProc.next();
+                visitProcedure(proc);
+            }
 
-    ValidationVisitor(DefaultProjectValidator defaultProjectValidator) {
-        this.defaultProjectValidator = defaultProjectValidator;
-    }
+            Iterator<Query> itQuer = dataMap.getQueries().iterator();
+            while (itQuer.hasNext()) {
+                Query q = itQuer.next();
+                visitQuery(q);
+            }
 
-    public ValidationResult visitDataChannelDescriptor(
-            DataChannelDescriptor channelDescriptor) {
-        defaultProjectValidator.getDataChannelValidator().validate(
-                channelDescriptor,
-                this);
-        Iterator<DataNodeDescriptor> it = channelDescriptor
-                .getNodeDescriptors()
-                .iterator();
-        while (it.hasNext()) {
-            DataNodeDescriptor node = it.next();
-            visitDataNodeDescriptor(node);
-        }
-
-        Iterator<DataMap> itMap = channelDescriptor.getDataMaps().iterator();
-        while (itMap.hasNext()) {
-            DataMap map = itMap.next();
-            visitDataMap(map);
+            return validationResult;
         }
-        return validationResults;
-    }
 
-    public ValidationResult visitDataMap(DataMap dataMap) {
-        defaultProjectValidator.getMapValidator().validate(dataMap, this);
-        Iterator<Embeddable> itEmb = dataMap.getEmbeddables().iterator();
-        while (itEmb.hasNext()) {
-            Embeddable emb = itEmb.next();
-            visitEmbeddable(emb);
+        public ValidationResult visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
+            nodeValidator.validate(nodeDescriptor, validationResult);
+            return validationResult;
         }
 
-        Iterator<ObjEntity> itObjEnt = dataMap.getObjEntities().iterator();
-        while (itObjEnt.hasNext()) {
-            ObjEntity ent = itObjEnt.next();
-            visitObjEntity(ent);
+        public ValidationResult visitDbAttribute(DbAttribute attribute) {
+            dbAttrValidator.validate(attribute, validationResult);
+            return validationResult;
         }
 
-        Iterator<DbEntity> itDbEnt = dataMap.getDbEntities().iterator();
-        while (itDbEnt.hasNext()) {
-            DbEntity ent = itDbEnt.next();
-            visitDbEntity(ent);
-        }
+        public ValidationResult visitDbEntity(DbEntity entity) {
+            dbEntityValidator.validate(entity, validationResult);
 
-        Iterator<Procedure> itProc = dataMap.getProcedures().iterator();
-        while (itProc.hasNext()) {
-            Procedure proc = itProc.next();
-            visitProcedure(proc);
-        }
+            Iterator<DbAttribute> itAttr = entity.getAttributes().iterator();
+            while (itAttr.hasNext()) {
+                DbAttribute attr = itAttr.next();
+                visitDbAttribute(attr);
+            }
 
-        Iterator<Query> itQuer = dataMap.getQueries().iterator();
-        while (itQuer.hasNext()) {
-            Query q = itQuer.next();
-            visitQuery(q);
+            Iterator<DbRelationship> itRel = entity.getRelationships().iterator();
+            while (itRel.hasNext()) {
+                DbRelationship rel = itRel.next();
+                visitDbRelationship(rel);
+            }
+            return validationResult;
         }
 
-        return validationResults;
-    }
-
-    public ValidationResult visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
-        defaultProjectValidator.getNodeValidator().validate(nodeDescriptor, this);
-        return validationResults;
-    }
-
-    public ValidationResult visitDbAttribute(DbAttribute attribute) {
-        defaultProjectValidator.getDbAttrValidator().validate(attribute, this);
-        return validationResults;
-    }
-
-    public ValidationResult visitDbEntity(DbEntity entity) {
-        defaultProjectValidator.getDbEntityValidator().validate(entity, this);
-
-        Iterator<DbAttribute> itAttr = entity.getAttributes().iterator();
-        while (itAttr.hasNext()) {
-            DbAttribute attr = itAttr.next();
-            visitDbAttribute(attr);
+        public ValidationResult visitDbRelationship(DbRelationship relationship) {
+            dbRelValidator.validate(relationship, validationResult);
+            return validationResult;
         }
 
-        Iterator<DbRelationship> itRel = entity.getRelationships().iterator();
-        while (itRel.hasNext()) {
-            DbRelationship rel = itRel.next();
-            visitDbRelationship(rel);
+        public ValidationResult visitEmbeddable(Embeddable embeddable) {
+            embeddableValidator.validate(embeddable, validationResult);
+            Iterator<EmbeddableAttribute> it = embeddable.getAttributes().iterator();
+            while (it.hasNext()) {
+                EmbeddableAttribute attr = it.next();
+                visitEmbeddableAttribute(attr);
+            }
+            return validationResult;
         }
-        return validationResults;
-    }
 
-    public ValidationResult visitDbRelationship(DbRelationship relationship) {
-        defaultProjectValidator.getDbRelValidator().validate(relationship, this);
-        return validationResults;
-    }
-
-    public ValidationResult visitEmbeddable(Embeddable embeddable) {
-        defaultProjectValidator.getEmbeddableValidator().validate(embeddable, this);
-        Iterator<EmbeddableAttribute> it = embeddable.getAttributes().iterator();
-        while (it.hasNext()) {
-            EmbeddableAttribute attr = it.next();
-            visitEmbeddableAttribute(attr);
+        public ValidationResult visitEmbeddableAttribute(EmbeddableAttribute attribute) {
+            embeddableAttributeValidator.validate(attribute, validationResult);
+            return validationResult;
         }
-        return validationResults;
-    }
-
-    public ValidationResult visitEmbeddableAttribute(EmbeddableAttribute attribute) {
-        defaultProjectValidator.getEmbeddableAttributeValidator().validate(
-                attribute,
-                this);
-        return validationResults;
-    }
-
-    public ValidationResult visitObjAttribute(ObjAttribute attribute) {
-        defaultProjectValidator.getObjAttrValidator().validate(attribute, this);
-        return validationResults;
-    }
-
-    public ValidationResult visitObjEntity(ObjEntity entity) {
-        defaultProjectValidator.getObjEntityValidator().validate(entity, this);
 
-        Iterator<ObjAttribute> itAttr = entity.getAttributes().iterator();
-        while (itAttr.hasNext()) {
-            ObjAttribute attr = itAttr.next();
-            visitObjAttribute(attr);
+        public ValidationResult visitObjAttribute(ObjAttribute attribute) {
+            objAttrValidator.validate(attribute, validationResult);
+            return validationResult;
         }
 
-        Iterator<ObjRelationship> itRel = entity.getRelationships().iterator();
-        while (itRel.hasNext()) {
-            ObjRelationship rel = itRel.next();
-            visitObjRelationship(rel);
-        }
-        return validationResults;
-    }
+        public ValidationResult visitObjEntity(ObjEntity entity) {
+            objEntityValidator.validate(entity, validationResult);
 
-    public ValidationResult visitObjRelationship(ObjRelationship relationship) {
-        defaultProjectValidator.getObjRelValidator().validate(relationship, this);
-        return validationResults;
-    }
+            Iterator<ObjAttribute> itAttr = entity.getAttributes().iterator();
+            while (itAttr.hasNext()) {
+                ObjAttribute attr = itAttr.next();
+                visitObjAttribute(attr);
+            }
 
-    public ValidationResult visitProcedure(Procedure procedure) {
-        defaultProjectValidator.getProcedureValidator().validate(procedure, this);
-        ProcedureParameter parameter = procedure.getResultParam();
-        if (parameter != null) {
-            visitProcedureParameter(parameter);
+            Iterator<ObjRelationship> itRel = entity.getRelationships().iterator();
+            while (itRel.hasNext()) {
+                ObjRelationship rel = itRel.next();
+                visitObjRelationship(rel);
+            }
+            return validationResult;
         }
 
-        Iterator<ProcedureParameter> itPrOut = procedure
-                .getCallOutParameters()
-                .iterator();
-        while (itPrOut.hasNext()) {
-            ProcedureParameter procPar = itPrOut.next();
-            visitProcedureParameter(procPar);
+        public ValidationResult visitObjRelationship(ObjRelationship relationship) {
+            objRelValidator.validate(relationship, validationResult);
+            return validationResult;
         }
 
-        Iterator<ProcedureParameter> itPr = procedure.getCallParameters().iterator();
-        while (itPr.hasNext()) {
-            ProcedureParameter procPar = itPr.next();
-            visitProcedureParameter(procPar);
-        }
+        public ValidationResult visitProcedure(Procedure procedure) {
+            procedureValidator.validate(procedure, validationResult);
+            ProcedureParameter parameter = procedure.getResultParam();
+            if (parameter != null) {
+                visitProcedureParameter(parameter);
+            }
 
-        return validationResults;
-    }
+            Iterator<ProcedureParameter> itPrOut = procedure
+                    .getCallOutParameters()
+                    .iterator();
+            while (itPrOut.hasNext()) {
+                ProcedureParameter procPar = itPrOut.next();
+                visitProcedureParameter(procPar);
+            }
 
-    public ValidationResult visitProcedureParameter(ProcedureParameter parameter) {
-        defaultProjectValidator
-                .getProcedureParameterValidator()
-                .validate(parameter, this);
-        return validationResults;
-    }
+            Iterator<ProcedureParameter> itPr = procedure.getCallParameters().iterator();
+            while (itPr.hasNext()) {
+                ProcedureParameter procPar = itPr.next();
+                visitProcedureParameter(procPar);
+            }
 
-    public ValidationResult visitQuery(Query query) {
-        if (query instanceof SelectQuery) {
-            defaultProjectValidator.getSelectQueryValidator().validate(query, this);
-        }
-        else if (query instanceof SQLTemplate) {
-            defaultProjectValidator.getSqlTemplateValidator().validate(query, this);
-        }
-        else if (query instanceof ProcedureQuery) {
-            defaultProjectValidator.getProcedureQueryValidator().validate(query, this);
+            return validationResult;
         }
-        else if (query instanceof EJBQLQuery) {
-            defaultProjectValidator.getEjbqlQueryValidator().validate(query, this);
-        }
-        else {
-            // ignore unknown nodes
-            return null;
-        }
-        return validationResults;
-    }
-
-    /**
-     * Registers validation result. Increases internally stored max severity if
-     * <code>result</code> parameter has a higher severity then the current value. Leaves
-     * current value unchanged otherwise.
-     */
-    public void registerValidated(String message, Object object) {
 
-        SimpleValidationFailure result = new SimpleValidationFailure(object, message);
-        validationResults.addFailure(result);
-    }
+        public ValidationResult visitProcedureParameter(ProcedureParameter parameter) {
+            procedureParameterValidator.validate(parameter, validationResult);
+            return validationResult;
+        }
 
-    public void registerError(String message, Object object) {
-        registerValidated(message, object);
-    }
+        public ValidationResult visitQuery(Query query) {
+            if (query instanceof SelectQuery) {
+                selectQueryValidator.validate((SelectQuery) query, validationResult);
+            }
+            else if (query instanceof SQLTemplate) {
+                sqlTemplateValidator.validate((SQLTemplate) query, validationResult);
+            }
+            else if (query instanceof ProcedureQuery) {
+                procedureQueryValidator
+                        .validate((ProcedureQuery) query, validationResult);
+            }
+            else if (query instanceof EJBQLQuery) {
+                ejbqlQueryValidator.validate((EJBQLQuery) query, validationResult);
+            }
 
-    public void registerWarning(String message, Object object) {
-        registerValidated(message, object);
+            return validationResult;
+        }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EJBQLQueryValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EJBQLQueryValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EJBQLQueryValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EJBQLQueryValidator.java Thu Mar 11 14:19:25 2010
@@ -19,20 +19,15 @@
 package org.apache.cayenne.project2.validation;
 
 import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.project.ProjectPath;
 import org.apache.cayenne.project2.validation.EJBQLStatementValidator.PositionException;
 import org.apache.cayenne.query.EJBQLQuery;
+import org.apache.cayenne.validation.ValidationResult;
 
-class EJBQLQueryValidator {
+class EJBQLQueryValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        EJBQLQuery query = (EJBQLQuery) object;
+    void validate(EJBQLQuery query, ValidationResult validationResult) {
 
-        ProjectPath path = new ProjectPath(new Object[] {
-                query.getDataMap().getDataChannelDescriptor(), query.getDataMap(), query
-        });
-
-        PositionException message = (new EJBQLStatementValidator()).validateEJBQL(
+        PositionException message = new EJBQLStatementValidator().validateEJBQL(
                 query,
                 new EntityResolver(query
                         .getDataMap()
@@ -40,9 +35,8 @@ class EJBQLQueryValidator {
                         .getDataMaps()));
 
         if (message != null) {
-            validationVisitor.registerWarning("EJBQL query "
-                    + query.getName()
-                    + " has error.", path);
+            addFailure(validationResult, query, "Error in EJBQL query '%s' syntax", query
+                    .getName());
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableAttributeValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableAttributeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableAttributeValidator.java Thu Mar 11 14:19:25 2010
@@ -20,21 +20,24 @@ package org.apache.cayenne.project2.vali
 
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class EmbeddableAttributeValidator {
+class EmbeddableAttributeValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-
-        EmbeddableAttribute emAttribute = (EmbeddableAttribute) object;
+    void validate(EmbeddableAttribute attribute, ValidationResult validationResult) {
 
         // Must have name
-        if (Util.isEmptyString(emAttribute.getName())) {
-            validationVisitor.registerError("Unnamed EmbeddableAttribute.", object);
+        if (Util.isEmptyString(attribute.getName())) {
+            addFailure(validationResult, attribute, "Unnamed EmbeddableAttribute");
         }
 
         // all attributes must have type
-        if (Util.isEmptyString(emAttribute.getType())) {
-            validationVisitor.registerWarning("EmbeddableAttribute has no type.", object);
+        if (Util.isEmptyString(attribute.getType())) {
+            addFailure(
+                    validationResult,
+                    attribute,
+                    "EmbeddableAttribute '%s' has no type",
+                    attribute.getName());
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/EmbeddableValidator.java Thu Mar 11 14:19:25 2010
@@ -22,44 +22,44 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class EmbeddableValidator {
+class EmbeddableValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        Embeddable emb = (Embeddable) object;
-        validateName(emb, object, validationVisitor);
-    }
+    void validate(Embeddable embeddable, ValidationResult validationResult) {
 
-    void validateName(Embeddable emb, Object object, ValidationVisitor validationVisitor) {
-        String name = emb.getClassName();
+        String name = embeddable.getClassName();
 
         // Must have name
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed Embeddable.", object);
+            addFailure(validationResult, embeddable, "Unnamed Embeddable");
             return;
         }
 
-        DataMap map = emb.getDataMap();
+        DataMap map = embeddable.getDataMap();
         if (map == null) {
             return;
         }
 
         // check for duplicate names in the parent context
         for (Embeddable otherEmb : map.getEmbeddables()) {
-            if (otherEmb == emb) {
+            if (otherEmb == embeddable) {
                 continue;
             }
 
             if (name.equals(otherEmb.getClassName())) {
-                validationVisitor.registerError("Duplicate Embeddable name: "
-                        + name
-                        + ".", object);
+
+                addFailure(
+                        validationResult,
+                        embeddable,
+                        "Duplicate Embeddable class name: %s",
+                        name);
                 break;
             }
         }
 
-        // check for dupliucates in other DataMaps
-        DataChannelDescriptor domain = emb.getDataMap().getDataChannelDescriptor();
+        // check for duplicates in other DataMaps
+        DataChannelDescriptor domain = map.getDataChannelDescriptor();
         if (domain != null) {
             for (DataMap nextMap : domain.getDataMaps()) {
                 if (nextMap == map) {
@@ -68,13 +68,11 @@ class EmbeddableValidator {
 
                 Embeddable conflictingEmbeddable = nextMap.getEmbeddable(name);
                 if (conflictingEmbeddable != null) {
-
-                    validationVisitor
-                            .registerWarning(
-                                    "Duplicate Embeddable name in another DataMap: "
-                                            + name
-                                            + ".",
-                                    object);
+                    addFailure(
+                            validationResult,
+                            embeddable,
+                            "Duplicate Embeddable name in another DataMap: %s",
+                            name);
                     break;
                 }
             }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/NameValidationHelper.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/NameValidationHelper.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/NameValidationHelper.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/NameValidationHelper.java Thu Mar 11 14:19:25 2010
@@ -34,6 +34,7 @@ public class NameValidationHelper {
             "abstract",
             "assert",
             "default",
+            "enum",
             "if",
             "private",
             "this",

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjAttributeValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjAttributeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjAttributeValidator.java Thu Mar 11 14:19:25 2010
@@ -18,8 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.project2.validation;
 
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.cayenne.map.Embeddable;
@@ -28,15 +26,15 @@ import org.apache.cayenne.map.EmbeddedAt
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class ObjAttributeValidator {
+class ObjAttributeValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        ObjAttribute attribute = (ObjAttribute) object;
+    void validate(ObjAttribute attribute, ValidationResult validationResult) {
 
         // Must have name
         if (Util.isEmptyString(attribute.getName())) {
-            validationVisitor.registerError("Unnamed ObjAttribute.", object);
+            addFailure(validationResult, attribute, "Unnamed ObjAttribute");
         }
         else {
             NameValidationHelper helper = NameValidationHelper.getInstance();
@@ -44,19 +42,29 @@ class ObjAttributeValidator {
                     .getName());
 
             if (invalidChars != null) {
-                validationVisitor.registerWarning(
-                        "ObjAttribute name contains invalid characters: " + invalidChars,
-                        object);
+                addFailure(
+                        validationResult,
+                        attribute,
+                        "ObjAttribute name '%s' contains invalid characters: %s",
+                        attribute.getName(),
+                        invalidChars);
             }
             else if (helper.invalidDataObjectProperty(attribute.getName())) {
-                validationVisitor.registerWarning("ObjAttribute name is invalid: "
-                        + attribute.getName(), object);
+                addFailure(
+                        validationResult,
+                        attribute,
+                        "ObjAttribute name '%s' is invalid",
+                        attribute.getName());
             }
         }
 
         // all attributes must have type
         if (Util.isEmptyString(attribute.getType())) {
-            validationVisitor.registerWarning("ObjAttribute has no type.", object);
+            addFailure(
+                    validationResult,
+                    attribute,
+                    "ObjAttribute '%s' has no Java type",
+                    attribute.getName());
         }
 
         if (attribute.getEntity() instanceof ObjEntity
@@ -66,62 +74,79 @@ class ObjAttributeValidator {
         else if (attribute instanceof EmbeddedAttribute) {
             Map<String, String> attrOverrides = ((EmbeddedAttribute) attribute)
                     .getAttributeOverrides();
-            Embeddable emb = ((EmbeddedAttribute) attribute).getEmbeddable();
-            if (emb == null && ((EmbeddedAttribute) attribute).getType() != null) {
-                validationVisitor.registerWarning(
-                        "EmbeddedAttribute has incorrect Embeddable.",
-                        object);
+
+            Embeddable embeddable = ((EmbeddedAttribute) attribute).getEmbeddable();
+            if (embeddable == null && ((EmbeddedAttribute) attribute).getType() != null) {
+
+                addFailure(
+                        validationResult,
+                        attribute,
+                        "EmbeddedAttribute '%s' has incorrect Embeddable",
+                        attribute.getName());
             }
-            else if (emb == null && ((EmbeddedAttribute) attribute).getType() == null) {
-                validationVisitor.registerWarning(
-                        "EmbeddedAttribute has no Embeddable.",
-                        object);
+            else if (embeddable == null
+                    && ((EmbeddedAttribute) attribute).getType() == null) {
+                addFailure(
+                        validationResult,
+                        attribute,
+                        "EmbeddedAttribute '%s' has no Embeddable",
+                        attribute.getName());
             }
 
-            if (emb != null) {
-                Collection<EmbeddableAttribute> embAttributes = emb.getAttributes();
+            if (embeddable != null) {
 
-                Iterator<EmbeddableAttribute> it = embAttributes.iterator();
-                while (it.hasNext()) {
-                    EmbeddableAttribute embAttr = (EmbeddableAttribute) it.next();
+                for (EmbeddableAttribute embeddableAttribute : embeddable.getAttributes()) {
                     String dbAttributeName;
                     if (attrOverrides.size() > 0
-                            && attrOverrides.containsKey(embAttr.getName())) {
-                        dbAttributeName = attrOverrides.get(embAttr.getName());
+                            && attrOverrides.containsKey(embeddableAttribute.getName())) {
+                        dbAttributeName = attrOverrides
+                                .get(embeddableAttribute.getName());
                     }
                     else {
-                        dbAttributeName = embAttr.getDbAttributeName();
+                        dbAttributeName = embeddableAttribute.getDbAttributeName();
                     }
 
                     if (dbAttributeName == "" || dbAttributeName == null) {
-                        validationVisitor.registerWarning(
-                                "EmbeddedAttribute has no DbAttribute mapping.",
-                                object);
+
+                        addFailure(
+                                validationResult,
+                                attribute,
+                                "EmbeddedAttribute '%s' has no DbAttribute mapping",
+                                attribute.getName());
                     }
                     else if (((ObjEntity) attribute.getEntity())
                             .getDbEntity()
                             .getAttribute(dbAttributeName) == null) {
-                        validationVisitor.registerWarning(
-                                "EmbeddedAttribute has incorrect DbAttribute mapping.",
-                                object);
+
+                        addFailure(
+                                validationResult,
+                                attribute,
+                                "EmbeddedAttribute '%s' has incorrect DbAttribute mapping",
+                                attribute.getName());
                     }
                 }
             }
 
         }
         else if (attribute.getDbAttribute() == null) {
-            validationVisitor.registerWarning(
-                    "ObjAttribute has no DbAttribute mapping.",
-                    object);
+            addFailure(
+                    validationResult,
+                    attribute,
+                    "ObjAttribute '%s' has no DbAttribute mapping",
+                    attribute.getName());
         }
         // can't support generated meaningful attributes for now; besides they don't make
         // sense.
+        // TODO: andrus 03/10/2010 - is that really so? I think those are supported...
         else if (attribute.getDbAttribute().isPrimaryKey()
                 && attribute.getDbAttribute().isGenerated()) {
-            validationVisitor.registerWarning(
-                    "ObjAttribute is mapped to a generated PK: "
-                            + attribute.getDbAttributeName(),
-                    object);
+
+            addFailure(
+                    validationResult,
+                    attribute,
+                    "ObjAttribute '%s' is mapped to a generated PK: %s",
+                    attribute.getName(),
+                    attribute.getDbAttributeName());
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjEntityValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjEntityValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjEntityValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjEntityValidator.java Thu Mar 11 14:19:25 2010
@@ -22,29 +22,29 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class ObjEntityValidator {
+class ObjEntityValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        ObjEntity ent = (ObjEntity) object;
+    void validate(ObjEntity entity, ValidationResult validationResult) {
 
-        validateName(ent, object, validationVisitor);
-        validateClassName(ent, object, validationVisitor);
-        validateSuperClassName(ent, object, validationVisitor);
+        validateName(entity, validationResult);
+        validateClassName(entity, validationResult);
+        validateSuperClassName(entity, validationResult);
 
         // validate DbEntity presence
-        if (ent.getDbEntity() == null && !ent.isAbstract()) {
-            validationVisitor.registerWarning(
-                    "ObjEntity has no DbEntity mapping.",
-                    object);
+        if (entity.getDbEntity() == null && !entity.isAbstract()) {
+
+            addFailure(
+                    validationResult,
+                    entity,
+                    "ObjEntity '%s' has no DbEntity mapping",
+                    entity.getName());
         }
     }
 
-    void validateClassName(
-            ObjEntity ent,
-            Object object,
-            ValidationVisitor validationVisitor) {
-        String className = ent.getClassName();
+    void validateClassName(ObjEntity entity, ValidationResult validationResult) {
+        String className = entity.getClassName();
 
         // if mapped to default class, ignore...
         if (Util.isEmptyString(className)) {
@@ -55,26 +55,34 @@ class ObjEntityValidator {
         String invalidChars = helper.invalidCharsInJavaClassName(className);
 
         if (invalidChars != null) {
-            validationVisitor.registerWarning(
-                    "ObjEntity Java class contains invalid characters: " + invalidChars,
-                    object);
+            addFailure(
+                    validationResult,
+                    entity,
+                    "ObjEntity '%s' Java class '%s' contains invalid characters: %s",
+                    entity.getName(),
+                    className,
+                    invalidChars);
         }
         else if (helper.invalidDataObjectClass(className)) {
-            validationVisitor.registerWarning("ObjEntity Java class is invalid: "
-                    + className, object);
+            addFailure(
+                    validationResult,
+                    entity,
+                    "Java class '%s' of ObjEntity '%s' is a reserved word",
+                    className,
+                    entity.getName());
         }
         else if (className.indexOf('.') < 0) {
-            validationVisitor.registerWarning(
-                    "Placing Java class in default package is discouraged: " + className,
-                    object);
+            addFailure(
+                    validationResult,
+                    entity,
+                    "Java class '%s' of ObjEntity '%s' is in a default package",
+                    className,
+                    entity.getName());
         }
     }
 
-    void validateSuperClassName(
-            ObjEntity ent,
-            Object object,
-            ValidationVisitor validationVisitor) {
-        String superClassName = ent.getSuperClassName();
+    void validateSuperClassName(ObjEntity entity, ValidationResult validationResult) {
+        String superClassName = entity.getSuperClassName();
 
         if (Util.isEmptyString(superClassName)) {
             return; // null is Ok
@@ -84,28 +92,35 @@ class ObjEntityValidator {
         String invalidChars = helper.invalidCharsInJavaClassName(superClassName);
 
         if (invalidChars != null) {
-            validationVisitor.registerWarning(
-                    "ObjEntity Java superclass contains invalid characters: "
-                            + invalidChars,
-                    object);
+            addFailure(
+                    validationResult,
+                    entity,
+                    "ObjEntity '%s' Java superclass '%s' contains invalid characters: %s",
+                    entity.getName(),
+                    superClassName,
+                    invalidChars);
         }
         else if (helper.invalidDataObjectClass(superClassName)) {
-            validationVisitor.registerWarning("ObjEntity Java superclass is invalid: "
-                    + superClassName, object);
+            addFailure(
+                    validationResult,
+                    entity,
+                    "ObjEntity '%s' Java superclass '%s' is a reserved word",
+                    entity.getName(),
+                    superClassName);
         }
 
-        DataMap map = ent.getDataMap();
+        DataMap map = entity.getDataMap();
         if (map == null) {
             return;
         }
     }
 
-    void validateName(ObjEntity entity, Object object, ValidationVisitor validationVisitor) {
+    void validateName(ObjEntity entity, ValidationResult validationResult) {
         String name = entity.getName();
 
         // Must have name
         if (Util.isEmptyString(name)) {
-            validationVisitor.registerError("Unnamed ObjEntity.", object);
+            addFailure(validationResult, entity, "Unnamed ObjEntity");
             return;
         }
 
@@ -121,14 +136,16 @@ class ObjEntityValidator {
             }
 
             if (name.equals(otherEnt.getName())) {
-                validationVisitor.registerError(
-                        "Duplicate ObjEntity name: " + name + ".",
-                        object);
+                addFailure(
+                        validationResult,
+                        entity,
+                        "Duplicate ObjEntity name: '%s'",
+                        name);
                 break;
             }
         }
 
-        // check for dupliucates in other DataMaps
+        // check for duplicates in other DataMaps
         DataChannelDescriptor domain = entity.getDataMap().getDataChannelDescriptor();
         if (domain != null) {
             for (DataMap nextMap : domain.getDataMaps()) {
@@ -141,11 +158,11 @@ class ObjEntityValidator {
 
                     if (!Util.nullSafeEquals(conflictingEntity.getClassName(), entity
                             .getClassName())) {
-                        validationVisitor.registerWarning(
-                                "Duplicate ObjEntity name in another DataMap: "
-                                        + name
-                                        + ".",
-                                object);
+                        addFailure(
+                                validationResult,
+                                entity,
+                                "Duplicate ObjEntity name in another DataMap: '%s'",
+                                name);
                         break;
                     }
                 }

Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjRelationshipValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjRelationshipValidator.java?rev=921861&r1=921860&r2=921861&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjRelationshipValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/validation/ObjRelationshipValidator.java Thu Mar 11 14:19:25 2010
@@ -28,71 +28,88 @@ import org.apache.cayenne.map.DeleteRule
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationResult;
 
-class ObjRelationshipValidator {
+class ObjRelationshipValidator extends ConfigurationNodeValidator {
 
-    void validate(Object object, ValidationVisitor validationVisitor) {
-        ObjRelationship rel = (ObjRelationship) object;
+    void validate(ObjRelationship relationship, ValidationResult validationResult) {
 
-        if (Util.isEmptyString(rel.getName())) {
-            validationVisitor.registerError("Unnamed ObjRelationship.", object);
+        if (Util.isEmptyString(relationship.getName())) {
+            addFailure(validationResult, relationship, "Unnamed ObjRelationship");
         }
+
         // check if there are attributes having the same name
-        else if (rel.getSourceEntity().getAttribute(rel.getName()) != null) {
-            validationVisitor.registerWarning("ObjRelationship "
-                    + objRelationshipIdentifier(rel)
-                    + " has the same name as one of ObjAttributes", object);
+        else if (relationship.getSourceEntity().getAttribute(relationship.getName()) != null) {
+            addFailure(
+                    validationResult,
+                    relationship,
+                    "ObjRelationship '%s' has the same name as one of ObjAttributes",
+                    toString(relationship));
         }
         else {
             NameValidationHelper helper = NameValidationHelper.getInstance();
-            String invalidChars = helper.invalidCharsInObjPathComponent(rel.getName());
+            String invalidChars = helper.invalidCharsInObjPathComponent(relationship
+                    .getName());
 
             if (invalidChars != null) {
-                validationVisitor.registerWarning("ObjRelationship "
-                        + objRelationshipIdentifier(rel)
-                        + " name contains invalid characters: "
-                        + invalidChars, object);
+                addFailure(
+                        validationResult,
+                        relationship,
+                        "ObjRelationship name '%s' contains invalid characters: %s",
+                        toString(relationship),
+                        invalidChars);
             }
-            else if (helper.invalidDataObjectProperty(rel.getName())) {
-                validationVisitor.registerWarning("ObjRelationship "
-                        + objRelationshipIdentifier(rel)
-                        + " name is invalid.", object);
+            else if (helper.invalidDataObjectProperty(relationship.getName())) {
+                addFailure(
+                        validationResult,
+                        relationship,
+                        "ObjRelationship name '%s' is a reserved word",
+                        toString(relationship));
             }
         }
 
-        if (rel.getTargetEntity() == null) {
-            validationVisitor.registerWarning("ObjRelationship "
-                    + objRelationshipIdentifier(rel)
-                    + " has no target entity.", object);
+        if (relationship.getTargetEntity() == null) {
+            addFailure(
+                    validationResult,
+                    relationship,
+                    "ObjRelationship '%s' has no target entity",
+                    toString(relationship));
         }
         else {
+
             // check for missing DbRelationship mappings
-            List<DbRelationship> dbRels = rel.getDbRelationships();
-            if (dbRels.size() == 0) {
-                validationVisitor.registerWarning("ObjRelationship "
-                        + objRelationshipIdentifier(rel)
-                        + " has no DbRelationship mapping.", object);
+            List<DbRelationship> dbRels = relationship.getDbRelationships();
+            if (dbRels.isEmpty()) {
+                addFailure(
+                        validationResult,
+                        relationship,
+                        "ObjRelationship '%s' has no DbRelationship mapping",
+                        toString(relationship));
             }
             else {
-                DbEntity expectedSrc = ((ObjEntity) rel.getSourceEntity()).getDbEntity();
-                DbEntity expectedTarget = ((ObjEntity) rel.getTargetEntity())
+                DbEntity expectedSrc = ((ObjEntity) relationship.getSourceEntity())
+                        .getDbEntity();
+                DbEntity expectedTarget = ((ObjEntity) relationship.getTargetEntity())
                         .getDbEntity();
 
                 if ((dbRels.get(0)).getSourceEntity() != expectedSrc
                         || (dbRels.get(dbRels.size() - 1)).getTargetEntity() != expectedTarget) {
-                    validationVisitor.registerWarning("ObjRelationship "
-                            + objRelationshipIdentifier(rel)
-                            + " has incomplete DbRelationship mapping.", object);
+
+                    addFailure(
+                            validationResult,
+                            relationship,
+                            "ObjRelationship '%s' has incomplete DbRelationship mapping",
+                            toString(relationship));
                 }
             }
         }
 
         // Disallow a Nullify delete rule where the relationship is toMany and the
         // foreign key attributes are mandatory.
-        if (rel.isToMany()
-                && !rel.isFlattened()
-                && (rel.getDeleteRule() == DeleteRule.NULLIFY)) {
-            ObjRelationship inverse = rel.getReverseRelationship();
+        if (relationship.isToMany()
+                && !relationship.isFlattened()
+                && (relationship.getDeleteRule() == DeleteRule.NULLIFY)) {
+            ObjRelationship inverse = relationship.getReverseRelationship();
             if (inverse != null) {
                 DbRelationship firstRel = inverse.getDbRelationships().get(0);
                 Iterator<DbJoin> attributePairIterator = firstRel.getJoins().iterator();
@@ -108,22 +125,22 @@ class ObjRelationshipValidator {
                 }
 
                 if (check) {
-                    validationVisitor
-                            .registerWarning(
-                                    "ObjRelationship "
-                                            + objRelationshipIdentifier(rel)
-                                            + " has a Nullify delete rule and a mandatory reverse relationship ",
-                                    object);
+                    addFailure(
+                            validationResult,
+                            relationship,
+                            "ObjRelationship '%s' has a Nullify delete rule and a mandatory reverse relationship",
+                            toString(relationship));
                 }
             }
         }
     }
 
-    String objRelationshipIdentifier(ObjRelationship rel) {
-        if (null == rel.getSourceEntity()) {
-            return "<[null source entity]." + rel.getName() + ">";
+    private String toString(ObjRelationship relationship) {
+        if (relationship.getSourceEntity() == null) {
+            return "[null source entity]." + relationship.getName();
         }
-        return "<" + rel.getSourceEntity().getName() + "." + rel.getName() + ">";
+
+        return relationship.getSourceEntity().getName() + "." + relationship.getName();
     }
 
 }