changeset 444:c315885825e5

Publish WFS layers on GeoServer from database configuration.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 21 Aug 2018 17:43:37 +0200
parents 5e8ac1c67fe6
children 37742dd72fdb
files cmd/gemma/geoserver.go pkg/models/pubservices.go
diffstat 2 files changed, 42 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/gemma/geoserver.go	Tue Aug 21 17:06:29 2018 +0200
+++ b/cmd/gemma/geoserver.go	Tue Aug 21 17:43:37 2018 +0200
@@ -10,6 +10,7 @@
 
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/misc"
+	"gemma.intevation.de/gemma/pkg/models"
 )
 
 const (
@@ -233,7 +234,10 @@
 		hasFeature = func(string) bool { return false }
 	}
 
-	for _, table := range tables {
+	npe := models.PublishedServices.Filter(models.PublishedWFS)
+	for i := range npe {
+		table := npe[i].Name
+
 		if hasFeature(table) {
 			log.Printf("info: featuretype %s already exists.\n", table)
 			continue
--- a/pkg/models/pubservices.go	Tue Aug 21 17:06:29 2018 +0200
+++ b/pkg/models/pubservices.go	Tue Aug 21 17:43:37 2018 +0200
@@ -3,15 +3,21 @@
 import (
 	"database/sql"
 	"log"
+	"sort"
 	"sync"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 )
 
 type PubEntry struct {
-	style sql.NullString
-	asWMS bool
-	asWFS bool
+	Style sql.NullString
+	WMS   bool
+	WFS   bool
+}
+
+type NamedPubEntry struct {
+	PubEntry
+	Name string
 }
 
 type PubServices struct {
@@ -53,8 +59,8 @@
 			var entry PubEntry
 			var key string
 			if err := rows.Scan(
-				&key, &entry.style,
-				&entry.asWFS, &entry.asWFS,
+				&key, &entry.Style,
+				&entry.WFS, &entry.WFS,
 			); err != nil {
 				return err
 			}
@@ -70,3 +76,29 @@
 	ps.entries = nil
 	ps.mu.Unlock()
 }
+
+func PublishedWMS(_ string, entry PubEntry) bool { return entry.WMS }
+func PublishedWFS(_ string, entry PubEntry) bool { return entry.WFS }
+
+func (ps *PubServices) Filter(accept func(string, PubEntry) bool) []NamedPubEntry {
+	ps.mu.Lock()
+	defer ps.mu.Unlock()
+	if ps.entries == nil {
+		ps.entries = make(map[string]PubEntry)
+		if err := ps.load(); err != nil {
+			log.Printf("error: %v\n", err)
+			return nil
+		}
+	}
+	var npe []NamedPubEntry
+	for k, v := range ps.entries {
+		if accept(k, v) {
+			npe = append(npe, NamedPubEntry{PubEntry: v, Name: k})
+		}
+	}
+
+	// To make output deterministic.
+	sort.Slice(npe, func(i, j int) bool { return npe[i].Name < npe[j].Name })
+
+	return npe
+}