Skip to content

Commit

Permalink
refactor unmarshal to use map instead of switch
Browse files Browse the repository at this point in the history
allows for defining the unmarshal in the dynamic class
  • Loading branch information
jgramoll committed Aug 1, 2019
1 parent 2c46df9 commit fb503f0
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 37 deletions.
13 changes: 13 additions & 0 deletions client/git_scm_clean_before_checkout_extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

func init() {
scmExtensionUnmarshalFunc["hudson.plugins.git.extensions.impl.CleanBeforeCheckout"] = unmarshalScmExtension
}

type GitScmCleanBeforeCheckoutExtension struct {
XMLName xml.Name `xml:"hudson.plugins.git.extensions.impl.CleanBeforeCheckout"`
Id string `xml:"id,attr"`
Expand All @@ -14,3 +18,12 @@ func NewGitScmCleanBeforeCheckoutExtension() *GitScmCleanBeforeCheckoutExtension
func (e *GitScmCleanBeforeCheckoutExtension) GetId() string {
return e.Id
}

func unmarshalScmExtension(d *xml.Decoder, start xml.StartElement) (GitScmExtension, error) {
extension := NewGitScmCleanBeforeCheckoutExtension()
err := d.DecodeElement(extension, &start)
if err != nil {
return nil, err
}
return extension, nil
}
11 changes: 6 additions & 5 deletions client/git_scm_extensions.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import (
"encoding/xml"
)

type scmExtensionUnmarshaler func(*xml.Decoder, xml.StartElement) (GitScmExtension, error)

var scmExtensionUnmarshalFunc = map[string]scmExtensionUnmarshaler{}

type GitScmExtensions struct {
Items *[]GitScmExtension
}
Expand All @@ -30,11 +34,8 @@ func (extensions *GitScmExtensions) UnmarshalXML(d *xml.Decoder, start xml.Start
extensions.Items = &[]GitScmExtension{}
for tok, err = d.Token(); err == nil; tok, err = d.Token() {
if elem, ok := tok.(xml.StartElement); ok {
// TODO use map
switch elem.Name.Local {
case "hudson.plugins.git.extensions.impl.CleanBeforeCheckout":
extension := NewGitScmCleanBeforeCheckoutExtension()
err := d.DecodeElement(extension, &elem)
if unmarshalXML, ok := scmExtensionUnmarshalFunc[elem.Name.Local]; ok {
extension, err := unmarshalXML(d, elem)
if err != nil {
return err
}
Expand Down
18 changes: 6 additions & 12 deletions client/job_actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import (
"encoding/xml"
)

type jobActionUnmarshaler func(*xml.Decoder, xml.StartElement) (JobAction, error)

var jobActionUnmarshalFunc = map[string]jobActionUnmarshaler{}

type JobActions struct {
XMLName xml.Name `xml:"actions"`
Items *[]JobAction `xml:",any"`
Expand Down Expand Up @@ -31,18 +35,8 @@ func (actions *JobActions) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
actions.Items = &[]JobAction{}
for tok, err = d.Token(); err == nil; tok, err = d.Token() {
if elem, ok := tok.(xml.StartElement); ok {
// TODO use map
switch elem.Name.Local {
case "org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction":
action := NewJobDeclarativeJobAction()
err := d.DecodeElement(action, &elem)
if err != nil {
return err
}
*actions.Items = append(*actions.Items, action)
case "org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction":
action := NewJobDeclarativeJobPropertyTrackerAction()
err := d.DecodeElement(action, &elem)
if unmarshalXML, ok := jobActionUnmarshalFunc[elem.Name.Local]; ok {
action, err := unmarshalXML(d, elem)
if err != nil {
return err
}
Expand Down
13 changes: 13 additions & 0 deletions client/job_declarative_job_action.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

func init() {
jobActionUnmarshalFunc["org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction"] = unmarshalDeclarativeJobAction
}

type JobDeclarativeJobAction struct {
XMLName xml.Name `xml:"org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction"`
Id string `xml:"id,attr,omitempty"`
Expand All @@ -14,3 +18,12 @@ func NewJobDeclarativeJobAction() *JobDeclarativeJobAction {
func (action *JobDeclarativeJobAction) GetId() string {
return action.Id
}

func unmarshalDeclarativeJobAction(d *xml.Decoder, start xml.StartElement) (JobAction, error) {
action := NewJobDeclarativeJobAction()
err := d.DecodeElement(action, &start)
if err != nil {
return nil, err
}
return action, nil
}
13 changes: 13 additions & 0 deletions client/job_declarative_job_property_tracker_action.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

func init() {
jobActionUnmarshalFunc["org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction"] = unmarshalDeclarativeJobPropertyTrackerAction
}

type JobDeclarativeJobPropertyTrackerAction struct {
XMLName xml.Name `xml:"org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobPropertyTrackerAction"`
Id string `xml:"id,attr,omitempty"`
Expand All @@ -19,3 +23,12 @@ func NewJobDeclarativeJobPropertyTrackerAction() *JobDeclarativeJobPropertyTrack
func (action *JobDeclarativeJobPropertyTrackerAction) GetId() string {
return action.Id
}

func unmarshalDeclarativeJobPropertyTrackerAction(d *xml.Decoder, start xml.StartElement) (JobAction, error) {
action := NewJobDeclarativeJobPropertyTrackerAction()
err := d.DecodeElement(action, &start)
if err != nil {
return nil, err
}
return action, nil
}
13 changes: 13 additions & 0 deletions client/job_gerrit_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ import (
"errors"
)

func init() {
jobTriggerUnmarshalFunc["com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger"] = unmarshalJobGerritTrigger
}

// ErrJobGerritTriggerProjectNotFound job gerrit trigger project not found
var ErrJobGerritTriggerProjectNotFound = errors.New("Could not find job gerrit trigger project")

Expand Down Expand Up @@ -64,6 +68,15 @@ func (trigger *JobGerritTrigger) GetId() string {
return trigger.Id
}

func unmarshalJobGerritTrigger(d *xml.Decoder, start xml.StartElement) (JobTrigger, error) {
trigger := NewJobGerritTrigger()
err := d.DecodeElement(trigger, &start)
if err != nil {
return nil, err
}
return trigger, nil
}

func (trigger *JobGerritTrigger) GetProject(projectId string) (*JobGerritTriggerProject, error) {
projects := *(trigger.Projects).Items
for _, project := range projects {
Expand Down
18 changes: 6 additions & 12 deletions client/job_gerrit_trigger_on_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

type jobGerritTriggerOnEventsUnmarshaler func(*xml.Decoder, xml.StartElement) (JobGerritTriggerOnEvent, error)

var jobGerritTriggerOnEventsUnmarshalFunc = map[string]jobGerritTriggerOnEventsUnmarshaler{}

type JobGerritTriggerOnEvents struct {
XMLName xml.Name `xml:"triggerOnEvents"`
LinkedList string `xml:"class,attr"`
Expand Down Expand Up @@ -31,18 +35,8 @@ func (events *JobGerritTriggerOnEvents) UnmarshalXML(d *xml.Decoder, start xml.S
events.Items = &[]JobGerritTriggerOnEvent{}
for tok, err = d.Token(); err == nil; tok, err = d.Token() {
if elem, ok := tok.(xml.StartElement); ok {
// TODO use map
switch elem.Name.Local {
case "com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginDraftPublishedEvent":
event := NewJobGerritTriggerPluginDraftPublishedEvent()
err := d.DecodeElement(event, &elem)
if err != nil {
return err
}
*events.Items = append(*events.Items, event)
case "com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginPatchsetCreatedEvent":
event := NewJobGerritTriggerPluginPatchsetCreatedEvent()
err := d.DecodeElement(event, &elem)
if unmarshalXML, ok := jobGerritTriggerOnEventsUnmarshalFunc[elem.Name.Local]; ok {
event, err := unmarshalXML(d, elem)
if err != nil {
return err
}
Expand Down
13 changes: 13 additions & 0 deletions client/job_gerrit_trigger_plugin_draft_published_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

func init() {
jobGerritTriggerOnEventsUnmarshalFunc["com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginDraftPublishedEvent"] = unmarshalJobGerritTriggerPluginDraftPublishedEvent
}

type JobGerritTriggerPluginDraftPublishedEvent struct {
XMLName xml.Name `xml:"com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginDraftPublishedEvent"`
Id string `xml:"id,attr,omitempty"`
Expand All @@ -14,3 +18,12 @@ func NewJobGerritTriggerPluginDraftPublishedEvent() *JobGerritTriggerPluginDraft
func (event *JobGerritTriggerPluginDraftPublishedEvent) GetId() string {
return event.Id
}

func unmarshalJobGerritTriggerPluginDraftPublishedEvent(d *xml.Decoder, start xml.StartElement) (JobGerritTriggerOnEvent, error) {
event := NewJobGerritTriggerPluginDraftPublishedEvent()
err := d.DecodeElement(event, &start)
if err != nil {
return nil, err
}
return event, nil
}
13 changes: 13 additions & 0 deletions client/job_gerrit_trigger_plugin_patchset_created_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ package client

import "encoding/xml"

func init() {
jobGerritTriggerOnEventsUnmarshalFunc["com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginPatchsetCreatedEvent"] = unmarshalJobGerritTriggerPluginPatchsetCreatedEvent
}

type JobGerritTriggerPluginPatchsetCreatedEvent struct {
XMLName xml.Name `xml:"com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.events.PluginPatchsetCreatedEvent"`
Id string `xml:"id,attr,omitempty"`
Expand All @@ -26,3 +30,12 @@ func NewJobGerritTriggerPluginPatchsetCreatedEvent() *JobGerritTriggerPluginPatc
func (event *JobGerritTriggerPluginPatchsetCreatedEvent) GetId() string {
return event.Id
}

func unmarshalJobGerritTriggerPluginPatchsetCreatedEvent(d *xml.Decoder, start xml.StartElement) (JobGerritTriggerOnEvent, error) {
event := NewJobGerritTriggerPluginPatchsetCreatedEvent()
err := d.DecodeElement(event, &start)
if err != nil {
return nil, err
}
return event, nil
}
4 changes: 2 additions & 2 deletions client/job_properties.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import (
"encoding/xml"
)

type PropertyBuilder func(*xml.Decoder, xml.StartElement) (JobProperty, error)
type propertyUnmarshaler func(*xml.Decoder, xml.StartElement) (JobProperty, error)

var propertyUnmarshalFunc = map[string]PropertyBuilder{}
var propertyUnmarshalFunc = map[string]propertyUnmarshaler{}

type JobProperties struct {
XMLName xml.Name `xml:"properties"`
Expand Down
13 changes: 7 additions & 6 deletions client/job_triggers.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import (
"encoding/xml"
)

type jobTriggerUnmarshaler func(*xml.Decoder, xml.StartElement) (JobTrigger, error)

var jobTriggerUnmarshalFunc = map[string]jobTriggerUnmarshaler{}

type JobTriggers struct {
XMLName xml.Name `xml:"triggers"`
Items *[]JobTrigger
Expand All @@ -30,15 +34,12 @@ func (triggers *JobTriggers) UnmarshalXML(d *xml.Decoder, start xml.StartElement
var err error
for tok, err = d.Token(); err == nil; tok, err = d.Token() {
if elem, ok := tok.(xml.StartElement); ok {
// TODO use map
switch elem.Name.Local {
case "com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTrigger":
trigger := NewJobGerritTrigger()
err := d.DecodeElement(trigger, &elem)
if unmarshalXML, ok := jobTriggerUnmarshalFunc[elem.Name.Local]; ok {
trigger, err := unmarshalXML(d, elem)
if err != nil {
return err
}
*triggers.Items = append(*(triggers).Items, trigger)
*triggers.Items = append(*triggers.Items, trigger)
}
}
if end, ok := tok.(xml.EndElement); ok {
Expand Down

0 comments on commit fb503f0

Please sign in to comment.