#
# 
#
# Generated by <a href="http://enunciate.webcohesion.com">Enunciate</a>.
#
require 'json'

# adding necessary json serialization methods to standard classes.
class Object
  def to_jaxb_json_hash
    return self
  end
  def self.from_json o
    return o
  end
end

class String
  def self.from_json o
    return o
  end
end

class Boolean
  def self.from_json o
    return o
  end
end

class Numeric
  def self.from_json o
    return o
  end
end

class Time
  #json time is represented as number of milliseconds since epoch
  def to_jaxb_json_hash
    return (to_i * 1000) + (usec / 1000)
  end
  def self.from_json o
    if o.nil?
      return nil
    else
      return Time.at(o / 1000, (o % 1000) * 1000)
    end
  end
end

class Array
  def to_jaxb_json_hash
    a = Array.new
    each { | _item | a.push _item.to_jaxb_json_hash }
    return a
  end
end

class Hash
  def to_jaxb_json_hash
    h = Hash.new
    each { | _key, _value | h[_key.to_jaxb_json_hash] = _value.to_jaxb_json_hash }
    return h
  end
end

module EnunciateHelpers
  LAMB_CLASS_AWARE = ->(_item) do
    java_clazz = _item['@class']
    clazz_array_parts = java_clazz.split('.')
    short_clazz = clazz_array_parts.pop
    clazz_package = clazz_array_parts.map do |e| e[0] = e.first.capitalize; e end.join("::")
    clazz = clazz_package + "::" + short_clazz
    Object.const_get(clazz).send(:from_json, _item)
  end
end


