Beefing up BidirectionalRepositoryLayout for use in webapp and proxy.

git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches/archiva-jpox-database-refactor@530543 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Joakim Erdfelt 2007-04-19 20:54:27 +00:00
parent 8b0319bf62
commit a2d0393d94
9 changed files with 666 additions and 272 deletions

View File

@ -29,7 +29,6 @@ import java.util.Map;
* @version $Id$
*/
public abstract class AbstractArtifactExtensionMapping
implements ArtifactExtensionMapping
{
protected final Map typeToExtensionMap;
@ -41,6 +40,8 @@ public abstract class AbstractArtifactExtensionMapping
typeToExtensionMap.put( "distribution-tgz", "tar.gz" );
typeToExtensionMap.put( "distribution-zip", "zip" );
typeToExtensionMap.put( "java-source", "jar" );
typeToExtensionMap.put( "javadoc.jar", "jar" );
typeToExtensionMap.put( "javadoc", "jar" );
typeToExtensionMap.put( "aspect", "jar" );
typeToExtensionMap.put( "uberjar", "jar" );
typeToExtensionMap.put( "maven-plugin", "jar" );

View File

@ -1,34 +0,0 @@
package org.apache.maven.archiva.repository.content;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* ArtifactExtensionMapping - Utility to provide the mapping between an Artifact's extension and it's type and
* vice versa.
*
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
* @version $Id$
*/
public interface ArtifactExtensionMapping
{
public String getExtension( String type );
public String getType( String filename );
}

View File

@ -26,12 +26,8 @@ import org.apache.commons.lang.StringUtils;
*
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
* @version $Id$
*
* @plexus.component role="org.apache.maven.archiva.repository.content.ArtifactExtensionMapping"
* role-hint="default"
*/
public class DefaultArtifactExtensionMapping extends AbstractArtifactExtensionMapping
implements ArtifactExtensionMapping
{
public DefaultArtifactExtensionMapping()
{

View File

@ -26,23 +26,20 @@ import org.apache.commons.lang.StringUtils;
*
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
* @version $Id$
*
* @plexus.component role="org.apache.maven.archiva.repository.content.ArtifactExtensionMapping"
* role-hint="legacy"
*/
public class LegacyArtifactExtensionMapping extends AbstractArtifactExtensionMapping
implements ArtifactExtensionMapping
public class LegacyArtifactExtensionMapping
extends AbstractArtifactExtensionMapping
{
public LegacyArtifactExtensionMapping()
{
super();
}
public String getType( String filename )
public String getType( String pathType, String filename )
{
if ( StringUtils.isBlank( filename ) )
{
return null;
return pathType;
}
String normalizedName = filename.toLowerCase().trim();
@ -57,20 +54,15 @@ public class LegacyArtifactExtensionMapping extends AbstractArtifactExtensionMap
}
else if ( normalizedName.endsWith( "-sources.jar" ) )
{
return "java-source";
return "jar";
}
else if ( normalizedName.endsWith( "-javadoc.jar" ) )
{
return "jar";
}
// TODO: handle type for -javadoc.jar ?
else
{
int index = normalizedName.lastIndexOf( '.' );
if ( index >= 0 )
{
return normalizedName.substring( index + 1 );
}
else
{
throw new IllegalArgumentException( "Filename " + filename + " does not have an extension." );
}
return pathType;
}
}
}

View File

@ -25,7 +25,6 @@ import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArtifactReference;
import org.apache.maven.archiva.model.ProjectReference;
import org.apache.maven.archiva.model.VersionedReference;
import org.apache.maven.archiva.repository.content.ArtifactExtensionMapping;
import org.apache.maven.archiva.repository.content.DefaultArtifactExtensionMapping;
/**
@ -39,6 +38,8 @@ import org.apache.maven.archiva.repository.content.DefaultArtifactExtensionMappi
public class DefaultBidirectionalRepositoryLayout
implements BidirectionalRepositoryLayout
{
private static final String MAVEN_METADATA = "maven-metadata.xml";
class PathReferences
{
public String groupId;
@ -69,7 +70,7 @@ public class DefaultBidirectionalRepositoryLayout
private static final char ARTIFACT_SEPARATOR = '-';
private ArtifactExtensionMapping extensionMapper = new DefaultArtifactExtensionMapping();
private DefaultArtifactExtensionMapping extensionMapper = new DefaultArtifactExtensionMapping();
public String getId()
{
@ -118,17 +119,36 @@ public class DefaultBidirectionalRepositoryLayout
public String toPath( ProjectReference reference )
{
return toPath( reference.getGroupId(), reference.getArtifactId(), null, null, null, null );
StringBuffer path = new StringBuffer();
path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
path.append( MAVEN_METADATA );
return path.toString();
}
public String toPath( VersionedReference reference )
{
return toPath( reference.getGroupId(), reference.getArtifactId(), reference.getVersion(), null, null, null );
StringBuffer path = new StringBuffer();
path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR );
path.append( reference.getArtifactId() ).append( PATH_SEPARATOR );
path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR );
path.append( MAVEN_METADATA );
return path.toString();
}
public ProjectReference toProjectReference( String path )
throws LayoutException
{
if ( !path.endsWith( "/maven-metadata.xml" ) )
{
throw new LayoutException( "Only paths ending in '/maven-metadata.xml' can be "
+ "converted to a ProjectReference." );
}
PathReferences pathrefs = toPathReferences( path, false );
ProjectReference reference = new ProjectReference();
reference.setGroupId( pathrefs.groupId );
@ -140,6 +160,12 @@ public class DefaultBidirectionalRepositoryLayout
public VersionedReference toVersionedReference( String path )
throws LayoutException
{
if ( !path.endsWith( "/maven-metadata.xml" ) )
{
throw new LayoutException( "Only paths ending in '/maven-metadata.xml' can be "
+ "converted to a VersionedReference." );
}
PathReferences pathrefs = toPathReferences( path, false );
VersionedReference reference = new VersionedReference();
@ -209,15 +235,30 @@ public class DefaultBidirectionalRepositoryLayout
// Maven 2.x path.
int partCount = pathParts.length;
int filenamePos = partCount - 1;
int baseVersionPos = partCount - 2;
int artifactIdPos = partCount - 3;
int groupIdPos = partCount - 4;
// Second to last is the baseVersion (the directory version)
prefs.baseVersion = pathParts[partCount - 2];
prefs.baseVersion = pathParts[baseVersionPos];
if ( "maven-metadata.xml".equals( pathParts[filenamePos] ) )
{
if( !VersionUtil.isVersion( prefs.baseVersion ) )
{
// We have a simple path without a version identifier.
prefs.baseVersion = null;
artifactIdPos++;
groupIdPos++;
}
}
// Third to last is the artifact Id.
prefs.artifactId = pathParts[partCount - 3];
prefs.artifactId = pathParts[artifactIdPos];
// Remaining pieces are the groupId.
for ( int i = 0; i <= partCount - 4; i++ )
for ( int i = 0; i <= groupIdPos; i++ )
{
prefs.appendGroupId( pathParts[i] );
}
@ -225,7 +266,7 @@ public class DefaultBidirectionalRepositoryLayout
try
{
// Last part is the filename
String filename = pathParts[partCount - 1];
String filename = pathParts[filenamePos];
// Now we need to parse the filename to get the artifact version Id.
prefs.fileParts = RepositoryLayoutUtils.splitFilename( filename, prefs.artifactId );

View File

@ -24,7 +24,6 @@ import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArtifactReference;
import org.apache.maven.archiva.model.ProjectReference;
import org.apache.maven.archiva.model.VersionedReference;
import org.apache.maven.archiva.repository.content.ArtifactExtensionMapping;
import org.apache.maven.archiva.repository.content.LegacyArtifactExtensionMapping;
import java.util.HashMap;
@ -41,9 +40,11 @@ import java.util.Map;
public class LegacyBidirectionalRepositoryLayout
implements BidirectionalRepositoryLayout
{
private static final String MAVEN_METADATA = "maven-metadata.xml";
private static final String PATH_SEPARATOR = "/";
private ArtifactExtensionMapping extensionMapper = new LegacyArtifactExtensionMapping();
private LegacyArtifactExtensionMapping extensionMapper = new LegacyArtifactExtensionMapping();
private Map typeToDirectoryMap;
@ -62,25 +63,37 @@ public class LegacyBidirectionalRepositoryLayout
public String toPath( ArchivaArtifact artifact )
{
return toPath( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact
.getClassifier(), artifact.getType() );
return toPath( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
artifact.getClassifier(), artifact.getType() );
}
public String toPath( ProjectReference reference )
{
// TODO: Verify type
return toPath( reference.getGroupId(), reference.getArtifactId(), null, null, "metadata-xml" );
StringBuffer path = new StringBuffer();
path.append( reference.getGroupId() ).append( PATH_SEPARATOR );
path.append( getDirectory( null, "jar" ) ).append( PATH_SEPARATOR );
path.append( MAVEN_METADATA );
return path.toString();
}
public String toPath( VersionedReference reference )
{
return toPath( reference.getGroupId(), reference.getArtifactId(), reference.getVersion(), null, "metadata-xml" );
// NOTE: A legacy repository cannot contain a versioned reference to the metadata.
StringBuffer path = new StringBuffer();
path.append( reference.getGroupId() ).append( PATH_SEPARATOR );
path.append( getDirectory( null, "jar" ) ).append( PATH_SEPARATOR );
path.append( MAVEN_METADATA );
return path.toString();
}
public String toPath( ArtifactReference reference )
{
return toPath( reference.getGroupId(), reference.getArtifactId(), reference.getVersion(),
reference.getClassifier(), reference.getType() );
return toPath( reference.getGroupId(), reference.getArtifactId(), reference.getVersion(), reference
.getClassifier(), reference.getType() );
}
private String toPath( String groupId, String artifactId, String version, String classifier, String type )
@ -107,10 +120,18 @@ public class LegacyBidirectionalRepositoryLayout
private String getDirectory( String classifier, String type )
{
// Special Cases involving classifiers and type.
if ( "jar".equals( type ) && "sources".equals( classifier ) )
// Special Cases involving type + classifier
if ( "jar".equals( type ) && StringUtils.isNotBlank( classifier ) )
{
return "javadoc.jars";
if ( "sources".equals( classifier ) )
{
return "source.jars";
}
if ( "javadoc".equals( classifier ) )
{
return "javadoc.jars";
}
}
// Special Cases involving only type.
@ -173,7 +194,20 @@ public class LegacyBidirectionalRepositoryLayout
prefs.fileParts = RepositoryLayoutUtils.splitFilename( filename, null );
prefs.type = extensionMapper.getType( filename );
prefs.type = extensionMapper.getType( prefs.pathType, filename );
// Sanity Checks.
if ( StringUtils.isEmpty( prefs.fileParts.extension ) )
{
throw new LayoutException( "Invalid artifact, no extension." );
}
if ( !prefs.type.equals( prefs.fileParts.extension ) )
{
throw new LayoutException( "Invalid artifact, mismatch on extension <" + prefs.fileParts.extension
+ "> and expected layout specified type <" + prefs.type
+ "> (mapped from actual path provided type <" + prefs.pathType + ">)" );
}
}
return prefs;
@ -194,32 +228,28 @@ public class LegacyBidirectionalRepositoryLayout
pathrefs.fileParts.version, pathrefs.fileParts.classifier,
pathrefs.type );
// Sanity Checks.
if ( StringUtils.isEmpty( pathrefs.fileParts.extension ) )
{
throw new LayoutException( "Invalid artifact, no extension." );
}
if ( !pathrefs.pathType.equals( pathrefs.fileParts.extension + "s" ) )
{
throw new LayoutException( "Invalid artifact, mismatch on extension <" + pathrefs.fileParts.extension
+ "> and layout specified type<" + pathrefs.pathType + ">." );
}
return artifact;
}
public ArtifactReference toArtifactReference( String path )
throws LayoutException
{
// TODO Auto-generated method stub
return null;
PathReferences pathrefs = toPathReferences( path, true );
ArtifactReference reference = new ArtifactReference();
reference.setGroupId( pathrefs.groupId );
reference.setArtifactId( pathrefs.fileParts.artifactId );
reference.setVersion( pathrefs.fileParts.version );
reference.setClassifier( pathrefs.fileParts.classifier );
reference.setType( pathrefs.type );
return reference;
}
public VersionedReference toVersionedReference( String path )
throws LayoutException
{
// TODO Auto-generated method stub
return null;
}

View File

@ -20,9 +20,7 @@ package org.apache.maven.archiva.repository.layout;
*/
import org.apache.commons.lang.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.maven.archiva.common.utils.VersionUtil;
/**
* RepositoryLayoutUtils - utility methods common for most BidirectionalRepositoryLayout implementation.
@ -38,18 +36,6 @@ public class RepositoryLayoutUtils
*/
private static final String ComplexExtensions[] = new String[] { "tar.gz", "tar.bz2" };
/**
* These are the version patterns found in the filenames of the various artifact's versions IDs.
* These patterns are all tackling lowercase version IDs.
*/
private static final String VersionPatterns[] =
new String[] { "(snapshot)", "([0-9][_.0-9a-z]*)", "(g?[_.0-9ab]*(pre|rc|g|m)[_.0-9]*)", "(dev[_.0-9]*)",
"(alpha[_.0-9]*)", "(beta[_.0-9]*)", "(rc[_.0-9]*)", "(test[_.0-9]*)", "(debug[_.0-9]*)",
"(unofficial[_.0-9]*)", "(current)", "(latest)", "(fcs)", "(release[_.0-9]*)", "(nightly)", "(final)",
"(incubating)", "(incubator)", "([ab][_.0-9]*)" };
private static final String VersionMegaPattern = StringUtils.join( VersionPatterns, '|' );
/**
* Filename Parsing Mode - Artifact Id.
*/
@ -137,17 +123,13 @@ public class RepositoryLayoutUtils
int versionStart = -1;
int versionEnd = -1;
Pattern pat = Pattern.compile( VersionMegaPattern, Pattern.CASE_INSENSITIVE );
Matcher mat;
for ( int i = 0; i < fileParts.length; i++ )
{
String part = fileParts[i];
mat = pat.matcher( part );
if ( mat.matches() )
if ( VersionUtil.isSimpleVersionKeyword( part ) )
{
// It is a potential verion part.
// It is a potential version part.
if ( versionStart < 0 )
{
versionStart = i;

View File

@ -19,19 +19,15 @@ package org.apache.maven.archiva.repository.layout;
* under the License.
*/
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArtifactReference;
import org.apache.maven.archiva.model.ProjectReference;
import org.apache.maven.archiva.model.VersionedReference;
import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
import org.apache.maven.archiva.repository.layout.LayoutException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* DefaultBidirectionalRepositoryLayoutTest
@ -54,7 +50,11 @@ public class DefaultBidirectionalRepositoryLayoutTest
public String type;
public String path;
public String pathArtifact;
public String pathVersiond;
public String pathProjectd;
public LayoutExample( String groupId, String artifactId, String version, String classifier, String type )
{
@ -66,6 +66,30 @@ public class DefaultBidirectionalRepositoryLayoutTest
this.type = type;
}
public void setDelimitedPath( String delimPath )
{
// Silly Test Writer! Don't end the path with a slash!
if ( delimPath.endsWith( "/" ) )
{
delimPath = delimPath.substring( 0, delimPath.length() - 1 );
}
String parts[] = StringUtils.split( delimPath, '|' );
switch ( parts.length )
{
case 3:
this.pathArtifact = parts[0] + "/" + parts[1] + "/" + parts[2];
case 2:
this.pathVersiond = parts[0] + "/" + parts[1] + "/maven-metadata.xml";
case 1:
this.pathProjectd = parts[0] + "/maven-metadata.xml";
break;
default:
fail( "Unknown number of path pieces, expected between 1 and 3, got <" + parts.length + "> on <"
+ delimPath + ">" );
}
}
public boolean isSuitableForArtifactTest()
{
return ( this.type != null ) && ( this.classifier != null ) && ( this.version != null );
@ -108,58 +132,65 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example;
// Artifact References
example = new LayoutExample( "com.foo", "foo-tool", "1.0", "", "jar" );
example.path = "com/foo/foo-tool/1.0/foo-tool-1.0.jar";
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, "jar" );
example.setDelimitedPath( "com/foo/foo-tool|1.0|foo-tool-1.0.jar" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-client", "1.0", "", "ejb-client" );
example.path = "com/foo/foo-client/1.0/foo-client-1.0.jar";
example = new LayoutExample( "com.foo", "foo-client", "1.0", null, "ejb-client" );
example.setDelimitedPath( "com/foo/foo-client|1.0|foo-client-1.0.jar" );
ret.add( example );
example = new LayoutExample( "com.foo.lib", "foo-lib", "2.1-alpha-1", "sources", "java-source" );
example.path = "com/foo/lib/foo-lib/2.1-alpha-1/foo-lib-2.1-alpha-1-sources.jar";
example.setDelimitedPath( "com/foo/lib/foo-lib|2.1-alpha-1|foo-lib-2.1-alpha-1-sources.jar" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", "", "jar" );
example.path = "com/foo/foo-connector/2.1-SNAPSHOT/foo-connector-2.1-20060822.123456-35.jar";
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", null, "jar" );
example.setDelimitedPath( "com/foo/foo-connector/2.1-SNAPSHOT/foo-connector-2.1-20060822.123456-35.jar" );
ret.add( example );
example = new LayoutExample( "org.apache.maven.test", "get-metadata-snapshot", "1.0-20050831.101112-1", "",
example = new LayoutExample( "org.apache.maven.test", "get-metadata-snapshot", "1.0-20050831.101112-1", null,
"jar" );
example.path = "org/apache/maven/test/get-metadata-snapshot/1.0-SNAPSHOT/get-metadata-snapshot-1.0-20050831.101112-1.jar";
example
.setDelimitedPath( "org/apache/maven/test/get-metadata-snapshot|1.0-SNAPSHOT|get-metadata-snapshot-1.0-20050831.101112-1.jar" );
ret.add( example );
example = new LayoutExample( "commons-lang", "commons-lang", "2.1", "", "jar" );
example.path = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
example = new LayoutExample( "commons-lang", "commons-lang", "2.1", null, "jar" );
example.setDelimitedPath( "commons-lang/commons-lang|2.1|commons-lang-2.1.jar" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-tool", "1.0", "", "jar" );
example.path = "com/foo/foo-tool/1.0/foo-tool-1.0.jar";
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, "jar" );
example.setDelimitedPath( "com/foo/foo-tool|1.0|foo-tool-1.0.jar" );
ret.add( example );
// Versioned References (done here by setting classifier and type to null)
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, null );
example.path = "com/foo/foo-tool/1.0/foo-tool-1.0.jar";
example.setDelimitedPath( "com/foo/foo-tool|1.0" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, null );
example.path = "com/foo/foo-tool/1.0/";
ret.add( example );
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, null );
example.path = "com/foo/foo-tool/1.0";
example = new LayoutExample( "net.i.have.a.really.long.path.just.for.the.hell.of.it", "a", "1.1-alpha-1", null,
null );
example.setDelimitedPath( "net/i/have/a/really/long/path/just/for/the/hell/of/it/a|1.1-alpha-1" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", null, null );
example.path = "com/foo/foo-connector/2.1-SNAPSHOT/foo-connector-2.1-20060822.123456-35.jar";
example.setDelimitedPath( "com/foo/foo-connector|2.1-SNAPSHOT" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", null, null );
example.path = "com/foo/foo-connector/2.1-SNAPSHOT/";
example = new LayoutExample( "com.foo", "foo-connector", "2.1-SNAPSHOT", null, null );
example.setDelimitedPath( "com/foo/foo-connector|2.1-SNAPSHOT" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", null, null );
example.path = "com/foo/foo-connector/2.1-SNAPSHOT";
// Project References (done here by setting version, classifier, and type to null)
example = new LayoutExample( "com.foo", "foo-tool", null, null, null );
example.setDelimitedPath( "com/foo/foo-tool/" );
ret.add( example );
example = new LayoutExample( "net.i.have.a.really.long.path.just.for.the.hell.of.it", "a", null, null, null );
example.setDelimitedPath( "net/i/have/a/really/long/path/just/for/the/hell/of/it/a/" );
ret.add( example );
example = new LayoutExample( "com.foo", "foo-connector", null, null, null );
example.setDelimitedPath( "com/foo/foo-connector" );
ret.add( example );
return ret;
@ -209,7 +240,7 @@ public class DefaultBidirectionalRepositoryLayoutTest
{
ArchivaArtifact artifact = createArtifact( example.groupId, example.artifactId, example.version,
example.classifier, example.type );
assertEquals( "Artifact <" + artifact + "> to path:", example.path, layout.toPath( artifact ) );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, layout.toPath( artifact ) );
}
}
}
@ -229,7 +260,8 @@ public class DefaultBidirectionalRepositoryLayoutTest
reference.setClassifier( example.classifier );
reference.setType( example.type );
assertEquals( "ArtifactReference <" + reference + "> to path:", example.path, layout.toPath( reference ) );
assertEquals( "ArtifactReference <" + reference + "> to path:", example.pathArtifact, layout
.toPath( reference ) );
}
}
}
@ -240,14 +272,14 @@ public class DefaultBidirectionalRepositoryLayoutTest
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForVersionedTest() && example.isSuitableForArtifactTest() )
if ( example.isSuitableForVersionedTest() || example.isSuitableForArtifactTest() )
{
VersionedReference reference = new VersionedReference();
reference.setGroupId( example.groupId );
reference.setArtifactId( example.artifactId );
reference.setVersion( example.version );
assertEquals( "VersionedReference <" + reference + "> to path:", example.path, layout
assertEquals( "VersionedReference <" + reference + "> to path:", example.pathVersiond, layout
.toPath( reference ) );
}
}
@ -259,14 +291,15 @@ public class DefaultBidirectionalRepositoryLayoutTest
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForProjectTest() && example.isSuitableForVersionedTest()
&& example.isSuitableForArtifactTest() )
if ( example.isSuitableForProjectTest() || example.isSuitableForVersionedTest()
|| example.isSuitableForArtifactTest() )
{
ProjectReference reference = new ProjectReference();
reference.setGroupId( example.groupId );
reference.setArtifactId( example.artifactId );
assertEquals( "ProjectReference <" + reference + "> to path:", example.path, layout.toPath( reference ) );
assertEquals( "ProjectReference <" + reference + "> to path:", example.pathProjectd, layout
.toPath( reference ) );
}
}
}
@ -366,14 +399,13 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = layout.toArtifact( example.path );
ArchivaArtifact artifact = layout.toArtifact( example.pathArtifact );
assertArtifact( artifact, example.groupId, example.artifactId, example.version, example.classifier,
example.type );
}
}
}
/* TODO: Fix layout object to pass test.
public void testPathToArtifactReference()
throws LayoutException
{
@ -383,15 +415,13 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArtifactReference reference = layout.toArtifactReference( example.path );
ArtifactReference reference = layout.toArtifactReference( example.pathArtifact );
assertArtifactReference( reference, example.groupId, example.artifactId, example.version,
example.classifier, example.type );
}
}
}
*/
/* TODO: Fix layout object to pass test.
public void testPathToVersionedReference()
throws LayoutException
{
@ -401,13 +431,14 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForVersionedTest() )
{
VersionedReference reference = layout.toVersionedReference( example.path );
VersionedReference reference = layout.toVersionedReference( example.pathVersiond );
String baseVersion = reference.getVersion();
assertVersionedReference( reference, example.groupId, example.artifactId, example.version );
assertVersionedReference( reference, example.groupId, example.artifactId, baseVersion );
}
}
}
*/
public void testPathToProjectReference()
throws LayoutException
@ -418,7 +449,7 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForProjectTest() )
{
ProjectReference reference = layout.toProjectReference( example.path );
ProjectReference reference = layout.toProjectReference( example.pathProjectd );
assertProjectReference( reference, example.groupId, example.artifactId );
}
@ -437,7 +468,7 @@ public class DefaultBidirectionalRepositoryLayoutTest
ArchivaArtifact artifact = createArtifact( example.groupId, example.artifactId, example.version,
example.classifier, example.type );
String testPath = layout.toPath( artifact );
assertEquals( "Artifact <" + artifact + "> to path:", example.path, testPath );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, testPath );
ArchivaArtifact testArtifact = layout.toArtifact( testPath );
assertArtifact( testArtifact, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
artifact.getClassifier(), artifact.getType() );
@ -454,11 +485,11 @@ public class DefaultBidirectionalRepositoryLayoutTest
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = layout.toArtifact( example.path );
ArchivaArtifact artifact = layout.toArtifact( example.pathArtifact );
assertArtifact( artifact, example.groupId, example.artifactId, example.version, example.classifier,
example.type );
String testPath = layout.toPath( artifact );
assertEquals( "Artifact <" + artifact + "> to path:", example.path, testPath );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, testPath );
}
}
}

View File

@ -19,8 +19,15 @@ package org.apache.maven.archiva.repository.layout;
* under the License.
*/
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
import org.apache.maven.archiva.model.ArtifactReference;
import org.apache.maven.archiva.model.ProjectReference;
import org.apache.maven.archiva.model.VersionedReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* LegacyBidirectionalRepositoryLayoutTest
@ -28,129 +35,477 @@ import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
* @version $Id$
*/
public class LegacyBidirectionalRepositoryLayoutTest extends AbstractBidirectionalRepositoryLayoutTestCase
public class LegacyBidirectionalRepositoryLayoutTest
extends AbstractBidirectionalRepositoryLayoutTestCase
{
class LayoutExample
{
public String groupId;
public String artifactId;
public String version;
public String classifier;
public String type;
public String pathArtifact;
public String pathVersiond;
public String pathProjectd;
public LayoutExample( String groupId, String artifactId, String version, String classifier, String type )
{
super();
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.classifier = classifier;
this.type = type;
}
public void setDelimitedPath( String delimPath )
{
// Silly Test Writer! Don't end the path with a slash!
if ( delimPath.endsWith( "/" ) )
{
delimPath = delimPath.substring( 0, delimPath.length() - 1 );
}
String parts[] = StringUtils.split( delimPath, '|' );
switch ( parts.length )
{
case 3:
this.pathArtifact = parts[0] + "/" + parts[1] + "/" + parts[2];
case 2:
this.pathVersiond = parts[0] + "/jars/maven-metadata.xml";
case 1:
this.pathProjectd = parts[0] + "/jars/maven-metadata.xml";
break;
default:
fail( "Unknown number of path pieces, expected between 1 and 3, got <" + parts.length + "> on <"
+ delimPath + ">" );
}
}
public boolean isSuitableForArtifactTest()
{
return ( this.type != null ) && ( this.classifier != null ) && ( this.version != null );
}
public boolean isSuitableForVersionedTest()
{
return ( this.type == null ) && ( this.classifier == null ) && ( this.version != null );
}
public boolean isSuitableForProjectTest()
{
return ( this.type == null ) && ( this.classifier == null ) && ( this.version == null );
}
}
class InvalidExample
{
public String path;
public String reason;
public boolean suitableForArtifactTests = true;
public boolean suitableForVersionedTests = false;
public boolean suitableForProjectTests = false;
public InvalidExample( String path, String reason )
{
super();
this.path = path;
this.reason = reason;
}
}
private BidirectionalRepositoryLayout layout;
protected void setUp() throws Exception
protected void setUp()
throws Exception
{
super.setUp();
layout = (BidirectionalRepositoryLayout) lookup( BidirectionalRepositoryLayout.class.getName(), "legacy" );
}
public void testToPathBasic()
public List /*<LayoutExample>*/getGoodExamples()
{
ArchivaArtifact artifact = createArtifact( "com.foo", "foo-tool", "1.0", "", "jar" );
List ret = new ArrayList();
assertEquals( "com.foo/jars/foo-tool-1.0.jar", layout.toPath( artifact ) );
}
LayoutExample example;
public void testToPathEjbClient()
{
ArchivaArtifact artifact = createArtifact( "com.foo", "foo-client", "1.0", "", "ejb-client" );
// Artifact References
example = new LayoutExample( "com.foo", "foo-tool", "1.0", null, "jar" );
example.setDelimitedPath( "com.foo|jars|foo-tool-1.0.jar" );
ret.add( example );
assertEquals( "com.foo/ejbs/foo-client-1.0.jar", layout.toPath( artifact ) );
}
example = new LayoutExample( "com.foo", "foo-client", "1.0", null, "ejb-client" );
example.setDelimitedPath( "com.foo|ejbs|foo-client-1.0.jar" );
ret.add( example );
public void testToPathWithClassifier()
{
ArchivaArtifact artifact = createArtifact( "com.foo.lib", "foo-lib", "2.1-alpha-1", "sources", "jar" );
example = new LayoutExample( "com.foo.lib", "foo-lib", "2.1-alpha-1", "sources", "jar" );
example.setDelimitedPath( "com.foo.lib|source.jars|foo-lib-2.1-alpha-1-sources.jar" );
ret.add( example );
assertEquals( "com.foo.lib/javadoc.jars/foo-lib-2.1-alpha-1-sources.jar", layout.toPath( artifact ) );
}
public void testToPathUsingUniqueSnapshot()
{
ArchivaArtifact artifact = createArtifact( "com.foo", "foo-connector", "2.1-20060822.123456-35", "", "jar" );
assertEquals( "com.foo/jars/foo-connector-2.1-20060822.123456-35.jar", layout.toPath( artifact ) );
}
public void testToArtifactBasicSimpleGroupId() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "commons-lang/jars/commons-lang-2.1.jar" );
assertArtifact( artifact, "commons-lang", "commons-lang", "2.1", "", "jar" );
}
public void testToArtifactBasicLongGroupId() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "org.apache.derby/jars/derby-10.2.2.0.jar" );
assertArtifact( artifact, "org.apache.derby", "derby", "10.2.2.0", "", "jar" );
}
public void testToArtifactLongGroupId() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "org.apache.geronimo.specs/jars/geronimo-ejb_2.1_spec-1.0.1.jar" );
assertArtifact( artifact, "org.apache.geronimo.specs", "geronimo-ejb_2.1_spec", "1.0.1", "", "jar" );
}
public void testToArtifactEjbClient() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "org.apache.beehive/jars/beehive-ejb-control-1.0.1.jar" );
// The type is correct. as we cannot possibly know this is an ejb client without parsing the pom
assertArtifact( artifact, "org.apache.beehive", "beehive-ejb-control", "1.0.1", "", "jar" );
}
public void testToArtifactWithClassifier() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "commons-lang/jars/commons-lang-2.3-sources.jar" );
// The 'java-source' type is correct. You might be thinking of extension, which we are not testing here.
assertArtifact( artifact, "commons-lang", "commons-lang", "2.3", "sources", "java-source" );
}
public void testToArtifactSnapshot() throws LayoutException
{
ArchivaArtifact artifact = layout.toArtifact( "directory-clients/poms/ldap-clients-0.9.1-SNAPSHOT.pom" );
assertSnapshotArtifact( artifact, "directory-clients", "ldap-clients", "0.9.1-SNAPSHOT", "", "pom" );
}
public void testInvalidNoType()
{
try
{
layout.toArtifact( "invalid/invalid/1/invalid-1" );
fail( "Should have detected no type." );
}
catch ( LayoutException e )
{
/* expected path */
}
}
public void testInvalidArtifactPackaging()
{
try
{
layout.toArtifact( "org.apache.maven.test/jars/artifactId-1.0.jar.md5" );
fail( "Should have detected wrong package extension." );
}
catch ( LayoutException e )
{
/* expected path */
}
}
public void testInvalidNoArtifactId()
{
try
{
layout.toArtifact( "groupId/jars/-1.0.jar" );
fail( "Should have detected artifactId is missing" );
}
catch ( LayoutException e )
{
/* expected path */
}
example = new LayoutExample( "com.foo.lib", "foo-lib", "2.1-alpha-1", "javadoc", "jar" );
example.setDelimitedPath( "com.foo.lib|javadoc.jars|foo-lib-2.1-alpha-1-javadoc.jar" );
ret.add( example );
try
example = new LayoutExample( "com.foo", "foo-connector", "2.1-20060822.123456-35", null, "jar" );
example.setDelimitedPath( "com.foo|jars|foo-connector-2.1-20060822.123456-35.jar" );
ret.add( example );
example = new LayoutExample( "org.apache.maven.test", "get-metadata-snapshot", "1.0-20050831.101112-1", null,
"jar" );
example.setDelimitedPath( "org.apache.maven.test|jars|get-metadata-snapshot-1.0-20050831.101112-1.jar" );
ret.add( example );
example = new LayoutExample( "commons-lang", "commons-lang", "2.1", null, "jar" );
example.setDelimitedPath( "commons-lang|jars|commons-lang-2.1.jar" );
ret.add( example );
example = new LayoutExample( "org.apache.derby", "derby", "10.2.2.0", null, "jar" );
example.setDelimitedPath( "org.apache.derby|jars|derby-10.2.2.0.jar" );
ret.add( example );
example = new LayoutExample( "org.apache.geronimo.specs", "geronimo-ejb_2.1_spec", "1.0.1", null, "jar" );
example.setDelimitedPath( "org.apache.geronimo.specs|jars|geronimo-ejb_2.1_spec-1.0.1.jar" );
ret.add( example );
example = new LayoutExample( "org.apache.beehive", "beehive-ejb-control", "1.0.1", null, "jar" );
example.setDelimitedPath( "org.apache.beehive|jars|beehive-ejb-control-1.0.1.jar" );
ret.add( example );
example = new LayoutExample( "commons-lang", "commons-lang", "2.3", "sources", "jar" );
example.setDelimitedPath( "commons-lang|source.jars|commons-lang-2.3-sources.jar" );
ret.add( example );
example = new LayoutExample( "directory-clients", "ldap-clients", "0.9.1-SNAPSHOT", null, "pom" );
example.setDelimitedPath( "directory-clients|poms|ldap-clients-0.9.1-SNAPSHOT.pom" );
ret.add( example );
// Versioned References (done here by setting classifier and type to null)
// TODO: Not sure how to represent a VersionedReference as a legacy path.
// Project References (done here by setting version, classifier, and type to null)
// TODO: Not sure how to represent a ProjectReference as a legacy path.
return ret;
}
public List /*<InvalidExample>*/getInvalidPaths()
{
List ret = new ArrayList();
InvalidExample example;
example = new InvalidExample( "invalid/invalid/1/invalid-1", "missing type" );
example.suitableForArtifactTests = true;
example.suitableForVersionedTests = false;
example.suitableForProjectTests = true;
ret.add( example );
example = new InvalidExample( "org.apache.maven.test/jars/artifactId-1.0.jar.md5", "wrong package extension" );
example.suitableForArtifactTests = true;
example.suitableForVersionedTests = false;
example.suitableForProjectTests = false;
ret.add( example );
example = new InvalidExample( "groupId/jars/-1.0.jar", "artifactId is missing" );
example.suitableForArtifactTests = true;
example.suitableForVersionedTests = false;
example.suitableForProjectTests = true;
ret.add( example );
example = new InvalidExample( "groupId/jars/1.0.jar", "artifactId is missing" );
example.suitableForArtifactTests = true;
example.suitableForVersionedTests = false;
example.suitableForProjectTests = true;
ret.add( example );
return ret;
}
public void testArtifactToPath()
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
layout.toArtifact( "groupId/jars/1.0.jar" );
fail( "Should have detected artifactId is missing" );
}
catch ( LayoutException e )
{
/* expected path */
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = createArtifact( example.groupId, example.artifactId, example.version,
example.classifier, example.type );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, layout.toPath( artifact ) );
}
}
}
public void testArtifactReferenceToPath()
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArtifactReference reference = new ArtifactReference();
reference.setGroupId( example.groupId );
reference.setArtifactId( example.artifactId );
reference.setVersion( example.version );
reference.setClassifier( example.classifier );
reference.setType( example.type );
assertEquals( "ArtifactReference <" + reference + "> to path:", example.pathArtifact, layout
.toPath( reference ) );
}
}
}
public void testVersionedReferenceToPath()
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForVersionedTest() || example.isSuitableForArtifactTest() )
{
VersionedReference reference = new VersionedReference();
reference.setGroupId( example.groupId );
reference.setArtifactId( example.artifactId );
reference.setVersion( example.version );
assertEquals( "VersionedReference <" + reference + "> to path:", example.pathVersiond, layout
.toPath( reference ) );
}
}
}
public void testProjectReferenceToPath()
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForProjectTest() || example.isSuitableForVersionedTest()
|| example.isSuitableForArtifactTest() )
{
ProjectReference reference = new ProjectReference();
reference.setGroupId( example.groupId );
reference.setArtifactId( example.artifactId );
assertEquals( "ProjectReference <" + reference + "> to path:", example.pathProjectd, layout
.toPath( reference ) );
}
}
}
public void testInvalidPathToArtifact()
{
Iterator it = getInvalidPaths().iterator();
while ( it.hasNext() )
{
InvalidExample example = (InvalidExample) it.next();
try
{
layout.toArtifact( example.path );
fail( "Should have thrown a LayoutException on the invalid path [" + example.path + "] because of ["
+ example.reason + "]" );
}
catch ( LayoutException e )
{
/* expected path */
}
}
}
public void testInvalidPathToArtifactReference()
{
Iterator it = getInvalidPaths().iterator();
while ( it.hasNext() )
{
InvalidExample example = (InvalidExample) it.next();
if( !example.suitableForArtifactTests )
{
continue;
}
try
{
layout.toArtifactReference( example.path );
fail( "Should have thrown a LayoutException on the invalid path [" + example.path + "] because of ["
+ example.reason + "]" );
}
catch ( LayoutException e )
{
/* expected path */
}
}
}
public void testInvalidPathToVersionedReference()
{
Iterator it = getInvalidPaths().iterator();
while ( it.hasNext() )
{
InvalidExample example = (InvalidExample) it.next();
if( !example.suitableForVersionedTests )
{
continue;
}
try
{
layout.toVersionedReference( example.path );
fail( "Should have thrown a LayoutException on the invalid path [" + example.path
+ "] because of [" + example.reason + "]" );
}
catch ( LayoutException e )
{
/* expected path */
}
}
}
public void testInvalidPathToProjectReference()
{
Iterator it = getInvalidPaths().iterator();
while ( it.hasNext() )
{
InvalidExample example = (InvalidExample) it.next();
if( !example.suitableForProjectTests )
{
continue;
}
try
{
layout.toProjectReference( example.path );
fail( "Should have thrown a LayoutException on the invalid path [" + example.path
+ "] because of [" + example.reason + "]" );
}
catch ( LayoutException e )
{
/* expected path */
}
}
}
public void testPathToArtifact()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = layout.toArtifact( example.pathArtifact );
assertArtifact( artifact, example.groupId, example.artifactId, example.version, example.classifier,
example.type );
}
}
}
public void testPathToArtifactReference()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArtifactReference reference = layout.toArtifactReference( example.pathArtifact );
assertArtifactReference( reference, example.groupId, example.artifactId, example.version,
example.classifier, example.type );
}
}
}
public void testPathToVersionedReference()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForVersionedTest() )
{
VersionedReference reference = layout.toVersionedReference( example.pathVersiond );
String baseVersion = reference.getVersion();
assertVersionedReference( reference, example.groupId, example.artifactId, baseVersion );
}
}
}
public void testPathToProjectReference()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForProjectTest() )
{
ProjectReference reference = layout.toProjectReference( example.pathProjectd );
assertProjectReference( reference, example.groupId, example.artifactId );
}
}
}
public void testRoundtripArtifactToPathToArtifact()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = createArtifact( example.groupId, example.artifactId, example.version,
example.classifier, example.type );
String testPath = layout.toPath( artifact );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, testPath );
ArchivaArtifact testArtifact = layout.toArtifact( testPath );
assertArtifact( testArtifact, artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
artifact.getClassifier(), artifact.getType() );
}
}
}
public void testRoundtripPathToArtifactToPath()
throws LayoutException
{
Iterator it = getGoodExamples().iterator();
while ( it.hasNext() )
{
LayoutExample example = (LayoutExample) it.next();
if ( example.isSuitableForArtifactTest() )
{
ArchivaArtifact artifact = layout.toArtifact( example.pathArtifact );
assertArtifact( artifact, example.groupId, example.artifactId, example.version, example.classifier,
example.type );
String testPath = layout.toPath( artifact );
assertEquals( "Artifact <" + artifact + "> to path:", example.pathArtifact, testPath );
}
}
}
}