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  }