#
# 
#
# 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 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)
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @protocol = String.from_json(_o['protocol']) unless _o['protocol'].nil?
      @host = String.from_json(_o['host']) unless _o['host'].nil?
      @port = Fixnum.from_json(_o['port']) unless _o['port'].nil?
      @username = String.from_json(_o['username']) unless _o['username'].nil?
      @password = String.from_json(_o['password']) unless _o['password'].nil?
      @useNtlm = Boolean.from_json(_o['useNtlm']) unless _o['useNtlm'].nil?
    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 Admin

module Model

  # (no documentation provided)
  class AbstractRepositoryConnector 

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

    # the json hash for this AbstractRepositoryConnector
    def to_jaxb_json_hash
      _h = {}
      if !blackListPatterns.nil?
        _ha = Array.new
        blackListPatterns.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['blackListPatterns'] = _ha
      end
      _h['policies'] = policies.to_jaxb_json_hash unless policies.nil?
      _h['properties'] = properties.to_jaxb_json_hash unless properties.nil?
      _h['proxyId'] = proxyId.to_jaxb_json_hash unless proxyId.nil?
      _h['sourceRepoId'] = sourceRepoId.to_jaxb_json_hash unless sourceRepoId.nil?
      _h['targetRepoId'] = targetRepoId.to_jaxb_json_hash unless targetRepoId.nil?
      if !whiteListPatterns.nil?
        _ha = Array.new
        whiteListPatterns.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['whiteListPatterns'] = _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
      if !propertiesEntries.nil?
        _ha = Array.new
        propertiesEntries.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['propertiesEntries'] = _ha
      end
      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['blackListPatterns'].nil?
        @blackListPatterns = Array.new
        _oa = _o['blackListPatterns']
        _oa.each { | _item | @blackListPatterns.push String.from_json(_item) }
      end
      @policies = Hash.from_json(_o['policies']) unless _o['policies'].nil?
      @properties = Hash.from_json(_o['properties']) unless _o['properties'].nil?
      @proxyId = String.from_json(_o['proxyId']) unless _o['proxyId'].nil?
      @sourceRepoId = String.from_json(_o['sourceRepoId']) unless _o['sourceRepoId'].nil?
      @targetRepoId = String.from_json(_o['targetRepoId']) unless _o['targetRepoId'].nil?
      if !_o['whiteListPatterns'].nil?
        @whiteListPatterns = Array.new
        _oa = _o['whiteListPatterns']
        _oa.each { | _item | @whiteListPatterns.push String.from_json(_item) }
      end
      @disabled = Boolean.from_json(_o['disabled']) unless _o['disabled'].nil?
      if !_o['policiesEntries'].nil?
        @policiesEntries = Array.new
        _oa = _o['policiesEntries']
        _oa.each { | _item | @policiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      end
      if !_o['propertiesEntries'].nil?
        @propertiesEntries = Array.new
        _oa = _o['propertiesEntries']
        _oa.each { | _item | @propertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      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 Metadata

module Model

  # (no documentation provided)
  class FacetedMetadata 

    # the facets of the metadata
    attr_accessor :facetList
    # the collection of facet IDs.
    attr_accessor :facetIds
    # the map of facets
    attr_accessor :facets

    # the json hash for this FacetedMetadata
    def to_jaxb_json_hash
      _h = {}
      if !facetList.nil?
        _ha = Array.new
        facetList.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['facetList'] = _ha
      end
      if !facetIds.nil?
        _ha = Array.new
        facetIds.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['facetIds'] = _ha
      end
      _h['facets'] = facets.to_jaxb_json_hash unless facets.nil?
      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['facetList'].nil?
        @facetList = Array.new
        _oa = _o['facetList']
        _oa.each { | _item | @facetList.push Org::Apache::Archiva::Metadata::Model::MetadataFacet.from_json(_item) }
      end
      if !_o['facetIds'].nil?
        @facetIds = Array.new
        _oa = _o['facetIds']
        _oa.each { | _item | @facetIds.push String.from_json(_item) }
      end
      @facets = Hash.from_json(_o['facets']) unless _o['facets'].nil?
    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 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)
      @key = String.from_json(_o['key']) unless _o['key'].nil?
      @value = String.from_json(_o['value']) unless _o['value'].nil?
    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 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)
      @lockingTimeout = Fixnum.from_json(_o['lockingTimeout']) unless _o['lockingTimeout'].nil?
      @skipLocking = Boolean.from_json(_o['skipLocking']) unless _o['skipLocking'].nil?
    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 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)
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @system = String.from_json(_o['system']) unless _o['system'].nil?
    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 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?
        @groupIds = Array.new
        _oa = _o['groupIds']
        _oa.each { | _item | @groupIds.push String.from_json(_item) }
      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 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)
      @group = String.from_json(_o['group']) unless _o['group'].nil?
      if !_o['roleNames'].nil?
        @roleNames = Array.new
        _oa = _o['roleNames']
        _oa.each { | _item | @roleNames.push String.from_json(_item) }
      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 Metadata

