pkg/handlers/variableextractors/defaults/gradle.go (94 lines of code) (raw):
package defaults
import (
"fmt"
"strings"
"github.com/Azure/draft/pkg/reporeader"
log "github.com/sirupsen/logrus"
)
const SOURCE_COMPATIBILITY = "sourceCompatibility"
const TARGET_COMPATIBILITY = "targetCompatibility"
const SERVER_PORT = "server.port"
const GRADLE_FILE_FORMAT = "*.gradle"
type GradleExtractor struct {
}
// GetName implements reporeader.VariableExtractor
func (*GradleExtractor) GetName() string {
return "gradle"
}
// MatchesLanguage implements reporeader.VariableExtractor
func (*GradleExtractor) MatchesLanguage(lowerlang string) bool {
return lowerlang == "gradle" || lowerlang == "gradlew"
}
// ReadDefaults implements reporeader.VariableExtractor
func (*GradleExtractor) ReadDefaults(r reporeader.RepoReader) (map[string]string, error) {
separatorsSet := createSeparatorsSet()
cutSet := createCutSet()
extractedValues := make(map[string]string)
files, err := r.FindFiles(".", []string{GRADLE_FILE_FORMAT}, 2)
if err != nil {
return nil, fmt.Errorf("error finding gradle files: %v", err)
}
if len(files) > 0 {
f, err := r.ReadFile(files[0])
if err != nil {
log.Warn("Unable to read gradle file, skipping detection")
return nil, nil
}
content := string(f)
// this separator is used to split the line from build.gradle ex: sourceCompatibility = '1.8'
// output will be ['sourceCompatibility', '1.8'] or ["sourceCompatibility", "1.8"]
separatorFunc := func(c rune) bool {
return separatorsSet.Contains(c)
}
// this func takes care of removing the single or double quotes from split array output
cutset := func(c rune) bool { return cutSet.Contains(c) }
if strings.Contains(content, SOURCE_COMPATIBILITY) || strings.Contains(content, TARGET_COMPATIBILITY) || strings.Contains(content, SERVER_PORT) {
stringAfterSplit := strings.FieldsFunc(content, separatorFunc)
for i, s := range stringAfterSplit {
if i+1 >= len(stringAfterSplit) {
break
}
if s == SOURCE_COMPATIBILITY {
detectedVersion := strings.TrimFunc(stringAfterSplit[i+1], cutset)
detectedVersion = detectedVersion + "-jre"
extractedValues["VERSION"] = detectedVersion
} else if s == TARGET_COMPATIBILITY {
detectedBuilderVersion := strings.TrimFunc(stringAfterSplit[i+1], cutset)
detectedBuilderVersion = "jdk" + detectedBuilderVersion
extractedValues["BUILDERVERSION"] = detectedBuilderVersion
} else if s == SERVER_PORT {
detectedPort := strings.TrimFunc(stringAfterSplit[i+1], cutset)
extractedValues["PORT"] = detectedPort
}
}
}
}
return extractedValues, nil
}
func createSeparatorsSet() Set {
separatorsSet := NewSet()
separatorsSet.Add(' ')
separatorsSet.Add('=')
separatorsSet.Add('\n')
separatorsSet.Add('\r')
separatorsSet.Add('\t')
separatorsSet.Add('{')
separatorsSet.Add('}')
separatorsSet.Add('[')
separatorsSet.Add(']')
separatorsSet.Add('-')
separatorsSet.Add(':')
return separatorsSet
}
func createCutSet() Set {
cutSet := NewSet()
cutSet.Add('\'')
cutSet.Add('"')
return cutSet
}
type Set map[interface{}]struct{}
func NewSet() Set {
return make(Set)
}
func (s Set) Add(item interface{}) {
s[item] = struct{}{}
}
func (s Set) Contains(item interface{}) bool {
_, ok := s[item]
return ok
}
var _ reporeader.VariableExtractor = &GradleExtractor{}