github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/abaputils/osl.go (about) 1 package abaputils 2 3 import ( 4 "reflect" 5 6 "github.com/SAP/jenkins-library/pkg/log" 7 ) 8 9 // ObjectSet in form of packages and software components to be checked 10 type ObjectSet struct { 11 PackageNames []Package `json:"packages,omitempty"` 12 SoftwareComponents []SoftwareComponents `json:"softwarecomponents,omitempty"` 13 PackageTrees []PackageTree `json:"packagetrees,omitempty"` 14 Type string `json:"type,omitempty"` 15 MultiPropertySet MultiPropertySet `json:"multipropertyset,omitempty"` 16 Set []Set `json:"set,omitempty"` 17 } 18 19 // MultiPropertySet that can possibly contain any subsets/object of the OSL 20 type MultiPropertySet struct { 21 Type string `json:"type,omitempty"` 22 PackageNames []Package `json:"packages,omitempty"` 23 PackageTrees []PackageTree `json:"packagetrees,omitempty"` 24 ObjectTypeGroups []ObjectTypeGroup `json:"objecttypegroups,omitempty"` 25 ObjectTypes []ObjectType `json:"objecttypes,omitempty"` 26 Owners []Owner `json:"owners,omitempty"` 27 ReleaseStates []ReleaseState `json:"releasestates,omitempty"` 28 Versions []Version `json:"versions,omitempty"` 29 ApplicationComponents []ApplicationComponent `json:"applicationcomponents,omitempty"` 30 SoftwareComponents []SoftwareComponents `json:"softwarecomponents,omitempty"` 31 TransportLayers []TransportLayer `json:"transportlayers,omitempty"` 32 Languages []Language `json:"languages,omitempty"` 33 SourceSystems []SourceSystem `json:"sourcesystems,omitempty"` 34 } 35 36 // Set 37 type Set struct { 38 Type string `json:"type,omitempty"` 39 Set []Set `json:"set,omitempty"` 40 PackageSet []PackageSet `json:"package,omitempty"` 41 FlatObjectSet []FlatObjectSet `json:"object,omitempty"` 42 ComponentSet []ComponentSet `json:"component,omitempty"` 43 TransportSet []TransportSet `json:"transport,omitempty"` 44 ObjectTypeSet []ObjectTypeSet `json:"objecttype,omitempty"` 45 } 46 47 // PackageSet in form of packages to be checked 48 type PackageSet struct { 49 Name string `json:"name,omitempty"` 50 IncludeSubpackages *bool `json:"includesubpackages,omitempty"` 51 } 52 53 // FlatObjectSet 54 type FlatObjectSet struct { 55 Name string `json:"name,omitempty"` 56 Type string `json:"type,omitempty"` 57 } 58 59 // ComponentSet in form of software components to be checked 60 type ComponentSet struct { 61 Name string `json:"name,omitempty"` 62 } 63 64 // TransportSet in form of transports to be checked 65 type TransportSet struct { 66 Number string `json:"number,omitempty"` 67 } 68 69 // ObjectTypeSet 70 type ObjectTypeSet struct { 71 Name string `json:"name,omitempty"` 72 } 73 74 // Package for MPS 75 type Package struct { 76 Name string `json:"name,omitempty"` 77 } 78 79 // Packagetree for MPS 80 type PackageTree struct { 81 Name string `json:"name,omitempty"` 82 } 83 84 // ObjectTypeGroup 85 type ObjectTypeGroup struct { 86 Name string `json:"name,omitempty"` 87 } 88 89 // ObjectType 90 type ObjectType struct { 91 Name string `json:"name,omitempty"` 92 } 93 94 // Owner 95 type Owner struct { 96 Name string `json:"name,omitempty"` 97 } 98 99 // ReleaseState 100 type ReleaseState struct { 101 Value string `json:"value,omitempty"` 102 } 103 104 // Version 105 type Version struct { 106 Value string `json:"value,omitempty"` 107 } 108 109 // ApplicationComponent 110 type ApplicationComponent struct { 111 Name string `json:"name,omitempty"` 112 } 113 114 // SoftwareComponents 115 type SoftwareComponents struct { 116 Name string `json:"name,omitempty"` 117 } 118 119 // TransportLayer 120 type TransportLayer struct { 121 Name string `json:"name,omitempty"` 122 } 123 124 // Language 125 type Language struct { 126 Value string `json:"value,omitempty"` 127 } 128 129 // SourceSystem 130 type SourceSystem struct { 131 Name string `json:"name,omitempty"` 132 } 133 134 func BuildOSLString(OSLConfig ObjectSet) (objectSetString string) { 135 136 //Build ObjectSets 137 s := OSLConfig 138 if s.Type == "" { 139 s.Type = "multiPropertySet" 140 } 141 switch s.Type { 142 case "multiPropertySet": 143 objectSetString += `<osl:objectSet xsi:type="` + s.Type + `" xmlns:osl="http://www.sap.com/api/osl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">` 144 145 if !(reflect.DeepEqual(s.PackageNames, Package{})) || !(reflect.DeepEqual(s.SoftwareComponents, SoftwareComponents{})) { 146 //To ensure Scomps and packages can be assigned on this level 147 mps := MultiPropertySet{ 148 PackageNames: s.PackageNames, 149 SoftwareComponents: s.SoftwareComponents, 150 } 151 objectSetString += writeObjectSetProperties(mps) 152 } 153 154 objectSetString += writeObjectSetProperties(s.MultiPropertySet) 155 156 if !(reflect.DeepEqual(s.MultiPropertySet, MultiPropertySet{})) { 157 log.Entry().Info("Wrong configuration has been detected: MultiPropertySet has been used. Please note that there is no official documentation for this usage. Please check the step documentation for more information") 158 } 159 160 for _, t := range s.Set { 161 log.Entry().Infof("Wrong configuration has been detected: %s has been used. This is currently not supported and this set will not be included in this run. Please check the step documentation for more information", t.Type) 162 } 163 objectSetString += `</osl:objectSet>` 164 165 default: 166 log.Entry().Infof("Wrong configuration has been detected: %s has been used. This is currently not supported and this set will not be included in this run. Please check the step documentation for more information", s.Type) 167 } 168 169 return objectSetString 170 } 171 172 func writeObjectSetProperties(set MultiPropertySet) (objectSetString string) { 173 for _, packages := range set.PackageNames { 174 objectSetString += `<osl:package name="` + packages.Name + `"/>` 175 } 176 for _, packagetrees := range set.PackageTrees { 177 objectSetString += `<osl:package name="` + packagetrees.Name + `" includeSubpackages="true"/>` 178 } 179 for _, objectTypeGroup := range set.ObjectTypeGroups { 180 objectSetString += `<osl:objectTypeGroup name="` + objectTypeGroup.Name + `"/>` 181 } 182 for _, objectType := range set.ObjectTypes { 183 objectSetString += `<osl:objectType name="` + objectType.Name + `"/>` 184 } 185 for _, owner := range set.Owners { 186 objectSetString += `<osl:owner name="` + owner.Name + `"/>` 187 } 188 for _, releaseState := range set.ReleaseStates { 189 objectSetString += `<osl:releaseState value="` + releaseState.Value + `"/>` 190 } 191 for _, version := range set.Versions { 192 objectSetString += `<osl:version value="` + version.Value + `"/>` 193 } 194 for _, applicationComponent := range set.ApplicationComponents { 195 objectSetString += `<osl:applicationComponent name="` + applicationComponent.Name + `"/>` 196 } 197 for _, component := range set.SoftwareComponents { 198 objectSetString += `<osl:softwareComponent name="` + component.Name + `"/>` 199 } 200 for _, transportLayer := range set.TransportLayers { 201 objectSetString += `<osl:transportLayer name="` + transportLayer.Name + `"/>` 202 } 203 for _, language := range set.Languages { 204 objectSetString += `<osl:language value="` + language.Value + `"/>` 205 } 206 for _, sourceSystem := range set.SourceSystems { 207 objectSetString += `<osl:sourceSystem name="` + sourceSystem.Name + `"/>` 208 } 209 return objectSetString 210 }