#
# 
#
# 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 Rest

module Api

module Model

  # (no documentation provided)
  class QueueEntry 

    # (no documentation provided)
    attr_accessor :key
    # (no documentation provided)
    attr_accessor :entriesNumber

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

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

    #initializes this QueueEntry 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
        if !_o['entriesNumber'].nil?
          _oa = _o['entriesNumber']
            if(_oa.is_a? Hash)
              @entriesNumber = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @entriesNumber =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @entriesNumber = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @entriesNumber.push Fixnum.from_json(_item)
                 else
                   @entriesNumber.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @entriesNumber = _oa
            end
          end
    end

    # constructs a QueueEntry 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class AbstractRepository 

    # (no documentation provided)
    attr_accessor :indexDirectory
    # (no documentation provided)
    attr_accessor :descriptions
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :layout
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :packedIndexDirectory
    # (no documentation provided)
    attr_accessor :names
    # (no documentation provided)
    attr_accessor :type
    # (no documentation provided)
    attr_accessor :description

    # the json hash for this AbstractRepository
    def to_jaxb_json_hash
      _h = {}
      _h['indexDirectory'] = indexDirectory.to_jaxb_json_hash unless indexDirectory.nil?
      _h['descriptions'] = descriptions.to_jaxb_json_hash unless descriptions.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['layout'] = layout.to_jaxb_json_hash unless layout.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['packedIndexDirectory'] = packedIndexDirectory.to_jaxb_json_hash unless packedIndexDirectory.nil?
      _h['names'] = names.to_jaxb_json_hash unless names.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      return _h
    end

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

    #initializes this AbstractRepository with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['indexDirectory'].nil?
          _oa = _o['indexDirectory']
            if(_oa.is_a? Hash)
              @indexDirectory = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @indexDirectory =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @indexDirectory = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @indexDirectory.push String.from_json(_item)
                 else
                   @indexDirectory.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @indexDirectory = _oa
            end
          end
        if !_o['descriptions'].nil?
          _oa = _o['descriptions']
            if(_oa.is_a? Hash)
              @descriptions = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @descriptions =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @descriptions = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @descriptions.push Hash.from_json(_item)
                 else
                   @descriptions.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @descriptions = _oa
            end
          end
        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['layout'].nil?
          _oa = _o['layout']
            if(_oa.is_a? Hash)
              @layout = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @layout =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @layout = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @layout.push String.from_json(_item)
                 else
                   @layout.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @layout = _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['packedIndexDirectory'].nil?
          _oa = _o['packedIndexDirectory']
            if(_oa.is_a? Hash)
              @packedIndexDirectory = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @packedIndexDirectory =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @packedIndexDirectory = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @packedIndexDirectory.push String.from_json(_item)
                 else
                   @packedIndexDirectory.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @packedIndexDirectory = _oa
            end
          end
        if !_o['names'].nil?
          _oa = _o['names']
            if(_oa.is_a? Hash)
              @names = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @names =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @names = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @names.push Hash.from_json(_item)
                 else
                   @names.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @names = _oa
            end
          end
        if !_o['type'].nil?
          _oa = _o['type']
            if(_oa.is_a? Hash)
              @type = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @type =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @type = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @type.push String.from_json(_item)
                 else
                   @type.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @type = _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
    end

    # constructs a AbstractRepository 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class UiConfiguration 

    # (no documentation provided)
    attr_accessor :showFindArtifacts
    # (no documentation provided)
    attr_accessor :appletFindEnabled
    # (no documentation provided)
    attr_accessor :disableEasterEggs
    # (no documentation provided)
    attr_accessor :applicationUrl
    # (no documentation provided)
    attr_accessor :disableRegistration

    # the json hash for this UiConfiguration
    def to_jaxb_json_hash
      _h = {}
      _h['showFindArtifacts'] = showFindArtifacts.to_jaxb_json_hash unless showFindArtifacts.nil?
      _h['appletFindEnabled'] = appletFindEnabled.to_jaxb_json_hash unless appletFindEnabled.nil?
      _h['disableEasterEggs'] = disableEasterEggs.to_jaxb_json_hash unless disableEasterEggs.nil?
      _h['applicationUrl'] = applicationUrl.to_jaxb_json_hash unless applicationUrl.nil?
      _h['disableRegistration'] = disableRegistration.to_jaxb_json_hash unless disableRegistration.nil?
      return _h
    end

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

    #initializes this UiConfiguration with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['showFindArtifacts'].nil?
          _oa = _o['showFindArtifacts']
            if(_oa.is_a? Hash)
              @showFindArtifacts = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @showFindArtifacts =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @showFindArtifacts = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @showFindArtifacts.push Boolean.from_json(_item)
                 else
                   @showFindArtifacts.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @showFindArtifacts = _oa
            end
          end
        if !_o['appletFindEnabled'].nil?
          _oa = _o['appletFindEnabled']
            if(_oa.is_a? Hash)
              @appletFindEnabled = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @appletFindEnabled =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @appletFindEnabled = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @appletFindEnabled.push Boolean.from_json(_item)
                 else
                   @appletFindEnabled.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @appletFindEnabled = _oa
            end
          end
        if !_o['disableEasterEggs'].nil?
          _oa = _o['disableEasterEggs']
            if(_oa.is_a? Hash)
              @disableEasterEggs = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @disableEasterEggs =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @disableEasterEggs = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @disableEasterEggs.push Boolean.from_json(_item)
                 else
                   @disableEasterEggs.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @disableEasterEggs = _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
        if !_o['disableRegistration'].nil?
          _oa = _o['disableRegistration']
            if(_oa.is_a? Hash)
              @disableRegistration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @disableRegistration =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @disableRegistration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @disableRegistration.push Boolean.from_json(_item)
                 else
                   @disableRegistration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @disableRegistration = _oa
            end
          end
    end

    # constructs a UiConfiguration 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

module Org

module Apache

module Archiva

module Metadata

module Model

