View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.internal.impl;
20  
21  import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
22  import static org.apache.maven.internal.impl.Utils.nonNull;
23  
24  import java.util.Objects;
25  import java.util.regex.Pattern;
26  import javax.inject.Named;
27  import javax.inject.Singleton;
28  import org.apache.maven.api.Version;
29  import org.apache.maven.api.VersionRange;
30  import org.apache.maven.api.services.VersionParser;
31  import org.apache.maven.api.services.VersionParserException;
32  import org.apache.maven.artifact.versioning.ArtifactVersion;
33  import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
34  import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
35  
36  @Named
37  @Singleton
38  public class DefaultVersionParser implements VersionParser {
39      private static final String SNAPSHOT = "SNAPSHOT";
40      private static final Pattern SNAPSHOT_TIMESTAMP = Pattern.compile("^(.*-)?([0-9]{8}\\.[0-9]{6}-[0-9]+)$");
41  
42      @Override
43      public Version parseVersion(String version) {
44          return new DefaultVersion(new DefaultArtifactVersion(nonNull(version, "version")));
45      }
46  
47      @Override
48      public VersionRange parseVersionRange(String range) {
49          try {
50              return new DefaultVersionRange(createFromVersionSpec(nonNull(range, "version")));
51          } catch (InvalidVersionSpecificationException e) {
52              throw new VersionParserException("Unable to parse version range: " + range, e);
53          }
54      }
55  
56      @Override
57      public boolean isSnapshot(String version) {
58          return checkSnapshot(version);
59      }
60  
61      static boolean checkSnapshot(String version) {
62          return version.endsWith(SNAPSHOT) || SNAPSHOT_TIMESTAMP.matcher(version).matches();
63      }
64  
65      static class DefaultVersion implements Version {
66          private final ArtifactVersion delegate;
67  
68          DefaultVersion(ArtifactVersion delegate) {
69              this.delegate = delegate;
70          }
71  
72          @Override
73          public int compareTo(Version o) {
74              if (o instanceof DefaultVersion) {
75                  return delegate.compareTo(((DefaultVersion) o).delegate);
76              } else {
77                  return delegate.compareTo(new DefaultArtifactVersion(o.toString()));
78              }
79          }
80  
81          @Override
82          public boolean equals(Object o) {
83              if (this == o) {
84                  return true;
85              }
86              if (o == null || getClass() != o.getClass()) {
87                  return false;
88              }
89              DefaultVersion that = (DefaultVersion) o;
90              return delegate.equals(that.delegate);
91          }
92  
93          @Override
94          public int hashCode() {
95              return Objects.hash(delegate);
96          }
97  
98          @Override
99          public String asString() {
100             return delegate.toString();
101         }
102 
103         @Override
104         public String toString() {
105             return asString();
106         }
107     }
108 
109     static class DefaultVersionRange implements VersionRange {
110         private final org.apache.maven.artifact.versioning.VersionRange delegate;
111 
112         DefaultVersionRange(org.apache.maven.artifact.versioning.VersionRange delegate) {
113             this.delegate = delegate;
114         }
115 
116         @Override
117         public boolean contains(Version version) {
118             if (version instanceof DefaultVersion) {
119                 return delegate.containsVersion(((DefaultVersion) version).delegate);
120             } else {
121                 return delegate.containsVersion(new DefaultArtifactVersion(version.toString()));
122             }
123         }
124 
125         @Override
126         public String asString() {
127             return delegate.toString();
128         }
129 
130         @Override
131         public String toString() {
132             return asString();
133         }
134     }
135 }