kriegaex commented on code in PR #125: URL: https://github.com/apache/xalan-java/pull/125#discussion_r1399927827
########## xalan/src/main/java/org/apache/xalan/Version.java: ########## @@ -20,36 +20,99 @@ */ package org.apache.xalan; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Administrative class to keep track of the version number of * the Xalan release. * <P>This class implements the upcoming standard of having - * org.apache.project-name.Version.getVersion() be a standard way - * to get version information. This class will replace the older + * org.apache.project-name.Version.getVersion() be a standard way + * to get version information. This class will replace the older * org.apache.xalan.processor.Version class.</P> - * <P>See also: org/apache/xalan/res/XSLTInfo.properties for + * <P>See also: org/apache/xalan/res/XSLTInfo.properties for * information about the version of the XSLT spec we support.</P> * @xsl.usage general */ public class Version { + private static final String POM_PROPERTIES_JAR = "org/apache/xalan/version.properties"; + private static final String POM_PROPERTIES_FILE_SYSTEM = "xalan/target/classes/" + POM_PROPERTIES_JAR; + private static final String VERSION_NUMBER_PATTERN = "^(\\d+)[.](\\d+)[.](D)?(\\d+)(-SNAPSHOT)?$"; + private static final String NO_VERSION = "0.0.0"; + + private static String version = NO_VERSION; + private static int majorVersionNum; + private static int releaseVersionNum; + private static int maintenanceVersionNum; + private static int developmentVersionNum; + + private static boolean snapshot; + + static { + readProperties(); + parseVersionNumber(); + } + + private static void readProperties() { + Properties pomProperties = new Properties(); + try (InputStream fromJar = Version.class.getClassLoader().getResourceAsStream(POM_PROPERTIES_JAR)) { + if (fromJar != null) { + pomProperties.load(fromJar); + version = pomProperties.getProperty("version", NO_VERSION); + } + else { + try (FileInputStream fromFileSystem = new FileInputStream(POM_PROPERTIES_FILE_SYSTEM)) { + pomProperties.load(fromFileSystem); + version = pomProperties.getProperty("version", NO_VERSION); + } + } + } + catch (IOException e) { + new RuntimeException("Cannot read properties file to extract version number information: ", e) + .printStackTrace(); + } + } + + private static void parseVersionNumber() { + Matcher matcher = Pattern.compile(VERSION_NUMBER_PATTERN).matcher(version); + if (matcher.find()) { + majorVersionNum = Integer.parseInt(matcher.group(1)); + releaseVersionNum = Integer.parseInt(matcher.group(2)); + if (matcher.group(3) == null) { + maintenanceVersionNum = Integer.parseInt(matcher.group(4)); + } + else { + developmentVersionNum = Integer.parseInt(matcher.group(4)); + } + snapshot = matcher.group(5) != null && !matcher.group(5).isEmpty(); + } + else { + System.err.println( + "Cannot match version \"" + version + "\" " + + "against expected pattern \"" + VERSION_NUMBER_PATTERN + "\"" + ); + } + } /** * Get the basic version string for the current Xalan release. - * Version String formatted like + * Version String formatted like * <CODE>"<B>Xalan</B> <B>Java</B> v.r[.dd| <B>D</B>nn]"</CODE>. * - * Futurework: have this read version info from jar manifest, - * pom.properties, and/or a file updated during maven build. - * * @return String denoting our current version */ public static String getVersion() { return getProduct()+" "+getImplementationLanguage()+" " +getMajorVersionNum()+"."+getReleaseVersionNum()+"." - +( (getDevelopmentVersionNum() > 0) ? - ("D"+getDevelopmentVersionNum()) : (""+getMaintenanceVersionNum())); + +( (getDevelopmentVersionNum() > 0) ? + ("D"+getDevelopmentVersionNum()) : (""+getMaintenanceVersionNum())) + +(isSnapshot() ? "-SNAPSHOT" :""); Review Comment: Did you read the PR description? Search for the paragraph starting with "The version classes could be quite small". Besides, for backward compatibility something like "D04" would be parsed to integer 4 and then returned as "D4" the next time. so far, so strange. But I want to be backwards compatible. Another developer already voiced concerns about backward compatibility of public API before. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@xalan.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@xalan.apache.org For additional commands, e-mail: dev-h...@xalan.apache.org