| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * 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 npanday.nuget; |
| |
| import com.google.common.base.Preconditions; |
| import com.google.common.base.Splitter; |
| import com.google.common.collect.Iterables; |
| |
| /** |
| * Port of Nugets VersionSpec as of version 1.7 |
| * |
| * @author <a href="mailto:me@lcorneliussen.de>Lars Corneliussen, Faktum Software</a> |
| */ |
| public class NugetVersionSpec |
| { |
| NugetSemanticVersion MinVersion, MaxVersion; |
| |
| boolean IsMinInclusive, IsMaxInclusive; |
| |
| @Override |
| public String toString() |
| { |
| if ( MinVersion != null && IsMinInclusive && MaxVersion == null && !IsMaxInclusive ) |
| { |
| return MinVersion.toString(); |
| } |
| |
| if ( MinVersion != null && MaxVersion != null && MinVersion == MaxVersion && IsMinInclusive && IsMaxInclusive ) |
| { |
| return "[" + MinVersion + "]"; |
| } |
| |
| StringBuilder versionBuilder = new StringBuilder(); |
| versionBuilder.append( IsMinInclusive ? '[' : '(' ); |
| versionBuilder.append( MinVersion + ", " + MaxVersion ); |
| versionBuilder.append( IsMaxInclusive ? ']' : ')' ); |
| |
| return versionBuilder.toString(); |
| } |
| |
| static Splitter VERSIONS_IN_RANGE = Splitter.on( "," ).omitEmptyStrings().trimResults(); |
| |
| public static NugetVersionSpec parse (String value){ |
| NugetVersionSpec spec = tryParse( value ); |
| Preconditions.checkArgument( spec != null, "Version spec '" + value + "' is invalid!"); |
| return spec; |
| } |
| |
| public static NugetVersionSpec tryParse( String value ) |
| { |
| Preconditions.checkNotNull( value ); |
| |
| value = value.trim(); |
| NugetVersionSpec versionSpec = new NugetVersionSpec(); |
| |
| // First, try to parse it as a plain version string |
| NugetSemanticVersion version = NugetSemanticVersion.tryParse( value ); |
| if ( version != null ) |
| { |
| // A plain version is treated as an inclusive minimum range |
| versionSpec.IsMinInclusive = true; |
| versionSpec.MinVersion = version; |
| return versionSpec; |
| } |
| |
| // Fail early if the string is too short to be valid |
| if ( value.length() < 3 ) |
| { |
| return null; |
| } |
| |
| // The first character must be [ ot ( |
| switch ( value.charAt( 0 ) ) |
| { |
| case '[': |
| versionSpec.IsMinInclusive = true; |
| break; |
| case '(': |
| versionSpec.IsMinInclusive = false; |
| break; |
| default: |
| return null; |
| } |
| |
| // The last character must be ] ot ) |
| switch ( value.charAt( value.length() - 1 ) ) |
| { |
| case ']': |
| versionSpec.IsMaxInclusive = true; |
| break; |
| case ')': |
| versionSpec.IsMaxInclusive = false; |
| break; |
| default: |
| return null; |
| } |
| |
| // Get rid of the two brackets |
| value = value.substring( 1, value.length() - 1 ); |
| |
| // Split by comma, and make sure we don't get more than two pieces |
| String[] parts = Iterables.toArray( VERSIONS_IN_RANGE.split( value ), String.class ); |
| if ( parts.length > 2 || parts.length == 0 ) |
| { |
| return null; |
| } |
| |
| // If there is only one piece, we use it for both min and max |
| String minVersionString = parts[0]; |
| String maxVersionString = ( parts.length == 2 ) ? parts[1] : parts[0]; |
| |
| NugetSemanticVersion minVersion = NugetSemanticVersion.tryParse( minVersionString ); |
| NugetSemanticVersion maxVersion = NugetSemanticVersion.tryParse( maxVersionString ); |
| |
| if ( minVersion == null || maxVersion == null ) |
| { |
| return null; |
| } |
| |
| versionSpec.MinVersion = minVersion; |
| versionSpec.MaxVersion = maxVersion; |
| |
| return versionSpec; |
| } |
| |
| public boolean isSatisfiedBy(NugetSemanticVersion version){ |
| boolean condition = true; |
| if (MinVersion != null) |
| { |
| if (IsMinInclusive) |
| { |
| condition = condition && version.compareTo( MinVersion ) >= 0; |
| } |
| else |
| { |
| condition = condition && version.compareTo( MinVersion) > 0; |
| } |
| } |
| |
| if (MaxVersion != null) |
| { |
| if (IsMaxInclusive) |
| { |
| condition = condition && version.compareTo( MaxVersion) <= 0; |
| } |
| else |
| { |
| condition = condition && version.compareTo( MaxVersion) < 0; |
| } |
| } |
| |
| return condition; |
| } |
| } |