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 javax.inject.Named;
22  import javax.inject.Singleton;
23  
24  import java.util.Objects;
25  import java.util.regex.Pattern;
26  
27  import org.apache.maven.api.Version;
28  import org.apache.maven.api.VersionRange;
29  import org.apache.maven.api.services.VersionParser;
30  import org.apache.maven.api.services.VersionParserException;
31  import org.apache.maven.artifact.versioning.ArtifactVersion;
32  import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
33  import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
34  
35  import static org.apache.maven.artifact.versioning.VersionRange.createFromVersionSpec;
36  import static org.apache.maven.internal.impl.Utils.nonNull;
37  
38  @Named
39  @Singleton
40  public class DefaultVersionParser implements VersionParser {
41      private static final String SNAPSHOT = "SNAPSHOT";
42      private static final Pattern SNAPSHOT_TIMESTAMP = Pattern.compile("^(.*-)?([0-9]{8}\\.[0-9]{6}-[0-9]+)$");
43  
44      @Override
45      public Version parseVersion(String version) {
46          return new DefaultVersion(new DefaultArtifactVersion(nonNull(version, "version")));
47      }
48  
49      @Override
50      public VersionRange parseVersionRange(String range) {
51          try {
52              return new DefaultVersionRange(createFromVersionSpec(nonNull(range, "version")));
53          } catch (InvalidVersionSpecificationException e) {
54              throw new VersionParserException("Unable to parse version range: " + range, e);
55          }
56      }
57  
58      @Override
59      public boolean isSnapshot(String version) {
60          return checkSnapshot(version);
61      }
62  
63      static boolean checkSnapshot(String version) {
64          return version.endsWith(SNAPSHOT) || SNAPSHOT_TIMESTAMP.matcher(version).matches();
65      }
66  
67      static class DefaultVersion implements Version {
68          private final ArtifactVersion delegate;
69  
70          DefaultVersion(ArtifactVersion delegate) {
71              this.delegate = delegate;
72          }
73  
74          @Override
75          public int compareTo(Version o) {
76              if (o instanceof DefaultVersion) {
77                  return delegate.compareTo(((DefaultVersion) o).delegate);
78              } else {
79                  return delegate.compareTo(new DefaultArtifactVersion(o.toString()));
80              }
81          }
82  
83          @Override
84          public boolean equals(Object o) {
85              if (this == o) {
86                  return true;
87              }
88              if (o == null || getClass() != o.getClass()) {
89                  return false;
90              }
91              DefaultVersion that = (DefaultVersion) o;
92              return delegate.equals(that.delegate);
93          }
94  
95          @Override
96          public int hashCode() {
97              return Objects.hash(delegate);
98          }
99  
100         @Override
101         public String asString() {
102             return delegate.toString();
103         }
104 
105         @Override
106         public String toString() {
107             return asString();
108         }
109     }
110 
111     static class DefaultVersionRange implements VersionRange {
112         private final org.apache.maven.artifact.versioning.VersionRange delegate;
113 
114         DefaultVersionRange(org.apache.maven.artifact.versioning.VersionRange delegate) {
115             this.delegate = delegate;
116         }
117 
118         @Override
119         public boolean contains(Version version) {
120             if (version instanceof DefaultVersion) {
121                 return delegate.containsVersion(((DefaultVersion) version).delegate);
122             } else {
123                 return delegate.containsVersion(new DefaultArtifactVersion(version.toString()));
124             }
125         }
126 
127         @Override
128         public String asString() {
129             return delegate.toString();
130         }
131 
132         @Override
133         public String toString() {
134             return asString();
135         }
136     }
137 }