+module MCollective
+ module Validator
+ @last_load = nil
+
+ # Loads the validator plugins. Validators will only be loaded every 5 minutes
+ def self.load_validators
+ if load_validators?
+ @last_load = Time.now.to_i
+ PluginManager.find_and_load("validator")
+ end
+ end
+
+ # Returns and instance of the Plugin class from which objects can be created.
+ # Valid plugin names are
+ # :valplugin
+ # "valplugin"
+ # "ValpluginValidator"
+ def self.[](klass)
+ if klass.is_a?(Symbol)
+ klass = validator_class(klass)
+ elsif !(klass.match(/.*Validator$/))
+ klass = validator_class(klass)
+ end
+
+ const_get(klass)
+ end
+
+ # Allows validation plugins to be called like module methods : Validator.validate()
+ def self.method_missing(method, *args, &block)
+ if has_validator?(method)
+ validator = Validator[method].validate(*args)
+ else
+ raise ValidatorError, "Unknown validator: '#{method}'."
+ end
+ end
+
+ def self.has_validator?(validator)
+ const_defined?(validator_class(validator))
+ end
+
+ def self.validator_class(validator)
+ "#{validator.to_s.capitalize}Validator"
+ end
+
+ def self.load_validators?
+ return true if @last_load.nil?
+
+ (@last_load - Time.now.to_i) > 300
+ end
+
+ # Generic validate method that will call the correct validator
+ # plugin based on the type of the validation parameter
+ def self.validate(validator, validation)
+ Validator.load_validators
+
+ begin
+ if [:integer, :boolean, :float, :number, :string].include?(validation)
+ Validator.typecheck(validator, validation)
+
+ else
+ case validation
+ when Regexp,String
+ Validator.regex(validator, validation)
+
+ when Symbol
+ Validator.send(validation, validator)
+
+ when Array
+ Validator.array(validator, validation)
+
+ when Class
+ Validator.typecheck(validator, validation)
+ end
+ end
+ rescue => e
+ raise ValidatorError, e.to_s
+ end
+ end
+ end
+end