github.com/sap/cf-mta-plugin@v2.6.3+incompatible/util/mta_manifest.go (about) 1 package util 2 3 import ( 4 "bufio" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 ) 9 10 const ContentTypeAttribute string = "Content-Type" 11 const ManifestVersion string = "Manifest-Version" 12 const Name string = "Name" 13 const ManifestName string = "MANIFEST.MF" 14 const MtaResource string = "MTA-Resource" 15 const MtaRequires string = "MTA-Requires" 16 const MtaModule string = "MTA-Module" 17 const MtadAttribute string = "META-INF/mtad.yaml" 18 const SectionSeparator string = "\n" 19 20 type MtaManifest struct { 21 ManifestVersion string 22 ManifestSections []ManifestSection 23 } 24 25 type ManifestSection struct { 26 Name string 27 Attributes map[string]string 28 } 29 30 type MtaManifestBuilder struct { 31 manifest MtaManifest 32 } 33 34 func NewMtaManifestBuilder() *MtaManifestBuilder { 35 return &MtaManifestBuilder{} 36 } 37 38 func (builder *MtaManifestBuilder) ManifestSections(sections []ManifestSection) *MtaManifestBuilder { 39 builder.manifest.ManifestSections = append(builder.manifest.ManifestSections, sections...) 40 return builder 41 } 42 43 func (builder *MtaManifestBuilder) Build() (string, error) { 44 location, err := ioutil.TempDir("", "mta-manifest") 45 if err != nil { 46 return "", err 47 } 48 fileLocation := filepath.Join(location, ManifestName) 49 file, err := os.Create(fileLocation) 50 if err != nil { 51 return "", err 52 } 53 defer file.Close() 54 55 fileWriter := bufio.NewWriter(file) 56 _, err = fileWriter.WriteString(getManifestVersion(builder.manifest)) 57 if err != nil { 58 return "", err 59 } 60 _, err = fileWriter.WriteString(SectionSeparator) 61 if err != nil { 62 return "", err 63 } 64 _, err = fileWriter.WriteString(SectionSeparator) 65 if err != nil { 66 return "", err 67 } 68 69 for _, section := range builder.manifest.ManifestSections { 70 _, err = fileWriter.WriteString(section.Name) 71 if err != nil { 72 return "", err 73 } 74 _, err = fileWriter.WriteString(SectionSeparator) 75 if err != nil { 76 return "", err 77 } 78 err = writeSectionAttributes(fileWriter, section.Attributes) 79 if err != nil { 80 return "", err 81 } 82 fileWriter.WriteString(SectionSeparator) 83 fileWriter.WriteString(SectionSeparator) 84 } 85 86 fileWriter.Flush() 87 return fileLocation, nil 88 } 89 90 func getManifestVersion(manifest MtaManifest) string { 91 if manifest.ManifestVersion == "" { 92 return ManifestVersion + ": 1.0" 93 } 94 return ManifestVersion + ": " + manifest.ManifestVersion 95 } 96 97 func writeSectionAttributes(fileWriter *bufio.Writer, attributes map[string]string) error { 98 for attrName, attrValue := range attributes { 99 _, err := fileWriter.WriteString(attrName + ": " + attrValue) 100 if err != nil { 101 return err 102 } 103 _, err = fileWriter.WriteString(SectionSeparator) 104 if err != nil { 105 return err 106 } 107 } 108 return nil 109 } 110 111 type MtaManifestSectionBuilder struct { 112 section ManifestSection 113 } 114 115 func NewMtaManifestSectionBuilder() *MtaManifestSectionBuilder { 116 return &MtaManifestSectionBuilder{ 117 section: ManifestSection{ 118 Attributes: make(map[string]string), 119 }, 120 } 121 } 122 123 func (builder *MtaManifestSectionBuilder) Name(name string) *MtaManifestSectionBuilder { 124 builder.section.Name = Name + ": " + name 125 return builder 126 } 127 128 func (builder *MtaManifestSectionBuilder) Attribute(attributeName, attributeValue string) *MtaManifestSectionBuilder { 129 builder.section.Attributes[attributeName] = attributeValue 130 return builder 131 } 132 133 func (builder *MtaManifestSectionBuilder) Build() ManifestSection { 134 return builder.section 135 }