Author: ogusakov
Date: Wed Jun 25 23:58:30 2008
New Revision: 671810

URL: http://svn.apache.org/viewvc?rev=671810&view=rev
Log:
OSGi-like version range implemented. To be used by the tree builder

Added:
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionException.java
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionQuery.java
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionRange.java
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/VersionRangeTest.java
Modified:
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
    maven/sandbox/trunk/mercury/src/test/resources/controlledRepo/c/c/1/c-1.pom

Modified: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java?rev=671810&r1=671809&r2=671810&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
 Wed Jun 25 23:58:30 2008
@@ -123,7 +123,22 @@
       count++;
 System.out.println("circ "+md+" vs "+p.md);
       if( md.sameGA(p.md) )
-        throw new MetadataTreeException("circular dependency "+count+" levels 
up for " + md + " as dependency of "+parent.md );
+      {
+        p = parent;
+        StringBuilder sb = new StringBuilder( 128 );
+        sb.append( md.toString() );
+        while( p!= null )
+        {
+          sb.append(" <- "+p.md.toString() );
+
+          if( md.sameGA(p.md) )
+          {
+            throw new MetadataTreeException("circular dependency "+count + " 
levels up. "
+                + sb.toString() + " <= "+(p.parent == null ? "no parent" : 
p.parent.md) );
+          }
+          p = p.parent;
+        }
+      }
       p = p.parent;
     }
   }

Added: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionException.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionException.java?rev=671810&view=auto
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionException.java
 (added)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionException.java
 Wed Jun 25 23:58:30 2008
@@ -0,0 +1,31 @@
+package org.apache.maven.mercury.metadata.version;
+
+/**
+ * 
+ * @author Oleg Gusakov
+ * @version $Id$
+ */
+public class VersionException
+    extends Exception
+{
+
+  public VersionException()
+  {
+  }
+
+  public VersionException(String message)
+  {
+    super(message);
+  }
+
+  public VersionException(Throwable cause)
+  {
+    super(cause);
+  }
+
+  public VersionException(String message, Throwable cause)
+  {
+    super(message, cause);
+  }
+
+}

Added: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionQuery.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionQuery.java?rev=671810&view=auto
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionQuery.java
 (added)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionQuery.java
 Wed Jun 25 23:58:30 2008
@@ -0,0 +1,45 @@
+package org.apache.maven.mercury.metadata.version;
+
+import java.util.StringTokenizer;
+
+/**
+ * Implementation will check particular version against a range
+ * 
+ * @author Oleg Gusakov
+ * @version $Id$
+ */
+public class VersionQuery
+{
+  String [] _ranges;
+  
+  public VersionQuery( String query )
+  {
+    
+  }
+  
+  private void parseRange( String query )
+  {
+    if( query == null || query.length() < 1 )
+      return;
+    
+    StringTokenizer st = new StringTokenizer( query, "," );
+    int nRanges = st.countTokens();
+    if( nRanges < 1 )
+      return;
+    
+    _ranges = new String [ nRanges ];
+    int count = 0;
+    
+    while( st.hasMoreTokens() )
+      _ranges[ count ++ ] = st.nextToken();
+    
+  }
+
+  /**
+   * 
+   */
+  public boolean within( String version )
+  {
+    return false;
+  }
+}

Added: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionRange.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionRange.java?rev=671810&view=auto
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionRange.java
 (added)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/version/VersionRange.java
 Wed Jun 25 23:58:30 2008
