diff --git a/src/main/java/org/owasp/dependencycheck/utils/DependencyVersion.java b/src/main/java/org/owasp/dependencycheck/utils/DependencyVersion.java new file mode 100644 index 000000000..e8647339e --- /dev/null +++ b/src/main/java/org/owasp/dependencycheck/utils/DependencyVersion.java @@ -0,0 +1,115 @@ +/* + * This file is part of DependencyCheck. + * + * DependencyCheck is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * DependencyCheck is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * DependencyCheck. If not, see http://www.gnu.org/licenses/. + * + * Copyright (c) 2013 Jeremy Long. All Rights Reserved. + */ +package org.owasp.dependencycheck.utils; + +import java.util.ArrayList; +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.lang.StringUtils; + +/** + *

Simple object to track the parts of a version number. The parts are + * contained in a List such that version 1.2.3 will be stored as: + * versionParts[0] = 1; + * versionParts[1] = 2; + * versionParts[2] = 3; + *

+ *

Note, the parser contained in this class expects the version numbers to be + * seperated by periods. If a different seperator is used the parser will likely + * fail.

+ * @author Jeremy Long (jeremy.long@gmail.com) + */ +public class DependencyVersion implements Iterable { + + /** + * Constructor for a empty DependencyVersion. + */ + public DependencyVersion() { + versionParts = new ArrayList(); + } + + /** + * Constructor for a DependencyVersion that will parse a version string. + * @param version the version number to parse + */ + public DependencyVersion(String version) { + parseVersion(version); + } + + /** + * Parses a version string into its sub parts: major, minor, revision, build, etc. + * @param version the version string to parse + */ + public final void parseVersion(String version) { + versionParts = new ArrayList(); + if (version != null) { + final Pattern rx = Pattern.compile("(\\d+|[a-z]+\\d+)"); + Matcher matcher = rx.matcher(version.toLowerCase()); + while (matcher.find()) { + versionParts.add(matcher.group()); + } + if (versionParts.isEmpty()) { + versionParts.add(version); + } + } + } + /** + * A list of the version parts. + */ + private List versionParts; + + /** + * Get the value of versionParts + * + * @return the value of versionParts + */ + public List getVersionParts() { + return versionParts; + } + + /** + * Set the value of versionParts + * + * @param versionParts new value of versionParts + */ + public void setVersionParts(List versionParts) { + this.versionParts = versionParts; + } + + /** + * Retrieves an iterator for the version parts. + * + * @return an iterator for the version parts + */ + public Iterator iterator() { + return versionParts.iterator(); + } + + /** + * Reconstructs the version string from the split version parts. + * @return a string reprenting the version. + */ + @Override + public String toString() { + return StringUtils.join(versionParts.toArray(), "."); + } +} diff --git a/src/main/java/org/owasp/dependencycheck/utils/DependencyVersionUtil.java b/src/main/java/org/owasp/dependencycheck/utils/DependencyVersionUtil.java new file mode 100644 index 000000000..3bb7999e4 --- /dev/null +++ b/src/main/java/org/owasp/dependencycheck/utils/DependencyVersionUtil.java @@ -0,0 +1,68 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package org.owasp.dependencycheck.utils; + +import java.util.regex.MatchResult; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * + * @author Jeremy Long (jeremy.long@gmail.com) + */ +public final class DependencyVersionUtil { + //private final static Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d+)*(\\d+[a-zA-Z]{1,3}\\d+)?"); + private final static Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d+)+(\\.?[a-zA-Z_-]{1,3}\\d+)?"); + + /** + * Private constructor for utility class. + */ + private DependencyVersionUtil() { + } + + public static DependencyVersion parseVersionFromFileName(String filename) { + if (filename == null) { + return null; + } + String version = null; + Matcher matcher = RX_VERSION.matcher(filename); + if (matcher.find()) { + version = matcher.group(); + } + //throw away the results if there are two things that look like version numbers + if (matcher.find()) { + return null; + } + if (version == null) { + return null; + } + return new DependencyVersion(version); + + +// String name = null; +// final int pos = filename.lastIndexOf('.'); +// if (pos>0) { +// name = filename.substring(0, pos).toLowerCase(); +// } else { +// name = filename.toLowerCase(); +// } +//// if (name.endsWith("-snapshot")) { +//// name = name.substring(0,name.length() - 9); +//// } +//// if (name.endsWith("-release")) { +//// name = name.substring(0,name.length() - 8); +//// } +// final String[] parts = name.split("[_-]"); +// if (parts == null || parts.length == 0) { +// return null; +// } +// for (int x = parts.length - 1; x >= 0; x--) { +// if (RX_VERSION.matcher(parts[x]).matches()) { +// return new DependencyVersion(parts[x]); +// } +// } +// return null; + } +}