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