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

module Model

module Beans

  # (no documentation provided)
  class AbstractRepository 

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

    # the json hash for this AbstractRepository
    def to_jaxb_json_hash
      _h = {}
      _h['layout'] = layout.to_jaxb_json_hash unless layout.nil?
      _h['indexDirectory'] = indexDirectory.to_jaxb_json_hash unless indexDirectory.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.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)
      @layout = String.from_json(_o['layout']) unless _o['layout'].nil?
      @indexDirectory = String.from_json(_o['indexDirectory']) unless _o['indexDirectory'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].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 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 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 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 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 Metadata

module Repository

module Stats

  # (no documentation provided)
  class RepositoryStatistics 

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

    # the json hash for this RepositoryStatistics
    def to_jaxb_json_hash
      _h = {}
      _h['duration'] = duration.to_jaxb_json_hash unless duration.nil?
      _h['totalProjectCount'] = totalProjectCount.to_jaxb_json_hash unless totalProjectCount.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['scanEndTime'] = scanEndTime.to_jaxb_json_hash unless scanEndTime.nil?
      _h['totalArtifactCount'] = totalArtifactCount.to_jaxb_json_hash unless totalArtifactCount.nil?
      _h['scanStartTime'] = scanStartTime.to_jaxb_json_hash unless scanStartTime.nil?
      _h['totalArtifactFileSize'] = totalArtifactFileSize.to_jaxb_json_hash unless totalArtifactFileSize.nil?
      _h['totalCountForType'] = totalCountForType.to_jaxb_json_hash unless totalCountForType.nil?
      _h['totalGroupCount'] = totalGroupCount.to_jaxb_json_hash unless totalGroupCount.nil?
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['facetId'] = facetId.to_jaxb_json_hash unless facetId.nil?
      _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 RepositoryStatistics
    def to_json
      to_jaxb_json_hash.to_json
    end

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

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

module Api

module Model

  # (no documentation provided)
  class AbstractImplementationInformation 

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

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

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

    #initializes this AbstractImplementationInformation with a json hash
    def init_jaxb_json_hash(_o)
      @beanId = String.from_json(_o['beanId']) unless _o['beanId'].nil?
      @readOnly = Boolean.from_json(_o['readOnly']) unless _o['readOnly'].nil?
      @descriptionKey = String.from_json(_o['descriptionKey']) unless _o['descriptionKey'].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 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 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 ChecksumSearch 

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

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

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

    #initializes this ChecksumSearch with a json hash
    def init_jaxb_json_hash(_o)
      if !_o['repositories'].nil?
        @repositories = Array.new
        _oa = _o['repositories']
        _oa.each { | _item | @repositories.push String.from_json(_item) }
      end
      @checksum = String.from_json(_o['checksum']) unless _o['checksum'].nil?
    end

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

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class FileLockConfiguration 

    # int
    attr_accessor :lockingTimeout
    # boolean
    attr_accessor :skipLocking

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

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

    #initializes this FileLockConfiguration with a json hash
    def init_jaxb_json_hash(_o)
      @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 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 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 FacetedMetadata 

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

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

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

    #initializes this FacetedMetadata with a json hash
    def init_jaxb_json_hash(_o)
      @facets = Hash.from_json(_o['facets']) unless _o['facets'].nil?
      if !_o['facetIds'].nil?
        @facetIds = Array.new
        _oa = _o['facetIds']
        _oa.each { | _item | @facetIds.push String.from_json(_item) }
      end
      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
    end

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

end

end

end

end

end

module Org

module Apache

module Archiva

module Metadata

module Model

  # (no documentation provided)
  class Organization 

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

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

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

    #initializes this Organization with a json hash
    def init_jaxb_json_hash(_o)
      @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 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 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 Admin

module Model

  # (no documentation provided)
  class AbstractRepositoryConnector 

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

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

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

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

module Model

module Facets

  # (no documentation provided)
  class RepositoryProblemFacet 

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

    # the json hash for this RepositoryProblemFacet
    def to_jaxb_json_hash
      _h = {}
      _h['repositoryId'] = repositoryId.to_jaxb_json_hash unless repositoryId.nil?
      _h['name'] = name.to_jaxb_json_hash unless name.nil?
      _h['problem'] = problem.to_jaxb_json_hash unless problem.nil?
      _h['id'] = id.to_jaxb_json_hash unless id.nil?
      _h['facetId'] = facetId.to_jaxb_json_hash unless facetId.nil?
      _h['namespace'] = namespace.to_jaxb_json_hash unless namespace.nil?
      _h['message'] = message.to_jaxb_json_hash unless message.nil?
      _h['project'] = project.to_jaxb_json_hash unless project.nil?
      _h['version'] = version.to_jaxb_json_hash unless version.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)
      @repositoryId = String.from_json(_o['repositoryId']) unless _o['repositoryId'].nil?
      @name = String.from_json(_o['name']) unless _o['name'].nil?
      @problem = String.from_json(_o['problem']) unless _o['problem'].nil?
      @id = String.from_json(_o['id']) unless _o['id'].nil?
      @facetId = String.from_json(_o['facetId']) unless _o['facetId'].nil?
      @namespace = String.from_json(_o['namespace']) unless _o['namespace'].nil?
      @message = String.from_json(_o['message']) unless _o['message'].nil?
      @project = String.from_json(_o['project']) unless _o['project'].nil?
      @version = String.from_json(_o['version']) unless _o['version'].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 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 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 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 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 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

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

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

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Metadata

module Model

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

    # (no documentation provided)
    attr_accessor :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 Rest

module Api

module Model

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


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

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

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

end

end

end

end

end

end

module Org

module Apache

module Archiva

module Admin

module Model

module Beans

  # (no documentation provided)
  class 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

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