/** * Licensed to JumpMind Inc under one or more contributor * license agreements. See the NOTICE file distributed * with this work for additional information regarding * copyright ownership. JumpMind Inc licenses this file * to you under the GNU General Public License, version 3.0 (GPLv3) * (the "License"); you may not use this file except in compliance * with the License. * * You should have received a copy of the GNU General Public License, * version 3.0 (GPLv3) along with this library; if not, see * <http://www.gnu.org/licenses/>. * * 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.jumpmind.util; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.jar.Attributes; import java.util.jar.Manifest; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.jumpmind.properties.TypedProperties; /** * Follow the Apache versioning scheme documented <a * href="http://apr.apache.org/versioning.html">here</a>. */ abstract public class AbstractVersion { public static final int MAJOR_INDEX = 0; public static final int MINOR_INDEX = 1; public static final int PATCH_INDEX = 2; private String version = null; private long buildTime = -1; abstract protected String getArtifactName(); protected Attributes findManifestAttributes() { InputStream is = null; try { Enumeration<URL> resources = getClass().getClassLoader().getResources( "META-INF/MANIFEST.MF"); while (resources.hasMoreElements()) { is = resources.nextElement().openStream(); Manifest manifest = new Manifest(is); Attributes attributes = manifest.getMainAttributes(); if (getArtifactName().equals(attributes.getValue("Project-Artifact"))) { return attributes; } } } catch (IOException e) { // nothing to do, really } finally { IOUtils.closeQuietly(is); } return null; } public String version() { if (version == null) { Attributes attributes = findManifestAttributes(); if (attributes != null) { version = attributes.getValue("Build-Version"); } else { File gradleProperties = new File("../symmetric-assemble/gradle.properties"); if (gradleProperties.exists()) { TypedProperties props = new TypedProperties(gradleProperties); version = props.get("version"); } else { version = "development"; } } } return version; } public long getBuildTime() { if (buildTime == -1) { Attributes attributes = findManifestAttributes(); try { buildTime = Long.parseLong(attributes.getValue("Build-Time").split("-")[0]); } catch (Exception e) { buildTime = 0; } } return buildTime; } public String versionWithUnderscores() { return version().replace("[\\.\\-]", "_"); } public int[] parseVersion(String version) { version = version.replaceAll("[^0-9\\.]", ""); int[] versions = new int[3]; if (!StringUtils.isEmpty(version)) { String[] splitVersion = version.split("\\."); if (splitVersion.length >= 3) { versions[PATCH_INDEX] = parseVersionComponent(splitVersion[2]); } if (splitVersion.length >= 2) { versions[MINOR_INDEX] = parseVersionComponent(splitVersion[1]); } if (splitVersion.length >= 1) { versions[MAJOR_INDEX] = parseVersionComponent(splitVersion[0]); } } return versions; } private int parseVersionComponent(String versionComponent) { int version = 0; try { version = Integer.parseInt(versionComponent); } catch (NumberFormatException e) { } return version; } protected boolean isOlderMajorVersion(String version) { return isOlderMajorVersion(parseVersion(version)); } protected boolean isOlderMajorVersion(int[] versions) { int[] softwareVersion = parseVersion(version()); if (versions[MAJOR_INDEX] < softwareVersion[MAJOR_INDEX]) { return true; } return false; } public boolean isOlderVersion(String version) { return isOlderThanVersion(version, version()); } public boolean isOlderThanVersion(String checkVersion, String targetVersion) { if (noVersion(targetVersion) || noVersion(checkVersion)) { return false; } int[] checkVersions = parseVersion(checkVersion); int[] targetVersions = parseVersion(targetVersion); if (checkVersions[MAJOR_INDEX] < targetVersions[MAJOR_INDEX]) { return true; } else if (checkVersions[MAJOR_INDEX] == targetVersions[MAJOR_INDEX] && checkVersions[MINOR_INDEX] < targetVersions[MINOR_INDEX]) { return true; } else if (checkVersions[MAJOR_INDEX] == targetVersions[MAJOR_INDEX] && checkVersions[MINOR_INDEX] == targetVersions[MINOR_INDEX] && checkVersions[PATCH_INDEX] < targetVersions[PATCH_INDEX]) { return true; } return false; } protected boolean noVersion(String targetVersion) { return StringUtils.isBlank(targetVersion) || "development".equals(targetVersion); } public boolean isOlderMinorVersion(String oldVersion) { return isOlderMinorVersion(version, version()); } public boolean isOlderMinorVersion(String checkVersion, String targetVersion) { if (noVersion(targetVersion) || noVersion(checkVersion)) { return false; } int[] checkVersions = parseVersion(checkVersion); int[] targetVersions = parseVersion(targetVersion); if (checkVersions[MAJOR_INDEX] < targetVersions[MAJOR_INDEX]) { return true; } else if (checkVersions[MAJOR_INDEX] == targetVersions[MAJOR_INDEX] && checkVersions[MINOR_INDEX] < targetVersions[MINOR_INDEX]) { return true; } return false; } }