module Model

  # (no documentation provided)
  class MailingList 

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

    # the json hash for this MailingList
    def to_jaxb_json_hash
      _h = {}
      _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['subscribeAddress'] = subscribeAddress.to_jaxb_json_hash unless subscribeAddress.nil?
      _h['unsubscribeAddress'] = unsubscribeAddress.to_jaxb_json_hash unless unsubscribeAddress.nil?
      _h['postAddress'] = postAddress.to_jaxb_json_hash unless postAddress.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.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)
      @mainArchiveUrl = String.from_json(_o['mainArchiveUrl']) unless _o['mainArchiveUrl'].nil?
      if !_o['otherArchives'].nil?
        @otherArchives = Array.new
        _oa = _o['otherArchives']
        _oa.each { | _item | @otherArchives.push String.from_json(_item) }
      end
      @subscribeAddress = String.from_json(_o['subscribeAddress']) unless _o['subscribeAddress'].nil?
      @unsubscribeAddress = String.from_json(_o['unsubscribeAddress']) unless _o['unsubscribeAddress'].nil?
      @postAddress = String.from_json(_o['postAddress']) unless _o['postAddress'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
    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 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)
      @maxTotal = Fixnum.from_json(_o['maxTotal']) unless _o['maxTotal'].nil?
      @maxTotalPerHost = Fixnum.from_json(_o['maxTotalPerHost']) unless _o['maxTotalPerHost'].nil?
      @usePooling = Boolean.from_json(_o['usePooling']) unless _o['usePooling'].nil?
    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 Metadata

module Model

  # (no documentation provided)
  class Dependency 

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

    # the json hash for this Dependency
    def to_jaxb_json_hash
      _h = {}
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['optional'] = optional.to_jaxb_json_hash unless optional.nil?
      _h['scope'] = scope.to_jaxb_json_hash unless scope.nil?
      _h['systemPath'] = systemPath.to_jaxb_json_hash unless systemPath.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['artifactId'] = artifactId.to_jaxb_json_hash unless artifactId.nil?
      _h['groupId'] = groupId.to_jaxb_json_hash unless groupId.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)
      @classifier = String.from_json(_o['classifier']) unless _o['classifier'].nil?
      @optional = Boolean.from_json(_o['optional']) unless _o['optional'].nil?
      @scope = String.from_json(_o['scope']) unless _o['scope'].nil?
      @systemPath = String.from_json(_o['systemPath']) unless _o['systemPath'].nil?
      @type = String.from_json(_o['type']) unless _o['type'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
    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 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)
      @pattern = String.from_json(_o['pattern']) unless _o['pattern'].nil?
      @proxyConnectorRuleType = String.from_json(_o['proxyConnectorRuleType']) unless _o['proxyConnectorRuleType'].nil?
      if !_o['proxyConnectors'].nil?
        @proxyConnectors = Array.new
        _oa = _o['proxyConnectors']
        _oa.each { | _item | @proxyConnectors.push Org::Apache::Archiva::Admin::Model::Beans::ProxyConnector.from_json(_item) }
      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 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?
        @userManagerImpls = Array.new
        _oa = _o['userManagerImpls']
        _oa.each { | _item | @userManagerImpls.push String.from_json(_item) }
      end
      @ldapConfiguration = Org::Apache::Archiva::Admin::Model::Beans::LdapConfiguration.from_json(_o['ldapConfiguration']) unless _o['ldapConfiguration'].nil?
      @migratedFromRedbackConfiguration = Boolean.from_json(_o['migratedFromRedbackConfiguration']) unless _o['migratedFromRedbackConfiguration'].nil?
      @configurationProperties = Hash.from_json(_o['configurationProperties']) unless _o['configurationProperties'].nil?
      if !_o['configurationPropertiesEntries'].nil?
        @configurationPropertiesEntries = Array.new
        _oa = _o['configurationPropertiesEntries']
        _oa.each { | _item | @configurationPropertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      end
      @useUsersCache = Boolean.from_json(_o['useUsersCache']) unless _o['useUsersCache'].nil?
      @usersCacheConfiguration = Org::Apache::Archiva::Admin::Model::Beans::CacheConfiguration.from_json(_o['usersCacheConfiguration']) unless _o['usersCacheConfiguration'].nil?
      if !_o['rbacManagerImpls'].nil?
        @rbacManagerImpls = Array.new
        _oa = _o['rbacManagerImpls']
        _oa.each { | _item | @rbacManagerImpls.push String.from_json(_item) }
      end
      if !_o['ldapGroupMappings'].nil?
        @ldapGroupMappings = Array.new
        _oa = _o['ldapGroupMappings']
        _oa.each { | _item | @ldapGroupMappings.push Org::Apache::Archiva::Admin::Model::Beans::LdapGroupMapping.from_json(_item) }
      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 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)
      @key = String.from_json(_o['key']) unless _o['key'].nil?
      @entriesNumber = Fixnum.from_json(_o['entriesNumber']) unless _o['entriesNumber'].nil?
    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 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?
        @strings = Array.new
        _oa = _o['strings']
        _oa.each { | _item | @strings.push String.from_json(_item) }
      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 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)
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @system = String.from_json(_o['system']) unless _o['system'].nil?
    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 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?
        @browseResultEntries = Array.new
        _oa = _o['browseResultEntries']
        _oa.each { | _item | @browseResultEntries.push Org::Apache::Archiva::Rest::Api::Model::BrowseResultEntry.from_json(_item) }
      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 Rest

