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