@@ -0,0 +1,139 @@
+package org.apache.maven.mercury.metadata.version;
+
+/**
+ * Single range implementation, similar to OSGi specification:
+ * 
+ * [1.2.3, 4.5.6) 1.2.3 <= x < 4.5.6
+ * [1.2.3, 4.5.6] 1.2.3 <= x <= 4.5.6
+ * (1.2.3, 4.5.6) 1.2.3 < x < 4.5.6
+ * (1.2.3, 4.5.6] 1.2.3 < x <= 4.5.6
+ * 1.2.3 1.2.3 <= x
+ * 
+ * @author Oleg Gusakov
+ * @version $Id$
+ */
+public class VersionRange
+{
+  private static final DefaultArtifactVersion ZERO_VERSION = new 
DefaultArtifactVersion("0.0.0");
+  
+  DefaultArtifactVersion _fromVersion = ZERO_VERSION;
+  boolean _fromInclusive = true;
+  
+  DefaultArtifactVersion _toVersion;
+  boolean _toInclusive = false;
+  
+  public VersionRange( String range )
+  throws VersionException
+  {
+    if( range == null || range.length() < 1 )
+      return;
+    
+    if( range.indexOf(',') > 0 )
+    {
+      if( range.startsWith("[") )
+        _fromInclusive = true;
+      else if( range.startsWith("(") )
+        _fromInclusive = false;
+      else
+        throw new VersionException("invalid range \""+range+"\"");
+
+      if( range.endsWith("]") )
+        _toInclusive = true;
+      else if( range.endsWith(")") )
+        _toInclusive = false;
+      else
+        throw new VersionException("invalid range \""+range+"\"");
+      
+      int ind = range.indexOf(',');
+
+      String sFrom = range.substring(1,ind);
+      if( sFrom != null && sFrom.length() > 0 )
+      {
+        String sFromT = sFrom.trim();
+        if( sFromT != null && sFromT.length() > 0 )
+        {
+          checkForValidCharacters( sFromT );
+          _fromVersion = new DefaultArtifactVersion( sFromT );
+        }
+      }
+
+      String sTo = range.substring( ind+1, range.length()-1 );
+      if( sTo != null && sTo.length() > 0 )
+      {
+        String sToT = sTo.trim();
+        if( sToT != null && sToT.length() > 0 )
+        {
+          checkForValidCharacters( sToT );
+          _toVersion = new DefaultArtifactVersion( sToT );
+        }
+      }
+      
+      if( _fromVersion == null && _fromInclusive )
+        throw new VersionException("invalid range \""+range+"\" - from ° 
cannot be inclusive");
+      
+      if( _toVersion == null && _toInclusive )
+        throw new VersionException("invalid range \""+range+"\" - to ° cannot 
be inclusive");
+      
+    }
+    else
+    {
+      checkForValidCharacters(range);
+      _fromVersion = new DefaultArtifactVersion( range );
+    }
+  }
+  
+  private void checkForValidCharacters( String v )
+  throws VersionException
+  {
+    if( v == null || v.length() < 1 )
+      throw new VersionException("empty version");
+    
+    int len = v.length();
+
+    for( int i=0; i<len; i++ )
+    {
+      char c = v.charAt(0);
+      
+      if( c >= '0' && c <= '9' )
+        continue;
+      
+      if( c >= 'A' && c <= 'Z' )
+        continue;
+      
+      if( c >= 'a' && c <= 'z' )
+        continue;
+      
+      if( c == '-' || c == '_' )
+        continue;
+      
+      throw new VersionException( "invalid character '"+c+"' in version 
\""+v+"\"" );
+    }
+  }
+  
+  public boolean isInRange( String version )
+  {
+    DefaultArtifactVersion ver = new DefaultArtifactVersion( version );
+    
+    int cmp1 = ver.compareTo( _fromVersion );
+    
+    if( cmp1 < 0 )
+      return false;
+    
+    if( cmp1 == 0 )
+      return _fromInclusive;
+    
+    if( _toVersion == null ) // eternity
+      return true;
+    
+    int cmp2 = ver.compareTo( _toVersion );
+    
+    if( cmp2 < 0 )
+      return true;
+    
+    if( cmp2 == 0 )
+      return _toInclusive;
+    
+    return false;
+  }
+
+}

Modified: 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java?rev=671810&r1=671809&r2=671810&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
 Wed Jun 25 23:58:30 2008
@@ -13,10 +13,11 @@
 {
   private static final Log log = LogFactoryImpl.getLog( MetadataTreeTest.class 
);
   
-//  ArtifactMetadata md = new ArtifactMetadata( "pmd:pmd:3.9" );
-//  File repo = new File("./target/test-classes/localRepo");
-  ArtifactMetadata md = new ArtifactMetadata( "a:a:1" );
-  File repo = new File("./target/test-classes/controlledRepo");
+  ArtifactMetadata md = new ArtifactMetadata( "pmd:pmd:3.9" );
+  File repo = new File("./target/test-classes/localRepo");
+//  ArtifactMetadata md = new ArtifactMetadata( "a:a:1" );
+//  File repo = new File("./target/test-classes/controlledRepo");
+  
   MetadataTree mt;
   MockMetadataSource mms = new MockMetadataSource();
 

Modified: 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java?rev=671810&r1=671809&r2=671810&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
 Wed Jun 25 23:58:30 2008
@@ -47,7 +47,10 @@
       if( pom.exists() )
       {
         ArtifactMetadata md = getMD(pom);
-        res.add(md);
+        
+        // TODO abstract into a range matcher
+        if( md.sameGAV(mdq) )
+          res.add(md);
       }
     }
 

Added: 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/VersionRangeTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/VersionRangeTest.java?rev=671810&view=auto
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/VersionRangeTest.java
 (added)
+++ 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/version/VersionRangeTest.java
 Wed Jun 25 23:58:30 2008
@@ -0,0 +1,35 @@
+package org.apache.maven.mercury.metadata.version;
+
+import junit.framework.TestCase;
+
+/**
+ * 
+ * @author Oleg Gusakov
+ * @version $Id$
+ */
+public class VersionRangeTest
+    extends TestCase
+{
+  private static final String rangeS = "[ 1.2.3 , 2.0.0 )"; 
+  VersionRange range;
+
+  protected void setUp() throws Exception
+  {
+    range = new VersionRange(rangeS);
+  }
+
+  protected void tearDown() throws Exception
+  {
+  }
+  
+  public void testSimple()
+  {
+    assert range.isInRange( "1.2.4" ) : "1.2.4 did not match the range 
"+rangeS; 
+    assert range.isInRange( "1.3.1" ) : "1.3.1 did not match the range 
"+rangeS; 
+    assert range.isInRange( "1.2.3" ) : "1.2.3 did not match the range 
"+rangeS; 
+    assert ! range.isInRange( "1.2.2" ) : "1.2.2 did matches the range 
"+rangeS; 
+    assert ! range.isInRange( "2.0.0" ) : "2.0.0 did matches the range 
"+rangeS; 
+    assert ! range.isInRange( "3.1.0" ) : "3.1.0 did matches the range 
"+rangeS; 
+  }
+
+}

Modified: 
maven/sandbox/trunk/mercury/src/test/resources/controlledRepo/c/c/1/c-1.pom
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/resources/controlledRepo/c/c/1/c-1.pom?rev=671810&r1=671809&r2=671810&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/src/test/resources/controlledRepo/c/c/1/c-1.pom 
(original)
+++ maven/sandbox/trunk/mercury/src/test/resources/controlledRepo/c/c/1/c-1.pom 
Wed Jun 25 23:58:30 2008
@@ -3,4 +3,19 @@
   <groupId>c</groupId>
   <artifactId>c</artifactId>
   <version>1</version>
+
+
+  <dependencies>
+    <dependency>
+      <groupId>b</groupId>
+      <artifactId>b</artifactId>
+      <version>1</version>
+    </dependency>
+    <dependency>
+      <groupId>a</groupId>
+      <artifactId>a</artifactId>
+      <version>1</version>
+    </dependency>
+  </dependencies>
+
 </project>
\ No newline at end of file


Reply via email to