module Facets

  # (no documentation provided)
  class RepositoryProblemFacet 

    # (no documentation provided)
    attr_accessor :namespace
    # (no documentation provided)
    attr_accessor :message
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :problem
    # (no documentation provided)
    attr_accessor :project
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :facetId

    # the json hash for this RepositoryProblemFacet
    def to_jaxb_json_hash
      _h = {}
      _h['namespace'] = namespace.to_jaxb_json_hash unless namespace.nil?
      _h['message'] = message.to_jaxb_json_hash unless message.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['problem'] = problem.to_jaxb_json_hash unless problem.nil?
      _h['project'] = project.to_jaxb_json_hash unless project.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['facetId'] = facetId.to_jaxb_json_hash unless facetId.nil?
      return _h
    end

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

    #initializes this RepositoryProblemFacet with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['namespace'].nil?
          _oa = _o['namespace']
            if(_oa.is_a? Hash)
              @namespace = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @namespace =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @namespace = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @namespace.push String.from_json(_item)
                 else
                   @namespace.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @namespace = _oa
            end
          end
        if !_o['message'].nil?
          _oa = _o['message']
            if(_oa.is_a? Hash)
              @message = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @message =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @message = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @message.push String.from_json(_item)
                 else
                   @message.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @message = _oa
            end
          end
        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['problem'].nil?
          _oa = _o['problem']
            if(_oa.is_a? Hash)
              @problem = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @problem =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @problem = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @problem.push String.from_json(_item)
                 else
                   @problem.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @problem = _oa
            end
          end
        if !_o['project'].nil?
          _oa = _o['project']
            if(_oa.is_a? Hash)
              @project = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @project =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @project = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @project.push String.from_json(_item)
                 else
                   @project.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @project = _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['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['repositoryId'].nil?
          _oa = _o['repositoryId']
            if(_oa.is_a? Hash)
              @repositoryId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositoryId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositoryId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositoryId.push String.from_json(_item)
                 else
                   @repositoryId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositoryId = _oa
            end
          end
        if !_o['facetId'].nil?
          _oa = _o['facetId']
            if(_oa.is_a? Hash)
              @facetId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @facetId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @facetId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @facetId.push String.from_json(_item)
                 else
                   @facetId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @facetId = _oa
            end
          end
    end

    # constructs a RepositoryProblemFacet 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ConsumerScanningStatistics 

    # (no documentation provided)
    attr_accessor :consumerKey
    # (no documentation provided)
    attr_accessor :count
    # (no documentation provided)
    attr_accessor :time
    # (no documentation provided)
    attr_accessor :average

    # the json hash for this ConsumerScanningStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['consumerKey'] = consumerKey.to_jaxb_json_hash unless consumerKey.nil?
      _h['count'] = count.to_jaxb_json_hash unless count.nil?
      _h['time'] = time.to_jaxb_json_hash unless time.nil?
      _h['average'] = average.to_jaxb_json_hash unless average.nil?
      return _h
    end

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

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

    # constructs a ConsumerScanningStatistics 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class CacheConfiguration 

    # (no documentation provided)
    attr_accessor :timeToIdleSeconds
    # (no documentation provided)
    attr_accessor :timeToLiveSeconds
    # (no documentation provided)
    attr_accessor :maxElementsInMemory
    # (no documentation provided)
    attr_accessor :maxElementsOnDisk

    # the json hash for this CacheConfiguration
    def to_jaxb_json_hash
      _h = {}
      _h['timeToIdleSeconds'] = timeToIdleSeconds.to_jaxb_json_hash unless timeToIdleSeconds.nil?
      _h['timeToLiveSeconds'] = timeToLiveSeconds.to_jaxb_json_hash unless timeToLiveSeconds.nil?
      _h['maxElementsInMemory'] = maxElementsInMemory.to_jaxb_json_hash unless maxElementsInMemory.nil?
      _h['maxElementsOnDisk'] = maxElementsOnDisk.to_jaxb_json_hash unless maxElementsOnDisk.nil?
      return _h
    end

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

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

    # constructs a CacheConfiguration 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

module Org

module Apache

module Archiva

module Repository

module Scanner

  # (no documentation provided)
  class RepositoryScanStatistics 

    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :newFileCount
    # (no documentation provided)
    attr_accessor :totalSize
    # (no documentation provided)
    attr_accessor :duration
    # (no documentation provided)
    attr_accessor :whenGathered
    # (no documentation provided)
    attr_accessor :totalFileCount

    # the json hash for this RepositoryScanStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['newFileCount'] = newFileCount.to_jaxb_json_hash unless newFileCount.nil?
      _h['totalSize'] = totalSize.to_jaxb_json_hash unless totalSize.nil?
      _h['duration'] = duration.to_jaxb_json_hash unless duration.nil?
      _h['whenGathered'] = whenGathered.to_jaxb_json_hash unless whenGathered.nil?
      _h['totalFileCount'] = totalFileCount.to_jaxb_json_hash unless totalFileCount.nil?
      return _h
    end

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

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

    # constructs a RepositoryScanStatistics 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class CiManagement 

    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :system

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

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

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

    # constructs a CiManagement 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class IssueManagement 

    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :system

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

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

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

    # constructs a IssueManagement 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class ArchivaRuntimeConfiguration 

    # (no documentation provided)
    attr_accessor :urlFailureCacheConfiguration
    # (no documentation provided)
    attr_accessor :fileLockConfiguration

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

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

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

    # constructs a ArchivaRuntimeConfiguration 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class PolicyInformation 

    # (no documentation provided)
    attr_accessor :options
    # (no documentation provided)
    attr_accessor :defaultOption
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :name

    # the json hash for this PolicyInformation
    def to_jaxb_json_hash
      _h = {}
      if !options.nil?
        _ha = Array.new
        options.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['options'] = _ha
      end
      _h['defaultOption'] = defaultOption.to_jaxb_json_hash unless defaultOption.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      return _h
    end

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

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

    # constructs a PolicyInformation 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class Dependency 

    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :type
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :optional
    # (no documentation provided)
    attr_accessor :scope
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :systemPath

    # the json hash for this Dependency
    def to_jaxb_json_hash
      _h = {}
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['optional'] = optional.to_jaxb_json_hash unless optional.nil?
      _h['scope'] = scope.to_jaxb_json_hash unless scope.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['systemPath'] = systemPath.to_jaxb_json_hash unless systemPath.nil?
      return _h
    end

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

    #initializes this Dependency with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['artifactId'].nil?
          _oa = _o['artifactId']
            if(_oa.is_a? Hash)
              @artifactId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifactId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifactId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifactId.push String.from_json(_item)
                 else
                   @artifactId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifactId = _oa
            end
          end
        if !_o['type'].nil?
          _oa = _o['type']
            if(_oa.is_a? Hash)
              @type = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @type =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @type = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @type.push String.from_json(_item)
                 else
                   @type.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @type = _oa
            end
          end
        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['optional'].nil?
          _oa = _o['optional']
            if(_oa.is_a? Hash)
              @optional = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @optional =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @optional = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @optional.push Boolean.from_json(_item)
                 else
                   @optional.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @optional = _oa
            end
          end
        if !_o['scope'].nil?
          _oa = _o['scope']
            if(_oa.is_a? Hash)
              @scope = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scope =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scope = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scope.push String.from_json(_item)
                 else
                   @scope.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scope = _oa
            end
          end
        if !_o['classifier'].nil?
          _oa = _o['classifier']
            if(_oa.is_a? Hash)
              @classifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @classifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @classifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @classifier.push String.from_json(_item)
                 else
                   @classifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @classifier = _oa
            end
          end
        if !_o['groupId'].nil?
          _oa = _o['groupId']
            if(_oa.is_a? Hash)
              @groupId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @groupId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @groupId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @groupId.push String.from_json(_item)
                 else
                   @groupId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @groupId = _oa
            end
          end
        if !_o['systemPath'].nil?
          _oa = _o['systemPath']
            if(_oa.is_a? Hash)
              @systemPath = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @systemPath =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @systemPath = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @systemPath.push String.from_json(_item)
                 else
                   @systemPath.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @systemPath = _oa
            end
          end
    end

    # constructs a Dependency 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class RepositoryGroup 

    # String
    attr_accessor :id
    # List
    attr_accessor :repositories
    # (no documentation provided)
    attr_accessor :mergedIndexPath
    # (no documentation provided)
    attr_accessor :mergedIndexTtl
    # (no documentation provided)
    attr_accessor :cronExpression

    # the json hash for this RepositoryGroup
    def to_jaxb_json_hash
      _h = {}
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      if !repositories.nil?
        _ha = Array.new
        repositories.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['repositories'] = _ha
      end
      _h['mergedIndexPath'] = mergedIndexPath.to_jaxb_json_hash unless mergedIndexPath.nil?
      _h['mergedIndexTtl'] = mergedIndexTtl.to_jaxb_json_hash unless mergedIndexTtl.nil?
      _h['cronExpression'] = cronExpression.to_jaxb_json_hash unless cronExpression.nil?
      return _h
    end

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

    #initializes this RepositoryGroup 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['repositories'].nil?
          _oa = _o['repositories']
            if(_oa.is_a? Hash)
              @repositories = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositories =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositories = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositories.push String.from_json(_item)
                 else
                   @repositories.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositories = _oa
            end
          end
        if !_o['mergedIndexPath'].nil?
          _oa = _o['mergedIndexPath']
            if(_oa.is_a? Hash)
              @mergedIndexPath = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @mergedIndexPath =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @mergedIndexPath = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @mergedIndexPath.push String.from_json(_item)
                 else
                   @mergedIndexPath.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @mergedIndexPath = _oa
            end
          end
        if !_o['mergedIndexTtl'].nil?
          _oa = _o['mergedIndexTtl']
            if(_oa.is_a? Hash)
              @mergedIndexTtl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @mergedIndexTtl =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @mergedIndexTtl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @mergedIndexTtl.push Fixnum.from_json(_item)
                 else
                   @mergedIndexTtl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @mergedIndexTtl = _oa
            end
          end
        if !_o['cronExpression'].nil?
          _oa = _o['cronExpression']
            if(_oa.is_a? Hash)
              @cronExpression = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cronExpression =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cronExpression = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cronExpression.push String.from_json(_item)
                 else
                   @cronExpression.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cronExpression = _oa
            end
          end
    end

    # constructs a RepositoryGroup 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class MetadataFacet 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :facetId

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

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

    #initializes this MetadataFacet 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['facetId'].nil?
          _oa = _o['facetId']
            if(_oa.is_a? Hash)
              @facetId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @facetId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @facetId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @facetId.push String.from_json(_item)
                 else
                   @facetId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @facetId = _oa
            end
          end
    end

    # constructs a MetadataFacet 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class NetworkProxy 

    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :protocol
    # (no documentation provided)
    attr_accessor :host
    # (no documentation provided)
    attr_accessor :port
    # (no documentation provided)
    attr_accessor :username
    # (no documentation provided)
    attr_accessor :password
    # (no documentation provided)
    attr_accessor :useNtlm

    # the json hash for this NetworkProxy
    def to_jaxb_json_hash
      _h = {}
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['protocol'] = protocol.to_jaxb_json_hash unless protocol.nil?
      _h['host'] = host.to_jaxb_json_hash unless host.nil?
      _h['port'] = port.to_jaxb_json_hash unless port.nil?
      _h['username'] = username.to_jaxb_json_hash unless username.nil?
      _h['password'] = password.to_jaxb_json_hash unless password.nil?
      _h['useNtlm'] = useNtlm.to_jaxb_json_hash unless useNtlm.nil?
      return _h
    end

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

    #initializes this NetworkProxy 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['protocol'].nil?
          _oa = _o['protocol']
            if(_oa.is_a? Hash)
              @protocol = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @protocol =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @protocol = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @protocol.push String.from_json(_item)
                 else
                   @protocol.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @protocol = _oa
            end
          end
        if !_o['host'].nil?
          _oa = _o['host']
            if(_oa.is_a? Hash)
              @host = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @host =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @host = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @host.push String.from_json(_item)
                 else
                   @host.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @host = _oa
            end
          end
        if !_o['port'].nil?
          _oa = _o['port']
            if(_oa.is_a? Hash)
              @port = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @port =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @port = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @port.push Fixnum.from_json(_item)
                 else
                   @port.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @port = _oa
            end
          end
        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
        if !_o['useNtlm'].nil?
          _oa = _o['useNtlm']
            if(_oa.is_a? Hash)
              @useNtlm = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @useNtlm =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @useNtlm = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @useNtlm.push Boolean.from_json(_item)
                 else
                   @useNtlm.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @useNtlm = _oa
            end
          end
    end

    # constructs a NetworkProxy 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

module Org

module Apache

module Archiva

module Metadata

module Repository

module Stats

module Model

  # (no documentation provided)
  class RepositoryStatistics 

    # (no documentation provided)
    attr_accessor :totalArtifactFileSize
    # (no documentation provided)
    attr_accessor :totalCountForType
    # (no documentation provided)
    attr_accessor :totalArtifactCount
    # (no documentation provided)
    attr_accessor :duration
    # (no documentation provided)
    attr_accessor :scanEndTime
    # (no documentation provided)
    attr_accessor :totalGroupCount
    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :scanStartTime
    # (no documentation provided)
    attr_accessor :totalProjectCount
    # (no documentation provided)
    attr_accessor :newFileCount
    # (no documentation provided)
    attr_accessor :totalFileCount

    # the json hash for this RepositoryStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['totalArtifactFileSize'] = totalArtifactFileSize.to_jaxb_json_hash unless totalArtifactFileSize.nil?
      _h['totalCountForType'] = totalCountForType.to_jaxb_json_hash unless totalCountForType.nil?
      _h['totalArtifactCount'] = totalArtifactCount.to_jaxb_json_hash unless totalArtifactCount.nil?
      _h['duration'] = duration.to_jaxb_json_hash unless duration.nil?
      _h['scanEndTime'] = scanEndTime.to_jaxb_json_hash unless scanEndTime.nil?
      _h['totalGroupCount'] = totalGroupCount.to_jaxb_json_hash unless totalGroupCount.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['scanStartTime'] = scanStartTime.to_jaxb_json_hash unless scanStartTime.nil?
      _h['totalProjectCount'] = totalProjectCount.to_jaxb_json_hash unless totalProjectCount.nil?
      _h['newFileCount'] = newFileCount.to_jaxb_json_hash unless newFileCount.nil?
      _h['totalFileCount'] = totalFileCount.to_jaxb_json_hash unless totalFileCount.nil?
      return _h
    end

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

    #initializes this RepositoryStatistics with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['totalArtifactFileSize'].nil?
          _oa = _o['totalArtifactFileSize']
            if(_oa.is_a? Hash)
              @totalArtifactFileSize = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalArtifactFileSize =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalArtifactFileSize = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalArtifactFileSize.push Bignum.from_json(_item)
                 else
                   @totalArtifactFileSize.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalArtifactFileSize = _oa
            end
          end
        if !_o['totalCountForType'].nil?
          _oa = _o['totalCountForType']
            if(_oa.is_a? Hash)
              @totalCountForType = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalCountForType =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalCountForType = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalCountForType.push Hash.from_json(_item)
                 else
                   @totalCountForType.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalCountForType = _oa
            end
          end
        if !_o['totalArtifactCount'].nil?
          _oa = _o['totalArtifactCount']
            if(_oa.is_a? Hash)
              @totalArtifactCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalArtifactCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalArtifactCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalArtifactCount.push Bignum.from_json(_item)
                 else
                   @totalArtifactCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalArtifactCount = _oa
            end
          end
        if !_o['duration'].nil?
          _oa = _o['duration']
            if(_oa.is_a? Hash)
              @duration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @duration =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @duration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @duration.push Bignum.from_json(_item)
                 else
                   @duration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @duration = _oa
            end
          end
        if !_o['scanEndTime'].nil?
          _oa = _o['scanEndTime']
            if(_oa.is_a? Hash)
              @scanEndTime = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scanEndTime =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scanEndTime = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scanEndTime.push Time.from_json(_item)
                 else
                   @scanEndTime.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scanEndTime = _oa
            end
          end
        if !_o['totalGroupCount'].nil?
          _oa = _o['totalGroupCount']
            if(_oa.is_a? Hash)
              @totalGroupCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalGroupCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalGroupCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalGroupCount.push Bignum.from_json(_item)
                 else
                   @totalGroupCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalGroupCount = _oa
            end
          end
        if !_o['repositoryId'].nil?
          _oa = _o['repositoryId']
            if(_oa.is_a? Hash)
              @repositoryId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositoryId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositoryId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositoryId.push String.from_json(_item)
                 else
                   @repositoryId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositoryId = _oa
            end
          end
        if !_o['scanStartTime'].nil?
          _oa = _o['scanStartTime']
            if(_oa.is_a? Hash)
              @scanStartTime = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scanStartTime =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scanStartTime = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scanStartTime.push Time.from_json(_item)
                 else
                   @scanStartTime.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scanStartTime = _oa
            end
          end
        if !_o['totalProjectCount'].nil?
          _oa = _o['totalProjectCount']
            if(_oa.is_a? Hash)
              @totalProjectCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalProjectCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalProjectCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalProjectCount.push Bignum.from_json(_item)
                 else
                   @totalProjectCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalProjectCount = _oa
            end
          end
        if !_o['newFileCount'].nil?
          _oa = _o['newFileCount']
            if(_oa.is_a? Hash)
              @newFileCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @newFileCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @newFileCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @newFileCount.push Bignum.from_json(_item)
                 else
                   @newFileCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @newFileCount = _oa
            end
          end
        if !_o['totalFileCount'].nil?
          _oa = _o['totalFileCount']
            if(_oa.is_a? Hash)
              @totalFileCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalFileCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalFileCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalFileCount.push Bignum.from_json(_item)
                 else
                   @totalFileCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalFileCount = _oa
            end
          end
    end

    # constructs a RepositoryStatistics 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 Admin

module Model

module Beans

  # (no documentation provided)
  class LegacyArtifactPath 

    # (no documentation provided)
    attr_accessor :path
    # (no documentation provided)
    attr_accessor :artifact
    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :type

    # the json hash for this LegacyArtifactPath
    def to_jaxb_json_hash
      _h = {}
      _h['path'] = path.to_jaxb_json_hash unless path.nil?
      _h['artifact'] = artifact.to_jaxb_json_hash unless artifact.nil?
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      return _h
    end

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

    #initializes this LegacyArtifactPath with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['path'].nil?
          _oa = _o['path']
            if(_oa.is_a? Hash)
              @path = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @path =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @path = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @path.push String.from_json(_item)
                 else
                   @path.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @path = _oa
            end
          end
        if !_o['artifact'].nil?
          _oa = _o['artifact']
            if(_oa.is_a? Hash)
              @artifact = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifact =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifact = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifact.push String.from_json(_item)
                 else
                   @artifact.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifact = _oa
            end
          end
        if !_o['groupId'].nil?
          _oa = _o['groupId']
            if(_oa.is_a? Hash)
              @groupId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @groupId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @groupId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @groupId.push String.from_json(_item)
                 else
                   @groupId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @groupId = _oa
            end
          end
        if !_o['artifactId'].nil?
          _oa = _o['artifactId']
            if(_oa.is_a? Hash)
              @artifactId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifactId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifactId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifactId.push String.from_json(_item)
                 else
                   @artifactId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifactId = _oa
            end
          end
        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['classifier'].nil?
          _oa = _o['classifier']
            if(_oa.is_a? Hash)
              @classifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @classifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @classifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @classifier.push String.from_json(_item)
                 else
                   @classifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @classifier = _oa
            end
          end
        if !_o['type'].nil?
          _oa = _o['type']
            if(_oa.is_a? Hash)
              @type = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @type =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @type = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @type.push String.from_json(_item)
                 else
                   @type.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @type = _oa
            end
          end
    end

    # constructs a LegacyArtifactPath 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

module Org

module Apache

module Archiva

module Web

module Model

  # (no documentation provided)
  class ApplicationRuntimeInfo 

    # (no documentation provided)
    attr_accessor :devMode
    # (no documentation provided)
    attr_accessor :javascriptLog
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :buildNumber
    # (no documentation provided)
    attr_accessor :timestamp
    # (no documentation provided)
    attr_accessor :copyrightRange
    # (no documentation provided)
    attr_accessor :logMissingI18n
    # (no documentation provided)
    attr_accessor :baseUrl
    # (no documentation provided)
    attr_accessor :timestampStr
    # (no documentation provided)
    attr_accessor :cookieInformation

    # the json hash for this ApplicationRuntimeInfo
    def to_jaxb_json_hash
      _h = {}
      _h['devMode'] = devMode.to_jaxb_json_hash unless devMode.nil?
      _h['javascriptLog'] = javascriptLog.to_jaxb_json_hash unless javascriptLog.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['buildNumber'] = buildNumber.to_jaxb_json_hash unless buildNumber.nil?
      _h['timestamp'] = timestamp.to_jaxb_json_hash unless timestamp.nil?
      _h['copyrightRange'] = copyrightRange.to_jaxb_json_hash unless copyrightRange.nil?
      _h['logMissingI18n'] = logMissingI18n.to_jaxb_json_hash unless logMissingI18n.nil?
      _h['baseUrl'] = baseUrl.to_jaxb_json_hash unless baseUrl.nil?
      _h['timestampStr'] = timestampStr.to_jaxb_json_hash unless timestampStr.nil?
      _h['cookieInformation'] = cookieInformation.to_jaxb_json_hash unless cookieInformation.nil?
      return _h
    end

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

    #initializes this ApplicationRuntimeInfo with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['devMode'].nil?
          _oa = _o['devMode']
            if(_oa.is_a? Hash)
              @devMode = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @devMode =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @devMode = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @devMode.push Boolean.from_json(_item)
                 else
                   @devMode.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @devMode = _oa
            end
          end
        if !_o['javascriptLog'].nil?
          _oa = _o['javascriptLog']
            if(_oa.is_a? Hash)
              @javascriptLog = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @javascriptLog =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @javascriptLog = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @javascriptLog.push Boolean.from_json(_item)
                 else
                   @javascriptLog.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @javascriptLog = _oa
            end
          end
        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['buildNumber'].nil?
          _oa = _o['buildNumber']
            if(_oa.is_a? Hash)
              @buildNumber = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @buildNumber =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @buildNumber = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @buildNumber.push String.from_json(_item)
                 else
                   @buildNumber.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @buildNumber = _oa
            end
          end
        if !_o['timestamp'].nil?
          _oa = _o['timestamp']
            if(_oa.is_a? Hash)
              @timestamp = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timestamp =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timestamp = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timestamp.push Bignum.from_json(_item)
                 else
                   @timestamp.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timestamp = _oa
            end
          end
        if !_o['copyrightRange'].nil?
          _oa = _o['copyrightRange']
            if(_oa.is_a? Hash)
              @copyrightRange = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @copyrightRange =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @copyrightRange = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @copyrightRange.push String.from_json(_item)
                 else
                   @copyrightRange.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @copyrightRange = _oa
            end
          end
        if !_o['logMissingI18n'].nil?
          _oa = _o['logMissingI18n']
            if(_oa.is_a? Hash)
              @logMissingI18n = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @logMissingI18n =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @logMissingI18n = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @logMissingI18n.push Boolean.from_json(_item)
                 else
                   @logMissingI18n.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @logMissingI18n = _oa
            end
          end
        if !_o['baseUrl'].nil?
          _oa = _o['baseUrl']
            if(_oa.is_a? Hash)
              @baseUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @baseUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @baseUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @baseUrl.push String.from_json(_item)
                 else
                   @baseUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @baseUrl = _oa
            end
          end
        if !_o['timestampStr'].nil?
          _oa = _o['timestampStr']
            if(_oa.is_a? Hash)
              @timestampStr = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timestampStr =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timestampStr = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timestampStr.push String.from_json(_item)
                 else
                   @timestampStr.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timestampStr = _oa
            end
          end
        if !_o['cookieInformation'].nil?
          _oa = _o['cookieInformation']
            if(_oa.is_a? Hash)
              @cookieInformation = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cookieInformation =  Org::Apache::Archiva::Web::Model::CookieInformation.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cookieInformation = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cookieInformation.push Org::Apache::Archiva::Web::Model::CookieInformation.from_json(_item)
                 else
                   @cookieInformation.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cookieInformation = _oa
            end
          end
    end

    # constructs a ApplicationRuntimeInfo 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class Entry 

    # (no documentation provided)
    attr_accessor :key
    # (no documentation provided)
    attr_accessor :value

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

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

    #initializes this Entry 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
        if !_o['value'].nil?
          _oa = _o['value']
            if(_oa.is_a? Hash)
              @value = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @value =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @value = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @value.push String.from_json(_item)
                 else
                   @value.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @value = _oa
            end
          end
    end

    # constructs a Entry 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

module Org

module Apache

module Archiva

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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class RedbackImplementationsInformations 

    # (no documentation provided)
    attr_accessor :userManagerImplementationInformations
    # (no documentation provided)
    attr_accessor :rbacManagerImplementationInformations

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

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

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

    # constructs a RedbackImplementationsInformations 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class AdminRepositoryConsumer 

    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :enabled

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

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

    #initializes this AdminRepositoryConsumer with a json hash
    def init_jaxb_json_hash(_o)
        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['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['enabled'].nil?
          _oa = _o['enabled']
            if(_oa.is_a? Hash)
              @enabled = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @enabled =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @enabled = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @enabled.push Boolean.from_json(_item)
                 else
                   @enabled.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @enabled = _oa
            end
          end
    end

    # constructs a AdminRepositoryConsumer 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class Scm 

    # (no documentation provided)
    attr_accessor :developerConnection
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :connection

    # the json hash for this Scm
    def to_jaxb_json_hash
      _h = {}
      _h['developerConnection'] = developerConnection.to_jaxb_json_hash unless developerConnection.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['connection'] = connection.to_jaxb_json_hash unless connection.nil?
      return _h
    end

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

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

    # constructs a Scm 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class OrganisationInformation 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :logoLocation

    # the json hash for this OrganisationInformation
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['logoLocation'] = logoLocation.to_jaxb_json_hash unless logoLocation.nil?
      return _h
    end

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

    #initializes this OrganisationInformation 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['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
        if !_o['logoLocation'].nil?
          _oa = _o['logoLocation']
            if(_oa.is_a? Hash)
              @logoLocation = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @logoLocation =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @logoLocation = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @logoLocation.push String.from_json(_item)
                 else
                   @logoLocation.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @logoLocation = _oa
            end
          end
    end

    # constructs a OrganisationInformation 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ArchivaRepositoryStatistics 

    # (no documentation provided)
    attr_accessor :scanEndTime
    # (no documentation provided)
    attr_accessor :scanStartTime
    # (no documentation provided)
    attr_accessor :totalArtifactCount
    # (no documentation provided)
    attr_accessor :totalArtifactFileSize
    # (no documentation provided)
    attr_accessor :totalFileCount
    # (no documentation provided)
    attr_accessor :totalGroupCount
    # (no documentation provided)
    attr_accessor :totalProjectCount
    # (no documentation provided)
    attr_accessor :newFileCount
    # (no documentation provided)
    attr_accessor :duration
    # (no documentation provided)
    attr_accessor :lastScanDate
    # (no documentation provided)
    attr_accessor :totalCountForType
    # (no documentation provided)
    attr_accessor :customValues

    # the json hash for this ArchivaRepositoryStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['scanEndTime'] = scanEndTime.to_jaxb_json_hash unless scanEndTime.nil?
      _h['scanStartTime'] = scanStartTime.to_jaxb_json_hash unless scanStartTime.nil?
      _h['totalArtifactCount'] = totalArtifactCount.to_jaxb_json_hash unless totalArtifactCount.nil?
      _h['totalArtifactFileSize'] = totalArtifactFileSize.to_jaxb_json_hash unless totalArtifactFileSize.nil?
      _h['totalFileCount'] = totalFileCount.to_jaxb_json_hash unless totalFileCount.nil?
      _h['totalGroupCount'] = totalGroupCount.to_jaxb_json_hash unless totalGroupCount.nil?
      _h['totalProjectCount'] = totalProjectCount.to_jaxb_json_hash unless totalProjectCount.nil?
      _h['newFileCount'] = newFileCount.to_jaxb_json_hash unless newFileCount.nil?
      _h['duration'] = duration.to_jaxb_json_hash unless duration.nil?
      _h['lastScanDate'] = lastScanDate.to_jaxb_json_hash unless lastScanDate.nil?
      _h['totalCountForType'] = totalCountForType.to_jaxb_json_hash unless totalCountForType.nil?
      _h['customValues'] = customValues.to_jaxb_json_hash unless customValues.nil?
      return _h
    end

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

    #initializes this ArchivaRepositoryStatistics with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['scanEndTime'].nil?
          _oa = _o['scanEndTime']
            if(_oa.is_a? Hash)
              @scanEndTime = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scanEndTime =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scanEndTime = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scanEndTime.push Time.from_json(_item)
                 else
                   @scanEndTime.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scanEndTime = _oa
            end
          end
        if !_o['scanStartTime'].nil?
          _oa = _o['scanStartTime']
            if(_oa.is_a? Hash)
              @scanStartTime = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scanStartTime =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scanStartTime = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scanStartTime.push Time.from_json(_item)
                 else
                   @scanStartTime.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scanStartTime = _oa
            end
          end
        if !_o['totalArtifactCount'].nil?
          _oa = _o['totalArtifactCount']
            if(_oa.is_a? Hash)
              @totalArtifactCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalArtifactCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalArtifactCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalArtifactCount.push Bignum.from_json(_item)
                 else
                   @totalArtifactCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalArtifactCount = _oa
            end
          end
        if !_o['totalArtifactFileSize'].nil?
          _oa = _o['totalArtifactFileSize']
            if(_oa.is_a? Hash)
              @totalArtifactFileSize = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalArtifactFileSize =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalArtifactFileSize = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalArtifactFileSize.push Bignum.from_json(_item)
                 else
                   @totalArtifactFileSize.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalArtifactFileSize = _oa
            end
          end
        if !_o['totalFileCount'].nil?
          _oa = _o['totalFileCount']
            if(_oa.is_a? Hash)
              @totalFileCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalFileCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalFileCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalFileCount.push Bignum.from_json(_item)
                 else
                   @totalFileCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalFileCount = _oa
            end
          end
        if !_o['totalGroupCount'].nil?
          _oa = _o['totalGroupCount']
            if(_oa.is_a? Hash)
              @totalGroupCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalGroupCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalGroupCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalGroupCount.push Bignum.from_json(_item)
                 else
                   @totalGroupCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalGroupCount = _oa
            end
          end
        if !_o['totalProjectCount'].nil?
          _oa = _o['totalProjectCount']
            if(_oa.is_a? Hash)
              @totalProjectCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalProjectCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalProjectCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalProjectCount.push Bignum.from_json(_item)
                 else
                   @totalProjectCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalProjectCount = _oa
            end
          end
        if !_o['newFileCount'].nil?
          _oa = _o['newFileCount']
            if(_oa.is_a? Hash)
              @newFileCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @newFileCount =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @newFileCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @newFileCount.push Bignum.from_json(_item)
                 else
                   @newFileCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @newFileCount = _oa
            end
          end
        if !_o['duration'].nil?
          _oa = _o['duration']
            if(_oa.is_a? Hash)
              @duration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @duration =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @duration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @duration.push Bignum.from_json(_item)
                 else
                   @duration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @duration = _oa
            end
          end
        if !_o['lastScanDate'].nil?
          _oa = _o['lastScanDate']
            if(_oa.is_a? Hash)
              @lastScanDate = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @lastScanDate =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @lastScanDate = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @lastScanDate.push String.from_json(_item)
                 else
                   @lastScanDate.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @lastScanDate = _oa
            end
          end
        if !_o['totalCountForType'].nil?
          _oa = _o['totalCountForType']
            if(_oa.is_a? Hash)
              @totalCountForType = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @totalCountForType =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @totalCountForType = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @totalCountForType.push Hash.from_json(_item)
                 else
                   @totalCountForType.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @totalCountForType = _oa
            end
          end
        if !_o['customValues'].nil?
          _oa = _o['customValues']
            if(_oa.is_a? Hash)
              @customValues = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @customValues =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @customValues = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @customValues.push Hash.from_json(_item)
                 else
                   @customValues.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @customValues = _oa
            end
          end
    end

    # constructs a ArchivaRepositoryStatistics 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class ProxyConnectorRule 

    # (no documentation provided)
    attr_accessor :pattern
    # (no documentation provided)
    attr_accessor :proxyConnectorRuleType
    # (no documentation provided)
    attr_accessor :proxyConnectors

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

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

    #initializes this ProxyConnectorRule with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['pattern'].nil?
          _oa = _o['pattern']
            if(_oa.is_a? Hash)
              @pattern = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @pattern =  String.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 String.from_json(_item)
                 else
                   @pattern.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @pattern = _oa
            end
          end
        if !_o['proxyConnectorRuleType'].nil?
          _oa = _o['proxyConnectorRuleType']
            if(_oa.is_a? Hash)
              @proxyConnectorRuleType = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @proxyConnectorRuleType =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @proxyConnectorRuleType = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @proxyConnectorRuleType.push String.from_json(_item)
                 else
                   @proxyConnectorRuleType.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @proxyConnectorRuleType = _oa
            end
          end
        if !_o['proxyConnectors'].nil?
          _oa = _o['proxyConnectors']
            if(_oa.is_a? Hash)
              @proxyConnectors = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @proxyConnectors =  Org::Apache::Archiva::Admin::Model::Beans::ProxyConnector.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @proxyConnectors = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @proxyConnectors.push Org::Apache::Archiva::Admin::Model::Beans::ProxyConnector.from_json(_item)
                 else
                   @proxyConnectors.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @proxyConnectors = _oa
            end
          end
    end

    # constructs a ProxyConnectorRule 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class SearchRequest 

    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :packaging
    # (no documentation provided)
    attr_accessor :className
    # (no documentation provided)
    attr_accessor :repositories
    # (no documentation provided)
    attr_accessor :bundleVersion
    # (no documentation provided)
    attr_accessor :bundleSymbolicName
    # (no documentation provided)
    attr_accessor :bundleExportPackage
    # (no documentation provided)
    attr_accessor :bundleExportService
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :includePomArtifacts
    # (no documentation provided)
    attr_accessor :queryTerms
    # (no documentation provided)
    attr_accessor :bundleImportPackage
    # (no documentation provided)
    attr_accessor :bundleRequireBundle
    # (no documentation provided)
    attr_accessor :pageSize
    # (no documentation provided)
    attr_accessor :selectedPage

    # the json hash for this SearchRequest
    def to_jaxb_json_hash
      _h = {}
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['packaging'] = packaging.to_jaxb_json_hash unless packaging.nil?
      _h['className'] = className.to_jaxb_json_hash unless className.nil?
      if !repositories.nil?
        _ha = Array.new
        repositories.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['repositories'] = _ha
      end
      _h['bundleVersion'] = bundleVersion.to_jaxb_json_hash unless bundleVersion.nil?
      _h['bundleSymbolicName'] = bundleSymbolicName.to_jaxb_json_hash unless bundleSymbolicName.nil?
      _h['bundleExportPackage'] = bundleExportPackage.to_jaxb_json_hash unless bundleExportPackage.nil?
      _h['bundleExportService'] = bundleExportService.to_jaxb_json_hash unless bundleExportService.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['includePomArtifacts'] = includePomArtifacts.to_jaxb_json_hash unless includePomArtifacts.nil?
      _h['queryTerms'] = queryTerms.to_jaxb_json_hash unless queryTerms.nil?
      _h['bundleImportPackage'] = bundleImportPackage.to_jaxb_json_hash unless bundleImportPackage.nil?
      _h['bundleRequireBundle'] = bundleRequireBundle.to_jaxb_json_hash unless bundleRequireBundle.nil?
      _h['pageSize'] = pageSize.to_jaxb_json_hash unless pageSize.nil?
      _h['selectedPage'] = selectedPage.to_jaxb_json_hash unless selectedPage.nil?
      return _h
    end

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

    #initializes this SearchRequest with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['groupId'].nil?
          _oa = _o['groupId']
            if(_oa.is_a? Hash)
              @groupId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @groupId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @groupId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @groupId.push String.from_json(_item)
                 else
                   @groupId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @groupId = _oa
            end
          end
        if !_o['artifactId'].nil?
          _oa = _o['artifactId']
            if(_oa.is_a? Hash)
              @artifactId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifactId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifactId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifactId.push String.from_json(_item)
                 else
                   @artifactId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifactId = _oa
            end
          end
        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['packaging'].nil?
          _oa = _o['packaging']
            if(_oa.is_a? Hash)
              @packaging = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @packaging =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @packaging = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @packaging.push String.from_json(_item)
                 else
                   @packaging.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @packaging = _oa
            end
          end
        if !_o['className'].nil?
          _oa = _o['className']
            if(_oa.is_a? Hash)
              @className = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @className =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @className = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @className.push String.from_json(_item)
                 else
                   @className.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @className = _oa
            end
          end
        if !_o['repositories'].nil?
          _oa = _o['repositories']
            if(_oa.is_a? Hash)
              @repositories = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositories =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositories = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositories.push String.from_json(_item)
                 else
                   @repositories.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositories = _oa
            end
          end
        if !_o['bundleVersion'].nil?
          _oa = _o['bundleVersion']
            if(_oa.is_a? Hash)
              @bundleVersion = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleVersion =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleVersion = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleVersion.push String.from_json(_item)
                 else
                   @bundleVersion.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleVersion = _oa
            end
          end
        if !_o['bundleSymbolicName'].nil?
          _oa = _o['bundleSymbolicName']
            if(_oa.is_a? Hash)
              @bundleSymbolicName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleSymbolicName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleSymbolicName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleSymbolicName.push String.from_json(_item)
                 else
                   @bundleSymbolicName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleSymbolicName = _oa
            end
          end
        if !_o['bundleExportPackage'].nil?
          _oa = _o['bundleExportPackage']
            if(_oa.is_a? Hash)
              @bundleExportPackage = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleExportPackage =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleExportPackage = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleExportPackage.push String.from_json(_item)
                 else
                   @bundleExportPackage.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleExportPackage = _oa
            end
          end
        if !_o['bundleExportService'].nil?
          _oa = _o['bundleExportService']
            if(_oa.is_a? Hash)
              @bundleExportService = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleExportService =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleExportService = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleExportService.push String.from_json(_item)
                 else
                   @bundleExportService.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleExportService = _oa
            end
          end
        if !_o['classifier'].nil?
          _oa = _o['classifier']
            if(_oa.is_a? Hash)
              @classifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @classifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @classifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @classifier.push String.from_json(_item)
                 else
                   @classifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @classifier = _oa
            end
          end
        if !_o['includePomArtifacts'].nil?
          _oa = _o['includePomArtifacts']
            if(_oa.is_a? Hash)
              @includePomArtifacts = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @includePomArtifacts =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @includePomArtifacts = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @includePomArtifacts.push Boolean.from_json(_item)
                 else
                   @includePomArtifacts.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @includePomArtifacts = _oa
            end
          end
        if !_o['queryTerms'].nil?
          _oa = _o['queryTerms']
            if(_oa.is_a? Hash)
              @queryTerms = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @queryTerms =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @queryTerms = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @queryTerms.push String.from_json(_item)
                 else
                   @queryTerms.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @queryTerms = _oa
            end
          end
        if !_o['bundleImportPackage'].nil?
          _oa = _o['bundleImportPackage']
            if(_oa.is_a? Hash)
              @bundleImportPackage = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleImportPackage =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleImportPackage = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleImportPackage.push String.from_json(_item)
                 else
                   @bundleImportPackage.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleImportPackage = _oa
            end
          end
        if !_o['bundleRequireBundle'].nil?
          _oa = _o['bundleRequireBundle']
            if(_oa.is_a? Hash)
              @bundleRequireBundle = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleRequireBundle =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleRequireBundle = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleRequireBundle.push String.from_json(_item)
                 else
                   @bundleRequireBundle.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleRequireBundle = _oa
            end
          end
        if !_o['pageSize'].nil?
          _oa = _o['pageSize']
            if(_oa.is_a? Hash)
              @pageSize = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @pageSize =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @pageSize = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @pageSize.push Fixnum.from_json(_item)
                 else
                   @pageSize.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @pageSize = _oa
            end
          end
        if !_o['selectedPage'].nil?
          _oa = _o['selectedPage']
            if(_oa.is_a? Hash)
              @selectedPage = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @selectedPage =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @selectedPage = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @selectedPage.push Fixnum.from_json(_item)
                 else
                   @selectedPage.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @selectedPage = _oa
            end
          end
    end

    # constructs a SearchRequest 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class VersionsList 

    # (no documentation provided)
    attr_accessor :versions

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

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

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

    # constructs a VersionsList 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class AbstractImplementationInformation 

    # (no documentation provided)
    attr_accessor :beanId
    # (no documentation provided)
    attr_accessor :readOnly
    # (no documentation provided)
    attr_accessor :descriptionKey

    # the json hash for this AbstractImplementationInformation
    def to_jaxb_json_hash
      _h = {}
      _h['beanId'] = beanId.to_jaxb_json_hash unless beanId.nil?
      _h['readOnly'] = readOnly.to_jaxb_json_hash unless readOnly.nil?
      _h['descriptionKey'] = descriptionKey.to_jaxb_json_hash unless descriptionKey.nil?
      return _h
    end

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

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

    # constructs a AbstractImplementationInformation 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ArtifactContent 

    # (no documentation provided)
    attr_accessor :content
    # (no documentation provided)
    attr_accessor :repositoryId

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

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

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

    # constructs a ArtifactContent 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class RedbackRuntimeConfiguration 

    # (no documentation provided)
    attr_accessor :userManagerImpls
    # (no documentation provided)
    attr_accessor :ldapConfiguration
    # (no documentation provided)
    attr_accessor :migratedFromRedbackConfiguration
    # (no documentation provided)
    attr_accessor :configurationProperties
    # (no documentation provided)
    attr_accessor :configurationPropertiesEntries
    # (no documentation provided)
    attr_accessor :useUsersCache
    # (no documentation provided)
    attr_accessor :usersCacheConfiguration
    # (no documentation provided)
    attr_accessor :rbacManagerImpls
    # (no documentation provided)
    attr_accessor :ldapGroupMappings

    # the json hash for this RedbackRuntimeConfiguration
    def to_jaxb_json_hash
      _h = {}
      if !userManagerImpls.nil?
        _ha = Array.new
        userManagerImpls.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['userManagerImpls'] = _ha
      end
      _h['ldapConfiguration'] = ldapConfiguration.to_jaxb_json_hash unless ldapConfiguration.nil?
      _h['migratedFromRedbackConfiguration'] = migratedFromRedbackConfiguration.to_jaxb_json_hash unless migratedFromRedbackConfiguration.nil?
      _h['configurationProperties'] = configurationProperties.to_jaxb_json_hash unless configurationProperties.nil?
      if !configurationPropertiesEntries.nil?
        _ha = Array.new
        configurationPropertiesEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['configurationPropertiesEntries'] = _ha
      end
      _h['useUsersCache'] = useUsersCache.to_jaxb_json_hash unless useUsersCache.nil?
      _h['usersCacheConfiguration'] = usersCacheConfiguration.to_jaxb_json_hash unless usersCacheConfiguration.nil?
      if !rbacManagerImpls.nil?
        _ha = Array.new
        rbacManagerImpls.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['rbacManagerImpls'] = _ha
      end
      if !ldapGroupMappings.nil?
        _ha = Array.new
        ldapGroupMappings.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['ldapGroupMappings'] = _ha
      end
      return _h
    end

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

    #initializes this RedbackRuntimeConfiguration with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['userManagerImpls'].nil?
          _oa = _o['userManagerImpls']
            if(_oa.is_a? Hash)
              @userManagerImpls = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @userManagerImpls =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @userManagerImpls = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @userManagerImpls.push String.from_json(_item)
                 else
                   @userManagerImpls.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @userManagerImpls = _oa
            end
          end
        if !_o['ldapConfiguration'].nil?
          _oa = _o['ldapConfiguration']
            if(_oa.is_a? Hash)
              @ldapConfiguration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @ldapConfiguration =  Org::Apache::Archiva::Admin::Model::Beans::LdapConfiguration.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @ldapConfiguration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @ldapConfiguration.push Org::Apache::Archiva::Admin::Model::Beans::LdapConfiguration.from_json(_item)
                 else
                   @ldapConfiguration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @ldapConfiguration = _oa
            end
          end
        if !_o['migratedFromRedbackConfiguration'].nil?
          _oa = _o['migratedFromRedbackConfiguration']
            if(_oa.is_a? Hash)
              @migratedFromRedbackConfiguration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @migratedFromRedbackConfiguration =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @migratedFromRedbackConfiguration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @migratedFromRedbackConfiguration.push Boolean.from_json(_item)
                 else
                   @migratedFromRedbackConfiguration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @migratedFromRedbackConfiguration = _oa
            end
          end
        if !_o['configurationProperties'].nil?
          _oa = _o['configurationProperties']
            if(_oa.is_a? Hash)
              @configurationProperties = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @configurationProperties =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @configurationProperties = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @configurationProperties.push Hash.from_json(_item)
                 else
                   @configurationProperties.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @configurationProperties = _oa
            end
          end
        if !_o['configurationPropertiesEntries'].nil?
          _oa = _o['configurationPropertiesEntries']
            if(_oa.is_a? Hash)
              @configurationPropertiesEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @configurationPropertiesEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @configurationPropertiesEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @configurationPropertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @configurationPropertiesEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @configurationPropertiesEntries = _oa
            end
          end
        if !_o['useUsersCache'].nil?
          _oa = _o['useUsersCache']
            if(_oa.is_a? Hash)
              @useUsersCache = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @useUsersCache =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @useUsersCache = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @useUsersCache.push Boolean.from_json(_item)
                 else
                   @useUsersCache.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @useUsersCache = _oa
            end
          end
        if !_o['usersCacheConfiguration'].nil?
          _oa = _o['usersCacheConfiguration']
            if(_oa.is_a? Hash)
              @usersCacheConfiguration = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @usersCacheConfiguration =  Org::Apache::Archiva::Admin::Model::Beans::CacheConfiguration.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @usersCacheConfiguration = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @usersCacheConfiguration.push Org::Apache::Archiva::Admin::Model::Beans::CacheConfiguration.from_json(_item)
                 else
                   @usersCacheConfiguration.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @usersCacheConfiguration = _oa
            end
          end
        if !_o['rbacManagerImpls'].nil?
          _oa = _o['rbacManagerImpls']
            if(_oa.is_a? Hash)
              @rbacManagerImpls = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @rbacManagerImpls =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @rbacManagerImpls = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @rbacManagerImpls.push String.from_json(_item)
                 else
                   @rbacManagerImpls.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @rbacManagerImpls = _oa
            end
          end
        if !_o['ldapGroupMappings'].nil?
          _oa = _o['ldapGroupMappings']
            if(_oa.is_a? Hash)
              @ldapGroupMappings = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @ldapGroupMappings =  Org::Apache::Archiva::Admin::Model::Beans::LdapGroupMapping.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @ldapGroupMappings = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @ldapGroupMappings.push Org::Apache::Archiva::Admin::Model::Beans::LdapGroupMapping.from_json(_item)
                 else
                   @ldapGroupMappings.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @ldapGroupMappings = _oa
            end
          end
    end

    # constructs a RedbackRuntimeConfiguration 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ChecksumSearch 

    # (no documentation provided)
    attr_accessor :repositories
    # (no documentation provided)
    attr_accessor :checksum

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

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

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

    # constructs a ChecksumSearch 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class FileLockConfiguration 

    # int
    attr_accessor :lockingTimeout
    # boolean
    attr_accessor :skipLocking

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

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

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

    # constructs a FileLockConfiguration 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class RepositoryScannerStatistics 

    # (no documentation provided)
    attr_accessor :managedRepository
    # (no documentation provided)
    attr_accessor :consumerScanningStatistics
    # (no documentation provided)
    attr_accessor :totalFileCount
    # (no documentation provided)
    attr_accessor :newFileCount

    # the json hash for this RepositoryScannerStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['managedRepository'] = managedRepository.to_jaxb_json_hash unless managedRepository.nil?
      if !consumerScanningStatistics.nil?
        _ha = Array.new
        consumerScanningStatistics.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['consumerScanningStatistics'] = _ha
      end
      _h['totalFileCount'] = totalFileCount.to_jaxb_json_hash unless totalFileCount.nil?
      _h['newFileCount'] = newFileCount.to_jaxb_json_hash unless newFileCount.nil?
      return _h
    end

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

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

    # constructs a RepositoryScannerStatistics 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class FileType 

    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :patterns

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

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

    #initializes this FileType 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['patterns'].nil?
          _oa = _o['patterns']
            if(_oa.is_a? Hash)
              @patterns = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @patterns =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @patterns = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @patterns.push String.from_json(_item)
                 else
                   @patterns.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @patterns = _oa
            end
          end
    end

    # constructs a FileType 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ArtifactContentEntry 

    # (no documentation provided)
    attr_accessor :path
    # (no documentation provided)
    attr_accessor :file
    # (no documentation provided)
    attr_accessor :depth
    # (no documentation provided)
    attr_accessor :repositoryId

    # the json hash for this ArtifactContentEntry
    def to_jaxb_json_hash
      _h = {}
      _h['path'] = path.to_jaxb_json_hash unless path.nil?
      _h['file'] = file.to_jaxb_json_hash unless file.nil?
      _h['depth'] = depth.to_jaxb_json_hash unless depth.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      return _h
    end

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

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

    # constructs a ArtifactContentEntry 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class FacetedMetadata 

    # (no documentation provided)
    attr_accessor :facets
    # (no documentation provided)
    attr_accessor :facetIds
    # (no documentation provided)
    attr_accessor :facetList

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

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

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

    # constructs a FacetedMetadata 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class Organization 

    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :name

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

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

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

    # constructs a Organization 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class GroupIdList 

    # (no documentation provided)
    attr_accessor :groupIds

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

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

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

    # constructs a GroupIdList 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class BrowseResult 

    # (no documentation provided)
    attr_accessor :browseResultEntries

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

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

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

    # constructs a BrowseResult 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

module Org

module Apache

module Archiva

module Admin

module Model

  # (no documentation provided)
  class AbstractRepositoryConnector 

    # (no documentation provided)
    attr_accessor :policies
    # (no documentation provided)
    attr_accessor :whiteListPatterns
    # (no documentation provided)
    attr_accessor :targetRepoId
    # (no documentation provided)
    attr_accessor :sourceRepoId
    # (no documentation provided)
    attr_accessor :proxyId
    # (no documentation provided)
    attr_accessor :propertiesEntries
    # (no documentation provided)
    attr_accessor :blackListPatterns
    # (no documentation provided)
    attr_accessor :disabled
    # (no documentation provided)
    attr_accessor :policiesEntries
    # (no documentation provided)
    attr_accessor :properties

    # the json hash for this AbstractRepositoryConnector
    def to_jaxb_json_hash
      _h = {}
      _h['policies'] = policies.to_jaxb_json_hash unless policies.nil?
      if !whiteListPatterns.nil?
        _ha = Array.new
        whiteListPatterns.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['whiteListPatterns'] = _ha
      end
      _h['targetRepoId'] = targetRepoId.to_jaxb_json_hash unless targetRepoId.nil?
      _h['sourceRepoId'] = sourceRepoId.to_jaxb_json_hash unless sourceRepoId.nil?
      _h['proxyId'] = proxyId.to_jaxb_json_hash unless proxyId.nil?
      if !propertiesEntries.nil?
        _ha = Array.new
        propertiesEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['propertiesEntries'] = _ha
      end
      if !blackListPatterns.nil?
        _ha = Array.new
        blackListPatterns.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['blackListPatterns'] = _ha
      end
      _h['disabled'] = disabled.to_jaxb_json_hash unless disabled.nil?
      if !policiesEntries.nil?
        _ha = Array.new
        policiesEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['policiesEntries'] = _ha
      end
      _h['properties'] = properties.to_jaxb_json_hash unless properties.nil?
      return _h
    end

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

    #initializes this AbstractRepositoryConnector with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['policies'].nil?
          _oa = _o['policies']
            if(_oa.is_a? Hash)
              @policies = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @policies =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @policies = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @policies.push Hash.from_json(_item)
                 else
                   @policies.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @policies = _oa
            end
          end
        if !_o['whiteListPatterns'].nil?
          _oa = _o['whiteListPatterns']
            if(_oa.is_a? Hash)
              @whiteListPatterns = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @whiteListPatterns =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @whiteListPatterns = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @whiteListPatterns.push String.from_json(_item)
                 else
                   @whiteListPatterns.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @whiteListPatterns = _oa
            end
          end
        if !_o['targetRepoId'].nil?
          _oa = _o['targetRepoId']
            if(_oa.is_a? Hash)
              @targetRepoId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @targetRepoId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @targetRepoId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @targetRepoId.push String.from_json(_item)
                 else
                   @targetRepoId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @targetRepoId = _oa
            end
          end
        if !_o['sourceRepoId'].nil?
          _oa = _o['sourceRepoId']
            if(_oa.is_a? Hash)
              @sourceRepoId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @sourceRepoId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @sourceRepoId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @sourceRepoId.push String.from_json(_item)
                 else
                   @sourceRepoId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @sourceRepoId = _oa
            end
          end
        if !_o['proxyId'].nil?
          _oa = _o['proxyId']
            if(_oa.is_a? Hash)
              @proxyId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @proxyId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @proxyId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @proxyId.push String.from_json(_item)
                 else
                   @proxyId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @proxyId = _oa
            end
          end
        if !_o['propertiesEntries'].nil?
          _oa = _o['propertiesEntries']
            if(_oa.is_a? Hash)
              @propertiesEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @propertiesEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @propertiesEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @propertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @propertiesEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @propertiesEntries = _oa
            end
          end
        if !_o['blackListPatterns'].nil?
          _oa = _o['blackListPatterns']
            if(_oa.is_a? Hash)
              @blackListPatterns = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @blackListPatterns =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @blackListPatterns = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @blackListPatterns.push String.from_json(_item)
                 else
                   @blackListPatterns.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @blackListPatterns = _oa
            end
          end
        if !_o['disabled'].nil?
          _oa = _o['disabled']
            if(_oa.is_a? Hash)
              @disabled = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @disabled =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @disabled = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @disabled.push Boolean.from_json(_item)
                 else
                   @disabled.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @disabled = _oa
            end
          end
        if !_o['policiesEntries'].nil?
          _oa = _o['policiesEntries']
            if(_oa.is_a? Hash)
              @policiesEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @policiesEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @policiesEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @policiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @policiesEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @policiesEntries = _oa
            end
          end
        if !_o['properties'].nil?
          _oa = _o['properties']
            if(_oa.is_a? Hash)
              @properties = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @properties =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @properties = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @properties.push Hash.from_json(_item)
                 else
                   @properties.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @properties = _oa
            end
          end
    end

    # constructs a AbstractRepositoryConnector 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class PropertyEntry 

    # (no documentation provided)
    attr_accessor :key
    # (no documentation provided)
    attr_accessor :value

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

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

    #initializes this PropertyEntry 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
        if !_o['value'].nil?
          _oa = _o['value']
            if(_oa.is_a? Hash)
              @value = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @value =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @value = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @value.push String.from_json(_item)
                 else
                   @value.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @value = _oa
            end
          end
    end

    # constructs a PropertyEntry 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

module Org

module Apache

module Archiva

module Maven2

module Model

  # (no documentation provided)
  class Artifact 

    # (no documentation provided)
    attr_accessor :bundleRequireBundle
    # (no documentation provided)
    attr_accessor :bundleVersion
    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :bundleImportPackage
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :fileExtension
    # (no documentation provided)
    attr_accessor :bundleExportPackage
    # (no documentation provided)
    attr_accessor :size
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :bundleLicense
    # (no documentation provided)
    attr_accessor :bundleName
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :bundleExportService
    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :goals
    # (no documentation provided)
    attr_accessor :prefix
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :scope
    # (no documentation provided)
    attr_accessor :packaging
    # (no documentation provided)
    attr_accessor :bundleDescription
    # (no documentation provided)
    attr_accessor :bundleDocUrl
    # (no documentation provided)
    attr_accessor :context
    # (no documentation provided)
    attr_accessor :path
    # (no documentation provided)
    attr_accessor :bundleSymbolicName
    # (no documentation provided)
    attr_accessor :type

    # the json hash for this Artifact
    def to_jaxb_json_hash
      _h = {}
      _h['bundleRequireBundle'] = bundleRequireBundle.to_jaxb_json_hash unless bundleRequireBundle.nil?
      _h['bundleVersion'] = bundleVersion.to_jaxb_json_hash unless bundleVersion.nil?
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['bundleImportPackage'] = bundleImportPackage.to_jaxb_json_hash unless bundleImportPackage.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['fileExtension'] = fileExtension.to_jaxb_json_hash unless fileExtension.nil?
      _h['bundleExportPackage'] = bundleExportPackage.to_jaxb_json_hash unless bundleExportPackage.nil?
      _h['size'] = size.to_jaxb_json_hash unless size.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['bundleLicense'] = bundleLicense.to_jaxb_json_hash unless bundleLicense.nil?
      _h['bundleName'] = bundleName.to_jaxb_json_hash unless bundleName.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['bundleExportService'] = bundleExportService.to_jaxb_json_hash unless bundleExportService.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      if !goals.nil?
        _ha = Array.new
        goals.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['goals'] = _ha
      end
      _h['prefix'] = prefix.to_jaxb_json_hash unless prefix.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['scope'] = scope.to_jaxb_json_hash unless scope.nil?
      _h['packaging'] = packaging.to_jaxb_json_hash unless packaging.nil?
      _h['bundleDescription'] = bundleDescription.to_jaxb_json_hash unless bundleDescription.nil?
      _h['bundleDocUrl'] = bundleDocUrl.to_jaxb_json_hash unless bundleDocUrl.nil?
      _h['context'] = context.to_jaxb_json_hash unless context.nil?
      _h['path'] = path.to_jaxb_json_hash unless path.nil?
      _h['bundleSymbolicName'] = bundleSymbolicName.to_jaxb_json_hash unless bundleSymbolicName.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      return _h
    end

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

    #initializes this Artifact with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['bundleRequireBundle'].nil?
          _oa = _o['bundleRequireBundle']
            if(_oa.is_a? Hash)
              @bundleRequireBundle = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleRequireBundle =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleRequireBundle = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleRequireBundle.push String.from_json(_item)
                 else
                   @bundleRequireBundle.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleRequireBundle = _oa
            end
          end
        if !_o['bundleVersion'].nil?
          _oa = _o['bundleVersion']
            if(_oa.is_a? Hash)
              @bundleVersion = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleVersion =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleVersion = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleVersion.push String.from_json(_item)
                 else
                   @bundleVersion.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleVersion = _oa
            end
          end
        if !_o['groupId'].nil?
          _oa = _o['groupId']
            if(_oa.is_a? Hash)
              @groupId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @groupId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @groupId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @groupId.push String.from_json(_item)
                 else
                   @groupId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @groupId = _oa
            end
          end
        if !_o['bundleImportPackage'].nil?
          _oa = _o['bundleImportPackage']
            if(_oa.is_a? Hash)
              @bundleImportPackage = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleImportPackage =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleImportPackage = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleImportPackage.push String.from_json(_item)
                 else
                   @bundleImportPackage.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleImportPackage = _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['artifactId'].nil?
          _oa = _o['artifactId']
            if(_oa.is_a? Hash)
              @artifactId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifactId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifactId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifactId.push String.from_json(_item)
                 else
                   @artifactId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifactId = _oa
            end
          end
        if !_o['fileExtension'].nil?
          _oa = _o['fileExtension']
            if(_oa.is_a? Hash)
              @fileExtension = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @fileExtension =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @fileExtension = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @fileExtension.push String.from_json(_item)
                 else
                   @fileExtension.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @fileExtension = _oa
            end
          end
        if !_o['bundleExportPackage'].nil?
          _oa = _o['bundleExportPackage']
            if(_oa.is_a? Hash)
              @bundleExportPackage = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleExportPackage =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleExportPackage = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleExportPackage.push String.from_json(_item)
                 else
                   @bundleExportPackage.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleExportPackage = _oa
            end
          end
        if !_o['size'].nil?
          _oa = _o['size']
            if(_oa.is_a? Hash)
              @size = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @size =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @size = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @size.push String.from_json(_item)
                 else
                   @size.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @size = _oa
            end
          end
        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['bundleLicense'].nil?
          _oa = _o['bundleLicense']
            if(_oa.is_a? Hash)
              @bundleLicense = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleLicense =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleLicense = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleLicense.push String.from_json(_item)
                 else
                   @bundleLicense.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleLicense = _oa
            end
          end
        if !_o['bundleName'].nil?
          _oa = _o['bundleName']
            if(_oa.is_a? Hash)
              @bundleName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleName.push String.from_json(_item)
                 else
                   @bundleName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleName = _oa
            end
          end
        if !_o['classifier'].nil?
          _oa = _o['classifier']
            if(_oa.is_a? Hash)
              @classifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @classifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @classifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @classifier.push String.from_json(_item)
                 else
                   @classifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @classifier = _oa
            end
          end
        if !_o['bundleExportService'].nil?
          _oa = _o['bundleExportService']
            if(_oa.is_a? Hash)
              @bundleExportService = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleExportService =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleExportService = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleExportService.push String.from_json(_item)
                 else
                   @bundleExportService.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleExportService = _oa
            end
          end
        if !_o['repositoryId'].nil?
          _oa = _o['repositoryId']
            if(_oa.is_a? Hash)
              @repositoryId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositoryId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositoryId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositoryId.push String.from_json(_item)
                 else
                   @repositoryId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositoryId = _oa
            end
          end
        if !_o['goals'].nil?
          _oa = _o['goals']
            if(_oa.is_a? Hash)
              @goals = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @goals =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @goals = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @goals.push String.from_json(_item)
                 else
                   @goals.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @goals = _oa
            end
          end
        if !_o['prefix'].nil?
          _oa = _o['prefix']
            if(_oa.is_a? Hash)
              @prefix = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @prefix =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @prefix = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @prefix.push String.from_json(_item)
                 else
                   @prefix.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @prefix = _oa
            end
          end
        if !_o['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
        if !_o['scope'].nil?
          _oa = _o['scope']
            if(_oa.is_a? Hash)
              @scope = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scope =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scope = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scope.push String.from_json(_item)
                 else
                   @scope.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scope = _oa
            end
          end
        if !_o['packaging'].nil?
          _oa = _o['packaging']
            if(_oa.is_a? Hash)
              @packaging = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @packaging =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @packaging = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @packaging.push String.from_json(_item)
                 else
                   @packaging.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @packaging = _oa
            end
          end
        if !_o['bundleDescription'].nil?
          _oa = _o['bundleDescription']
            if(_oa.is_a? Hash)
              @bundleDescription = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleDescription =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleDescription = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleDescription.push String.from_json(_item)
                 else
                   @bundleDescription.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleDescription = _oa
            end
          end
        if !_o['bundleDocUrl'].nil?
          _oa = _o['bundleDocUrl']
            if(_oa.is_a? Hash)
              @bundleDocUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleDocUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleDocUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleDocUrl.push String.from_json(_item)
                 else
                   @bundleDocUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleDocUrl = _oa
            end
          end
        if !_o['context'].nil?
          _oa = _o['context']
            if(_oa.is_a? Hash)
              @context = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @context =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @context = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @context.push String.from_json(_item)
                 else
                   @context.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @context = _oa
            end
          end
        if !_o['path'].nil?
          _oa = _o['path']
            if(_oa.is_a? Hash)
              @path = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @path =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @path = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @path.push String.from_json(_item)
                 else
                   @path.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @path = _oa
            end
          end
        if !_o['bundleSymbolicName'].nil?
          _oa = _o['bundleSymbolicName']
            if(_oa.is_a? Hash)
              @bundleSymbolicName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bundleSymbolicName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bundleSymbolicName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bundleSymbolicName.push String.from_json(_item)
                 else
                   @bundleSymbolicName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bundleSymbolicName = _oa
            end
          end
        if !_o['type'].nil?
          _oa = _o['type']
            if(_oa.is_a? Hash)
              @type = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @type =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @type = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @type.push String.from_json(_item)
                 else
                   @type.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @type = _oa
            end
          end
    end

    # constructs a Artifact 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class MetadataAddRequest 

    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :metadatas

    # the json hash for this MetadataAddRequest
    def to_jaxb_json_hash
      _h = {}
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['metadatas'] = metadatas.to_jaxb_json_hash unless metadatas.nil?
      return _h
    end

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

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

    # constructs a MetadataAddRequest 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

module Org

module Apache

module Archiva

module Web

module Model

  # (no documentation provided)
  class JavascriptLog 

    # (no documentation provided)
    attr_accessor :loggerName
    # (no documentation provided)
    attr_accessor :message

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

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

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

    # constructs a JavascriptLog 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

module Org

module Apache

module Archiva

module Maven2

module Model

  # (no documentation provided)
  class TreeEntry 

    # (no documentation provided)
    attr_accessor :childs
    # (no documentation provided)
    attr_accessor :artifact

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

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

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

    # constructs a TreeEntry 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class License 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :url

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

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

    #initializes this License 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['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
    end

    # constructs a License 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class LdapConfiguration 

    # (no documentation provided)
    attr_accessor :hostName
    # (no documentation provided)
    attr_accessor :port
    # (no documentation provided)
    attr_accessor :ssl
    # (no documentation provided)
    attr_accessor :baseDn
    # (no documentation provided)
    attr_accessor :contextFactory
    # (no documentation provided)
    attr_accessor :bindDn
    # (no documentation provided)
    attr_accessor :password
    # (no documentation provided)
    attr_accessor :authenticationMethod
    # (no documentation provided)
    attr_accessor :extraProperties
    # (no documentation provided)
    attr_accessor :bindAuthenticatorEnabled
    # (no documentation provided)
    attr_accessor :extraPropertiesEntries
    # (no documentation provided)
    attr_accessor :baseGroupsDn
    # (no documentation provided)
    attr_accessor :writable
    # (no documentation provided)
    attr_accessor :useRoleNameAsGroup

    # the json hash for this LdapConfiguration
    def to_jaxb_json_hash
      _h = {}
      _h['hostName'] = hostName.to_jaxb_json_hash unless hostName.nil?
      _h['port'] = port.to_jaxb_json_hash unless port.nil?
      _h['ssl'] = ssl.to_jaxb_json_hash unless ssl.nil?
      _h['baseDn'] = baseDn.to_jaxb_json_hash unless baseDn.nil?
      _h['contextFactory'] = contextFactory.to_jaxb_json_hash unless contextFactory.nil?
      _h['bindDn'] = bindDn.to_jaxb_json_hash unless bindDn.nil?
      _h['password'] = password.to_jaxb_json_hash unless password.nil?
      _h['authenticationMethod'] = authenticationMethod.to_jaxb_json_hash unless authenticationMethod.nil?
      _h['extraProperties'] = extraProperties.to_jaxb_json_hash unless extraProperties.nil?
      _h['bindAuthenticatorEnabled'] = bindAuthenticatorEnabled.to_jaxb_json_hash unless bindAuthenticatorEnabled.nil?
      if !extraPropertiesEntries.nil?
        _ha = Array.new
        extraPropertiesEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['extraPropertiesEntries'] = _ha
      end
      _h['baseGroupsDn'] = baseGroupsDn.to_jaxb_json_hash unless baseGroupsDn.nil?
      _h['writable'] = writable.to_jaxb_json_hash unless writable.nil?
      _h['useRoleNameAsGroup'] = useRoleNameAsGroup.to_jaxb_json_hash unless useRoleNameAsGroup.nil?
      return _h
    end

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

    #initializes this LdapConfiguration with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['hostName'].nil?
          _oa = _o['hostName']
            if(_oa.is_a? Hash)
              @hostName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @hostName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @hostName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @hostName.push String.from_json(_item)
                 else
                   @hostName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @hostName = _oa
            end
          end
        if !_o['port'].nil?
          _oa = _o['port']
            if(_oa.is_a? Hash)
              @port = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @port =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @port = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @port.push Fixnum.from_json(_item)
                 else
                   @port.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @port = _oa
            end
          end
        if !_o['ssl'].nil?
          _oa = _o['ssl']
            if(_oa.is_a? Hash)
              @ssl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @ssl =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @ssl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @ssl.push Boolean.from_json(_item)
                 else
                   @ssl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @ssl = _oa
            end
          end
        if !_o['baseDn'].nil?
          _oa = _o['baseDn']
            if(_oa.is_a? Hash)
              @baseDn = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @baseDn =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @baseDn = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @baseDn.push String.from_json(_item)
                 else
                   @baseDn.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @baseDn = _oa
            end
          end
        if !_o['contextFactory'].nil?
          _oa = _o['contextFactory']
            if(_oa.is_a? Hash)
              @contextFactory = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @contextFactory =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @contextFactory = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @contextFactory.push String.from_json(_item)
                 else
                   @contextFactory.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @contextFactory = _oa
            end
          end
        if !_o['bindDn'].nil?
          _oa = _o['bindDn']
            if(_oa.is_a? Hash)
              @bindDn = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bindDn =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bindDn = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bindDn.push String.from_json(_item)
                 else
                   @bindDn.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bindDn = _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['authenticationMethod'].nil?
          _oa = _o['authenticationMethod']
            if(_oa.is_a? Hash)
              @authenticationMethod = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @authenticationMethod =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @authenticationMethod = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @authenticationMethod.push String.from_json(_item)
                 else
                   @authenticationMethod.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @authenticationMethod = _oa
            end
          end
        if !_o['extraProperties'].nil?
          _oa = _o['extraProperties']
            if(_oa.is_a? Hash)
              @extraProperties = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraProperties =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraProperties = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraProperties.push Hash.from_json(_item)
                 else
                   @extraProperties.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraProperties = _oa
            end
          end
        if !_o['bindAuthenticatorEnabled'].nil?
          _oa = _o['bindAuthenticatorEnabled']
            if(_oa.is_a? Hash)
              @bindAuthenticatorEnabled = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @bindAuthenticatorEnabled =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @bindAuthenticatorEnabled = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @bindAuthenticatorEnabled.push Boolean.from_json(_item)
                 else
                   @bindAuthenticatorEnabled.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @bindAuthenticatorEnabled = _oa
            end
          end
        if !_o['extraPropertiesEntries'].nil?
          _oa = _o['extraPropertiesEntries']
            if(_oa.is_a? Hash)
              @extraPropertiesEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraPropertiesEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraPropertiesEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraPropertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @extraPropertiesEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraPropertiesEntries = _oa
            end
          end
        if !_o['baseGroupsDn'].nil?
          _oa = _o['baseGroupsDn']
            if(_oa.is_a? Hash)
              @baseGroupsDn = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @baseGroupsDn =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @baseGroupsDn = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @baseGroupsDn.push String.from_json(_item)
                 else
                   @baseGroupsDn.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @baseGroupsDn = _oa
            end
          end
        if !_o['writable'].nil?
          _oa = _o['writable']
            if(_oa.is_a? Hash)
              @writable = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @writable =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @writable = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @writable.push Boolean.from_json(_item)
                 else
                   @writable.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @writable = _oa
            end
          end
        if !_o['useRoleNameAsGroup'].nil?
          _oa = _o['useRoleNameAsGroup']
            if(_oa.is_a? Hash)
              @useRoleNameAsGroup = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @useRoleNameAsGroup =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @useRoleNameAsGroup = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @useRoleNameAsGroup.push Boolean.from_json(_item)
                 else
                   @useRoleNameAsGroup.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @useRoleNameAsGroup = _oa
            end
          end
    end

    # constructs a LdapConfiguration 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

module Org

module Apache

module Archiva

module Web

module Model

  # (no documentation provided)
  class FileMetadata 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :size
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :deleteUrl
    # (no documentation provided)
    attr_accessor :deleteType
    # (no documentation provided)
    attr_accessor :errorKey
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :pomFile
    # (no documentation provided)
    attr_accessor :serverFileName
    # (no documentation provided)
    attr_accessor :packaging

    # the json hash for this FileMetadata
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['size'] = size.to_jaxb_json_hash unless size.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['deleteUrl'] = deleteUrl.to_jaxb_json_hash unless deleteUrl.nil?
      _h['deleteType'] = deleteType.to_jaxb_json_hash unless deleteType.nil?
      _h['errorKey'] = errorKey.to_jaxb_json_hash unless errorKey.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['pomFile'] = pomFile.to_jaxb_json_hash unless pomFile.nil?
      _h['serverFileName'] = serverFileName.to_jaxb_json_hash unless serverFileName.nil?
      _h['packaging'] = packaging.to_jaxb_json_hash unless packaging.nil?
      return _h
    end

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

    #initializes this FileMetadata 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['size'].nil?
          _oa = _o['size']
            if(_oa.is_a? Hash)
              @size = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @size =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @size = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @size.push Bignum.from_json(_item)
                 else
                   @size.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @size = _oa
            end
          end
        if !_o['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
        if !_o['deleteUrl'].nil?
          _oa = _o['deleteUrl']
            if(_oa.is_a? Hash)
              @deleteUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @deleteUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @deleteUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @deleteUrl.push String.from_json(_item)
                 else
                   @deleteUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @deleteUrl = _oa
            end
          end
        if !_o['deleteType'].nil?
          _oa = _o['deleteType']
            if(_oa.is_a? Hash)
              @deleteType = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @deleteType =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @deleteType = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @deleteType.push String.from_json(_item)
                 else
                   @deleteType.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @deleteType = _oa
            end
          end
        if !_o['errorKey'].nil?
          _oa = _o['errorKey']
            if(_oa.is_a? Hash)
              @errorKey = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @errorKey =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @errorKey = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @errorKey.push String.from_json(_item)
                 else
                   @errorKey.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @errorKey = _oa
            end
          end
        if !_o['classifier'].nil?
          _oa = _o['classifier']
            if(_oa.is_a? Hash)
              @classifier = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @classifier =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @classifier = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @classifier.push String.from_json(_item)
                 else
                   @classifier.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @classifier = _oa
            end
          end
        if !_o['pomFile'].nil?
          _oa = _o['pomFile']
            if(_oa.is_a? Hash)
              @pomFile = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @pomFile =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @pomFile = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @pomFile.push Boolean.from_json(_item)
                 else
                   @pomFile.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @pomFile = _oa
            end
          end
        if !_o['serverFileName'].nil?
          _oa = _o['serverFileName']
            if(_oa.is_a? Hash)
              @serverFileName = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @serverFileName =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @serverFileName = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @serverFileName.push String.from_json(_item)
                 else
                   @serverFileName.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @serverFileName = _oa
            end
          end
        if !_o['packaging'].nil?
          _oa = _o['packaging']
            if(_oa.is_a? Hash)
              @packaging = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @packaging =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @packaging = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @packaging.push String.from_json(_item)
                 else
                   @packaging.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @packaging = _oa
            end
          end
    end

    # constructs a FileMetadata 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class NetworkConfiguration 

    # (no documentation provided)
    attr_accessor :maxTotal
    # (no documentation provided)
    attr_accessor :maxTotalPerHost
    # (no documentation provided)
    attr_accessor :usePooling

    # the json hash for this NetworkConfiguration
    def to_jaxb_json_hash
      _h = {}
      _h['maxTotal'] = maxTotal.to_jaxb_json_hash unless maxTotal.nil?
      _h['maxTotalPerHost'] = maxTotalPerHost.to_jaxb_json_hash unless maxTotalPerHost.nil?
      _h['usePooling'] = usePooling.to_jaxb_json_hash unless usePooling.nil?
      return _h
    end

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

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

    # constructs a NetworkConfiguration 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class CacheEntry 

    # (no documentation provided)
    attr_accessor :key
    # (no documentation provided)
    attr_accessor :size
    # (no documentation provided)
    attr_accessor :cacheHits
    # (no documentation provided)
    attr_accessor :cacheMiss
    # (no documentation provided)
    attr_accessor :cacheHitRate
    # cache size in kb
    attr_accessor :inMemorySize

    # the json hash for this CacheEntry
    def to_jaxb_json_hash
      _h = {}
      _h['key'] = key.to_jaxb_json_hash unless key.nil?
      _h['size'] = size.to_jaxb_json_hash unless size.nil?
      _h['cacheHits'] = cacheHits.to_jaxb_json_hash unless cacheHits.nil?
      _h['cacheMiss'] = cacheMiss.to_jaxb_json_hash unless cacheMiss.nil?
      _h['cacheHitRate'] = cacheHitRate.to_jaxb_json_hash unless cacheHitRate.nil?
      _h['inMemorySize'] = inMemorySize.to_jaxb_json_hash unless inMemorySize.nil?
      return _h
    end

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

    #initializes this CacheEntry 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
        if !_o['size'].nil?
          _oa = _o['size']
            if(_oa.is_a? Hash)
              @size = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @size =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @size = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @size.push Bignum.from_json(_item)
                 else
                   @size.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @size = _oa
            end
          end
        if !_o['cacheHits'].nil?
          _oa = _o['cacheHits']
            if(_oa.is_a? Hash)
              @cacheHits = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cacheHits =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cacheHits = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cacheHits.push Bignum.from_json(_item)
                 else
                   @cacheHits.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cacheHits = _oa
            end
          end
        if !_o['cacheMiss'].nil?
          _oa = _o['cacheMiss']
            if(_oa.is_a? Hash)
              @cacheMiss = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cacheMiss =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cacheMiss = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cacheMiss.push Bignum.from_json(_item)
                 else
                   @cacheMiss.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cacheMiss = _oa
            end
          end
        if !_o['cacheHitRate'].nil?
          _oa = _o['cacheHitRate']
            if(_oa.is_a? Hash)
              @cacheHitRate = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cacheHitRate =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cacheHitRate = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cacheHitRate.push String.from_json(_item)
                 else
                   @cacheHitRate.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cacheHitRate = _oa
            end
          end
        if !_o['inMemorySize'].nil?
          _oa = _o['inMemorySize']
            if(_oa.is_a? Hash)
              @inMemorySize = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @inMemorySize =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @inMemorySize = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @inMemorySize.push Bignum.from_json(_item)
                 else
                   @inMemorySize.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @inMemorySize = _oa
            end
          end
    end

    # constructs a CacheEntry 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class MailingList 

    # (no documentation provided)
    attr_accessor :postAddress
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :mainArchiveUrl
    # (no documentation provided)
    attr_accessor :otherArchives
    # (no documentation provided)
    attr_accessor :unsubscribeAddress
    # (no documentation provided)
    attr_accessor :subscribeAddress

    # the json hash for this MailingList
    def to_jaxb_json_hash
      _h = {}
      _h['postAddress'] = postAddress.to_jaxb_json_hash unless postAddress.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['mainArchiveUrl'] = mainArchiveUrl.to_jaxb_json_hash unless mainArchiveUrl.nil?
      if !otherArchives.nil?
        _ha = Array.new
        otherArchives.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['otherArchives'] = _ha
      end
      _h['unsubscribeAddress'] = unsubscribeAddress.to_jaxb_json_hash unless unsubscribeAddress.nil?
      _h['subscribeAddress'] = subscribeAddress.to_jaxb_json_hash unless subscribeAddress.nil?
      return _h
    end

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

    #initializes this MailingList with a json hash
    def init_jaxb_json_hash(_o)
        if !_o['postAddress'].nil?
          _oa = _o['postAddress']
            if(_oa.is_a? Hash)
              @postAddress = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @postAddress =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @postAddress = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @postAddress.push String.from_json(_item)
                 else
                   @postAddress.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @postAddress = _oa
            end
          end
        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['mainArchiveUrl'].nil?
          _oa = _o['mainArchiveUrl']
            if(_oa.is_a? Hash)
              @mainArchiveUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @mainArchiveUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @mainArchiveUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @mainArchiveUrl.push String.from_json(_item)
                 else
                   @mainArchiveUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @mainArchiveUrl = _oa
            end
          end
        if !_o['otherArchives'].nil?
          _oa = _o['otherArchives']
            if(_oa.is_a? Hash)
              @otherArchives = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @otherArchives =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @otherArchives = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @otherArchives.push String.from_json(_item)
                 else
                   @otherArchives.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @otherArchives = _oa
            end
          end
        if !_o['unsubscribeAddress'].nil?
          _oa = _o['unsubscribeAddress']
            if(_oa.is_a? Hash)
              @unsubscribeAddress = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @unsubscribeAddress =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @unsubscribeAddress = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @unsubscribeAddress.push String.from_json(_item)
                 else
                   @unsubscribeAddress.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @unsubscribeAddress = _oa
            end
          end
        if !_o['subscribeAddress'].nil?
          _oa = _o['subscribeAddress']
            if(_oa.is_a? Hash)
              @subscribeAddress = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @subscribeAddress =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @subscribeAddress = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @subscribeAddress.push String.from_json(_item)
                 else
                   @subscribeAddress.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @subscribeAddress = _oa
            end
          end
    end

    # constructs a MailingList 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class BrowseResultEntry 

    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :project
    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :artifactId

    # the json hash for this BrowseResultEntry
    def to_jaxb_json_hash
      _h = {}
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['project'] = project.to_jaxb_json_hash unless project.nil?
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      return _h
    end

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

    #initializes this BrowseResultEntry 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['project'].nil?
          _oa = _o['project']
            if(_oa.is_a? Hash)
              @project = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @project =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @project = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @project.push Boolean.from_json(_item)
                 else
                   @project.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @project = _oa
            end
          end
        if !_o['groupId'].nil?
          _oa = _o['groupId']
            if(_oa.is_a? Hash)
              @groupId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @groupId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @groupId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @groupId.push String.from_json(_item)
                 else
                   @groupId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @groupId = _oa
            end
          end
        if !_o['artifactId'].nil?
          _oa = _o['artifactId']
            if(_oa.is_a? Hash)
              @artifactId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @artifactId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @artifactId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @artifactId.push String.from_json(_item)
                 else
                   @artifactId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @artifactId = _oa
            end
          end
    end

    # constructs a BrowseResultEntry 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

module Org

module Apache

module Archiva

module Web

module Model

  # (no documentation provided)
  class CookieInformation 

    # (no documentation provided)
    attr_accessor :path
    # (no documentation provided)
    attr_accessor :domain
    # (no documentation provided)
    attr_accessor :secure
    # (no documentation provided)
    attr_accessor :timeout
    # (no documentation provided)
    attr_accessor :rememberMeEnabled

    # the json hash for this CookieInformation
    def to_jaxb_json_hash
      _h = {}
      _h['path'] = path.to_jaxb_json_hash unless path.nil?
      _h['domain'] = domain.to_jaxb_json_hash unless domain.nil?
      _h['secure'] = secure.to_jaxb_json_hash unless secure.nil?
      _h['timeout'] = timeout.to_jaxb_json_hash unless timeout.nil?
      _h['rememberMeEnabled'] = rememberMeEnabled.to_jaxb_json_hash unless rememberMeEnabled.nil?
      return _h
    end

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

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

    # constructs a CookieInformation 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class ManagedRepository < Org::Apache::Archiva::Admin::Model::Beans::AbstractRepository 

    # (no documentation provided)
    attr_accessor :cronExpression
    # (no documentation provided)
    attr_accessor :location
    # (no documentation provided)
    attr_accessor :releases
    # Get null
    attr_accessor :snapshots
    # (no documentation provided)
    attr_accessor :blockRedeployments
    # (no documentation provided)
    attr_accessor :stagingRepository
    # (no documentation provided)
    attr_accessor :scanned
    # (no documentation provided)
    attr_accessor :retentionPeriod
    # (no documentation provided)
    attr_accessor :retentionCount
    # (no documentation provided)
    attr_accessor :deleteReleasedSnapshots
    # (no documentation provided)
    attr_accessor :stageRepoNeeded
    # (no documentation provided)
    attr_accessor :resetStats
    # (no documentation provided)
    attr_accessor :skipPackedIndexCreation

    # the json hash for this ManagedRepository
    def to_jaxb_json_hash
      _h = super
      _h['cronExpression'] = cronExpression.to_jaxb_json_hash unless cronExpression.nil?
      _h['location'] = location.to_jaxb_json_hash unless location.nil?
      _h['releases'] = releases.to_jaxb_json_hash unless releases.nil?
      _h['snapshots'] = snapshots.to_jaxb_json_hash unless snapshots.nil?
      _h['blockRedeployments'] = blockRedeployments.to_jaxb_json_hash unless blockRedeployments.nil?
      _h['stagingRepository'] = stagingRepository.to_jaxb_json_hash unless stagingRepository.nil?
      _h['scanned'] = scanned.to_jaxb_json_hash unless scanned.nil?
      _h['retentionPeriod'] = retentionPeriod.to_jaxb_json_hash unless retentionPeriod.nil?
      _h['retentionCount'] = retentionCount.to_jaxb_json_hash unless retentionCount.nil?
      _h['deleteReleasedSnapshots'] = deleteReleasedSnapshots.to_jaxb_json_hash unless deleteReleasedSnapshots.nil?
      _h['stageRepoNeeded'] = stageRepoNeeded.to_jaxb_json_hash unless stageRepoNeeded.nil?
      _h['resetStats'] = resetStats.to_jaxb_json_hash unless resetStats.nil?
      _h['skipPackedIndexCreation'] = skipPackedIndexCreation.to_jaxb_json_hash unless skipPackedIndexCreation.nil?
      return _h
    end

    #initializes this ManagedRepository with a json hash
    def init_jaxb_json_hash(_o)
      super _o
        if !_o['cronExpression'].nil?
          _oa = _o['cronExpression']
            if(_oa.is_a? Hash)
              @cronExpression = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cronExpression =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cronExpression = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cronExpression.push String.from_json(_item)
                 else
                   @cronExpression.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cronExpression = _oa
            end
          end
        if !_o['location'].nil?
          _oa = _o['location']
            if(_oa.is_a? Hash)
              @location = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @location =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @location = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @location.push String.from_json(_item)
                 else
                   @location.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @location = _oa
            end
          end
        if !_o['releases'].nil?
          _oa = _o['releases']
            if(_oa.is_a? Hash)
              @releases = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @releases =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @releases = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @releases.push Boolean.from_json(_item)
                 else
                   @releases.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @releases = _oa
            end
          end
        if !_o['snapshots'].nil?
          _oa = _o['snapshots']
            if(_oa.is_a? Hash)
              @snapshots = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @snapshots =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @snapshots = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @snapshots.push Boolean.from_json(_item)
                 else
                   @snapshots.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @snapshots = _oa
            end
          end
        if !_o['blockRedeployments'].nil?
          _oa = _o['blockRedeployments']
            if(_oa.is_a? Hash)
              @blockRedeployments = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @blockRedeployments =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @blockRedeployments = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @blockRedeployments.push Boolean.from_json(_item)
                 else
                   @blockRedeployments.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @blockRedeployments = _oa
            end
          end
        if !_o['stagingRepository'].nil?
          _oa = _o['stagingRepository']
            if(_oa.is_a? Hash)
              @stagingRepository = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @stagingRepository =  Org::Apache::Archiva::Admin::Model::Beans::ManagedRepository.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @stagingRepository = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @stagingRepository.push Org::Apache::Archiva::Admin::Model::Beans::ManagedRepository.from_json(_item)
                 else
                   @stagingRepository.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @stagingRepository = _oa
            end
          end
        if !_o['scanned'].nil?
          _oa = _o['scanned']
            if(_oa.is_a? Hash)
              @scanned = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scanned =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scanned = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scanned.push Boolean.from_json(_item)
                 else
                   @scanned.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scanned = _oa
            end
          end
        if !_o['retentionPeriod'].nil?
          _oa = _o['retentionPeriod']
            if(_oa.is_a? Hash)
              @retentionPeriod = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @retentionPeriod =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @retentionPeriod = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @retentionPeriod.push Fixnum.from_json(_item)
                 else
                   @retentionPeriod.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @retentionPeriod = _oa
            end
          end
        if !_o['retentionCount'].nil?
          _oa = _o['retentionCount']
            if(_oa.is_a? Hash)
              @retentionCount = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @retentionCount =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @retentionCount = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @retentionCount.push Fixnum.from_json(_item)
                 else
                   @retentionCount.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @retentionCount = _oa
            end
          end
        if !_o['deleteReleasedSnapshots'].nil?
          _oa = _o['deleteReleasedSnapshots']
            if(_oa.is_a? Hash)
              @deleteReleasedSnapshots = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @deleteReleasedSnapshots =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @deleteReleasedSnapshots = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @deleteReleasedSnapshots.push Boolean.from_json(_item)
                 else
                   @deleteReleasedSnapshots.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @deleteReleasedSnapshots = _oa
            end
          end
        if !_o['stageRepoNeeded'].nil?
          _oa = _o['stageRepoNeeded']
            if(_oa.is_a? Hash)
              @stageRepoNeeded = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @stageRepoNeeded =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @stageRepoNeeded = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @stageRepoNeeded.push Boolean.from_json(_item)
                 else
                   @stageRepoNeeded.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @stageRepoNeeded = _oa
            end
          end
        if !_o['resetStats'].nil?
          _oa = _o['resetStats']
            if(_oa.is_a? Hash)
              @resetStats = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @resetStats =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @resetStats = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @resetStats.push Boolean.from_json(_item)
                 else
                   @resetStats.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @resetStats = _oa
            end
          end
        if !_o['skipPackedIndexCreation'].nil?
          _oa = _o['skipPackedIndexCreation']
            if(_oa.is_a? Hash)
              @skipPackedIndexCreation = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @skipPackedIndexCreation =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @skipPackedIndexCreation = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @skipPackedIndexCreation.push Boolean.from_json(_item)
                 else
                   @skipPackedIndexCreation.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @skipPackedIndexCreation = _oa
            end
          end
    end

    # constructs a ManagedRepository 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class ArtifactTransferRequest < Org::Apache::Archiva::Maven2::Model::Artifact 

    # (no documentation provided)
    attr_accessor :targetRepositoryId

    # the json hash for this ArtifactTransferRequest
    def to_jaxb_json_hash
      _h = super
      _h['targetRepositoryId'] = targetRepositoryId.to_jaxb_json_hash unless targetRepositoryId.nil?
      return _h
    end

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

    # constructs a ArtifactTransferRequest 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class RemoteRepository < Org::Apache::Archiva::Admin::Model::Beans::AbstractRepository 

    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :userName
    # (no documentation provided)
    attr_accessor :password
    # (no documentation provided)
    attr_accessor :timeout
    # (no documentation provided)
    attr_accessor :downloadRemoteIndex
    # (no documentation provided)
    attr_accessor :remoteIndexUrl
    # (no documentation provided)
    attr_accessor :remoteDownloadNetworkProxyId
    # (no documentation provided)
    attr_accessor :cronExpression
    # (no documentation provided)
    attr_accessor :remoteDownloadTimeout
    # (no documentation provided)
    attr_accessor :downloadRemoteIndexOnStartup
    # (no documentation provided)
    attr_accessor :extraParameters
    # (no documentation provided)
    attr_accessor :extraParametersEntries
    # (no documentation provided)
    attr_accessor :extraHeaders
    # (no documentation provided)
    attr_accessor :extraHeadersEntries
    # (no documentation provided)
    attr_accessor :checkPath

    # the json hash for this RemoteRepository
    def to_jaxb_json_hash
      _h = super
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['userName'] = userName.to_jaxb_json_hash unless userName.nil?
      _h['password'] = password.to_jaxb_json_hash unless password.nil?
      _h['timeout'] = timeout.to_jaxb_json_hash unless timeout.nil?
      _h['downloadRemoteIndex'] = downloadRemoteIndex.to_jaxb_json_hash unless downloadRemoteIndex.nil?
      _h['remoteIndexUrl'] = remoteIndexUrl.to_jaxb_json_hash unless remoteIndexUrl.nil?
      _h['remoteDownloadNetworkProxyId'] = remoteDownloadNetworkProxyId.to_jaxb_json_hash unless remoteDownloadNetworkProxyId.nil?
      _h['cronExpression'] = cronExpression.to_jaxb_json_hash unless cronExpression.nil?
      _h['remoteDownloadTimeout'] = remoteDownloadTimeout.to_jaxb_json_hash unless remoteDownloadTimeout.nil?
      _h['downloadRemoteIndexOnStartup'] = downloadRemoteIndexOnStartup.to_jaxb_json_hash unless downloadRemoteIndexOnStartup.nil?
      _h['extraParameters'] = extraParameters.to_jaxb_json_hash unless extraParameters.nil?
      if !extraParametersEntries.nil?
        _ha = Array.new
        extraParametersEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['extraParametersEntries'] = _ha
      end
      _h['extraHeaders'] = extraHeaders.to_jaxb_json_hash unless extraHeaders.nil?
      if !extraHeadersEntries.nil?
        _ha = Array.new
        extraHeadersEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['extraHeadersEntries'] = _ha
      end
      _h['checkPath'] = checkPath.to_jaxb_json_hash unless checkPath.nil?
      return _h
    end

    #initializes this RemoteRepository with a json hash
    def init_jaxb_json_hash(_o)
      super _o
        if !_o['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
        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
        if !_o['timeout'].nil?
          _oa = _o['timeout']
            if(_oa.is_a? Hash)
              @timeout = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @timeout =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @timeout = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @timeout.push Fixnum.from_json(_item)
                 else
                   @timeout.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @timeout = _oa
            end
          end
        if !_o['downloadRemoteIndex'].nil?
          _oa = _o['downloadRemoteIndex']
            if(_oa.is_a? Hash)
              @downloadRemoteIndex = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @downloadRemoteIndex =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @downloadRemoteIndex = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @downloadRemoteIndex.push Boolean.from_json(_item)
                 else
                   @downloadRemoteIndex.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @downloadRemoteIndex = _oa
            end
          end
        if !_o['remoteIndexUrl'].nil?
          _oa = _o['remoteIndexUrl']
            if(_oa.is_a? Hash)
              @remoteIndexUrl = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @remoteIndexUrl =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @remoteIndexUrl = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @remoteIndexUrl.push String.from_json(_item)
                 else
                   @remoteIndexUrl.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @remoteIndexUrl = _oa
            end
          end
        if !_o['remoteDownloadNetworkProxyId'].nil?
          _oa = _o['remoteDownloadNetworkProxyId']
            if(_oa.is_a? Hash)
              @remoteDownloadNetworkProxyId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @remoteDownloadNetworkProxyId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @remoteDownloadNetworkProxyId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @remoteDownloadNetworkProxyId.push String.from_json(_item)
                 else
                   @remoteDownloadNetworkProxyId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @remoteDownloadNetworkProxyId = _oa
            end
          end
        if !_o['cronExpression'].nil?
          _oa = _o['cronExpression']
            if(_oa.is_a? Hash)
              @cronExpression = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @cronExpression =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @cronExpression = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @cronExpression.push String.from_json(_item)
                 else
                   @cronExpression.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @cronExpression = _oa
            end
          end
        if !_o['remoteDownloadTimeout'].nil?
          _oa = _o['remoteDownloadTimeout']
            if(_oa.is_a? Hash)
              @remoteDownloadTimeout = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @remoteDownloadTimeout =  Fixnum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @remoteDownloadTimeout = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @remoteDownloadTimeout.push Fixnum.from_json(_item)
                 else
                   @remoteDownloadTimeout.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @remoteDownloadTimeout = _oa
            end
          end
        if !_o['downloadRemoteIndexOnStartup'].nil?
          _oa = _o['downloadRemoteIndexOnStartup']
            if(_oa.is_a? Hash)
              @downloadRemoteIndexOnStartup = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @downloadRemoteIndexOnStartup =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @downloadRemoteIndexOnStartup = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @downloadRemoteIndexOnStartup.push Boolean.from_json(_item)
                 else
                   @downloadRemoteIndexOnStartup.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @downloadRemoteIndexOnStartup = _oa
            end
          end
        if !_o['extraParameters'].nil?
          _oa = _o['extraParameters']
            if(_oa.is_a? Hash)
              @extraParameters = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraParameters =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraParameters = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraParameters.push Hash.from_json(_item)
                 else
                   @extraParameters.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraParameters = _oa
            end
          end
        if !_o['extraParametersEntries'].nil?
          _oa = _o['extraParametersEntries']
            if(_oa.is_a? Hash)
              @extraParametersEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraParametersEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraParametersEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraParametersEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @extraParametersEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraParametersEntries = _oa
            end
          end
        if !_o['extraHeaders'].nil?
          _oa = _o['extraHeaders']
            if(_oa.is_a? Hash)
              @extraHeaders = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraHeaders =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraHeaders = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraHeaders.push Hash.from_json(_item)
                 else
                   @extraHeaders.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraHeaders = _oa
            end
          end
        if !_o['extraHeadersEntries'].nil?
          _oa = _o['extraHeadersEntries']
            if(_oa.is_a? Hash)
              @extraHeadersEntries = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @extraHeadersEntries =  Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @extraHeadersEntries = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @extraHeadersEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item)
                 else
                   @extraHeadersEntries.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @extraHeadersEntries = _oa
            end
          end
        if !_o['checkPath'].nil?
          _oa = _o['checkPath']
            if(_oa.is_a? Hash)
              @checkPath = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @checkPath =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @checkPath = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @checkPath.push String.from_json(_item)
                 else
                   @checkPath.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @checkPath = _oa
            end
          end
    end

    # constructs a RemoteRepository 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class ProjectVersionMetadata < Org::Apache::Archiva::Metadata::Model::FacetedMetadata 

    # (no documentation provided)
    attr_accessor :organization
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :properties
    # (no documentation provided)
    attr_accessor :issueManagement
    # (no documentation provided)
    attr_accessor :incomplete
    # (no documentation provided)
    attr_accessor :description
    # (no documentation provided)
    attr_accessor :scm
    # (no documentation provided)
    attr_accessor :ciManagement
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :mailingLists
    # (no documentation provided)
    attr_accessor :dependencies
    # (no documentation provided)
    attr_accessor :licenses

    # the json hash for this ProjectVersionMetadata
    def to_jaxb_json_hash
      _h = super
      _h['organization'] = organization.to_jaxb_json_hash unless organization.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['properties'] = properties.to_jaxb_json_hash unless properties.nil?
      _h['issueManagement'] = issueManagement.to_jaxb_json_hash unless issueManagement.nil?
      _h['incomplete'] = incomplete.to_jaxb_json_hash unless incomplete.nil?
      _h['description'] = description.to_jaxb_json_hash unless description.nil?
      _h['scm'] = scm.to_jaxb_json_hash unless scm.nil?
      _h['ciManagement'] = ciManagement.to_jaxb_json_hash unless ciManagement.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      if !mailingLists.nil?
        _ha = Array.new
        mailingLists.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['mailingLists'] = _ha
      end
      if !dependencies.nil?
        _ha = Array.new
        dependencies.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['dependencies'] = _ha
      end
      if !licenses.nil?
        _ha = Array.new
        licenses.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['licenses'] = _ha
      end
      return _h
    end

    #initializes this ProjectVersionMetadata with a json hash
    def init_jaxb_json_hash(_o)
      super _o
        if !_o['organization'].nil?
          _oa = _o['organization']
            if(_oa.is_a? Hash)
              @organization = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @organization =  Org::Apache::Archiva::Metadata::Model::Organization.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @organization = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @organization.push Org::Apache::Archiva::Metadata::Model::Organization.from_json(_item)
                 else
                   @organization.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @organization = _oa
            end
          end
        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['url'].nil?
          _oa = _o['url']
            if(_oa.is_a? Hash)
              @url = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @url =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @url = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @url.push String.from_json(_item)
                 else
                   @url.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @url = _oa
            end
          end
        if !_o['properties'].nil?
          _oa = _o['properties']
            if(_oa.is_a? Hash)
              @properties = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @properties =  Hash.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @properties = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @properties.push Hash.from_json(_item)
                 else
                   @properties.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @properties = _oa
            end
          end
        if !_o['issueManagement'].nil?
          _oa = _o['issueManagement']
            if(_oa.is_a? Hash)
              @issueManagement = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @issueManagement =  Org::Apache::Archiva::Metadata::Model::IssueManagement.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @issueManagement = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @issueManagement.push Org::Apache::Archiva::Metadata::Model::IssueManagement.from_json(_item)
                 else
                   @issueManagement.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @issueManagement = _oa
            end
          end
        if !_o['incomplete'].nil?
          _oa = _o['incomplete']
            if(_oa.is_a? Hash)
              @incomplete = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @incomplete =  Boolean.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @incomplete = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @incomplete.push Boolean.from_json(_item)
                 else
                   @incomplete.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @incomplete = _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['scm'].nil?
          _oa = _o['scm']
            if(_oa.is_a? Hash)
              @scm = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @scm =  Org::Apache::Archiva::Metadata::Model::Scm.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @scm = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @scm.push Org::Apache::Archiva::Metadata::Model::Scm.from_json(_item)
                 else
                   @scm.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @scm = _oa
            end
          end
        if !_o['ciManagement'].nil?
          _oa = _o['ciManagement']
            if(_oa.is_a? Hash)
              @ciManagement = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @ciManagement =  Org::Apache::Archiva::Metadata::Model::CiManagement.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @ciManagement = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @ciManagement.push Org::Apache::Archiva::Metadata::Model::CiManagement.from_json(_item)
                 else
                   @ciManagement.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @ciManagement = _oa
            end
          end
        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['mailingLists'].nil?
          _oa = _o['mailingLists']
            if(_oa.is_a? Hash)
              @mailingLists = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @mailingLists =  Org::Apache::Archiva::Metadata::Model::MailingList.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @mailingLists = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @mailingLists.push Org::Apache::Archiva::Metadata::Model::MailingList.from_json(_item)
                 else
                   @mailingLists.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @mailingLists = _oa
            end
          end
        if !_o['dependencies'].nil?
          _oa = _o['dependencies']
            if(_oa.is_a? Hash)
              @dependencies = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @dependencies =  Org::Apache::Archiva::Metadata::Model::Dependency.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @dependencies = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @dependencies.push Org::Apache::Archiva::Metadata::Model::Dependency.from_json(_item)
                 else
                   @dependencies.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @dependencies = _oa
            end
          end
        if !_o['licenses'].nil?
          _oa = _o['licenses']
            if(_oa.is_a? Hash)
              @licenses = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @licenses =  Org::Apache::Archiva::Metadata::Model::License.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @licenses = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @licenses.push Org::Apache::Archiva::Metadata::Model::License.from_json(_item)
                 else
                   @licenses.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @licenses = _oa
            end
          end
    end

    # constructs a ProjectVersionMetadata 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class UserManagerImplementationInformation < Org::Apache::Archiva::Rest::Api::Model::AbstractImplementationInformation 


    # the json hash for this UserManagerImplementationInformation
    def to_jaxb_json_hash
      _h = super
      return _h
    end

    #initializes this UserManagerImplementationInformation with a json hash
    def init_jaxb_json_hash(_o)
      super _o
    end

    # constructs a UserManagerImplementationInformation 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

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class ProxyConnectorRuleType

    # (no documentation provided)
    WHITE_LIST = "WHITE_LIST"

    # (no documentation provided)
    BLACK_LIST = "BLACK_LIST"
  end

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class ProxyConnector < Org::Apache::Archiva::Admin::Model::AbstractRepositoryConnector 

    # int
    attr_accessor :order

    # the json hash for this ProxyConnector
    def to_jaxb_json_hash
      _h = super
      _h['order'] = order.to_jaxb_json_hash unless order.nil?
      return _h
    end

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

    # constructs a ProxyConnector 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

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class ArtifactMetadata < Org::Apache::Archiva::Metadata::Model::FacetedMetadata 

    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :size
    # (no documentation provided)
    attr_accessor :sha1
    # (no documentation provided)
    attr_accessor :fileLastModified
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :md5
    # (no documentation provided)
    attr_accessor :whenGathered
    # (no documentation provided)
    attr_accessor :projectVersion
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :project
    # (no documentation provided)
    attr_accessor :namespace

    # the json hash for this ArtifactMetadata
    def to_jaxb_json_hash
      _h = super
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['size'] = size.to_jaxb_json_hash unless size.nil?
      _h['sha1'] = sha1.to_jaxb_json_hash unless sha1.nil?
      _h['fileLastModified'] = fileLastModified.to_jaxb_json_hash unless fileLastModified.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['md5'] = md5.to_jaxb_json_hash unless md5.nil?
      _h['whenGathered'] = whenGathered.to_jaxb_json_hash unless whenGathered.nil?
      _h['projectVersion'] = projectVersion.to_jaxb_json_hash unless projectVersion.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['project'] = project.to_jaxb_json_hash unless project.nil?
      _h['namespace'] = namespace.to_jaxb_json_hash unless namespace.nil?
      return _h
    end

    #initializes this ArtifactMetadata with a json hash
    def init_jaxb_json_hash(_o)
      super _o
        if !_o['repositoryId'].nil?
          _oa = _o['repositoryId']
            if(_oa.is_a? Hash)
              @repositoryId = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @repositoryId =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @repositoryId = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @repositoryId.push String.from_json(_item)
                 else
                   @repositoryId.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @repositoryId = _oa
            end
          end
        if !_o['size'].nil?
          _oa = _o['size']
            if(_oa.is_a? Hash)
              @size = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @size =  Bignum.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @size = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @size.push Bignum.from_json(_item)
                 else
                   @size.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @size = _oa
            end
          end
        if !_o['sha1'].nil?
          _oa = _o['sha1']
            if(_oa.is_a? Hash)
              @sha1 = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @sha1 =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @sha1 = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @sha1.push String.from_json(_item)
                 else
                   @sha1.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @sha1 = _oa
            end
          end
        if !_o['fileLastModified'].nil?
          _oa = _o['fileLastModified']
            if(_oa.is_a? Hash)
              @fileLastModified = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @fileLastModified =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @fileLastModified = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @fileLastModified.push Time.from_json(_item)
                 else
                   @fileLastModified.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @fileLastModified = _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['md5'].nil?
          _oa = _o['md5']
            if(_oa.is_a? Hash)
              @md5 = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @md5 =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @md5 = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @md5.push String.from_json(_item)
                 else
                   @md5.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @md5 = _oa
            end
          end
        if !_o['whenGathered'].nil?
          _oa = _o['whenGathered']
            if(_oa.is_a? Hash)
              @whenGathered = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @whenGathered =  Time.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @whenGathered = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @whenGathered.push Time.from_json(_item)
                 else
                   @whenGathered.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @whenGathered = _oa
            end
          end
        if !_o['projectVersion'].nil?
          _oa = _o['projectVersion']
            if(_oa.is_a? Hash)
              @projectVersion = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @projectVersion =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @projectVersion = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @projectVersion.push String.from_json(_item)
                 else
                   @projectVersion.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @projectVersion = _oa
            end
          end
        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['project'].nil?
          _oa = _o['project']
            if(_oa.is_a? Hash)
              @project = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @project =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @project = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @project.push String.from_json(_item)
                 else
                   @project.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @project = _oa
            end
          end
        if !_o['namespace'].nil?
          _oa = _o['namespace']
            if(_oa.is_a? Hash)
              @namespace = EnunciateHelpers::LAMB_CLASS_AWARE.call(_oa) if _oa['@class']
              @namespace =  String.from_json(_oa) unless _oa['@class']
            elsif (_oa.is_a? Array)
              #an array(of hashes hopefully) or scalar
              @namespace = Array.new
              _oa.each { | _item | 
                 if ((_item.nil? || _item['@class'].nil?)rescue true)
                   @namespace.push String.from_json(_item)
                 else
                   @namespace.push EnunciateHelpers::LAMB_CLASS_AWARE.call(_item)
                 end
               }
            else
                @namespace = _oa
            end
          end
    end

    # constructs a ArtifactMetadata 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

module Org

module Apache

module Archiva

module Rest

module Api

module Model

  # (no documentation provided)
  class RBACManagerImplementationInformation < Org::Apache::Archiva::Rest::Api::Model::AbstractImplementationInformation 


    # the json hash for this RBACManagerImplementationInformation
    def to_jaxb_json_hash
      _h = super
      return _h
    end

    #initializes this RBACManagerImplementationInformation with a json hash
    def init_jaxb_json_hash(_o)
      super _o
    end

    # constructs a RBACManagerImplementationInformation 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
