blob: da14b2c60e5316afedc44a198ffd93ec69c6ec7b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.enforcer.rules.version;
import javax.inject.Named;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.SystemUtils;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.codehaus.plexus.util.StringUtils;
/**
* This rule checks that the Java version is allowed.
*
* @author <a href="mailto:brianf@apache.org">Brian Fox</a>
*/
@Named("requireJavaVersion")
public final class RequireJavaVersion extends AbstractVersionEnforcer {
private static final Pattern JDK8_VERSION_PATTERN = Pattern.compile("([\\d.]+)");
/**
* Display the normalized JDK version.
*/
private boolean display = false;
@Override
public void setVersion(String theVersion) {
if ("8".equals(theVersion)) {
super.setVersion("1.8");
return;
}
if (!theVersion.contains("8")) {
super.setVersion(theVersion);
return;
}
Matcher matcher = JDK8_VERSION_PATTERN.matcher(theVersion);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
if ("8".equals(matcher.group(1))) {
matcher.appendReplacement(result, "1.8");
} else {
matcher.appendReplacement(result, "$1");
}
}
matcher.appendTail(result);
super.setVersion(result.toString());
}
@Override
public void execute() throws EnforcerRuleException {
String javaVersion = SystemUtils.JAVA_VERSION;
String javaVersionNormalized = normalizeJDKVersion(javaVersion);
if (display) {
getLog().info("Detected Java Version: '" + javaVersion + "'");
getLog().info("Normalized Java Version: '" + javaVersionNormalized + "'");
} else {
getLog().debug("Detected Java Version: '" + javaVersion + "'");
getLog().debug("Normalized Java Version: '" + javaVersionNormalized + "'");
}
ArtifactVersion detectedJdkVersion = new DefaultArtifactVersion(javaVersionNormalized);
getLog().debug("Parsed Version: Major: " + detectedJdkVersion.getMajorVersion() + " Minor: "
+ detectedJdkVersion.getMinorVersion() + " Incremental: " + detectedJdkVersion.getIncrementalVersion()
+ " Build: " + detectedJdkVersion.getBuildNumber() + " Qualifier: "
+ detectedJdkVersion.getQualifier());
setCustomMessageIfNoneConfigured(detectedJdkVersion, getVersion());
enforceVersion("JDK", getVersion(), detectedJdkVersion);
}
/**
* Converts a jdk string from 1.5.0-11b12 to a single 3 digit version like 1.5.0-11
*
* @param theJdkVersion to be converted.
* @return the converted string.
*/
public static String normalizeJDKVersion(String theJdkVersion) {
theJdkVersion = theJdkVersion.replaceAll("_|-", ".");
String tokenArray[] = StringUtils.split(theJdkVersion, ".");
List<String> tokens = Arrays.asList(tokenArray);
StringBuilder buffer = new StringBuilder(theJdkVersion.length());
Iterator<String> iter = tokens.iterator();
for (int i = 0; i < tokens.size() && i < 4; i++) {
String section = iter.next();
section = section.replaceAll("[^0-9]", "");
if (section != null && !section.isEmpty()) {
buffer.append(Integer.parseInt(section));
if (i != 2) {
buffer.append('.');
} else {
buffer.append('-');
}
}
}
String version = buffer.toString();
version = StringUtils.stripEnd(version, "-");
return StringUtils.stripEnd(version, ".");
}
private void setCustomMessageIfNoneConfigured(ArtifactVersion detectedJdkVersion, String allowedVersionRange) {
if (getMessage() == null) {
String version;
try {
VersionRange vr = VersionRange.createFromVersionSpec(allowedVersionRange);
version = AbstractVersionEnforcer.toString(vr);
} catch (InvalidVersionSpecificationException e) {
getLog().debug("Could not parse allowed version range " + allowedVersionRange + " " + e.getMessage());
version = allowedVersionRange;
}
String message = String.format(
"Detected JDK version %s (JAVA_HOME=%s) is not in the allowed range %s.",
detectedJdkVersion, SystemUtils.JAVA_HOME, version);
super.setMessage(message);
}
}
@Override
public String toString() {
return String.format(
"%s[message=%s, version=%s, display=%b]",
getClass().getSimpleName(), getMessage(), getVersion(), display);
}
}