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  }