class GeoserverClient

Public Class Methods

all_layer_names(debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 79
def self.all_layer_names(debug_mode=false)
  all_layers_data = self.all_layers(debug_mode)
  all_layers_data["featureTypes"]["featureType"].map{|x| x["name"]}
end
all_layers(debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 85
def self.all_layers(debug_mode=false)
  log "Get all layers in workspace #{self.workspace}"

  puts "workspace = #{self.workspace}"

  get_feature_types_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/featuretypes.json" )
  get_data(get_feature_types_uri, {}, debug_mode )
end
api_password() click to toggle source
# File lib/geoserver_client.rb, line 21
def self.api_password
  @@api_password ||= "geoserver"
end
api_password=(api_password) click to toggle source
# File lib/geoserver_client.rb, line 33
def self.api_password=(api_password)
  @@api_password = api_password
end
api_root() click to toggle source
# File lib/geoserver_client.rb, line 25
def self.api_root
  @@api_root ||= ""
end
api_root=(api_root) click to toggle source
# File lib/geoserver_client.rb, line 37
def self.api_root= (api_root)
  api_root += "/" if !api_root.nil? && api_root[-1] != "/"
  @@api_root = api_root
end
api_user() click to toggle source
# File lib/geoserver_client.rb, line 17
def self.api_user
  @@api_user ||= "admin"
end
api_user=(api_user) click to toggle source
# File lib/geoserver_client.rb, line 29
def self.api_user=(api_user)
  @@api_user = api_user
end
create_featuretype(name, options={}, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 116
def self.create_featuretype(name, options={}, debug_mode=false)
  data = {
      featureType: {
          name: name,
          nativeName: options[:native_name] || name,
          # title: options[:title],
          # abstract: options[:abstract],
          # store: {
          #     "@class" => "dataStore",
          #     name: self.datastore
          # },
          # projectionPolicy: options[:projection_policy] || "FORCE_DECLARED",
          # srs: options[:srs] || "EPSG:3035",
          # # more options
      }
  }



  create_featuretype_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/datastores/#{self.datastore}/featuretypes.json" )
  post_data create_featuretype_uri, data.to_json, debug_mode
end
create_layergroup(layer_group_name, layers, options= {}, debug_mode = false) click to toggle source
# File lib/geoserver_client.rb, line 260
def self.create_layergroup(layer_group_name, layers, options= {}, debug_mode = false)
  log "Geoserver::Create layer-group #{layer_group_name} in datastore #{self.datastore}"

  data = { layerGroup: {
      name: layer_group_name,
      mode: "SINGLE",
      workspace: { name: GeoserverClient.workspace },
      publishables: {published:[]}
    }
  }

  layers.each do |layer|
    layer_data = {"@type" => "layer", "name" => layer}
    data[:layerGroup][:publishables][:published] << layer_data
  end

  create_layergroup_uri = URI.join(GeoserverClient.api_root, "layergroups.json" )

  # puts "Create layergroup uri = #{create_layergroup_uri}"

  response = post_data(create_layergroup_uri, data.to_json, debug_mode)
  response
end
create_resource(file_name, options={}, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 229
def self.create_resource(file_name, options={}, debug_mode=false)
  # check if the file exists?
  raise StandardError.new("Given file #{file_name} does not exist?") unless File.exist?(file_name)

  basename  = File.basename(file_name)
  file_data = File.read(file_name)


  create_resource_uri = URI.join(GeoserverClient.api_root, "resource/styles/", basename, "?operation=default" )

  puts "Create resource uri = #{create_resource_uri}"

  response = post_data(create_resource_uri, file_data, debug_mode, method: :put, content_type: '*/*')
  response
end
create_style(name, options={}, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 184
def self.create_style(name, options={}, debug_mode=false)
  filename = options[:filename] || "#{name}.sld"

  # raise exception if filename does not end in sld?

  data = { style:
    {
      name: name,
      filename: filename
    }
  }
  create_style_uri = URI.join(GeoserverClient.api_root, "styles.json" )
  response = post_data(create_style_uri, data.to_json, debug_mode)

  if options[:sld].present?
    post_sld_uri = URI.join(GeoserverClient.api_root, "styles/#{filename}" )
    response = post_data(post_sld_uri, options[:sld], debug_mode, method: :put, content_type: 'application/vnd.ogc.sld+xml')
  end

  response
end
datastore() click to toggle source
# File lib/geoserver_client.rb, line 47
def self.datastore
  raise ConfigException.new('GeoserverClient::datastore is not yet set') if @@default_datastore.nil?
  @@default_datastore
end
datastore=(other_datastore) click to toggle source
# File lib/geoserver_client.rb, line 56
def self.datastore=(other_datastore)
  @@default_datastore = other_datastore
end
delete_featuretype(name, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 140
def self.delete_featuretype(name, debug_mode=false)
  delete_featuretype_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/datastores/#{self.datastore}/featuretypes/#{name}.json?recurse=true" )
  response = post_data(delete_featuretype_uri, {}, debug_mode, method: :delete )
end
delete_layergroup(layer_group_name, debug_mode = false) click to toggle source
# File lib/geoserver_client.rb, line 301
def self.delete_layergroup(layer_group_name, debug_mode = false)
  log "Geoserver::DELETE layer-group #{layer_group_name} in workspace #{self.workspace}"

  get_lg_uri = URI.join(GeoserverClient.api_root, "workspaces/#{GeoserverClient.workspace}/layergroups/#{layer_group_name}.json" )
  post_data(get_lg_uri, {}, debug_mode, method: :delete )
end
delete_resource(file_name, options={}, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 245
def self.delete_resource(file_name, options={}, debug_mode=false)

  basename  = File.basename(file_name)

  # deleting will delete folder recursively, but how can we check/protect this?

  delete_resource_uri = URI.join(GeoserverClient.api_root, "resource/", basename )

  puts "Delete resource uri = #{delete_resource_uri}"

  response = post_data(delete_resource_uri, {}, debug_mode, method: :delete)
  response
end
delete_style(name, debug_mode = false) click to toggle source
# File lib/geoserver_client.rb, line 223
def self.delete_style(name, debug_mode = false)
  delete_style_uri = URI.join(GeoserverClient.api_root, "styles/#{name}.json" )
  response = post_data(delete_style_uri, {}, debug_mode, method: :delete )
end
feature_type(layer_name, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 102
def self.feature_type(layer_name, debug_mode=false)
  log "Get layer #{layer_name} in datastore #{self.datastore}"

  get_feature_type_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/datastores/#{self.datastore}/featuretypes/#{layer_name}.json" )
  get_data(get_feature_type_uri, {}, debug_mode )
end
get_layergroup(layer_group_name, debug_mode = false) click to toggle source
# File lib/geoserver_client.rb, line 293
def self.get_layergroup(layer_group_name, debug_mode = false)
  log "Geoserver::Get layer-group #{layer_group_name} in datastore #{self.datastore}"

  get_lg_uri = URI.join(GeoserverClient.api_root, "workspaces/#{GeoserverClient.workspace}/layergroups/#{layer_group_name}.json" )
  get_data(get_lg_uri, {}, debug_mode )
end
layer(layer_name, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 109
def self.layer(layer_name, debug_mode=false)
  log "Get layer #{layer_name} in datastore #{self.datastore}"

  get_feature_type_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/datastores/#{self.datastore}/layers/#{layer_name}.json" )
  get_data(get_feature_type_uri, {}, debug_mode )
end
layergroups(debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 284
def self.layergroups(debug_mode=false)
  log "Geoserver::Get layergroups in workspace #{self.workspace}"

  get_layergroups_uri = URI.join(GeoserverClient.api_root, "workspaces/#{GeoserverClient.workspace}/layergroups.json" )
  get_data(get_layergroups_uri, {}, debug_mode )
end
layers(debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 95
def self.layers(debug_mode=false)
  log "Get layers in datastore #{self.datastore}"

  get_feature_types_uri = URI.join(GeoserverClient.api_root, "workspaces/#{self.workspace}/datastores/#{self.datastore}/featuretypes.json" )
  get_data(get_feature_types_uri, {}, debug_mode )
end
log(message, loglevel=:debug ) click to toggle source
# File lib/geoserver_client.rb, line 68
def self.log(message, loglevel=:debug )
  return if logger.nil?
  if logger.respond_to?(loglevel)
    logger.send loglevel, "GeoserverClient::#{message}"
  elsif logger == :stdout
    puts message
  end
end
logger() click to toggle source
# File lib/geoserver_client.rb, line 60
def self.logger
  @@logger rescue nil 
end
logger=(other_logger) click to toggle source
# File lib/geoserver_client.rb, line 64
def self.logger=(other_logger)
  @@logger = other_logger
end
set_layer_style(layer_name, style_name, debug_mode=false) click to toggle source

def self.create_layer(layer_name, options={}, debug_mode=false)

data = {featureType: {
    name: layer_name,
    native_name: options[:native_name] || layer_name,
    title: options[:title],
    abstract: options[:abstract],

}}

update_layer_uri = URI.join(GeoserverClient.api_root, "layers/#{self.workspace}:#{layer_name}.json" )
post_data update_layer_uri, data, debug_mode, method: :put

end

# File lib/geoserver_client.rb, line 163
def self.set_layer_style(layer_name, style_name, debug_mode=false)
  data = {layer: {defaultStyle: style_name }}

  update_layer_uri = URI.join(GeoserverClient.api_root, "layers/#{self.workspace}:#{layer_name}.json" )
  post_data update_layer_uri, data.to_json, debug_mode, method: :put
end
style(style_name, format=:sld, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 177
def self.style(style_name, format=:sld, debug_mode=false)
  log "Geoserver::Get styles in datastore #{self.datastore}"

  get_styles_uri = URI.join(GeoserverClient.api_root, "styles/#{style_name}.#{format}" )
  get_data(get_styles_uri, {}, debug_mode )
end
styles(debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 170
def self.styles(debug_mode=false)
  log "Geoserver::Get styles in datastore #{self.datastore}"

  get_styles_uri = URI.join(GeoserverClient.api_root, "styles.json" )
  get_data(get_styles_uri, {}, debug_mode )
end
update_style(name, options={}, debug_mode=false) click to toggle source
# File lib/geoserver_client.rb, line 206
def self.update_style(name, options={}, debug_mode=false)
  filename = options[:filename] || "#{name}.sld"

  # raise exception if filename does not end in sld?

  if options[:sld].present?
    post_sld_uri = URI.join(GeoserverClient.api_root, "styles/#{filename}" )
    response = post_data(post_sld_uri, options[:sld], debug_mode, method: :put, content_type: 'application/vnd.ogc.sld+xml')
  else
    raise StandardError.new("SLD parameter was missing!")
  end

  response
end
workspace() click to toggle source
# File lib/geoserver_client.rb, line 42
def self.workspace
  raise ConfigException.new('GeoserverClient::workspace is not yet set') if @@default_workspace.nil?
  @@default_workspace
end
workspace=(other_workspace) click to toggle source
# File lib/geoserver_client.rb, line 52
def self.workspace=(other_workspace)
  @@default_workspace = other_workspace
end

Protected Class Methods

get_data(uri, data, debug_mode) click to toggle source
# File lib/geoserver_client.rb, line 311
def self.get_data(uri, data, debug_mode)
  if debug_mode
    log "URL = #{uri}"
    @debugger = []
    self.http_client.debug_dev = @debugger
  end

  auth = Base64.strict_encode64("#{GeoserverClient.api_user}:#{GeoserverClient.api_password}")
  log "Authorization = #{auth}" if debug_mode

  response = self.http_client.get(uri, data, {'Authorization' => "Basic #{auth}" })

  log @debugger.inspect if debug_mode

  raise StandardError.new(response.body) unless response.status == 200

  JSON.parse(response.body) rescue response.body
end
post_data(uri, data, debug_mode, options={}) click to toggle source
# File lib/geoserver_client.rb, line 331
def self.post_data(uri, data, debug_mode, options={})
  http_method = options[:method] || :post
  if debug_mode
    log "URL = #{uri}"
    @debugger = []
    self.http_client.debug_dev = @debugger
  end

  auth = Base64.strict_encode64("#{GeoserverClient.api_user}:#{GeoserverClient.api_password}")
  log "Authorization = #{auth}" if debug_mode

  content_type = options[:content_type] || 'application/json'
  # accept       = options[:accept] || 'application/json'
  accept = content_type

  response = self.http_client.send(http_method, uri, data, {'Authorization' => "Basic #{auth}", 'Content-Type' => content_type, 'Accept' => accept } )

  log @debugger.join.to_s if debug_mode

  log "Response status = #{response.status}" if debug_mode


  unless response.status == 200 || response.status == 201
    if http_method == :delete && response.status == 404
      log "Warning: did not exist or was already deleted. Error = #{response.body}"
    else
      log "Unexpected result: status = #{response.status}, body = #{response.body}"
      log "DEBUGGER = #{@debugger.join.to_s}"
      raise StandardError.new(response.body)
    end
  end
  log response.inspect if debug_mode

  response
end