1   package org.apache.maven.plugin.invoker;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import org.apache.maven.project.MavenProject;
23  import org.codehaus.plexus.util.Os;
24  import org.codehaus.plexus.util.StringUtils;
25  
26  import java.util.ArrayList;
27  import java.util.Collection;
28  import java.util.Iterator;
29  import java.util.List;
30  import java.util.Properties;
31  
32  
33  
34  
35  
36  
37  class SelectorUtils
38  {
39  
40      static void parseList( String list, Collection includes, Collection excludes )
41      {
42          String[] tokens = ( list != null ) ? StringUtils.split( list, "," ) : new String[0];
43  
44          for ( int i = 0; i < tokens.length; i++ )
45          {
46              String token = tokens[i].trim();
47  
48              if ( token.startsWith( "!" ) )
49              {
50                  excludes.add( token.substring( 1 ) );
51              }
52              else
53              {
54                  includes.add( token );
55              }
56          }
57      }
58  
59      static boolean isOsFamily( String osSpec )
60      {
61          List includes = new ArrayList();
62          List excludes = new ArrayList();
63          parseList( osSpec, includes, excludes );
64  
65          return isOsFamily( includes, true ) && !isOsFamily( excludes, false );
66      }
67  
68      static boolean isOsFamily( List families, boolean defaultMatch )
69      {
70          if ( families != null && !families.isEmpty() )
71          {
72              for ( Iterator it = families.iterator(); it.hasNext(); )
73              {
74                  String family = (String) it.next();
75  
76                  if ( Os.isFamily( family ) )
77                  {
78                      return true;
79                  }
80              }
81  
82              return false;
83          }
84          else
85          {
86              return defaultMatch;
87          }
88      }
89  
90      
91  
92  
93  
94      static String getMavenVersion()
95      {
96          try
97          {
98              
99              
100             
101             
102             Properties properties = new Properties();
103             properties.load( MavenProject.class.getClassLoader().getResourceAsStream(
104                 "META-INF/maven/org.apache.maven/maven-core/pom.properties" ) );
105             return StringUtils.trim( properties.getProperty( "version" ) );
106         }
107         catch ( Exception e )
108         {
109             return null;
110         }
111     }
112 
113     static boolean isMavenVersion( String mavenSpec )
114     {
115         List includes = new ArrayList();
116         List excludes = new ArrayList();
117         parseList( mavenSpec, includes, excludes );
118 
119         List mavenVersionList = parseVersion( getMavenVersion() );
120 
121         return isJreVersion( mavenVersionList, includes, true ) && !isJreVersion( mavenVersionList, excludes, false );
122     }
123 
124     static boolean isJreVersion( String jreSpec )
125     {
126         List includes = new ArrayList();
127         List excludes = new ArrayList();
128         parseList( jreSpec, includes, excludes );
129 
130         List jreVersion = parseVersion( System.getProperty( "java.version", "" ) );
131 
132         return isJreVersion( jreVersion, includes, true ) && !isJreVersion( jreVersion, excludes, false );
133     }
134 
135     static boolean isJreVersion( List jreVersion, List versionPatterns, boolean defaultMatch )
136     {
137         if ( versionPatterns != null && !versionPatterns.isEmpty() )
138         {
139             for ( Iterator it = versionPatterns.iterator(); it.hasNext(); )
140             {
141                 String versionPattern = (String) it.next();
142 
143                 if ( isJreVersion( jreVersion, versionPattern ) )
144                 {
145                     return true;
146                 }
147             }
148 
149             return false;
150         }
151         else
152         {
153             return defaultMatch;
154         }
155     }
156 
157     static boolean isJreVersion( List jreVersion, String versionPattern )
158     {
159         List checkVersion = parseVersion( versionPattern );
160 
161         if ( versionPattern.endsWith( "+" ) )
162         {
163             
164             return compareVersions( jreVersion, checkVersion ) >= 0;
165         }
166         else if ( versionPattern.endsWith( "-" ) )
167         {
168             
169             return compareVersions( jreVersion, checkVersion ) < 0;
170         }
171         else
172         {
173             
174             return checkVersion.size() <= jreVersion.size() && checkVersion.equals(
175                 jreVersion.subList( 0, checkVersion.size() ) );
176         }
177     }
178 
179     static List parseVersion( String version )
180     {
181         version = version.replaceAll( "[^0-9]", "." );
182 
183         String[] tokens = StringUtils.split( version, "." );
184 
185         List numbers = new ArrayList();
186 
187         for ( int i = 0; i < tokens.length; i++ )
188         {
189             numbers.add( Integer.valueOf( tokens[i] ) );
190         }
191 
192         return numbers;
193     }
194 
195     static int compareVersions( List version1, List version2 )
196     {
197         for ( Iterator it1 = version1.iterator(), it2 = version2.iterator(); ; )
198         {
199             if ( !it1.hasNext() )
200             {
201                 return it2.hasNext() ? -1 : 0;
202             }
203             if ( !it2.hasNext() )
204             {
205                 return it1.hasNext() ? 1 : 0;
206             }
207 
208             Integer num1 = (Integer) it1.next();
209             Integer num2 = (Integer) it2.next();
210 
211             int rel = num1.compareTo( num2 );
212             if ( rel != 0 )
213             {
214                 return rel;
215             }
216         }
217     }
218 
219 }