module Api

module Model

  # (no documentation provided)
  class ChecksumSearch 

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

    # the json hash for this ChecksumSearch
    def to_jaxb_json_hash
      _h = {}
      _h['checksum'] = checksum.to_jaxb_json_hash unless checksum.nil?
      if !repositories.nil?
        _ha = Array.new
        repositories.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['repositories'] = _ha
      end
      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)
      @checksum = String.from_json(_o['checksum']) unless _o['checksum'].nil?
      if !_o['repositories'].nil?
        @repositories = Array.new
        _oa = _o['repositories']
        _oa.each { | _item | @repositories.push String.from_json(_item) }
      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 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)
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @logoLocation = String.from_json(_o['logoLocation']) unless _o['logoLocation'].nil?
    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 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)
      @loggerName = String.from_json(_o['loggerName']) unless _o['loggerName'].nil?
      @message = String.from_json(_o['message']) unless _o['message'].nil?
    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 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?
        @userManagerImplementationInformations = Array.new
        _oa = _o['userManagerImplementationInformations']
        _oa.each { | _item | @userManagerImplementationInformations.push Org::Apache::Archiva::Rest::Api::Model::UserManagerImplementationInformation.from_json(_item) }
      end
      if !_o['rbacManagerImplementationInformations'].nil?
        @rbacManagerImplementationInformations = Array.new
        _oa = _o['rbacManagerImplementationInformations']
        _oa.each { | _item | @rbacManagerImplementationInformations.push Org::Apache::Archiva::Rest::Api::Model::RBACManagerImplementationInformation.from_json(_item) }
      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 Maven2

