Mercurial > gemma
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 }