[Groonga-commit] groonga/gcs [master] Report both validation errors of domain and index field for Define/DeleteIndexField

Back to archive index

YUKI Hiroshi null+****@clear*****
Mon Nov 26 19:07:32 JST 2012


YUKI Hiroshi	2012-11-26 19:07:32 +0900 (Mon, 26 Nov 2012)

  New Revision: 759fd6bb4ae42a4331a563d7418feb93fa4a81a9
  https://github.com/groonga/gcs/commit/759fd6bb4ae42a4331a563d7418feb93fa4a81a9

  Log:
    Report both validation errors of domain and index field for Define/DeleteIndexField

  Modified files:
    lib/api/2011-02-01/configuration.js
    lib/database/domain.js
    lib/database/index-field.js
    lib/errors.js

  Modified: lib/api/2011-02-01/configuration.js (+67 -18)
===================================================================
--- lib/api/2011-02-01/configuration.js    2012-11-26 18:55:01 +0900 (13cf32d)
+++ lib/api/2011-02-01/configuration.js    2012-11-26 19:07:32 +0900 (0ba29a7)
@@ -313,18 +313,42 @@ function createIndexFieldStatus(options) {
 }
 
 handlers.DefineIndexField = function(context, request, response, config) {
+  var validationErrors = [];
+
   var domainName = request.query.DomainName || '';
-  var domain = handleDomanValidationError(function() {
-        return new Domain(domainName, context).validate();
-      });
-  if (!domain || !domain.exists())
-    throw new errors.ResourceNotFoundError('Domain not found: ' + domainName);
+  var domain;
+  try {
+    handleDomanValidationError(function() {
+      domain = new Domain(domainName, context);
+      domain.validate();
+    });
+  } catch(error) {
+    if (error.isMultiplexed)
+      validationErrors = validationErrors.concat(error.messages);
+    else
+      throw error;
+  }
 
   var fieldName = request.query['IndexField.IndexFieldName'] || '';
   var fieldType = request.query['IndexField.IndexFieldType'] || '';
-  var field = handleIndexFieldValidationError(function() {
-        return domain.getIndexField(fieldName).setType(fieldType).validate();
-      });
+  var field;
+  try {
+    handleIndexFieldValidationError(function() {
+      field = domain.getIndexField(fieldName).setType(fieldType);
+      field.validate();
+    });
+  } catch(error) {
+    if (error.isMultiplexed)
+      validationErrors = validationErrors.concat(error.messages);
+    else
+      throw error;
+  }
+
+  if (!domain || !domain.exists())
+    throw new errors.ResourceNotFoundError('Domain not found: ' + domainName);
+
+  if (validationErrors.length)
+    throw new errors.MultiplexedValidationError(validationErrors);
 
   var textOptions = Object.keys(request.query).filter(function(name) {
         return name.indexOf('IndexField.TextOptions.') == 0;
@@ -363,18 +387,43 @@ handlers.DefineIndexField = function(context, request, response, config) {
 };
 
 handlers.DeleteIndexField = function(context, request, response, config) {
-  var domain = handleDomanValidationError(function() {
-        return new Domain(request.query.DomainName || '', context).validate();
-      });
-  if (!domain || !domain.exists())
-    throw new errors.ResourceNotFoundError('Domain not found: ' + request.query.DomainName);
+  var validationErrors = [];
+
+  var domainName = request.query.DomainName || '';
+  var domain;
+  try {
+    handleDomanValidationError(function() {
+      domain = new Domain(domainName, context);
+      domain.validate();
+    });
+  } catch(error) {
+    if (error.isMultiplexed)
+      validationErrors = validationErrors.concat(error.messages);
+    else
+      throw error;
+  }
 
   var fieldName = request.query['IndexFieldName'] || '';
-  var field = handleIndexFieldValidationError(function() {
-        return domain.getIndexField(fieldName).validateName();
-      }, {
-        NAME_FIELD: 'indexFieldName'
-      });
+  var field;
+  try {
+    handleIndexFieldValidationError(function() {
+      field = domain.getIndexField(fieldName);
+      field.validateName();
+    }, {
+      NAME_FIELD: 'indexFieldName'
+    });
+  } catch(error) {
+    if (error.isMultiplexed)
+      validationErrors = validationErrors.concat(error.messages);
+    else
+      throw error;
+  }
+
+  if (!domain || !domain.exists())
+    throw new errors.ResourceNotFoundError('Domain not found: ' + domainName);
+
+  if (validationErrors.length)
+    throw new errors.MultiplexedValidationError(validationErrors);
 
   var result = null;
   if (field.exists()) {

  Modified: lib/database/domain.js (+2 -6)
===================================================================
--- lib/database/domain.js    2012-11-26 18:55:01 +0900 (3717495)
+++ lib/database/domain.js    2012-11-26 19:07:32 +0900 (0cec73c)
@@ -88,12 +88,8 @@ function assertValidDomainName(domain) {
     errors.push(commonPrefix + 'Member must have length less ' +
                 'than or equal to ' + MAXIMUM_NAME_LENGTH);
 
-  if (errors.length) {
-    var prefix = errors.length > 1 ? 
-                   errors.length + ' validation errors detected: ' :
-                   '1 validation error detected: ';
-    throw new ValidationError(prefix + errors.join('; '));
-  }
+  if (errors.length)
+    throw new MultiplexedValidationError(errors);
 }
 
 

  Modified: lib/database/index-field.js (+4 -12)
===================================================================
--- lib/database/index-field.js    2012-11-26 18:55:01 +0900 (8f9f6e4)
+++ lib/database/index-field.js    2012-11-26 19:07:32 +0900 (fdc21a4)
@@ -158,12 +158,8 @@ IndexField.prototype = {
 
     var errors = collectTypeValidationErrors(this._type)
                    .concat(collectNameValidationErrors(this.name));
-    if (errors.length) {
-      var prefix = errors.length > 1 ? 
-                     errors.length + ' validation errors detected: ' :
-                     '1 validation error detected: ';
-      throw new ValidationError(prefix + errors.join('; '));
-    }
+    if (errors.length)
+      throw new MultiplexedValidationError(errors);
 
     this.validateOptions();
 
@@ -175,12 +171,8 @@ IndexField.prototype = {
       throw new ValidationError('field name must be a string');
 
     var errors = collectNameValidationErrors(this.name);
-    if (errors.length) {
-      var prefix = errors.length > 1 ? 
-                     errors.length + ' validation errors detected: ' :
-                     '1 validation error detected: ';
-      throw new ValidationError(prefix + errors.join('; '));
-    }
+    if (errors.length)
+      throw new MultiplexedValidationError(errors);
 
     return this;
   },

  Modified: lib/errors.js (+15 -0)
===================================================================
--- lib/errors.js    2012-11-26 18:55:01 +0900 (d5be889)
+++ lib/errors.js    2012-11-26 19:07:32 +0900 (e5b93b2)
@@ -8,6 +8,21 @@ function ValidationError(message) {
 }
 exports.ValidationError = ValidationError;
 
+function MultiplexedValidationError(messages) {
+  var prefix = messages.length > 1 ? 
+                 messages.length + ' validation errors detected: ' :
+                 '1 validation error detected: ';
+  var error = new Error(prefix + messages.join('; '));
+  error.isValidationError = true;
+  error.isSenderError = true;
+  error.isMultiplexed = true;
+  error.code = 'ValidationError';
+  error.type = 'ValidationError';
+  error.messages = messages;
+  return error;
+}
+exports.MultiplexedValidationError = MultiplexedValidationError;
+
 function FieldOptionConflictError(message) {
   var error = new Error(message);
   error.isValidationError = true;
-------------- next part --------------
HTML����������������������������...
Télécharger 



More information about the Groonga-commit mailing list
Back to archive index