BUGFIX: read XML data

This commit is contained in:
Simon Martens
2025-03-13 18:31:09 +01:00
parent e839bbebe8
commit f85dbab551
9 changed files with 105 additions and 28 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
cache/

5
config.dev.json Normal file
View File

@@ -0,0 +1,5 @@
{
"debug": true,
"watch": true,
"git_url": "git@github.com:Theodor-Springmann-Stiftung/lenz-briefe.git"
}

View File

@@ -17,8 +17,10 @@ const (
DEFAULT_SEARCH_CACHE_DIR = "search" DEFAULT_SEARCH_CACHE_DIR = "search"
DEFAULT_IMG_DIR = "data_bilder" DEFAULT_IMG_DIR = "data_bilder"
DEFAULT_BRANCH = "main"
DEFAULT_PORT = "8080" DEFAULT_PORT = "8080"
DEFAULT_ADDR = "localhost" DEFAULT_ADDR = "127.0.0.1"
DEFAULT_HTTPS = false DEFAULT_HTTPS = false
ENV_PREFIX = "KGPZ" ENV_PREFIX = "KGPZ"
@@ -55,7 +57,7 @@ func NewConfigProvider(files []string) *ConfigProvider {
func (c *ConfigProvider) Read() error { func (c *ConfigProvider) Read() error {
c.Config = &Config{} c.Config = &Config{}
for _, file := range c.Files { for _, file := range c.Files {
c.Config = readSettingsFile(c.Config, file) _, _ = readSettingsFile(c.Config, file)
} }
c.Config = readSettingsEnv(c.Config) c.Config = readSettingsEnv(c.Config)
c.Config = readDefaults(c.Config) c.Config = readDefaults(c.Config)
@@ -69,17 +71,17 @@ func (c *ConfigProvider) Validate() error {
return nil return nil
} }
func readSettingsFile(cfg *Config, path string) *Config { func readSettingsFile(cfg *Config, path string) (*Config, error) {
f, err := os.Open(path) f, err := os.Open(path)
if err != nil { if err != nil {
return cfg return cfg, err
} }
defer f.Close() defer f.Close()
dec := json.NewDecoder(f) dec := json.NewDecoder(f)
err = dec.Decode(cfg) err = dec.Decode(cfg)
return cfg return cfg, err
} }
func readSettingsEnv(cfg *Config) *Config { func readSettingsEnv(cfg *Config) *Config {
@@ -92,6 +94,10 @@ func readDefaults(cfg *Config) *Config {
cfg.BaseDIR = DEFAULT_DIR cfg.BaseDIR = DEFAULT_DIR
} }
if strings.TrimSpace(cfg.GitBranch) == "" {
cfg.GitBranch = DEFAULT_BRANCH
}
if strings.TrimSpace(cfg.GITPath) == "" { if strings.TrimSpace(cfg.GITPath) == "" {
cfg.GITPath = DEFAULT_GIT_CACHE_DIR cfg.GITPath = DEFAULT_GIT_CACHE_DIR
} }

View File

@@ -5,14 +5,16 @@ import "sync"
var cp *ConfigProvider var cp *ConfigProvider
var mu = sync.Mutex{} var mu = sync.Mutex{}
func Get() Config { func Get() (Config, error) {
mu.Lock() mu.Lock()
defer mu.Unlock() defer mu.Unlock()
if cp == nil { if cp == nil {
cp = NewConfigProvider([]string{"config.dev.json", "config.json"}) cp = NewConfigProvider([]string{"config.dev.json", "config.json"})
return *cp.Config, cp.Read()
} }
return *cp.Config
return *cp.Config, nil
} }
func Set(config Config) { func Set(config Config) {

View File

@@ -1,4 +1,4 @@
package providers package gitprovider
import ( import (
"errors" "errors"

33
lenz.go
View File

@@ -1,5 +1,36 @@
package main package main
import (
"fmt"
"log/slog"
"path/filepath"
"github.com/Theodor-Springmann-Stiftung/lenz-web/config"
gitprovider "github.com/Theodor-Springmann-Stiftung/lenz-web/git"
xmlparsing "github.com/Theodor-Springmann-Stiftung/lenz-web/xml"
"github.com/Theodor-Springmann-Stiftung/lenz-web/xmlmodels"
)
func main() { func main() {
println("Hello, World!") cfg, err := config.Get()
if err != nil {
panic(err)
}
if cfg.Debug {
slog.SetLogLoggerLevel(slog.LevelDebug)
}
dir := filepath.Join(cfg.BaseDIR, cfg.GITPath)
gp, err := gitprovider.NewGitProvider(cfg.GitURL, dir, cfg.GitBranch)
if err != nil {
panic(err)
}
lib := xmlmodels.NewLibrary()
lib.Parse(xmlparsing.Commit, dir, gp.Commit)
fmt.Println("Library: ", lib)
} }

View File

@@ -3,11 +3,13 @@ package xmlparsing
import ( import (
"encoding/xml" "encoding/xml"
"io" "io"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
) )
func UnmarshalFile[T any](filename string, data T) error { func UnmarshalFile[T any](filename string, data T) error {
slog.Debug("Unmarshalling file: ", "file", filename)
xmlFile, err := os.Open(filename) xmlFile, err := os.Open(filename)
if err != nil { if err != nil {
return err return err
@@ -18,8 +20,8 @@ func UnmarshalFile[T any](filename string, data T) error {
if err != nil { if err != nil {
return err return err
} }
err = xml.Unmarshal(byteValue, &data)
err = xml.Unmarshal(byteValue, &data)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -2,7 +2,9 @@ package xmlmodels
import ( import (
"fmt" "fmt"
"log/slog"
"path/filepath" "path/filepath"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
@@ -11,7 +13,7 @@ import (
) )
const ( const (
REFERENCES_PATH = "data/xml/akteure.xml" REFERENCES_PATH = "data/xml/references.xml"
LETTERS_PATH = "data/xml/briefe.xml" LETTERS_PATH = "data/xml/briefe.xml"
META_PATH = "data/xml/meta.xml" META_PATH = "data/xml/meta.xml"
TRADITIONS_PATH = "data/xml/traditions.xml" TRADITIONS_PATH = "data/xml/traditions.xml"
@@ -32,7 +34,33 @@ type Library struct {
func (l *Library) String() string { func (l *Library) String() string {
// TODO: // TODO:
return "" sb := strings.Builder{}
sb.WriteString("Persons: ")
sb.WriteString(strconv.Itoa(len(l.Persons.Array)))
sb.WriteString("\n")
sb.WriteString("Places: ")
sb.WriteString(strconv.Itoa(len(l.Places.Array)))
sb.WriteString("\n")
sb.WriteString("AppDefs: ")
sb.WriteString(strconv.Itoa(len(l.AppDefs.Array)))
sb.WriteString("\n")
sb.WriteString("Letters: ")
sb.WriteString(strconv.Itoa(len(l.Letters.Array)))
sb.WriteString("\n")
sb.WriteString("Traditions: ")
sb.WriteString(strconv.Itoa(len(l.Traditions.Array)))
sb.WriteString("\n")
sb.WriteString("Metas: ")
sb.WriteString(strconv.Itoa(len(l.Metas.Array)))
sb.WriteString("\n")
return sb.String()
} }
// INFO: this is the only place where the providers are created. There is no need for locking on access. // INFO: this is the only place where the providers are created. There is no need for locking on access.
@@ -68,6 +96,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.Persons.Serialize(&PersonDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta) err := l.Persons.Serialize(&PersonDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize persons:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH))
metamu.Unlock() metamu.Unlock()
} }
@@ -79,6 +108,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.Places.Serialize(&LocationDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta) err := l.Places.Serialize(&LocationDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize places:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH))
metamu.Unlock() metamu.Unlock()
} }
@@ -90,6 +120,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.AppDefs.Serialize(&AppDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta) err := l.AppDefs.Serialize(&AppDefs{}, filepath.Join(meta.BaseDir, REFERENCES_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize appdefs:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, REFERENCES_PATH))
metamu.Unlock() metamu.Unlock()
} }
@@ -101,6 +132,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.Letters.Serialize(&DocumentsRoot{}, filepath.Join(meta.BaseDir, LETTERS_PATH), meta) err := l.Letters.Serialize(&DocumentsRoot{}, filepath.Join(meta.BaseDir, LETTERS_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize letters:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, LETTERS_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, LETTERS_PATH))
metamu.Unlock() metamu.Unlock()
} }
@@ -112,6 +144,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.Traditions.Serialize(&TraditionsRoot{}, filepath.Join(meta.BaseDir, TRADITIONS_PATH), meta) err := l.Traditions.Serialize(&TraditionsRoot{}, filepath.Join(meta.BaseDir, TRADITIONS_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize traditions:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, TRADITIONS_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, TRADITIONS_PATH))
metamu.Unlock() metamu.Unlock()
} }
@@ -123,6 +156,7 @@ func (l *Library) Parse(source xmlparsing.ParseSource, baseDir, commit string) e
err := l.Metas.Serialize(&MetaRoot{}, filepath.Join(meta.BaseDir, META_PATH), meta) err := l.Metas.Serialize(&MetaRoot{}, filepath.Join(meta.BaseDir, META_PATH), meta)
if err != nil { if err != nil {
metamu.Lock() metamu.Lock()
slog.Error("Failed to serialize meta:", "error", err)
meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, META_PATH)) meta.FailedPaths = append(meta.FailedPaths, filepath.Join(meta.BaseDir, META_PATH))
metamu.Unlock() metamu.Unlock()
} }

View File

@@ -4,22 +4,16 @@ import "encoding/xml"
type MetaRoot struct { type MetaRoot struct {
XMLName xml.Name `xml:"opus"` XMLName xml.Name `xml:"opus"`
Metas []Meta `xml:"letterDesc"` Metas []Meta `xml:"descriptions>letterDesc"`
} }
func (m MetaRoot) Children() []Meta { func (m MetaRoot) Children() []Meta {
return m.Metas return m.Metas
} }
type DefinitionsRoot struct {
XMLName xml.Name `xml:"definitions"`
Persons PersonDefs `xml:"personDefs"`
Locations LocationDefs `xml:"locationDefs"`
Apparatuses AppDefs `xml:"appDefs"`
}
type PersonDefs struct { type PersonDefs struct {
Persons []PersonDef `xml:"personDef"` xml.Name `xml:"opus"`
Persons []PersonDef `xml:"definitions>personDefs>personDef"`
} }
func (p PersonDefs) Children() []PersonDef { func (p PersonDefs) Children() []PersonDef {
@@ -27,7 +21,8 @@ func (p PersonDefs) Children() []PersonDef {
} }
type LocationDefs struct { type LocationDefs struct {
Locations []LocationDef `xml:"locationDef"` xml.Name `xml:"opus"`
Locations []LocationDef `xml:"definitions>locationDefs>locationDef"`
} }
func (l LocationDefs) Children() []LocationDef { func (l LocationDefs) Children() []LocationDef {
@@ -35,7 +30,8 @@ func (l LocationDefs) Children() []LocationDef {
} }
type AppDefs struct { type AppDefs struct {
Apps []AppDef `xml:"appDef"` xml.Name `xml:"opus"`
Apps []AppDef `xml:"definitions>appDefs>appDef"`
} }
func (a AppDefs) Children() []AppDef { func (a AppDefs) Children() []AppDef {
@@ -43,8 +39,8 @@ func (a AppDefs) Children() []AppDef {
} }
type TraditionsRoot struct { type TraditionsRoot struct {
XMLName xml.Name `xml:"traditions"` xml.Name `xml:"opus"`
Traditions []Tradition `xml:"tradition"` Traditions []Tradition `xml:"traditions>letterTradition"`
} }
func (t TraditionsRoot) Children() []Tradition { func (t TraditionsRoot) Children() []Tradition {
@@ -52,10 +48,10 @@ func (t TraditionsRoot) Children() []Tradition {
} }
type DocumentsRoot struct { type DocumentsRoot struct {
XMLName xml.Name `xml:"document"` xml.Name `xml:"opus"`
Documents []Letter `xml:"letterText"` Document []Letter `xml:"document>letterText"`
} }
func (d DocumentsRoot) Children() []Letter { func (d DocumentsRoot) Children() []Letter {
return d.Documents return d.Document
} }