001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.common.versioning; 014 015import java.util.List; 016import java.util.logging.Level; 017 018import com.google.common.base.Splitter; 019import com.google.common.base.Strings; 020import com.google.common.collect.Lists; 021 022import cpw.mods.fml.common.FMLLog; 023import cpw.mods.fml.common.LoaderException; 024 025/** 026 * Parses version strings according to the specification here: 027 * http://docs.codehaus.org/display/MAVEN/Versioning 028 * and allows for comparison of versions based on that document. 029 * Bounded version specifications are defined as 030 * http://maven.apache.org/plugins/maven-enforcer-plugin/rules/versionRanges.html 031 * 032 * Borrows heavily from maven version range management code 033 * 034 * @author cpw 035 * 036 */ 037public class VersionParser 038{ 039 private static final Splitter SEPARATOR = Splitter.on('@').omitEmptyStrings().trimResults(); 040 public static ArtifactVersion parseVersionReference(String labelledRef) 041 { 042 if (Strings.isNullOrEmpty(labelledRef)) 043 { 044 throw new RuntimeException(String.format("Empty reference %s", labelledRef)); 045 } 046 List<String> parts = Lists.newArrayList(SEPARATOR.split(labelledRef)); 047 if (parts.size()>2) 048 { 049 throw new RuntimeException(String.format("Invalid versioned reference %s", labelledRef)); 050 } 051 if (parts.size()==1) 052 { 053 return new DefaultArtifactVersion(parts.get(0), true); 054 } 055 return new DefaultArtifactVersion(parts.get(0),parseRange(parts.get(1))); 056 } 057 058 public static boolean satisfies(ArtifactVersion target, ArtifactVersion source) 059 { 060 return target.containsVersion(source); 061 } 062 063 public static VersionRange parseRange(String range) 064 { 065 try 066 { 067 return VersionRange.createFromVersionSpec(range); 068 } 069 catch (InvalidVersionSpecificationException e) 070 { 071 FMLLog.log(Level.SEVERE, e, "Unable to parse a version range specification successfully %s", range); 072 throw new LoaderException(e); 073 } 074 } 075}