87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/xml"
|
|
)
|
|
|
|
type MxGraphModel struct {
|
|
XMLName xml.Name `xml:"mxGraphModel"`
|
|
|
|
Root struct {
|
|
XMLName xml.Name `xml:"root"`
|
|
MxCell []MxCell `xml:"mxCell"`
|
|
MxObject *[]MxObject `xml:"object"`
|
|
MxLink []MxLink
|
|
}
|
|
}
|
|
|
|
type MxCell struct {
|
|
XMLName xml.Name `xml:"mxCell"`
|
|
ID string `xml:"id,attr"`
|
|
RID *string `xml:"rID,attr"`
|
|
Rtype string `xml:"rType,attr"`
|
|
Parent *string `xml:"parent,attr"`
|
|
Edge *string `xml:"edge,attr"`
|
|
Source *string `xml:"source,attr"`
|
|
Target *string `xml:"target,attr"`
|
|
}
|
|
|
|
type MxLink struct {
|
|
ID string `xml:"id,attr"`
|
|
Source string `xml:"source,attr"`
|
|
Target string `xml:"target,attr"`
|
|
}
|
|
|
|
type MxObject struct {
|
|
XMLName xml.Name `xml:"object"`
|
|
ID string `xml:"id,attr"`
|
|
Settings []xml.Attr `xml:",any,attr"`
|
|
MxCell MxCell `xml:"mxCell"`
|
|
}
|
|
|
|
// Didn't manage to differentiate Links and cells containing components using
|
|
// only structures and unmarshal, so we use this method post-umarshalling
|
|
func (g *MxGraphModel) createLinks() {
|
|
var cells_without_links []MxCell
|
|
|
|
|
|
for i, mxcell := range g.Root.MxCell {
|
|
|
|
if mxcell.Edge != nil {
|
|
mxcell.processLinks()
|
|
newLink := MxLink{mxcell.ID,*mxcell.Source,*mxcell.Target}
|
|
g.Root.MxLink = append(g.Root.MxLink,newLink)
|
|
} else {
|
|
cells_without_links = append(cells_without_links,g.Root.MxCell[i])
|
|
}
|
|
}
|
|
|
|
|
|
g.Root.MxCell = nil
|
|
g.Root.MxCell = cells_without_links
|
|
|
|
}
|
|
|
|
func (cell *MxCell) processLinks() {
|
|
v := ""
|
|
if cell.Source == nil {
|
|
cell.Source = &v
|
|
}
|
|
if cell.Target == nil {
|
|
cell.Target = &v
|
|
}
|
|
}
|
|
|
|
type mxissue struct {
|
|
msg string
|
|
}
|
|
|
|
func (m *mxissue) Error() string {
|
|
return m.msg
|
|
}
|
|
|
|
func newMxIssue(message string) error {
|
|
return &mxissue{message}
|
|
}
|
|
|