module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class ResetPasswordRequest 

    # (no documentation provided)
    attr_accessor :username
    # (no documentation provided)
    attr_accessor :applicationUrl

    # the json hash for this ResetPasswordRequest
    def to_jaxb_json_hash
      _h = {}
      _h['username'] = username.to_jaxb_json_hash unless username.nil?
      _h['applicationUrl'] = applicationUrl.to_jaxb_json_hash unless applicationUrl.nil?
      return _h
    end

    # the json (string form) for this ResetPasswordRequest
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this ResetPasswordRequest with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['username'].nil?
          _oa = _o['username']
            if(_oa.is_a? Hash)
              @username = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @username =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @username = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @username.push String.from_json(_item)
                 else
                   @username.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @username = _oa
            end
          end
        if !_o['applicationUrl'].nil?
          _oa = _o['applicationUrl']
            if(_oa.is_a? Hash)
              @applicationUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @applicationUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @applicationUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @applicationUrl.push String.from_json(_item)
                 else
                   @applicationUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @applicationUrl = _oa
            end
          end
    end

    # constructs a ResetPasswordRequest from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class Permission 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :operation
    # (no documentation provided)
    attr_accessor :resource

    # the json hash for this Permission
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['operation'] = operation.to_jaxb_json_hash unless operation.nil?
      _h['resource'] = resource.to_jaxb_json_hash unless resource.nil?
      return _h
    end

    # the json (string form) for this Permission
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this Permission with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['name'].nil?
          _oa = _o['name']
            if(_oa.is_a? Hash)
              @name = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @name =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @name = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @name.push String.from_json(_item)
                 else
                   @name.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @name = _oa
            end
          end
        if !_o['operation'].nil?
          _oa = _o['operation']
            if(_oa.is_a? Hash)
              @operation = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @operation =  Org::Apache::Archiva::Redback::Rest::Api::Model::Operation.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @operation = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @operation.push Org::Apache::Archiva::Redback::Rest::Api::Model::Operation.from_json(_item)
                 else
                   @operation.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @operation = _oa
            end
          end
        if !_o['resource'].nil?
          _oa = _o['resource']
            if(_oa.is_a? Hash)
              @resource = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @resource =  Org::Apache::Archiva::Redback::Rest::Api::Model::Resource.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @resource = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @resource.push Org::Apache::Archiva::Redback::Rest::Api::Model::Resource.from_json(_item)
                 else
                   @resource.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @resource = _oa
            end
          end
    end

    # constructs a Permission from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class Application 

    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :longDescription

    # the json hash for this Application
    def to_jaxb_json_hash
      _h = {}
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      _h['longDescription'] = longDescription.to_jaxb_json_hash unless longDescription.nil?
      return _h
    end

    # the json (string form) for this Application
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this Application with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['version'].nil?
          _oa = _o['version']
            if(_oa.is_a? Hash)
              @version = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @version =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @version = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @version.push String.from_json(_item)
                 else
                   @version.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @version = _oa
            end
          end
        if !_o['id'].nil?
          _oa = _o['id']
            if(_oa.is_a? Hash)
              @id = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @id =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @id = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @id.push String.from_json(_item)
                 else
                   @id.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @id = _oa
            end
          end
        if !_o['description'].nil?
          _oa = _o['description']
            if(_oa.is_a? Hash)
              @description = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @description =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @description = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @description.push String.from_json(_item)
                 else
                   @description.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @description = _oa
            end
          end
        if !_o['longDescription'].nil?
          _oa = _o['longDescription']
            if(_oa.is_a? Hash)
              @longDescription = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @longDescription =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @longDescription = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @longDescription.push String.from_json(_item)
                 else
                   @longDescription.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @longDescription = _oa
            end
          end
    end

    # constructs a Application from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class UserRegistrationRequest 

    # (no documentation provided)
    attr_accessor :user
    # (no documentation provided)
    attr_accessor :applicationUrl

    # the json hash for this UserRegistrationRequest
    def to_jaxb_json_hash
      _h = {}
      _h['user'] = user.to_jaxb_json_hash unless user.nil?
      _h['applicationUrl'] = applicationUrl.to_jaxb_json_hash unless applicationUrl.nil?
      return _h
    end

    # the json (string form) for this UserRegistrationRequest
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this UserRegistrationRequest with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['user'].nil?
          _oa = _o['user']
            if(_oa.is_a? Hash)
              @user = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @user =  Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @user = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @user.push Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_item)
                 else
                   @user.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @user = _oa
            end
          end
        if !_o['applicationUrl'].nil?
          _oa = _o['applicationUrl']
            if(_oa.is_a? Hash)
              @applicationUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @applicationUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @applicationUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @applicationUrl.push String.from_json(_item)
                 else
                   @applicationUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @applicationUrl = _oa
            end
          end
    end

    # constructs a UserRegistrationRequest from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class Operation 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :permanent

    # the json hash for this Operation
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      _h['permanent'] = permanent.to_jaxb_json_hash unless permanent.nil?
      return _h
    end

    # the json (string form) for this Operation
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this Operation with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['name'].nil?
          _oa = _o['name']
            if(_oa.is_a? Hash)
              @name = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @name =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @name = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @name.push String.from_json(_item)
                 else
                   @name.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @name = _oa
            end
          end
        if !_o['description'].nil?
          _oa = _o['description']
            if(_oa.is_a? Hash)
              @description = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @description =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @description = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @description.push String.from_json(_item)
                 else
                   @description.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @description = _oa
            end
          end
        if !_o['permanent'].nil?
          _oa = _o['permanent']
            if(_oa.is_a? Hash)
              @permanent = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @permanent =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @permanent = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @permanent.push Boolean.from_json(_item)
                 else
                   @permanent.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @permanent = _oa
            end
          end
    end

    # constructs a Operation from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class Resource 

    # (no documentation provided)
    attr_accessor :identifier
    # (no documentation provided)
    attr_accessor :pattern
    # (no documentation provided)
    attr_accessor :permanent

    # the json hash for this Resource
    def to_jaxb_json_hash
      _h = {}
      _h['identifier'] = identifier.to_jaxb_json_hash unless identifier.nil?
      _h['pattern'] = pattern.to_jaxb_json_hash unless pattern.nil?
      _h['permanent'] = permanent.to_jaxb_json_hash unless permanent.nil?
      return _h
    end

    # the json (string form) for this Resource
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this Resource with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['identifier'].nil?
          _oa = _o['identifier']
            if(_oa.is_a? Hash)
              @identifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @identifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @identifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @identifier.push String.from_json(_item)
                 else
                   @identifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @identifier = _oa
            end
          end
        if !_o['pattern'].nil?
          _oa = _o['pattern']
            if(_oa.is_a? Hash)
              @pattern = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @pattern =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @pattern = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @pattern.push Boolean.from_json(_item)
                 else
                   @pattern.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @pattern = _oa
            end
          end
        if !_o['permanent'].nil?
          _oa = _o['permanent']
            if(_oa.is_a? Hash)
              @permanent = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @permanent =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @permanent = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @permanent.push Boolean.from_json(_item)
                 else
                   @permanent.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @permanent = _oa
            end
          end
    end

    # constructs a Resource from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class LoginRequest 

    # (no documentation provided)
    attr_accessor :username
    # (no documentation provided)
    attr_accessor :password

    # the json hash for this LoginRequest
    def to_jaxb_json_hash
      _h = {}
      _h['username'] = username.to_jaxb_json_hash unless username.nil?
      _h['password'] = password.to_jaxb_json_hash unless password.nil?
      return _h
    end

    # the json (string form) for this LoginRequest
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this LoginRequest with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['username'].nil?
          _oa = _o['username']
            if(_oa.is_a? Hash)
              @username = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @username =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @username = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @username.push String.from_json(_item)
                 else
                   @username.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @username = _oa
            end
          end
        if !_o['password'].nil?
          _oa = _o['password']
            if(_oa.is_a? Hash)
              @password = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @password =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @password = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @password.push String.from_json(_item)
                 else
                   @password.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @password = _oa
            end
          end
    end

    # constructs a LoginRequest from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class ApplicationRoles 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :globalRoles
    # (no documentation provided)
    attr_accessor :roleTemplates
    # (no documentation provided)
    attr_accessor :resources

    # the json hash for this ApplicationRoles
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      if !globalRoles.nil?
        _ha = Array.new
        globalRoles.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['globalRoles'] = _ha
      end
      if !roleTemplates.nil?
        _ha = Array.new
        roleTemplates.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['roleTemplates'] = _ha
      end
      if !resources.nil?
        _ha = Array.new
        resources.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['resources'] = _ha
      end
      return _h
    end

    # the json (string form) for this ApplicationRoles
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this ApplicationRoles with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['name'].nil?
          _oa = _o['name']
            if(_oa.is_a? Hash)
              @name = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @name =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @name = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @name.push String.from_json(_item)
                 else
                   @name.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @name = _oa
            end
          end
        if !_o['description'].nil?
          _oa = _o['description']
            if(_oa.is_a? Hash)
              @description = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @description =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @description = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @description.push String.from_json(_item)
                 else
                   @description.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @description = _oa
            end
          end
        if !_o['globalRoles'].nil?
          _oa = _o['globalRoles']
            if(_oa.is_a? Hash)
              @globalRoles = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @globalRoles =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @globalRoles = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @globalRoles.push String.from_json(_item)
                 else
                   @globalRoles.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @globalRoles = _oa
            end
          end
        if !_o['roleTemplates'].nil?
          _oa = _o['roleTemplates']
            if(_oa.is_a? Hash)
              @roleTemplates = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @roleTemplates =  Org::Apache::Archiva::Redback::Rest::Api::Model::RoleTemplate.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @roleTemplates = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @roleTemplates.push Org::Apache::Archiva::Redback::Rest::Api::Model::RoleTemplate.from_json(_item)
                 else
                   @roleTemplates.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @roleTemplates = _oa
            end
          end
        if !_o['resources'].nil?
          _oa = _o['resources']
            if(_oa.is_a? Hash)
              @resources = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @resources =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @resources = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @resources.push String.from_json(_item)
                 else
                   @resources.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @resources = _oa
            end
          end
    end

    # constructs a ApplicationRoles from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class RegistrationKey 

    # (no documentation provided)
    attr_accessor :key

    # the json hash for this RegistrationKey
    def to_jaxb_json_hash
      _h = {}
      _h['key'] = key.to_jaxb_json_hash unless key.nil?
      return _h
    end

    # the json (string form) for this RegistrationKey
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this RegistrationKey with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['key'].nil?
          _oa = _o['key']
            if(_oa.is_a? Hash)
              @key = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @key =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @key = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @key.push String.from_json(_item)
                 else
                   @key.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @key = _oa
            end
          end
    end

    # constructs a RegistrationKey from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class LdapGroupMappingUpdateRequest 

    # (no documentation provided)
    attr_accessor :ldapGroupMapping

    # the json hash for this LdapGroupMappingUpdateRequest
    def to_jaxb_json_hash
      _h = {}
      if !ldapGroupMapping.nil?
        _ha = Array.new
        ldapGroupMapping.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['ldapGroupMapping'] = _ha
      end
      return _h
    end

    # the json (string form) for this LdapGroupMappingUpdateRequest
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this LdapGroupMappingUpdateRequest with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['ldapGroupMapping'].nil?
          _oa = _o['ldapGroupMapping']
            if(_oa.is_a? Hash)
              @ldapGroupMapping = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @ldapGroupMapping =  Org::Apache::Archiva::Redback::Rest::Api::Model::LdapGroupMapping.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @ldapGroupMapping = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @ldapGroupMapping.push Org::Apache::Archiva::Redback::Rest::Api::Model::LdapGroupMapping.from_json(_item)
                 else
                   @ldapGroupMapping.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @ldapGroupMapping = _oa
            end
          end
    end

    # constructs a LdapGroupMappingUpdateRequest from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class RoleTemplate 

    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :namePrefix
    # (no documentation provided)
    attr_accessor :delimiter
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :resource
    # (no documentation provided)
    attr_accessor :roles

    # the json hash for this RoleTemplate
    def to_jaxb_json_hash
      _h = {}
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['namePrefix'] = namePrefix.to_jaxb_json_hash unless namePrefix.nil?
      _h['delimiter'] = delimiter.to_jaxb_json_hash unless delimiter.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      _h['resource'] = resource.to_jaxb_json_hash unless resource.nil?
      if !roles.nil?
        _ha = Array.new
        roles.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['roles'] = _ha
      end
      return _h
    end

    # the json (string form) for this RoleTemplate
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this RoleTemplate with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['id'].nil?
          _oa = _o['id']
            if(_oa.is_a? Hash)
              @id = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @id =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @id = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @id.push String.from_json(_item)
                 else
                   @id.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @id = _oa
            end
          end
        if !_o['namePrefix'].nil?
          _oa = _o['namePrefix']
            if(_oa.is_a? Hash)
              @namePrefix = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @namePrefix =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @namePrefix = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @namePrefix.push String.from_json(_item)
                 else
                   @namePrefix.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @namePrefix = _oa
            end
          end
        if !_o['delimiter'].nil?
          _oa = _o['delimiter']
            if(_oa.is_a? Hash)
              @delimiter = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @delimiter =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @delimiter = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @delimiter.push String.from_json(_item)
                 else
                   @delimiter.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @delimiter = _oa
            end
          end
        if !_o['description'].nil?
          _oa = _o['description']
            if(_oa.is_a? Hash)
              @description = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @description =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @description = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @description.push String.from_json(_item)
                 else
                   @description.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @description = _oa
            end
          end
        if !_o['resource'].nil?
          _oa = _o['resource']
            if(_oa.is_a? Hash)
              @resource = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @resource =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @resource = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @resource.push String.from_json(_item)
                 else
                   @resource.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @resource = _oa
            end
          end
        if !_o['roles'].nil?
          _oa = _o['roles']
            if(_oa.is_a? Hash)
              @roles = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @roles =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @roles = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @roles.push String.from_json(_item)
                 else
                   @roles.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @roles = _oa
            end
          end
    end

    # constructs a RoleTemplate from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class Role 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :assignable
    # (no documentation provided)
    attr_accessor :childRoleNames
    # (no documentation provided)
    attr_accessor :permissions
    # (no documentation provided)
    attr_accessor :permanent
    # (no documentation provided)
    attr_accessor :parentRoleNames
    # (no documentation provided)
    attr_accessor :parentsRolesUsers
    # (no documentation provided)
    attr_accessor :users
    # (no documentation provided)
    attr_accessor :otherUsers
    # (no documentation provided)
    attr_accessor :removedUsers

    # the json hash for this Role
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      _h['assignable'] = assignable.to_jaxb_json_hash unless assignable.nil?
      if !childRoleNames.nil?
        _ha = Array.new
        childRoleNames.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['childRoleNames'] = _ha
      end
      if !permissions.nil?
        _ha = Array.new
        permissions.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['permissions'] = _ha
      end
      _h['permanent'] = permanent.to_jaxb_json_hash unless permanent.nil?
      if !parentRoleNames.nil?
        _ha = Array.new
        parentRoleNames.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['parentRoleNames'] = _ha
      end
      if !parentsRolesUsers.nil?
        _ha = Array.new
        parentsRolesUsers.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['parentsRolesUsers'] = _ha
      end
      if !users.nil?
        _ha = Array.new
        users.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['users'] = _ha
      end
      if !otherUsers.nil?
        _ha = Array.new
        otherUsers.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['otherUsers'] = _ha
      end
      if !removedUsers.nil?
        _ha = Array.new
        removedUsers.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['removedUsers'] = _ha
      end
      return _h
    end

    # the json (string form) for this Role
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this Role with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['name'].nil?
          _oa = _o['name']
            if(_oa.is_a? Hash)
              @name = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @name =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @name = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @name.push String.from_json(_item)
                 else
                   @name.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @name = _oa
            end
          end
        if !_o['description'].nil?
          _oa = _o['description']
            if(_oa.is_a? Hash)
              @description = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @description =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @description = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @description.push String.from_json(_item)
                 else
                   @description.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @description = _oa
            end
          end
        if !_o['assignable'].nil?
          _oa = _o['assignable']
            if(_oa.is_a? Hash)
              @assignable = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @assignable =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @assignable = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @assignable.push Boolean.from_json(_item)
                 else
                   @assignable.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @assignable = _oa
            end
          end
        if !_o['childRoleNames'].nil?
          _oa = _o['childRoleNames']
            if(_oa.is_a? Hash)
              @childRoleNames = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @childRoleNames =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @childRoleNames = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @childRoleNames.push String.from_json(_item)
                 else
                   @childRoleNames.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @childRoleNames = _oa
            end
          end
        if !_o['permissions'].nil?
          _oa = _o['permissions']
            if(_oa.is_a? Hash)
              @permissions = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @permissions =  Org::Apache::Archiva::Redback::Rest::Api::Model::Permission.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @permissions = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @permissions.push Org::Apache::Archiva::Redback::Rest::Api::Model::Permission.from_json(_item)
                 else
                   @permissions.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @permissions = _oa
            end
          end
        if !_o['permanent'].nil?
          _oa = _o['permanent']
            if(_oa.is_a? Hash)
              @permanent = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @permanent =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @permanent = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @permanent.push Boolean.from_json(_item)
                 else
                   @permanent.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @permanent = _oa
            end
          end
        if !_o['parentRoleNames'].nil?
          _oa = _o['parentRoleNames']
            if(_oa.is_a? Hash)
              @parentRoleNames = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @parentRoleNames =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @parentRoleNames = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @parentRoleNames.push String.from_json(_item)
                 else
                   @parentRoleNames.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @parentRoleNames = _oa
            end
          end
        if !_o['parentsRolesUsers'].nil?
          _oa = _o['parentsRolesUsers']
            if(_oa.is_a? Hash)
              @parentsRolesUsers = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @parentsRolesUsers =  Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @parentsRolesUsers = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @parentsRolesUsers.push Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_item)
                 else
                   @parentsRolesUsers.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @parentsRolesUsers = _oa
            end
          end
        if !_o['users'].nil?
          _oa = _o['users']
            if(_oa.is_a? Hash)
              @users = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @users =  Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @users = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @users.push Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_item)
                 else
                   @users.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @users = _oa
            end
          end
        if !_o['otherUsers'].nil?
          _oa = _o['otherUsers']
            if(_oa.is_a? Hash)
              @otherUsers = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @otherUsers =  Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @otherUsers = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @otherUsers.push Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_item)
                 else
                   @otherUsers.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @otherUsers = _oa
            end
          end
        if !_o['removedUsers'].nil?
          _oa = _o['removedUsers']
            if(_oa.is_a? Hash)
              @removedUsers = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @removedUsers =  Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @removedUsers = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @removedUsers.push Org::Apache::Archiva::Redback::Rest::Api::Model::User.from_json(_item)
                 else
                   @removedUsers.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @removedUsers = _oa
            end
          end
    end

    # constructs a Role from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class LdapGroupMapping 

    # (no documentation provided)
    attr_accessor :group
    # (no documentation provided)
    attr_accessor :roleNames

    # the json hash for this LdapGroupMapping
    def to_jaxb_json_hash
      _h = {}
      _h['group'] = group.to_jaxb_json_hash unless group.nil?
      if !roleNames.nil?
        _ha = Array.new
        roleNames.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['roleNames'] = _ha
      end
      return _h
    end

    # the json (string form) for this LdapGroupMapping
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this LdapGroupMapping with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['group'].nil?
          _oa = _o['group']
            if(_oa.is_a? Hash)
              @group = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @group =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @group = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @group.push String.from_json(_item)
                 else
                   @group.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @group = _oa
            end
          end
        if !_o['roleNames'].nil?
          _oa = _o['roleNames']
            if(_oa.is_a? Hash)
              @roleNames = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @roleNames =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @roleNames = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @roleNames.push String.from_json(_item)
                 else
                   @roleNames.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @roleNames = _oa
            end
          end
    end

    # constructs a LdapGroupMapping from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class StringList 

    # (no documentation provided)
    attr_accessor :strings

    # the json hash for this StringList
    def to_jaxb_json_hash
      _h = {}
      if !strings.nil?
        _ha = Array.new
        strings.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['strings'] = _ha
      end
      return _h
    end

    # the json (string form) for this StringList
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this StringList with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['strings'].nil?
          _oa = _o['strings']
            if(_oa.is_a? Hash)
              @strings = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @strings =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @strings = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @strings.push String.from_json(_item)
                 else
                   @strings.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @strings = _oa
            end
          end
    end

    # constructs a StringList from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Redback

