class Embulk::DataSource

def self.from_java(java_data_source_impl)

def self.from_java(java_data_source_impl)
  json = java_data_source_impl.toString
  new.merge!(JSON.parse(json))
end

def self.from_ruby_hash(hash)

def self.from_ruby_hash(hash)
  new.merge!(hash)
end

def initialize(hash={}, default=nil, &block)

def initialize(hash={}, default=nil, &block)
  if default.nil?
    super(&block)
  else
    super(default)
  end
  hash.each {|key,value| self[key] = value }
end

def load_config(task_type)

def load_config(task_type)
  Java::Injected::ModelManager.readObjectWithConfigSerDe(task_type.java_class, to_json.to_java)
end

def load_task(task_type)

def load_task(task_type)
  Java::Injected::ModelManager.readObject(task_type.java_class, to_json.to_java)
end

def param(key, type, options={})

def param(key, type, options={})
  if self.has_key?(key)
    v = self[key]
    value =
      case type
      when :integer
        begin
          Integer(v)
        rescue => e
          raise ConfigError.new e
        end
      when :float
        begin
          Float(v)
        rescue => e
          raise ConfigError.new e
        end
      when :string
        begin
          String(v).dup
        rescue => e
          raise ConfigError.new e
        end
      when :bool
        begin
          !!v  # TODO validation
        rescue => e
          raise ConfigError.new e
        end
      when :hash
        raise ConfigError.new "Invalid value for :hash" unless v.is_a?(Hash)
        DataSource.new.merge!(v)
      when :array
        raise ConfigError.new "Invalid value for :array" unless v.is_a?(Array)
        v.dup
      else
        unless type.respond_to?(:load)
          raise ArgumentError, "Unknown type #{type.to_s.dump}"
        end
        begin
          type.load(v)
        rescue => e
          raise ConfigError.new e
        end
      end
  elsif options.has_key?(:default)
    value = options[:default]
  else
    raise ConfigError.new "Required field #{key.to_s.dump} is not set"
  end
  return value
end

def to_java

def to_java
  json = to_json
  Java::Injected::ModelManager.readObject(Java::DataSourceImpl.java_class, json.to_java)
end