diff --git a/.github/workflows/e2e-versions.yml b/.github/workflows/e2e-versions.yml index 47250cc..7ca6727 100644 --- a/.github/workflows/e2e-versions.yml +++ b/.github/workflows/e2e-versions.yml @@ -337,3 +337,48 @@ jobs: - name: Verify Java run: bash __tests__/verify-java.sh "11.0.2" "${{ steps.setup-java.outputs.path }}" shell: bash + + setup-java-version-from-pom-spring-boot-specification: + name: ${{ matrix.distribution }} version from file 'openjdk64-11.0.2' - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + distribution: ['adopt', 'zulu', 'liberica' ] + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Create .java-version file + shell: bash + run: | + echo "" > pom.xml + echo "" >> pom.xml + echo " 4.0.0" >> pom.xml + echo " com.test" >> pom.xml + echo " Test" >> pom.xml + echo " 0.0.1-SNAPSHOT" >> pom.xml + echo " Test" >> pom.xml + echo " " >> pom.xml + echo " 11" >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " org.springframework.boot" >> pom.xml + echo " spring-boot-maven-plugin" >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo " " >> pom.xml + echo "" >> pom.xml + - name: setup-java + uses: ./ + id: setup-java + with: + distribution: ${{ matrix.distribution }} + java-version-file: 'pom.xml' + - name: Verify Java + run: bash __tests__/verify-java.sh "11.0.2" "${{ steps.setup-java.outputs.path }}" + shell: bash diff --git a/src/setup-java.ts b/src/setup-java.ts index 1d6dc15..df90e6e 100644 --- a/src/setup-java.ts +++ b/src/setup-java.ts @@ -47,7 +47,7 @@ async function run() { .toString() .trim(); - const version = getVersionFromFileContent(content, distributionName); + const version = getVersionFromFileContent(versionFile, content, distributionName); core.debug(`Parsed version from file '${version}'`); if (!version) { diff --git a/src/util.ts b/src/util.ts index d3a09f6..967406c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -101,13 +101,19 @@ export function isCacheFeatureAvailable(): boolean { } export function getVersionFromFileContent( + fileName: string, content: string, distributionName: string ): string | null { - const javaVersionRegExp = /(?(?<=(^|\s|\-))(\d+\S*))(\s|$)/; - const fileContent = content.match(javaVersionRegExp)?.groups?.version - ? (content.match(javaVersionRegExp)?.groups?.version as string) - : ''; + let fileContent = null; + if (fileName.includes('.java-version')) { + fileContent = parseJavaVersionFile(content) + } else if (fileName.includes('pom.xml')){ + fileContent = parsePomXmlFile(content) + } else { + throw new Error(`File ${fileName} not supported, files supported: '.java-version' and 'pom.xml'`) + } + if (!fileContent) { return null; } @@ -133,7 +139,84 @@ export function getVersionFromFileContent( return version.toString(); } +function parseJavaVersionFile(content: string): string | null { + const javaVersionRegExp = /(?(?<=(^|\s|\-))(\d+\S*))(\s|$)/; + const fileContent = content.match(javaVersionRegExp)?.groups?.version + ? (content.match(javaVersionRegExp)?.groups?.version as string) + : ''; + if (!fileContent) { + return null; + } + + return fileContent +} + +function parsePomXmlFile(content: string): string | null { + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(content, "text/xml"); + const versionDefinitionTypes = [ + getByMavenCompilerSource, + getByMavenCompilerRelease, + getBySpringBootSpecification, + ] + const versionFound = versionDefinitionTypes.filter(function(definitionType){ + const version = definitionType(xmlDoc) + + return version !== null + }) + + + return versionFound?.at(0)?.toString() ?? null; +} + +function getByMavenCompilerSource(xmlDoc: Document): string | null { + const possibleTags = [ + "maven.compiler.source", + "source" + ] + + const tagFound = possibleTags.filter(function(tag) { + const version = getVersionByTagName(xmlDoc, tag) + + return version !== null + }) + + return tagFound?.at(0)?.toString() ?? null + +} + +function getByMavenCompilerRelease(xmlDoc: Document): string | null { + const possibleTags = [ + "maven.compiler.release", + "release" + ] + + const tagFound = possibleTags.filter(function(tag) { + const version = getVersionByTagName(xmlDoc, tag) + + return version !== null + }) + + return tagFound?.at(0)?.toString() ?? null +} + +function getBySpringBootSpecification(xmlDoc: Document): string | null { + return getVersionByTagName(xmlDoc, "java.version") +} + +function getVersionByTagName(xmlDoc: Document, tagName: string): string | null { + const element = xmlDoc.getElementsByTagName(tagName) + + if (element.length < 1) { + return null + } + + return element[0].textContent + +} + // By convention, action expects version 8 in the format `8.*` instead of `1.8` function avoidOldNotation(content: string): string { return content.startsWith('1.') ? content.substring(2) : content; } +