nlsfi / hakunapi

OGC API Features Java server
https://github.com/nlsfi/hakunapi
MIT License
12 stars 3 forks source link

Support splitting Hakunapi configurations to multiple files #47

Open teezip opened 1 year ago

teezip commented 1 year ago

In some services Hakunapi feature configuration files are relatively large.

In this enhancements Hakunapi read a folder containing multipe configuration files and merges these when starting a server.

nls-jajuko commented 7 months ago

YAML files have a concept to reference additional files with refs f.ex $ref: 'somecollection.yaml#/collections/somecollection' One approach would be to support YAML configurations and transform those to hakunapi in-memory properties with Jackson jackson-dataformat-yaml. YAML to properties transform might be possible to implement without any changes to current service initialisation - except additional yaml config file detection. This might require some contracts for declarations as arrays in YAML for collections lists and properties as well as parameters lists.

# YAML configuration > transform (expansion) > properties > hakunapi configuration
# https://github.com/FasterXML/jackson-dataformats-text/tree/2.17/properties ?
# fex  yaml becomes properties
# api.title=INSPIRE Simple Addresses, Finland
# api.version=0.1
# api.desription=Example....
#
# General information about the api
# Not required, dummy values provided by the service
api:
  title: "INSPIRE Simple Addresses, Finland"
  version: 0.1
  description: >
   Example implementation of OGC API Services with hakunapi. 
   INSPIRE Simple Addresses from Finland. Data from 13.02.2023 
   https://www.avoindata.fi/data/fi/dataset/rakennusten-osoitetiedot-koko-suomi 
   by Finnish Digital and Population Data services Agency.
  license:
    name: "Data accessed from the API is licensed by the Digital and Population Data Services Agency CC BY 4.0 licence."
    url: "https://creativecommons.org/licenses/by/4.0/"

# List of servers 
## Required, comma-separated list of server the API is
servers:
  dev:
  ## The url of the server has to be correct as it is used for all links generated by the server
    url: "http://localhost:8080/features"
    description: "Development server"

# API level configuration
formats:
  geojson:
    # force lon,lat axisOrder on GeoJSON output even if output CRS is lat,lon by authority
    # formats.geojson.forceLonLat=true
    type: json
  html:
    type: html
  gpkg:
    type: gpkg
    dir: "/app/features_addresses/tmp"

getfeatures:
 limit: 
   default: 10
   max: 10000

# Configure known srids (hakunapi will always add 84 (lon, lat) and 4326 (lat, lon))
srid:
 - 3067:
 - 4258:
     latLon: true
   # Let hakunapi know that EPSG:4258 is lat,lon order

# Collections and their configurations

## Required, comma-separated list of all collections
collections:
  somecollection: 
    # ? something like this
    $ref: 'somecollection.yaml#/collections/somecollection'
  addresses:
    title: "Simple Addresses"
    description: "Addresses of Finlands Buildings"
    ## Should properties with null values be omitted from the response
    writeNulls: true
    ## PostgreSQL/PostGIS configuration 
    ### This collection is backed by 'pg' (PostgreSQL/PostGIS) source/driver 
    type: pg
    ### Name of {db}.properties
    db: db
    schema: "public"
    table: "simple_addresses"

    extent:
      ### Spatial extent of the collection, required by some clients to recognize the colletion as a spatial feature collection
      spatial:
        crs84: [15.0537852,58.6074565,33.9935374,70.2641566]
     ### Supported Coordinate Reference Systems (CRS:84 is always and automatically included)
    srid: [3067,4258]
    ### Required, mapping for primary id property
    id:
      mapping: id
    ### Mapping for primary geometry property
    geometry:
      mapping: geom
    ### List of all (other) properties 
    #properties: inspireId_localId,inspireId_namespace,component_ThoroughfareName,component_PostalDescriptor,component_AdminUnitName_1,component_AdminUnitName_4,locator_designator_addressNumber,locator_level,locator_level_href,position_specification,position_specification_href,position_method,position_method_href,position_default,building,parcel

    ### property is mapped to a static value instead of column reference if mapping is single-quoted
    properties:
      inspireId_localId: 
        mapping: id
      inspireId_namespace:
        mapping: 'https://github.com/INSPIRE-MIF/2017.2/GeoJSON/ads/examples/'
      component_ThoroughfareName:
        mapping: thoroughfare_name
      component_PostalDescriptor:
        mapping: postal_descriptor
      component_AdminUnitName_1:
        mapping: 'Suomi'
      component_AdminUnitName_4:
        mapping: admin_unit_name_4
      locator_designator_addressNumber:
        mapping: address_number
      locator_level:
        mapping: 'siteLevel'
      locator_level_href:
        mapping: 'https://inspire.ec.europa.eu/codelist/LocatorLevelValue/siteLevel'
      position_specification:
        mapping: 'building'
      position_specification_href: 
        mapping: 'https://inspire.ec.europa.eu/codelist/GeometrySpecificationValue/building'
      position_method: 
        mapping: 'byOtherParty'
      position_method_href:
        mapping: 'https://inspire.ec.europa.eu/codelist/GeometryMethodValue/byOtherParty'
      position_default:  
        mapping: 'true'
      ### If the name of the property matches the name of the backing column no mapping is required
      building:
      parcel:

## Queryables
    parameters:
       inspireId_localId:
       component_ThoroughfareName:
       component_PostalDescriptor:
       component_AdminUnitName_4:
       locator_designator_addressNumber:
       building:
       parcel: