Author: ogusakov Date: Mon Oct 6 17:56:38 2008 New Revision: 702318 URL: http://svn.apache.org/viewvc?rev=702318&view=rev Log: Repository metadata data transfer object and repository policy added
Added: maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionComparator.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java Modified: maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/Messages.properties maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/pom.xml maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java Modified: maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/Messages.properties URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/Messages.properties?rev=702318&r1=702317&r2=702318&view=diff ============================================================================== --- maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/Messages.properties (original) +++ maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/Messages.properties Mon Oct 6 17:56:38 2008 @@ -1 +1,2 @@ -bad.version.sn=version range cannot include SNAPSHOT, LATEST or RELEASE versions, found: {0} \ No newline at end of file +bad.version.sn=version range cannot include SNAPSHOT, LATEST or RELEASE versions, found: {0} +null.version.to.compare=one of the versions is null: {0} vs {1}, cannot compare \ No newline at end of file Added: maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionComparator.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionComparator.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionComparator.java (added) +++ maven/sandbox/trunk/mercury/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionComparator.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,31 @@ +package org.apache.maven.mercury.artifact.version; + +import java.util.Comparator; + +import org.codehaus.plexus.lang.DefaultLanguage; +import org.codehaus.plexus.lang.Language; + +/** + * version comparator used elsewhere to keep version collections sorted + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class VersionComparator + implements Comparator<String> +{ + private static final Language _lang = new DefaultLanguage( VersionComparator.class ); + + public int compare( String v1, String v2 ) + { + if( v1 == null || v2 == null ) + throw new IllegalArgumentException( _lang.getMessage( "null.version.to.compare", v1,v2 ) ); + + DefaultArtifactVersion av1 = new DefaultArtifactVersion( v1 ); + DefaultArtifactVersion av2 = new DefaultArtifactVersion( v2 ); + + return av1.compareTo( av2 ); + } + +} Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/pom.xml URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/pom.xml?rev=702318&r1=702317&r2=702318&view=diff ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/pom.xml (original) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/pom.xml Mon Oct 6 17:56:38 2008 @@ -4,26 +4,33 @@ <artifactId>mercury-repo-api</artifactId> <name>Mercury Repository APIs: ${project.version}</name> <description>Repository APIs</description> + <parent> <groupId>org.apache.maven.mercury</groupId> <artifactId>mercury-repo</artifactId> <version>1.0.0-alpha-2-SNAPSHOT</version> </parent> + <dependencies> <dependency> <groupId>org.apache.maven.mercury</groupId> <artifactId>mercury-artifact</artifactId> - <version>1.0.0-alpha-2-SNAPSHOT</version> + <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.maven.mercury</groupId> <artifactId>mercury-transport-api</artifactId> - <version>1.0.0-alpha-2-SNAPSHOT</version> - </dependency> - <dependency> - <groupId>org.apache.maven.mercury</groupId> - <artifactId>mercury-external</artifactId> - <version>1.0.0-alpha-2-SNAPSHOT</version> + <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.apache.maven.mercury</groupId> + <artifactId>mercury-external</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.mercury</groupId> + <artifactId>mercury-md-shared</artifactId> + <version>${project.version}</version> + </dependency> </dependencies> </project> \ No newline at end of file Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties?rev=702318&r1=702317&r2=702318&view=diff ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties (original) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties Mon Oct 6 17:56:38 2008 @@ -6,3 +6,7 @@ null.reader.processor=reader processor cannot be null null.writer.repo=writer repository cannot be null null.writer.processor=writer processor cannot be null + +empty.policy=repository update policy cannot be empty: {0} +bad.policy=cannot parse repository update policy: {0} +bad.interval.policy=cannot parse interval repository update policy: {0} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,65 @@ +package org.apache.maven.mercury.repository.api; + +import java.util.Collection; +import java.util.TreeSet; + +import org.apache.maven.mercury.artifact.ArtifactCoordinates; +import org.apache.maven.mercury.artifact.version.VersionComparator; +import org.apache.maven.mercury.util.TimeUtil; +import org.apache.maven.mercury.util.Util; + +/** + * This is a data object to carry GA level repository + * metadata, namely - a list of versions and last check timestamp + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class RepositoryGAMetadata +{ + ArtifactCoordinates ga; + + /** a list of last discovered versions, ordered ascending */ + protected TreeSet<String> versions; + + /** GMT timestamp of the last metadata check */ + protected long lastCheck; + + /** + * @param versions + * @param lastCheck + */ + public RepositoryGAMetadata( ArtifactCoordinates ga, Collection<String> versions ) + { + this.ga = ga; + this.versions = new TreeSet<String>( new VersionComparator() ); + + if( ! Util.isEmpty( versions ) ) + this.versions.addAll( versions ); + + this.lastCheck = TimeUtil.getUTCTimestampAsLong(); + } + + public TreeSet<String> getVersions() + { + return versions; + } + + public long getLastCheck() + { + return lastCheck; + } + + public void update( Collection<String> versions ) + { + this.versions.addAll( versions ); + this.lastCheck = TimeUtil.getUTCTimestampAsLong(); + } + + public ArtifactCoordinates getGA() + { + return ga; + } + +} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,96 @@ +package org.apache.maven.mercury.repository.api; + +import java.util.Collection; +import java.util.TreeSet; + +import org.apache.maven.mercury.artifact.ArtifactCoordinates; +import org.apache.maven.mercury.artifact.version.VersionComparator; +import org.apache.maven.mercury.util.TimeUtil; +import org.apache.maven.mercury.util.Util; + +/** + * This is a data object to carry GA level repository + * metadata, namely - a list of versions and last check timestamp + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class RepositoryGAVMetadata +{ + ArtifactCoordinates gav; + + /** a list of last discovered snapshots, ordered descending */ + protected TreeSet<String> snapshots; + + /** a list of last discovered versions, ordered ascending */ + protected Collection<String> classifiers; + + /** GMT timestamp of the last metadata check */ + protected long lastCheck; + + /** + * @param versions + * @param lastCheck + */ + public RepositoryGAVMetadata( ArtifactCoordinates gav, Collection<String> snapshots, Collection<String> classifiers ) + { + this.gav = gav; + + this.snapshots = new TreeSet<String>( new VersionComparator() ); + + if( !Util.isEmpty( snapshots ) ) + this.snapshots.addAll( snapshots ); + + this.classifiers = classifiers; + this.lastCheck = TimeUtil.getUTCTimestampAsLong(); + } + + public TreeSet<String> getSnapshots() + { + return snapshots; + } + + public Collection<String> getClassifiers() + { + return classifiers; + } + + /** + * find the most recent snapshot timestamp + * + * @return + */ + public String getSnapshot() + { + return snapshots.last(); + } + + public long getLastCheck() + { + return lastCheck; + } + + public void updateSnapshots( Collection<String> snapshots ) + { + this.snapshots.clear(); + + if( !Util.isEmpty( snapshots ) ) + this.snapshots.addAll( snapshots ); + + this.lastCheck = TimeUtil.getUTCTimestampAsLong(); + } + + public void updateClassifiers( Collection<String> classifiers ) + { + this.classifiers = classifiers; + this.lastCheck = TimeUtil.getUTCTimestampAsLong(); + } + + + public ArtifactCoordinates getGAV() + { + return gav; + } + +} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,34 @@ +package org.apache.maven.mercury.repository.api; + +import java.util.Collection; + +import org.apache.maven.mercury.artifact.ArtifactBasicMetadata; +import org.apache.maven.mercury.repository.metadata.Metadata; + +/** + * this object abstracts the existence of multiple repositories and repository + * policies. Given a metadata request, implementor of this interface will + * either return a local copy if one exists, or will go out and read from a remote repo + * if either local copy does not exist or remote repository policy allows a read + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public interface RepositoryMetadataCache +{ + /** + * initialize cache implementor with a collection of remote repositories. Order + * does not matter here because access is defined by repository policy. + * + * @param repos + */ + public void init( Collection<RemoteRepository> repos ); + + /** + * + * @param bmd + * @return + */ + public Metadata findGA( ArtifactBasicMetadata bmd ); +} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,77 @@ +package org.apache.maven.mercury.repository.api; + +import org.apache.maven.mercury.artifact.version.VersionComparator; +import org.apache.maven.mercury.util.Util; +import org.codehaus.plexus.lang.DefaultLanguage; +import org.codehaus.plexus.lang.Language; + +/** + * implements current maven update policy + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class RepositoryUpdateIntervalPolicy +implements RepositoryUpdatePolicy +{ + private static final Language _lang = new DefaultLanguage( RepositoryUpdateIntervalPolicy.class ); + + public static final String UPDATE_POLICY_NEVER = "never"; + + public static final String UPDATE_POLICY_ALWAYS = "always"; + + public static final String UPDATE_POLICY_DAILY = "daily"; + + public static final String UPDATE_POLICY_INTERVAL = "interval"; + private static final int UPDATE_POLICY_INTERVAL_LENGTH = UPDATE_POLICY_INTERVAL.length(); + + private static final long NEVER = -1L; + + private static final long DAYLY = 3600000L*24L; + + protected long interval = DAYLY; + + + public RepositoryUpdateIntervalPolicy() + { + } + + public RepositoryUpdateIntervalPolicy( String policy ) + { + init( policy ); + } + + public void init( String policy ) + { + if( Util.isEmpty( policy ) ) + throw new IllegalArgumentException( _lang.getMessage( "empty.policy", policy )); + + if( policy.startsWith( UPDATE_POLICY_ALWAYS ) ) + interval = 0L; + else if( policy.startsWith( UPDATE_POLICY_DAILY ) ) + interval = DAYLY; + else if( policy.startsWith( UPDATE_POLICY_NEVER ) ) + interval = NEVER; + else if( policy.startsWith( UPDATE_POLICY_INTERVAL ) ) + { + int len = policy.length(); + if( len <= UPDATE_POLICY_INTERVAL_LENGTH ) + throw new IllegalArgumentException( _lang.getMessage( "bad.interval.policy", policy )); + + interval = Integer.parseInt( policy.substring( len-1 ) ) * 60000L; + } + else + throw new IllegalArgumentException( _lang.getMessage( "bad.policy", policy )); + } + + public boolean timeToUpdate( long lastUpdate ) + { + long now =System.currentTimeMillis(); + + boolean res = now - lastUpdate > interval; + + return res; + } + +} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,26 @@ +package org.apache.maven.mercury.repository.api; + +/** + * abstraction of a repository update policy calculator + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public interface RepositoryUpdatePolicy +{ + /** + * initialize this calculator + * + * @param policy as a string somewhere in configuration + */ + void init( String policy ); + + /** + * perform the calculation and decide if it's time to update + * + * @param lastUpdate + * @return + */ + boolean timeToUpdate( long lastUpdate ); +} Added: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java?rev=702318&view=auto ============================================================================== --- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java (added) +++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java Mon Oct 6 17:56:38 2008 @@ -0,0 +1,40 @@ +package org.apache.maven.mercury.repository.api; + +import junit.framework.TestCase; + +/** + * + * + * @author Oleg Gusakov + * @version $Id$ + * + */ +public class RepositoryUpdatePolicyIntervalTest + extends TestCase +{ + RepositoryUpdateIntervalPolicy in; + long now; + + @Override + protected void setUp() + throws Exception + { + in = new RepositoryUpdateIntervalPolicy( RepositoryUpdateIntervalPolicy.UPDATE_POLICY_INTERVAL+"1" ); + now = System.currentTimeMillis(); + } + + public void testInterval() + { + assertFalse( in.timeToUpdate( now ) ); + assertTrue( in.timeToUpdate( now-80000L ) ); + } + + public void testDayly() + { + in = new RepositoryUpdateIntervalPolicy( RepositoryUpdateIntervalPolicy.UPDATE_POLICY_DAILY ); + + assertFalse( in.timeToUpdate( now ) ); + assertFalse( in.timeToUpdate( now-80000L ) ); + assertTrue( in.timeToUpdate( now - 24L*3600L*1000L - 80000L ) ); + } +} Modified: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java?rev=702318&r1=702317&r2=702318&view=diff ============================================================================== --- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java (original) +++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java Mon Oct 6 17:56:38 2008 @@ -23,6 +23,15 @@ /** * + * @return current UTC timestamp by yyyyMMddHHmmss mask as a long int + */ + public static long getUTCTimestampAsLong( ) + { + return Long.parseLong( getUTCTimestamp( new Date() ) ); + } + + /** + * * @param date * @return current date converted to UTC timestamp by yyyyMMddHHmmss mask */ Modified: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java?rev=702318&r1=702317&r2=702318&view=diff ============================================================================== --- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java (original) +++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java Mon Oct 6 17:56:38 2008 @@ -12,22 +12,22 @@ public class Util { @SuppressWarnings("unchecked") - public boolean isEmpty( Collection o ) + public static boolean isEmpty( Collection o ) { return o == null || o.isEmpty(); } - public boolean isEmpty( String o ) + public static boolean isEmpty( String o ) { return o == null || o.length() < 1; } - public boolean isEmpty( Object [] o ) + public static boolean isEmpty( Object [] o ) { return o == null || o.length < 1; } - public boolean isEmpty( Object o ) + public static boolean isEmpty( Object o ) { return o == null; }