Use go module as dependency tool instead of glide
[src/xds/xds-server.git] / lib / xdsserver / folders.go
index 41158fb..5b3649e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 "IoT.bzh"
+ * Copyright (C) 2017-2018 "IoT.bzh"
  * Author Sebastien Douheret <sebastien@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,10 +26,10 @@ import (
        "strings"
        "time"
 
+       common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xdsconfig"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
        "github.com/franciscocpg/reflectme"
-       common "github.com/iotbzh/xds-common/golib"
-       "github.com/iotbzh/xds-server/lib/xsapiv1"
-       "github.com/iotbzh/xds-server/lib/xdsconfig"
        "github.com/syncthing/syncthing/lib/sync"
 )
 
@@ -51,8 +51,8 @@ type RegisteredCB struct {
 var fcMutex = sync.NewMutex()
 var ffMutex = sync.NewMutex()
 
-// FoldersNew Create a new instance of Model Folders
-func FoldersNew(ctx *Context) *Folders {
+// FoldersConstructor Create a new instance of Model Folders
+func FoldersConstructor(ctx *Context) *Folders {
        file, _ := xdsconfig.FoldersConfigFilenameGet()
        return &Folders{
                Context:    ctx,
@@ -74,7 +74,9 @@ func (f *Folders) LoadConfig() error {
                f.Log.Infof("Use folder config file: %s", f.fileOnDisk)
                err := foldersConfigRead(f.fileOnDisk, &flds)
                if err != nil {
-                       if strings.HasPrefix(err.Error(), "No folder config") {
+                       if strings.HasPrefix(err.Error(), "EOF") {
+                               f.Log.Warnf("Empty folder config file")
+                       } else if strings.HasPrefix(err.Error(), "No folder config") {
                                f.Log.Warnf(err.Error())
                        } else {
                                return err
@@ -177,7 +179,7 @@ func (f *Folders) ResolveID(id string) (string, error) {
        } else if len(match) == 0 {
                return id, fmt.Errorf("Unknown id")
        }
-       return id, fmt.Errorf("Multiple IDs found with provided prefix: " + id)
+       return id, fmt.Errorf("Multiple IDs found %v", match)
 }
 
 // Get returns the folder config or nil if not existing
@@ -216,6 +218,7 @@ func (f *Folders) Add(newF xsapiv1.FolderConfig) (*xsapiv1.FolderConfig, error)
 
 // CreateUpdate creates or update a folder
 func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial bool) (*xsapiv1.FolderConfig, error) {
+       var err error
 
        fcMutex.Lock()
        defer fcMutex.Unlock()
@@ -269,12 +272,21 @@ func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial b
        // Normalize path (needed for Windows path including bashlashes)
        newF.ClientPath = common.PathNormalize(newF.ClientPath)
 
-       // Add new folder
-       newFolder, err := fld.Add(newF)
-       if err != nil {
-               newF.Status = xsapiv1.StatusErrorConfig
-               log.Printf("ERROR Adding folder: %v\n", err)
-               return newFolder, err
+       var newFolder *xsapiv1.FolderConfig
+       if create {
+               // Add folder
+               if newFolder, err = fld.Add(newF); err != nil {
+                       newF.Status = xsapiv1.StatusErrorConfig
+                       log.Printf("ERROR Adding folder: %v\n", err)
+                       return newFolder, err
+               }
+       } else {
+               // Just update project config
+               if newFolder, err = fld.Setup(newF); err != nil {
+                       newF.Status = xsapiv1.StatusErrorConfig
+                       log.Printf("ERROR Updating folder: %v\n", err)
+                       return newFolder, err
+               }
        }
 
        // Add to folders list
@@ -287,13 +299,6 @@ func (f *Folders) createUpdate(newF xsapiv1.FolderConfig, create bool, initial b
                }
        }
 
-       // Register event change callback
-       for _, rcb := range f.registerCB {
-               if err := fld.RegisterEventChange(rcb.cb, rcb.data); err != nil {
-                       return newFolder, err
-               }
-       }
-
        // Force sync after creation
        // (need to defer to be sure that WS events will arrive after HTTP creation reply)
        go func() {
@@ -379,29 +384,6 @@ func (f *Folders) Update(id string, cfg xsapiv1.FolderConfig) (*xsapiv1.FolderCo
        return fld, err
 }
 
-// RegisterEventChange requests registration for folder event change
-func (f *Folders) RegisterEventChange(id string, cb *FolderEventCB, data *FolderEventCBData) error {
-
-       flds := make(map[string]*IFOLDER)
-       if id != "" {
-               // Register to a specific folder
-               flds[id] = f.Get(id)
-       } else {
-               // Register to all folders
-               flds = f.folders
-               f.registerCB = append(f.registerCB, RegisteredCB{cb: cb, data: data})
-       }
-
-       for _, fld := range flds {
-               err := (*fld).RegisterEventChange(cb, data)
-               if err != nil {
-                       return err
-               }
-       }
-
-       return nil
-}
-
 // ForceSync Force the synchronization of a folder
 func (f *Folders) ForceSync(id string) error {
        fc := f.Get(id)
@@ -425,8 +407,8 @@ func (f *Folders) IsFolderInSync(id string) (bool, error) {
 // Use XML format and not json to be able to save/load all fields including
 // ones that are masked in json (IOW defined with `json:"-"`)
 type xmlFolders struct {
-       XMLName xml.Name             `xml:"folders"`
-       Version string               `xml:"version,attr"`
+       XMLName xml.Name               `xml:"folders"`
+       Version string                 `xml:"version,attr"`
        Folders []xsapiv1.FolderConfig `xml:"folders"`
 }
 
@@ -448,6 +430,18 @@ func foldersConfigRead(file string, folders *[]xsapiv1.FolderConfig) error {
        data := xmlFolders{}
        err = xml.NewDecoder(fd).Decode(&data)
        if err == nil {
+               // Decode old type encoding (number) for backward compatibility
+               for i, d := range data.Folders {
+                       switch d.Type {
+                       case "1":
+                               data.Folders[i].Type = xsapiv1.TypePathMap
+                       case "2":
+                               data.Folders[i].Type = xsapiv1.TypeCloudSync
+                       case "3":
+                               data.Folders[i].Type = xsapiv1.TypeCifsSmb
+                       }
+               }
+
                *folders = data.Folders
        }
        return err