module Rest

module Api

module Model

  # (no documentation provided)
  class User 

    # (no documentation provided)
    attr_accessor :username
    # (no documentation provided)
    attr_accessor :fullName
    # (no documentation provided)
    attr_accessor :email
    # (no documentation provided)
    attr_accessor :validated
    # (no documentation provided)
    attr_accessor :locked
    # (no documentation provided)
    attr_accessor :password
    # (no documentation provided)
    attr_accessor :passwordChangeRequired
    # (no documentation provided)
    attr_accessor :permanent
    # (no documentation provided)
    attr_accessor :confirmPassword
    # (no documentation provided)
    attr_accessor :timestampAccountCreation
    # (no documentation provided)
    attr_accessor :timestampLastLogin
    # (no documentation provided)
    attr_accessor :timestampLastPasswordChange
    # (no documentation provided)
    attr_accessor :previousPassword
    # (no documentation provided)
    attr_accessor :assignedRoles
    # (no documentation provided)
    attr_accessor :readOnly
    # (no documentation provided)
    attr_accessor :userManagerId
    # (no documentation provided)
    attr_accessor :validationToken

    # the json hash for this User
    def to_jaxb_json_hash
      _h = {}
      _h['username'] = username.to_jaxb_json_hash unless username.nil?
      _h['fullName'] = fullName.to_jaxb_json_hash unless fullName.nil?
      _h['email'] = email.to_jaxb_json_hash unless email.nil?
      _h['validated'] = validated.to_jaxb_json_hash unless validated.nil?
      _h['locked'] = locked.to_jaxb_json_hash unless locked.nil?
      _h['password'] = password.to_jaxb_json_hash unless password.nil?
      _h['passwordChangeRequired'] = passwordChangeRequired.to_jaxb_json_hash unless passwordChangeRequired.nil?
      _h['permanent'] = permanent.to_jaxb_json_hash unless permanent.nil?
      _h['confirmPassword'] = confirmPassword.to_jaxb_json_hash unless confirmPassword.nil?
      _h['timestampAccountCreation'] = timestampAccountCreation.to_jaxb_json_hash unless timestampAccountCreation.nil?
      _h['timestampLastLogin'] = timestampLastLogin.to_jaxb_json_hash unless timestampLastLogin.nil?
      _h['timestampLastPasswordChange'] = timestampLastPasswordChange.to_jaxb_json_hash unless timestampLastPasswordChange.nil?
      _h['previousPassword'] = previousPassword.to_jaxb_json_hash unless previousPassword.nil?
      if !assignedRoles.nil?
        _ha = Array.new
        assignedRoles.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['assignedRoles'] = _ha
      end
      _h['readOnly'] = readOnly.to_jaxb_json_hash unless readOnly.nil?
      _h['userManagerId'] = userManagerId.to_jaxb_json_hash unless userManagerId.nil?
      _h['validationToken'] = validationToken.to_jaxb_json_hash unless validationToken.nil?
      return _h
    end

    # the json (string form) for this User
    def to_json
      to_jaxb_json_hash.to_json
    end

    #initializes this User with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['username'].nil?
          _oa = _o['username']
            if(_oa.is_a? Hash)
              @username = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @username =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @username = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @username.push String.from_json(_item)
                 else
                   @username.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @username = _oa
            end
          end
        if !_o['fullName'].nil?
          _oa = _o['fullName']
            if(_oa.is_a? Hash)
              @fullName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @fullName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @fullName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @fullName.push String.from_json(_item)
                 else
                   @fullName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @fullName = _oa
            end
          end
        if !_o['email'].nil?
          _oa = _o['email']
            if(_oa.is_a? Hash)
              @email = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @email =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @email = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @email.push String.from_json(_item)
                 else
                   @email.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @email = _oa
            end
          end
        if !_o['validated'].nil?
          _oa = _o['validated']
            if(_oa.is_a? Hash)
              @validated = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @validated =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @validated = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @validated.push Boolean.from_json(_item)
                 else
                   @validated.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @validated = _oa
            end
          end
        if !_o['locked'].nil?
          _oa = _o['locked']
            if(_oa.is_a? Hash)
              @locked = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @locked =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @locked = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @locked.push Boolean.from_json(_item)
                 else
                   @locked.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @locked = _oa
            end
          end
        if !_o['password'].nil?
          _oa = _o['password']
            if(_oa.is_a? Hash)
              @password = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @password =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @password = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @password.push String.from_json(_item)
                 else
                   @password.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @password = _oa
            end
          end
        if !_o['passwordChangeRequired'].nil?
          _oa = _o['passwordChangeRequired']
            if(_oa.is_a? Hash)
              @passwordChangeRequired = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @passwordChangeRequired =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @passwordChangeRequired = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @passwordChangeRequired.push Boolean.from_json(_item)
                 else
                   @passwordChangeRequired.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @passwordChangeRequired = _oa
            end
          end
        if !_o['permanent'].nil?
          _oa = _o['permanent']
            if(_oa.is_a? Hash)
              @permanent = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @permanent =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @permanent = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @permanent.push Boolean.from_json(_item)
                 else
                   @permanent.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @permanent = _oa
            end
          end
        if !_o['confirmPassword'].nil?
          _oa = _o['confirmPassword']
            if(_oa.is_a? Hash)
              @confirmPassword = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @confirmPassword =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @confirmPassword = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @confirmPassword.push String.from_json(_item)
                 else
                   @confirmPassword.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @confirmPassword = _oa
            end
          end
        if !_o['timestampAccountCreation'].nil?
          _oa = _o['timestampAccountCreation']
            if(_oa.is_a? Hash)
              @timestampAccountCreation = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timestampAccountCreation =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timestampAccountCreation = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timestampAccountCreation.push String.from_json(_item)
                 else
                   @timestampAccountCreation.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timestampAccountCreation = _oa
            end
          end
        if !_o['timestampLastLogin'].nil?
          _oa = _o['timestampLastLogin']
            if(_oa.is_a? Hash)
              @timestampLastLogin = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timestampLastLogin =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timestampLastLogin = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timestampLastLogin.push String.from_json(_item)
                 else
                   @timestampLastLogin.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timestampLastLogin = _oa
            end
          end
        if !_o['timestampLastPasswordChange'].nil?
          _oa = _o['timestampLastPasswordChange']
            if(_oa.is_a? Hash)
              @timestampLastPasswordChange = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timestampLastPasswordChange =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timestampLastPasswordChange = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timestampLastPasswordChange.push String.from_json(_item)
                 else
                   @timestampLastPasswordChange.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timestampLastPasswordChange = _oa
            end
          end
        if !_o['previousPassword'].nil?
          _oa = _o['previousPassword']
            if(_oa.is_a? Hash)
              @previousPassword = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @previousPassword =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @previousPassword = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @previousPassword.push String.from_json(_item)
                 else
                   @previousPassword.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @previousPassword = _oa
            end
          end
        if !_o['assignedRoles'].nil?
          _oa = _o['assignedRoles']
            if(_oa.is_a? Hash)
              @assignedRoles = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @assignedRoles =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @assignedRoles = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @assignedRoles.push String.from_json(_item)
                 else
                   @assignedRoles.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @assignedRoles = _oa
            end
          end
        if !_o['readOnly'].nil?
          _oa = _o['readOnly']
            if(_oa.is_a? Hash)
              @readOnly = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @readOnly =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @readOnly = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @readOnly.push Boolean.from_json(_item)
                 else
                   @readOnly.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @readOnly = _oa
            end
          end
        if !_o['userManagerId'].nil?
          _oa = _o['userManagerId']
            if(_oa.is_a? Hash)
              @userManagerId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @userManagerId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @userManagerId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @userManagerId.push String.from_json(_item)
                 else
                   @userManagerId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @userManagerId = _oa
            end
          end
        if !_o['validationToken'].nil?
          _oa = _o['validationToken']
            if(_oa.is_a? Hash)
              @validationToken = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @validationToken =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @validationToken = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @validationToken.push String.from_json(_item)
                 else
                   @validationToken.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @validationToken = _oa
            end
          end
    end

    # constructs a User from a (parsed) JSON hash
    def self.from_json(o)
      if o.nil?
        return nil
      else
        inst = new
        inst.init_jaxb_json_hash o
        return inst
      end
    end
  end

end

end

end

end

end

end

end
