comparison pkg/geoserver/boot.go @ 4936:21a48e2d2260 fairway-marks-import

Create group layers in GeoServer via REST calls.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 17 Feb 2020 00:45:21 +0100
parents c64dba002726
children 40da1b8aba01
comparison
equal deleted inserted replaced
4935:c64dba002726 4936:21a48e2d2260
243 243
244 return err 244 return err
245 } 245 }
246 246
247 func ensureFeatures() error { 247 func ensureFeatures() error {
248 tables := models.InternalServices.Filter(models.IntWFS)
249 if len(tables) == 0 {
250 log.Println("info: no tables to publish")
251 return nil
252 }
253
254 log.Printf("info: number of tables to publish %d\n", len(tables))
255
248 var ( 256 var (
249 geoURL = config.GeoServerURL() 257 geoURL = config.GeoServerURL()
250 user = config.GeoServerUser() 258 user = config.GeoServerUser()
251 password = config.GeoServerPassword() 259 password = config.GeoServerPassword()
252 auth = basicAuth(user, password) 260 auth = basicAuth(user, password)
253 ) 261 )
254 262
255 datastoreURL := geoURL + "/rest/workspaces/" + workspaceName + 263 datastoreURL := geoURL + "/rest/workspaces/" + workspaceName +
256 "/datastores/" + datastoreName 264 "/datastores/" + datastoreName
257
258 tables := models.InternalServices.Filter(models.IntWFS)
259 if len(tables) == 0 {
260 log.Println("info: no tables to publish")
261 return nil
262 }
263
264 log.Printf("info: number of tables to publish %d\n", len(tables))
265 265
266 var features struct { 266 var features struct {
267 FeatureTypes struct { 267 FeatureTypes struct {
268 FeatureType []struct { 268 FeatureType []struct {
269 Name string `json:"name"` 269 Name string `json:"name"`
392 log.Println("info: no groups layers to publish") 392 log.Println("info: no groups layers to publish")
393 return nil 393 return nil
394 } 394 }
395 395
396 log.Printf("info: number of layer groups to publish %d\n", len(groups)) 396 log.Printf("info: number of layer groups to publish %d\n", len(groups))
397 // TODO: Implement me! 397
398 398 var (
399 /* 399 geoURL = config.GeoServerURL()
400 for i := range groups { 400 user = config.GeoServerUser()
401 log.Printf("info: layer group #%d: %s\n", i+1, groups[i].Name) 401 password = config.GeoServerPassword()
402 for _, layer := range groups[i].Layers { 402 auth = basicAuth(user, password)
403 log.Printf("info: layer: %s\n", layer) 403 )
404
405 type layerGroups struct {
406 LayerGroups struct {
407 LayerGroup []struct {
408 Name string `json:"name"`
409 } `json:"layerGroup"`
410 } `json:"layerGroups"`
411 }
412
413 var lg layerGroups
414
415 hasLayerGroup := func(name string) bool {
416 for i := range lg.LayerGroups.LayerGroup {
417 if lg.LayerGroups.LayerGroup[i].Name == name {
418 return true
404 } 419 }
405 } 420 }
406 */ 421 return false
422 }
423
424 layerGroupsURL := geoURL + "/rest/workspaces/" + workspaceName +
425 "/layergroups"
426
427 // Fetch all layer groups.
428 req, err := http.NewRequest(
429 http.MethodGet,
430 layerGroupsURL+".json",
431 nil)
432 if err != nil {
433 return err
434 }
435 auth(req)
436 resp, err := http.DefaultClient.Do(req)
437 if err != nil {
438 return err
439 }
440
441 err = json.NewDecoder(resp.Body).Decode(&lg)
442 resp.Body.Close()
443 if err != nil {
444 // XXX: ignore this error.
445 }
446
447 var already []string
448
449 defer func() {
450 if len(already) > 0 {
451 log.Printf("info: already having layer groups: %s\n",
452 strings.Join(already, ", "))
453 }
454 }()
455
456 for i := range groups {
457 if hasLayerGroup(groups[i].Name) {
458 already = append(already, groups[i].Name)
459 continue
460 }
461
462 type (
463 Layers struct {
464 Layer []string `xml:"layer"`
465 }
466 Styles struct {
467 Style []string `xml:"style"`
468 }
469 LayerGroup struct {
470 XMLName xml.Name `xml:"layerGroup"`
471 Name string `xml:"name"`
472 Title string `xml:"title"`
473 Layers Layers `xml:"layers"`
474 Styles Styles `xml:"styles"`
475 }
476 )
477
478 lgr := LayerGroup{
479 Name: groups[i].Name,
480 Title: groups[i].Name,
481 Layers: Layers{
482 Layer: groups[i].Layers,
483 },
484 Styles: Styles{
485 Style: groups[i].Layers,
486 },
487 }
488
489 req, err = http.NewRequest(
490 http.MethodPost,
491 layerGroupsURL+".xml",
492 toXMLStream(&lgr))
493 if err != nil {
494 return err
495 }
496 asContentType(req, "text/xml")
497 auth(req)
498
499 resp, err := http.DefaultClient.Do(req)
500 if err != nil {
501 return err
502 }
503
504 if resp.StatusCode != http.StatusCreated {
505 return fmt.Errorf("status code '%s' (%d)",
506 http.StatusText(resp.StatusCode),
507 resp.StatusCode)
508 }
509 }
407 510
408 return nil 511 return nil
409 } 512 }
410 513
411 func deleteWorkspace() error { 514 func deleteWorkspace() error {