github.com/unirita/cuto@v0.9.8-0.20160830082821-aa6652f877b7/flowgen/converter/export.go (about) 1 package converter 2 3 import ( 4 "encoding/xml" 5 "fmt" 6 "io" 7 "os" 8 ) 9 10 // Export writes xml to w. Contents of xml is read from d(Definitions object). 11 func Export(w io.Writer, d *Definitions) error { 12 output, err := xml.MarshalIndent(d, "", " ") 13 if err != nil { 14 return fmt.Errorf("XML marshal error: %v", err) 15 } 16 17 w.Write([]byte(xml.Header)) 18 w.Write(output) 19 return nil 20 } 21 22 // ExportFile writes xml to file. 23 func ExportFile(filepath string, d *Definitions) error { 24 backupFileIfExists(filepath) 25 f, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0644) 26 defer f.Close() 27 if err != nil { 28 return fmt.Errorf("Output file open error: %s", err) 29 } 30 31 return Export(f, d) 32 } 33 34 // GenerateDefinitions generates BPMN Difinitions object from head element of flow. 35 func GenerateDefinitions(head Element) *Definitions { 36 d := NewDefinitions() 37 38 pre := d.Process.Start.ID 39 for current := head; current != nil; current = current.Next() { 40 switch current.(type) { 41 case *Job: 42 pre = d.AppendJob(current.(*Job), pre) 43 case *Gateway: 44 pre = d.AppendGateway(current.(*Gateway), pre) 45 default: 46 panic("Unexpected type detected.") 47 } 48 } 49 50 d.AppendSequenceFlow(NewSequenceFlow(pre, d.Process.End.ID)) 51 52 return d 53 } 54 55 func backupFileIfExists(path string) { 56 _, err := os.Stat(path) 57 if !os.IsNotExist(err) { 58 bkupPath := path + ".bk" 59 _, err := os.Stat(bkupPath) 60 if !os.IsNotExist(err) { 61 tmpPath := path + ".tmp" 62 os.Rename(bkupPath, tmpPath) 63 defer os.Remove(tmpPath) 64 } 65 os.Rename(path, bkupPath) 66 } 67 }