syft/imgbom/cataloger/java/archive_filename.go

85 lines
1.9 KiB
Go

package java
import (
"path/filepath"
"regexp"
"strings"
"github.com/anchore/imgbom/imgbom/pkg"
)
// match examples:
// pkg-extra-field-4.3.2-rc1 --> match(name=pkg-extra-field version=4.3.2-rc1)
// pkg-extra-field-4.3-rc1 --> match(name=pkg-extra-field version=4.3-rc1)
// pkg-extra-field-4.3 --> match(name=pkg-extra-field version=4.3)
var versionPattern = regexp.MustCompile(`(?P<name>.+)-(?P<version>(\d+\.)?(\d+\.)?(\*|\d+)(-[a-zA-Z0-9\-\.]+)*)`)
type archiveFilename struct {
raw string
}
func newJavaArchiveFilename(raw string) archiveFilename {
return archiveFilename{
raw: raw,
}
}
func (a archiveFilename) normalize() string {
// trim the file extension and remove any path prefixes
return strings.TrimSuffix(filepath.Base(a.raw), "."+a.extension())
}
func (a archiveFilename) fields() []map[string]string {
name := a.normalize()
matches := versionPattern.FindAllStringSubmatch(name, -1)
items := make([]map[string]string, 0)
for _, match := range matches {
item := make(map[string]string)
for i, name := range versionPattern.SubexpNames() {
if i != 0 && name != "" {
item[name] = match[i]
}
}
items = append(items, item)
}
return items
}
func (a archiveFilename) extension() string {
return strings.TrimPrefix(filepath.Ext(a.raw), ".")
}
func (a archiveFilename) pkgType() pkg.Type {
switch strings.ToLower(a.extension()) {
case "jar", "war", "ear":
return pkg.JavaPkg
case "jpi", "hpi":
return pkg.JenkinsPluginPkg
default:
return pkg.UnknownPkg
}
}
func (a archiveFilename) version() string {
fields := a.fields()
// there should be only one version, if there is more or less then something is wrong
if len(fields) != 1 {
return ""
}
return fields[0]["version"]
}
func (a archiveFilename) name() string {
fields := a.fields()
// there should be only one name, if there is more or less then something is wrong
if len(fields) != 1 {
return ""
}
return fields[0]["name"]
}