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  }