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