Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / lib / mcollective / validator.rb
diff --git a/lib/mcollective/validator.rb b/lib/mcollective/validator.rb
new file mode 100644 (file)
index 0000000..f83c606
--- /dev/null
@@ -0,0 +1,80 @@
+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