changeset 1619:3093bab05c81

WFS downloader: Dump features to stdout for testing purposes.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 18 Dec 2018 13:26:26 +0100
parents 9f5090fe130f
children 2e4ec4251c57
files cmd/wfs/dump.go cmd/wfs/main.go pkg/wfs/download.go
diffstat 3 files changed, 67 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/wfs/dump.go	Tue Dec 18 12:57:43 2018 +0100
+++ b/cmd/wfs/dump.go	Tue Dec 18 13:26:26 2018 +0100
@@ -14,11 +14,35 @@
 package main
 
 import (
+	"bufio"
 	"fmt"
+	"io"
+	"net/http"
+	"os"
 
 	"gemma.intevation.de/gemma/pkg/wfs"
 )
 
+func dumpURL(out io.Writer, url string) error {
+	resp, err := http.Get(url)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	_, err = io.Copy(out, resp.Body)
+	return err
+}
+
+func dumpURLs(urls []string) error {
+	out := bufio.NewWriter(os.Stdout)
+	for _, url := range urls {
+		if err := dumpURL(out, url); err != nil {
+			return err
+		}
+	}
+	return out.Flush()
+}
+
 func dump(caps *wfs.Capabilities) {
 	fmt.Println("service identification")
 	fmt.Println("----------------------")
--- a/cmd/wfs/main.go	Tue Dec 18 12:57:43 2018 +0100
+++ b/cmd/wfs/main.go	Tue Dec 18 13:26:26 2018 +0100
@@ -20,24 +20,39 @@
 	"gemma.intevation.de/gemma/pkg/wfs"
 )
 
+func check(err error) {
+	if err != nil {
+		log.Fatalf("error: %v\n", err)
+	}
+}
+
 func main() {
 	var (
-		dumpCaps    = flag.Bool("dump-caps", false, "Dump capabilities document")
-		featureType = flag.String("features", "ws-wamos:ienc_wtwaxs", "feature to get")
+		dumpCaps     = flag.Bool("dump-caps", false, "Dump capabilities document")
+		dumpFeatures = flag.Bool("dump-features", false, "Dump features")
+		featureType  = flag.String("features", "", "feature to get")
+		sortBy       = flag.String("sortby", "", "Sort features by this property")
 	)
 	flag.Parse()
 
 	for _, arg := range flag.Args() {
 		caps, err := wfs.GetCapabilities(arg)
-		if err != nil {
-			log.Fatalf("error: %v\n", err)
-		}
+		check(err)
 		if *dumpCaps {
 			dump(caps)
 		}
 
-		if err := wfs.GetFeaturesGET(caps, *featureType, "application/json"); err != nil {
-			log.Fatalf("error: %v\n", err)
+		if *featureType == "" {
+			continue
+		}
+
+		urls, err := wfs.GetFeaturesGET(
+			caps, *featureType, "application/json", *sortBy)
+		check(err)
+
+		log.Printf("urls: %v\n", urls)
+		if *dumpFeatures {
+			check(dumpURLs(urls))
 		}
 	}
 }
--- a/pkg/wfs/download.go	Tue Dec 18 12:57:43 2018 +0100
+++ b/pkg/wfs/download.go	Tue Dec 18 13:26:26 2018 +0100
@@ -94,37 +94,42 @@
 	return *result.NumberMatched, nil
 }
 
-func GetFeaturesGET(caps *Capabilities, featureTypeName, outputFormat string) error {
+func GetFeaturesGET(
+	caps *Capabilities,
+	featureTypeName,
+	outputFormat string,
+	sortBy string,
+) ([]string, error) {
 
 	feature := caps.FindFeatureType(featureTypeName)
 	if feature == nil {
-		return ErrNoSuchFeatureType
+		return nil, ErrNoSuchFeatureType
 	}
 	op := caps.FindOperation("GetFeature")
 	if op == nil {
-		return ErrGetFeatureNotSupported
+		return nil, ErrGetFeatureNotSupported
 	}
 
 	if op.DCP.HTTP.Get == nil {
-		return ErrMethodGetNotSupported
+		return nil, ErrMethodGetNotSupported
 	}
 
 	getRaw := op.DCP.HTTP.Get.HRef
 	getU, err := url.Parse(getRaw)
 	if err != nil {
-		return err
+		return nil, err
 	}
 	// The URL could be relative so resolve against Capabilities URL.
 	if !getU.IsAbs() {
 		base, err := url.Parse(caps.BaseURL)
 		if err != nil {
-			return err
+			return nil, err
 		}
 		getU = getU.ResolveReference(base)
 	}
 
 	if !op.SupportsOutputFormat(outputFormat) {
-		return ErrOutputFormatNotSupported
+		return nil, ErrOutputFormatNotSupported
 	}
 
 	wfsVersion := caps.HighestWFSVersion(WFS2_0_0)
@@ -172,6 +177,12 @@
 		}
 	}
 
+	addSortBy := func(v url.Values) {
+		if sortBy != "" {
+			v.Set("sortBy", sortBy)
+		}
+	}
+
 	if supportsPaging {
 		pagedURL := func(ofs, count int) string {
 			v := url.Values{}
@@ -187,6 +198,7 @@
 			v.Set("TYPENAMES", featureTypeName)
 			addNS(v)
 			addOutputFormat(v)
+			addSortBy(v)
 			q := *getU
 			q.RawQuery = v.Encode()
 			return q.String()
@@ -215,14 +227,11 @@
 		v.Set("TYPENAMES", featureTypeName)
 		addNS(v)
 		addOutputFormat(v)
+		addSortBy(v)
 		q := *getU
 		q.RawQuery = v.Encode()
 		downloadURLs = []string{q.String()}
 	}
 
-	// TODO: Implement me!
-
-	log.Printf("%v\n", downloadURLs)
-
-	return nil
+	return downloadURLs, nil
 }