module Model

  # (no documentation provided)
  class TreeEntry 

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

    # the json hash for this TreeEntry
    def to_jaxb_json_hash
      _h = {}
      _h['artifact'] = artifact.to_jaxb_json_hash unless artifact.nil?
      if !childs.nil?
        _ha = Array.new
        childs.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['childs'] = _ha
      end
      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)
      @artifact = Org::Apache::Archiva::Maven2::Model::Artifact.from_json(_o['artifact']) unless _o['artifact'].nil?
      if !_o['childs'].nil?
        @childs = Array.new
        _oa = _o['childs']
        _oa.each { | _item | @childs.push Org::Apache::Archiva::Maven2::Model::TreeEntry.from_json(_item) }
      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 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)
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @size = Bignum.from_json(_o['size']) unless _o['size'].nil?
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @deleteUrl = String.from_json(_o['deleteUrl']) unless _o['deleteUrl'].nil?
      @deleteType = String.from_json(_o['deleteType']) unless _o['deleteType'].nil?
      @errorKey = String.from_json(_o['errorKey']) unless _o['errorKey'].nil?
      @classifier = String.from_json(_o['classifier']) unless _o['classifier'].nil?
      @pomFile = Boolean.from_json(_o['pomFile']) unless _o['pomFile'].nil?
      @serverFileName = String.from_json(_o['serverFileName']) unless _o['serverFileName'].nil?
      @packaging = String.from_json(_o['packaging']) unless _o['packaging'].nil?
    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 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)
      @consumerKey = String.from_json(_o['consumerKey']) unless _o['consumerKey'].nil?
      @count = Bignum.from_json(_o['count']) unless _o['count'].nil?
      @time = Bignum.from_json(_o['time']) unless _o['time'].nil?
      @average = String.from_json(_o['average']) unless _o['average'].nil?
    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 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

    # 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?
      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)
      @scanEndTime = Time.from_json(_o['scanEndTime']) unless _o['scanEndTime'].nil?
      @scanStartTime = Time.from_json(_o['scanStartTime']) unless _o['scanStartTime'].nil?
      @totalArtifactCount = Bignum.from_json(_o['totalArtifactCount']) unless _o['totalArtifactCount'].nil?
      @totalArtifactFileSize = Bignum.from_json(_o['totalArtifactFileSize']) unless _o['totalArtifactFileSize'].nil?
      @totalFileCount = Bignum.from_json(_o['totalFileCount']) unless _o['totalFileCount'].nil?
      @totalGroupCount = Bignum.from_json(_o['totalGroupCount']) unless _o['totalGroupCount'].nil?
      @totalProjectCount = Bignum.from_json(_o['totalProjectCount']) unless _o['totalProjectCount'].nil?
      @newFileCount = Bignum.from_json(_o['newFileCount']) unless _o['newFileCount'].nil?
      @duration = Bignum.from_json(_o['duration']) unless _o['duration'].nil?
      @lastScanDate = String.from_json(_o['lastScanDate']) unless _o['lastScanDate'].nil?
    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 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)
      @key = String.from_json(_o['key']) unless _o['key'].nil?
      @value = String.from_json(_o['value']) unless _o['value'].nil?
    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 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)
      @content = String.from_json(_o['content']) unless _o['content'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
    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 Repository

module Scanner

  # (no documentation provided)
  class RepositoryScanStatistics 

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

    # the json hash for this RepositoryScanStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['whenGathered'] = whenGathered.to_jaxb_json_hash unless whenGathered.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['duration'] = duration.to_jaxb_json_hash unless duration.nil?
      _h['totalFileCount'] = totalFileCount.to_jaxb_json_hash unless totalFileCount.nil?
      _h['newFileCount'] = newFileCount.to_jaxb_json_hash unless newFileCount.nil?
      _h['totalSize'] = totalSize.to_jaxb_json_hash unless totalSize.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)
      @whenGathered = Time.from_json(_o['whenGathered']) unless _o['whenGathered'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
      @duration = Bignum.from_json(_o['duration']) unless _o['duration'].nil?
      @totalFileCount = Bignum.from_json(_o['totalFileCount']) unless _o['totalFileCount'].nil?
      @newFileCount = Bignum.from_json(_o['newFileCount']) unless _o['newFileCount'].nil?
      @totalSize = Bignum.from_json(_o['totalSize']) unless _o['totalSize'].nil?
    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 Repository

module Stats

  # (no documentation provided)
  class RepositoryStatistics 

    # (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 :repositoryId
    # (no documentation provided)
    attr_accessor :facetId
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :totalCountForType

    # the json hash for this RepositoryStatistics
    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['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['facetId'] = facetId.to_jaxb_json_hash unless facetId.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['totalCountForType'] = totalCountForType.to_jaxb_json_hash unless totalCountForType.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)
      @scanEndTime = Time.from_json(_o['scanEndTime']) unless _o['scanEndTime'].nil?
      @scanStartTime = Time.from_json(_o['scanStartTime']) unless _o['scanStartTime'].nil?
      @totalArtifactCount = Bignum.from_json(_o['totalArtifactCount']) unless _o['totalArtifactCount'].nil?
      @totalArtifactFileSize = Bignum.from_json(_o['totalArtifactFileSize']) unless _o['totalArtifactFileSize'].nil?
      @totalFileCount = Bignum.from_json(_o['totalFileCount']) unless _o['totalFileCount'].nil?
      @totalGroupCount = Bignum.from_json(_o['totalGroupCount']) unless _o['totalGroupCount'].nil?
      @totalProjectCount = Bignum.from_json(_o['totalProjectCount']) unless _o['totalProjectCount'].nil?
      @newFileCount = Bignum.from_json(_o['newFileCount']) unless _o['newFileCount'].nil?
      @duration = Bignum.from_json(_o['duration']) unless _o['duration'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
      @facetId = String.from_json(_o['facetId']) unless _o['facetId'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @totalCountForType = Hash.from_json(_o['totalCountForType']) unless _o['totalCountForType'].nil?
    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

module Org

module Apache

module Archiva

module Maven2

module Model

  # (no documentation provided)
  class Artifact 

    # (no documentation provided)
    attr_accessor :groupId
    # (no documentation provided)
    attr_accessor :artifactId
    # (no documentation provided)
    attr_accessor :version
    # (no documentation provided)
    attr_accessor :repositoryId
    # (no documentation provided)
    attr_accessor :context
    # (no documentation provided)
    attr_accessor :url
    # (no documentation provided)
    attr_accessor :prefix
    # (no documentation provided)
    attr_accessor :goals
    # (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 :bundleDescription
    # (no documentation provided)
    attr_accessor :bundleName
    # (no documentation provided)
    attr_accessor :bundleLicense
    # (no documentation provided)
    attr_accessor :bundleDocUrl
    # (no documentation provided)
    attr_accessor :bundleImportPackage
    # (no documentation provided)
    attr_accessor :bundleRequireBundle
    # (no documentation provided)
    attr_accessor :classifier
    # (no documentation provided)
    attr_accessor :packaging
    # (no documentation provided)
    attr_accessor :fileExtension
    # (no documentation provided)
    attr_accessor :size
    # (no documentation provided)
    attr_accessor :type
    # (no documentation provided)
    attr_accessor :path
    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :scope

    # the json hash for this Artifact
    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['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['context'] = context.to_jaxb_json_hash unless context.nil?
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['prefix'] = prefix.to_jaxb_json_hash unless prefix.nil?
      if !goals.nil?
        _ha = Array.new
        goals.each { | _item | _ha.push _item.to_jaxb_json_hash }
        _h['goals'] = _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['bundleDescription'] = bundleDescription.to_jaxb_json_hash unless bundleDescription.nil?
      _h['bundleName'] = bundleName.to_jaxb_json_hash unless bundleName.nil?
      _h['bundleLicense'] = bundleLicense.to_jaxb_json_hash unless bundleLicense.nil?
      _h['bundleDocUrl'] = bundleDocUrl.to_jaxb_json_hash unless bundleDocUrl.nil?
      _h['bundleImportPackage'] = bundleImportPackage.to_jaxb_json_hash unless bundleImportPackage.nil?
      _h['bundleRequireBundle'] = bundleRequireBundle.to_jaxb_json_hash unless bundleRequireBundle.nil?
      _h['classifier'] = classifier.to_jaxb_json_hash unless classifier.nil?
      _h['packaging'] = packaging.to_jaxb_json_hash unless packaging.nil?
      _h['fileExtension'] = fileExtension.to_jaxb_json_hash unless fileExtension.nil?
      _h['size'] = size.to_jaxb_json_hash unless size.nil?
      _h['type'] = type.to_jaxb_json_hash unless type.nil?
      _h['path'] = path.to_jaxb_json_hash unless path.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['scope'] = scope.to_jaxb_json_hash unless scope.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)
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
      @context = String.from_json(_o['context']) unless _o['context'].nil?
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @prefix = String.from_json(_o['prefix']) unless _o['prefix'].nil?
      if !_o['goals'].nil?
        @goals = Array.new
        _oa = _o['goals']
        _oa.each { | _item | @goals.push String.from_json(_item) }
      end
      @bundleVersion = String.from_json(_o['bundleVersion']) unless _o['bundleVersion'].nil?
      @bundleSymbolicName = String.from_json(_o['bundleSymbolicName']) unless _o['bundleSymbolicName'].nil?
      @bundleExportPackage = String.from_json(_o['bundleExportPackage']) unless _o['bundleExportPackage'].nil?
      @bundleExportService = String.from_json(_o['bundleExportService']) unless _o['bundleExportService'].nil?
      @bundleDescription = String.from_json(_o['bundleDescription']) unless _o['bundleDescription'].nil?
      @bundleName = String.from_json(_o['bundleName']) unless _o['bundleName'].nil?
      @bundleLicense = String.from_json(_o['bundleLicense']) unless _o['bundleLicense'].nil?
      @bundleDocUrl = String.from_json(_o['bundleDocUrl']) unless _o['bundleDocUrl'].nil?
      @bundleImportPackage = String.from_json(_o['bundleImportPackage']) unless _o['bundleImportPackage'].nil?
      @bundleRequireBundle = String.from_json(_o['bundleRequireBundle']) unless _o['bundleRequireBundle'].nil?
      @classifier = String.from_json(_o['classifier']) unless _o['classifier'].nil?
      @packaging = String.from_json(_o['packaging']) unless _o['packaging'].nil?
      @fileExtension = String.from_json(_o['fileExtension']) unless _o['fileExtension'].nil?
      @size = String.from_json(_o['size']) unless _o['size'].nil?
      @type = String.from_json(_o['type']) unless _o['type'].nil?
      @path = String.from_json(_o['path']) unless _o['path'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @scope = String.from_json(_o['scope']) unless _o['scope'].nil?
    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 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)
      @managedRepository = Org::Apache::Archiva::Admin::Model::Beans::ManagedRepository.from_json(_o['managedRepository']) unless _o['managedRepository'].nil?
      if !_o['consumerScanningStatistics'].nil?
        @consumerScanningStatistics = Array.new
        _oa = _o['consumerScanningStatistics']
        _oa.each { | _item | @consumerScanningStatistics.push Org::Apache::Archiva::Rest::Api::Model::ConsumerScanningStatistics.from_json(_item) }
      end
      @totalFileCount = Bignum.from_json(_o['totalFileCount']) unless _o['totalFileCount'].nil?
      @newFileCount = Bignum.from_json(_o['newFileCount']) unless _o['newFileCount'].nil?
    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 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)
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @project = Boolean.from_json(_o['project']) unless _o['project'].nil?
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
    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 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)
      @path = String.from_json(_o['path']) unless _o['path'].nil?
      @artifact = String.from_json(_o['artifact']) unless _o['artifact'].nil?
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @classifier = String.from_json(_o['classifier']) unless _o['classifier'].nil?
      @type = String.from_json(_o['type']) unless _o['type'].nil?
    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 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)
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @metadatas = Hash.from_json(_o['metadatas']) unless _o['metadatas'].nil?
    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 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?
        @versions = Array.new
        _oa = _o['versions']
        _oa.each { | _item | @versions.push String.from_json(_item) }
      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 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)
      @urlFailureCacheConfiguration = Org::Apache::Archiva::Admin::Model::Beans::CacheConfiguration.from_json(_o['urlFailureCacheConfiguration']) unless _o['urlFailureCacheConfiguration'].nil?
      @fileLockConfiguration = Org::Apache::Archiva::Admin::Model::Beans::FileLockConfiguration.from_json(_o['fileLockConfiguration']) unless _o['fileLockConfiguration'].nil?
    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 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)
      @description = String.from_json(_o['description']) unless _o['description'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @enabled = Boolean.from_json(_o['enabled']) unless _o['enabled'].nil?
    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

module Facets

  # (no documentation provided)
  class RepositoryProblemFacet 

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

    # the json hash for this RepositoryProblemFacet
    def to_jaxb_json_hash
      _h = {}
      _h['facetId'] = facetId.to_jaxb_json_hash unless facetId.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['namespace'] = namespace.to_jaxb_json_hash unless namespace.nil?
      _h['project'] = project.to_jaxb_json_hash unless project.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['message'] = message.to_jaxb_json_hash unless message.nil?
      _h['problem'] = problem.to_jaxb_json_hash unless problem.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)
      @facetId = String.from_json(_o['facetId']) unless _o['facetId'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
      @namespace = String.from_json(_o['namespace']) unless _o['namespace'].nil?
      @project = String.from_json(_o['project']) unless _o['project'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @message = String.from_json(_o['message']) unless _o['message'].nil?
      @problem = String.from_json(_o['problem']) unless _o['problem'].nil?
    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 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)
      @timeToIdleSeconds = Fixnum.from_json(_o['timeToIdleSeconds']) unless _o['timeToIdleSeconds'].nil?
      @timeToLiveSeconds = Fixnum.from_json(_o['timeToLiveSeconds']) unless _o['timeToLiveSeconds'].nil?
      @maxElementsInMemory = Fixnum.from_json(_o['maxElementsInMemory']) unless _o['maxElementsInMemory'].nil?
      @maxElementsOnDisk = Fixnum.from_json(_o['maxElementsOnDisk']) unless _o['maxElementsOnDisk'].nil?
    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 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)
      @groupId = String.from_json(_o['groupId']) unless _o['groupId'].nil?
      @artifactId = String.from_json(_o['artifactId']) unless _o['artifactId'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @packaging = String.from_json(_o['packaging']) unless _o['packaging'].nil?
      @className = String.from_json(_o['className']) unless _o['className'].nil?
      if !_o['repositories'].nil?
        @repositories = Array.new
        _oa = _o['repositories']
        _oa.each { | _item | @repositories.push String.from_json(_item) }
      end
      @bundleVersion = String.from_json(_o['bundleVersion']) unless _o['bundleVersion'].nil?
      @bundleSymbolicName = String.from_json(_o['bundleSymbolicName']) unless _o['bundleSymbolicName'].nil?
      @bundleExportPackage = String.from_json(_o['bundleExportPackage']) unless _o['bundleExportPackage'].nil?
      @bundleExportService = String.from_json(_o['bundleExportService']) unless _o['bundleExportService'].nil?
      @classifier = String.from_json(_o['classifier']) unless _o['classifier'].nil?
      @includePomArtifacts = Boolean.from_json(_o['includePomArtifacts']) unless _o['includePomArtifacts'].nil?
      @queryTerms = String.from_json(_o['queryTerms']) unless _o['queryTerms'].nil?
      @bundleImportPackage = String.from_json(_o['bundleImportPackage']) unless _o['bundleImportPackage'].nil?
      @bundleRequireBundle = String.from_json(_o['bundleRequireBundle']) unless _o['bundleRequireBundle'].nil?
      @pageSize = Fixnum.from_json(_o['pageSize']) unless _o['pageSize'].nil?
      @selectedPage = Fixnum.from_json(_o['selectedPage']) unless _o['selectedPage'].nil?
    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 Metadata

module Model

  # (no documentation provided)
  class Scm 

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

    # the json hash for this Scm
    def to_jaxb_json_hash
      _h = {}
      _h['url'] = url.to_jaxb_json_hash unless url.nil?
      _h['developerConnection'] = developerConnection.to_jaxb_json_hash unless developerConnection.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)
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @developerConnection = String.from_json(_o['developerConnection']) unless _o['developerConnection'].nil?
      @connection = String.from_json(_o['connection']) unless _o['connection'].nil?
    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 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)
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @url = String.from_json(_o['url']) unless _o['url'].nil?
    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 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)
      @showFindArtifacts = Boolean.from_json(_o['showFindArtifacts']) unless _o['showFindArtifacts'].nil?
      @appletFindEnabled = Boolean.from_json(_o['appletFindEnabled']) unless _o['appletFindEnabled'].nil?
      @disableEasterEggs = Boolean.from_json(_o['disableEasterEggs']) unless _o['disableEasterEggs'].nil?
      @applicationUrl = String.from_json(_o['applicationUrl']) unless _o['applicationUrl'].nil?
      @disableRegistration = Boolean.from_json(_o['disableRegistration']) unless _o['disableRegistration'].nil?
    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 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)
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      if !_o['repositories'].nil?
        @repositories = Array.new
        _oa = _o['repositories']
        _oa.each { | _item | @repositories.push String.from_json(_item) }
      end
      @mergedIndexPath = String.from_json(_o['mergedIndexPath']) unless _o['mergedIndexPath'].nil?
      @mergedIndexTtl = Fixnum.from_json(_o['mergedIndexTtl']) unless _o['mergedIndexTtl'].nil?
      @cronExpression = String.from_json(_o['cronExpression']) unless _o['cronExpression'].nil?
    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 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)
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      if !_o['patterns'].nil?
        @patterns = Array.new
        _oa = _o['patterns']
        _oa.each { | _item | @patterns.push String.from_json(_item) }
      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)
      @path = String.from_json(_o['path']) unless _o['path'].nil?
      @file = Boolean.from_json(_o['file']) unless _o['file'].nil?
      @depth = Fixnum.from_json(_o['depth']) unless _o['depth'].nil?
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
    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 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)
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
    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 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)
      @key = String.from_json(_o['key']) unless _o['key'].nil?
      @size = Bignum.from_json(_o['size']) unless _o['size'].nil?
      @cacheHits = Bignum.from_json(_o['cacheHits']) unless _o['cacheHits'].nil?
      @cacheMiss = Bignum.from_json(_o['cacheMiss']) unless _o['cacheMiss'].nil?
      @cacheHitRate = String.from_json(_o['cacheHitRate']) unless _o['cacheHitRate'].nil?
      @inMemorySize = Bignum.from_json(_o['inMemorySize']) unless _o['inMemorySize'].nil?
    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 Admin

module Model

module Beans

  # (no documentation provided)
  class AbstractRepository 

    # (no documentation provided)
    attr_accessor :id
    # (no documentation provided)
    attr_accessor :name
    # (no documentation provided)
    attr_accessor :layout
    # (no documentation provided)
    attr_accessor :indexDirectory
    # (no documentation provided)
    attr_accessor :description

    # the json hash for this AbstractRepository
    def to_jaxb_json_hash
      _h = {}
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['layout'] = layout.to_jaxb_json_hash unless layout.nil?
      _h['indexDirectory'] = indexDirectory.to_jaxb_json_hash unless indexDirectory.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)
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @layout = String.from_json(_o['layout']) unless _o['layout'].nil?
      @indexDirectory = String.from_json(_o['indexDirectory']) unless _o['indexDirectory'].nil?
      @description = String.from_json(_o['description']) unless _o['description'].nil?
    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 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?
        @options = Array.new
        _oa = _o['options']
        _oa.each { | _item | @options.push String.from_json(_item) }
      end
      @defaultOption = String.from_json(_o['defaultOption']) unless _o['defaultOption'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
    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 Rest

module Api

module Model

  # (no documentation provided)
  class AbstractImplementationInformation 

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

    # the json hash for this AbstractImplementationInformation
    def to_jaxb_json_hash
      _h = {}
      _h['beanId'] = beanId.to_jaxb_json_hash unless beanId.nil?
      _h['descriptionKey'] = descriptionKey.to_jaxb_json_hash unless descriptionKey.nil?
      _h['readOnly'] = readOnly.to_jaxb_json_hash unless readOnly.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)
      @beanId = String.from_json(_o['beanId']) unless _o['beanId'].nil?
      @descriptionKey = String.from_json(_o['descriptionKey']) unless _o['descriptionKey'].nil?
      @readOnly = Boolean.from_json(_o['readOnly']) unless _o['readOnly'].nil?
    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 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)
      @path = String.from_json(_o['path']) unless _o['path'].nil?
      @domain = String.from_json(_o['domain']) unless _o['domain'].nil?
      @secure = String.from_json(_o['secure']) unless _o['secure'].nil?
      @timeout = String.from_json(_o['timeout']) unless _o['timeout'].nil?
      @rememberMeEnabled = Boolean.from_json(_o['rememberMeEnabled']) unless _o['rememberMeEnabled'].nil?
    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 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)
      @devMode = Boolean.from_json(_o['devMode']) unless _o['devMode'].nil?
      @javascriptLog = Boolean.from_json(_o['javascriptLog']) unless _o['javascriptLog'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @buildNumber = String.from_json(_o['buildNumber']) unless _o['buildNumber'].nil?
      @timestamp = Bignum.from_json(_o['timestamp']) unless _o['timestamp'].nil?
      @copyrightRange = String.from_json(_o['copyrightRange']) unless _o['copyrightRange'].nil?
      @logMissingI18n = Boolean.from_json(_o['logMissingI18n']) unless _o['logMissingI18n'].nil?
      @baseUrl = String.from_json(_o['baseUrl']) unless _o['baseUrl'].nil?
      @timestampStr = String.from_json(_o['timestampStr']) unless _o['timestampStr'].nil?
      @cookieInformation = Org::Apache::Archiva::Web::Model::CookieInformation.from_json(_o['cookieInformation']) unless _o['cookieInformation'].nil?
    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 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)
      @hostName = String.from_json(_o['hostName']) unless _o['hostName'].nil?
      @port = Fixnum.from_json(_o['port']) unless _o['port'].nil?
      @ssl = Boolean.from_json(_o['ssl']) unless _o['ssl'].nil?
      @baseDn = String.from_json(_o['baseDn']) unless _o['baseDn'].nil?
      @contextFactory = String.from_json(_o['contextFactory']) unless _o['contextFactory'].nil?
      @bindDn = String.from_json(_o['bindDn']) unless _o['bindDn'].nil?
      @password = String.from_json(_o['password']) unless _o['password'].nil?
      @authenticationMethod = String.from_json(_o['authenticationMethod']) unless _o['authenticationMethod'].nil?
      @extraProperties = Hash.from_json(_o['extraProperties']) unless _o['extraProperties'].nil?
      @bindAuthenticatorEnabled = Boolean.from_json(_o['bindAuthenticatorEnabled']) unless _o['bindAuthenticatorEnabled'].nil?
      if !_o['extraPropertiesEntries'].nil?
        @extraPropertiesEntries = Array.new
        _oa = _o['extraPropertiesEntries']
        _oa.each { | _item | @extraPropertiesEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      end
      @baseGroupsDn = String.from_json(_o['baseGroupsDn']) unless _o['baseGroupsDn'].nil?
      @writable = Boolean.from_json(_o['writable']) unless _o['writable'].nil?
      @useRoleNameAsGroup = Boolean.from_json(_o['useRoleNameAsGroup']) unless _o['useRoleNameAsGroup'].nil?
    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 Admin

module Model

module Beans

  # (no documentation provided)
  class ProxyConnectorRuleType

    # 
    WHITE_LIST = "WHITE_LIST"

    # 
    BLACK_LIST = "BLACK_LIST"
  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

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
      @targetRepositoryId = String.from_json(_o['targetRepositoryId']) unless _o['targetRepositoryId'].nil?
    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 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
      @order = Fixnum.from_json(_o['order']) unless _o['order'].nil?
    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 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
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @userName = String.from_json(_o['userName']) unless _o['userName'].nil?
      @password = String.from_json(_o['password']) unless _o['password'].nil?
      @timeout = Fixnum.from_json(_o['timeout']) unless _o['timeout'].nil?
      @downloadRemoteIndex = Boolean.from_json(_o['downloadRemoteIndex']) unless _o['downloadRemoteIndex'].nil?
      @remoteIndexUrl = String.from_json(_o['remoteIndexUrl']) unless _o['remoteIndexUrl'].nil?
      @remoteDownloadNetworkProxyId = String.from_json(_o['remoteDownloadNetworkProxyId']) unless _o['remoteDownloadNetworkProxyId'].nil?
      @cronExpression = String.from_json(_o['cronExpression']) unless _o['cronExpression'].nil?
      @remoteDownloadTimeout = Fixnum.from_json(_o['remoteDownloadTimeout']) unless _o['remoteDownloadTimeout'].nil?
      @downloadRemoteIndexOnStartup = Boolean.from_json(_o['downloadRemoteIndexOnStartup']) unless _o['downloadRemoteIndexOnStartup'].nil?
      @extraParameters = Hash.from_json(_o['extraParameters']) unless _o['extraParameters'].nil?
      if !_o['extraParametersEntries'].nil?
        @extraParametersEntries = Array.new
        _oa = _o['extraParametersEntries']
        _oa.each { | _item | @extraParametersEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      end
      @extraHeaders = Hash.from_json(_o['extraHeaders']) unless _o['extraHeaders'].nil?
      if !_o['extraHeadersEntries'].nil?
        @extraHeadersEntries = Array.new
        _oa = _o['extraHeadersEntries']
        _oa.each { | _item | @extraHeadersEntries.push Org::Apache::Archiva::Admin::Model::Beans::PropertyEntry.from_json(_item) }
      end
      @checkPath = String.from_json(_o['checkPath']) unless _o['checkPath'].nil?
    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 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 Metadata

module Model

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

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

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

    #initializes this ProjectVersionMetadata with a json hash
    def init_jaxb_json_hash(_o)
      super _o
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].nil?
      @description = String.from_json(_o['description']) unless _o['description'].nil?
      @url = String.from_json(_o['url']) unless _o['url'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @organization = Org::Apache::Archiva::Metadata::Model::Organization.from_json(_o['organization']) unless _o['organization'].nil?
      @issueManagement = Org::Apache::Archiva::Metadata::Model::IssueManagement.from_json(_o['issueManagement']) unless _o['issueManagement'].nil?
      @scm = Org::Apache::Archiva::Metadata::Model::Scm.from_json(_o['scm']) unless _o['scm'].nil?
      @ciManagement = Org::Apache::Archiva::Metadata::Model::CiManagement.from_json(_o['ciManagement']) unless _o['ciManagement'].nil?
      if !_o['licenses'].nil?
        @licenses = Array.new
        _oa = _o['licenses']
        _oa.each { | _item | @licenses.push Org::Apache::Archiva::Metadata::Model::License.from_json(_item) }
      end
      if !_o['mailingLists'].nil?
        @mailingLists = Array.new
        _oa = _o['mailingLists']
        _oa.each { | _item | @mailingLists.push Org::Apache::Archiva::Metadata::Model::MailingList.from_json(_item) }
      end
      if !_o['dependencies'].nil?
        @dependencies = Array.new
        _oa = _o['dependencies']
        _oa.each { | _item | @dependencies.push Org::Apache::Archiva::Metadata::Model::Dependency.from_json(_item) }
      end
      @incomplete = Boolean.from_json(_o['incomplete']) unless _o['incomplete'].nil?
    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 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 :daysOlder
    # (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['daysOlder'] = daysOlder.to_jaxb_json_hash unless daysOlder.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
      @cronExpression = String.from_json(_o['cronExpression']) unless _o['cronExpression'].nil?
      @location = String.from_json(_o['location']) unless _o['location'].nil?
      @releases = Boolean.from_json(_o['releases']) unless _o['releases'].nil?
      @snapshots = Boolean.from_json(_o['snapshots']) unless _o['snapshots'].nil?
      @blockRedeployments = Boolean.from_json(_o['blockRedeployments']) unless _o['blockRedeployments'].nil?
      @stagingRepository = Org::Apache::Archiva::Admin::Model::Beans::ManagedRepository.from_json(_o['stagingRepository']) unless _o['stagingRepository'].nil?
      @scanned = Boolean.from_json(_o['scanned']) unless _o['scanned'].nil?
      @daysOlder = Fixnum.from_json(_o['daysOlder']) unless _o['daysOlder'].nil?
      @retentionCount = Fixnum.from_json(_o['retentionCount']) unless _o['retentionCount'].nil?
      @deleteReleasedSnapshots = Boolean.from_json(_o['deleteReleasedSnapshots']) unless _o['deleteReleasedSnapshots'].nil?
      @stageRepoNeeded = Boolean.from_json(_o['stageRepoNeeded']) unless _o['stageRepoNeeded'].nil?
      @resetStats = Boolean.from_json(_o['resetStats']) unless _o['resetStats'].nil?
      @skipPackedIndexCreation = Boolean.from_json(_o['skipPackedIndexCreation']) unless _o['skipPackedIndexCreation'].nil?
    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
