Adding ability to calculate a ProjectReference from a path.

git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches/archiva-jpox-database-refactor@529108 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Joakim Erdfelt 2007-04-16 00:51:13 +00:00
parent 46fefb7f3e
commit 94ca53dece
4 changed files with 148 additions and 36 deletions

View File

@ -71,4 +71,13 @@ public interface BidirectionalRepositoryLayout
* @throws LayoutException if there was a problem converting the path to an artifact. * @throws LayoutException if there was a problem converting the path to an artifact.
*/ */
public ArchivaArtifact toArtifact( String path ) throws LayoutException; public ArchivaArtifact toArtifact( String path ) throws LayoutException;
/**
* Given a repository relateive path to a filename, return the ProjectReference object suitable for the path.
*
* @param path the path relative to the repository base dir for the artifact.
* @return the ProjectReference representing the path. (or null if path cannot be converted to a ProjectReference)
* @throws LayoutException if there was a problem converting the path to an artifact.
*/
public ProjectReference toProjectReference( String path ) throws LayoutException;
} }

View File

@ -100,9 +100,35 @@ public class DefaultBidirectionalRepositoryLayout
return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR ); return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
} }
public ArchivaArtifact toArtifact( String path ) class PathReferences
{
public String groupId;
public String artifactId;
public String baseVersion;
public String type;
public FilenameParts fileParts;
public void appendGroupId( String part )
{
if ( groupId == null )
{
groupId = part;
return;
}
groupId += "." + part;
}
}
private PathReferences toPathReferences( String path, boolean parseFilename )
throws LayoutException throws LayoutException
{ {
PathReferences prefs = new PathReferences();
String normalizedPath = StringUtils.replace( path, "\\", "/" ); String normalizedPath = StringUtils.replace( path, "\\", "/" );
String pathParts[] = StringUtils.split( normalizedPath, '/' ); String pathParts[] = StringUtils.split( normalizedPath, '/' );
@ -126,42 +152,60 @@ public class DefaultBidirectionalRepositoryLayout
// Maven 2.x path. // Maven 2.x path.
int partCount = pathParts.length; int partCount = pathParts.length;
// Second to last is the baseVersion (the directory version)
prefs.baseVersion = pathParts[partCount - 2];
// Third to last is the artifact Id.
prefs.artifactId = pathParts[partCount - 3];
// Remaining pieces are the groupId.
for ( int i = 0; i <= partCount - 4; i++ )
{
prefs.appendGroupId( pathParts[i] );
}
if ( parseFilename )
{
// Last part is the filename // Last part is the filename
String filename = pathParts[partCount - 1]; String filename = pathParts[partCount - 1];
// Second to last is the baseVersion (the directory version)
String baseVersion = pathParts[partCount - 2];
// Third to last is the artifact Id.
String artifactId = pathParts[partCount - 3];
// Remaining pieces are the groupId.
String groupId = "";
for ( int i = 0; i <= partCount - 4; i++ )
{
if ( groupId.length() > 0 )
{
groupId += ".";
}
groupId += pathParts[i];
}
// Now we need to parse the filename to get the artifact version Id. // Now we need to parse the filename to get the artifact version Id.
FilenameParts fileParts = RepositoryLayoutUtils.splitFilename( filename, artifactId ); prefs.fileParts = RepositoryLayoutUtils.splitFilename( filename, prefs.artifactId );
String type = extensionMapper.getType( filename ); prefs.type = extensionMapper.getType( filename );
}
ArchivaArtifact artifact = new ArchivaArtifact( groupId, artifactId, fileParts.version, fileParts.classifier, return prefs;
type ); }
public ProjectReference toProjectReference( String path )
throws LayoutException
{
PathReferences pathrefs = toPathReferences( path, false );
ProjectReference reference = new ProjectReference();
reference.setGroupId( pathrefs.groupId );
reference.setArtifactId( pathrefs.artifactId );
return reference;
}
public ArchivaArtifact toArtifact( String path )
throws LayoutException
{
PathReferences pathrefs = toPathReferences( path, true );
ArchivaArtifact artifact = new ArchivaArtifact( pathrefs.groupId, pathrefs.artifactId,
pathrefs.fileParts.version, pathrefs.fileParts.classifier,
pathrefs.type );
// Sanity Checks. // Sanity Checks.
String artifactBaseVersion = VersionUtil.getBaseVersion( fileParts.version ); String artifactBaseVersion = VersionUtil.getBaseVersion( pathrefs.fileParts.version );
if ( !artifactBaseVersion.equals( baseVersion ) ) if ( !artifactBaseVersion.equals( pathrefs.baseVersion ) )
{ {
throw new LayoutException( "Invalid artifact location, version directory and filename mismatch." ); throw new LayoutException( "Invalid artifact location, version directory and filename mismatch." );
} }
if ( !artifactId.equals( fileParts.artifactId ) ) if ( !pathrefs.artifactId.equals( pathrefs.fileParts.artifactId ) )
{ {
throw new LayoutException( "Invalid artifact Id" ); throw new LayoutException( "Invalid artifact Id" );
} }

View File

@ -35,6 +35,33 @@ class FilenameParts
public String extension; public String extension;
public String toFilename()
{
StringBuffer sb = new StringBuffer();
if ( artifactId != null )
{
sb.append( artifactId );
}
if ( classifier != null )
{
sb.append( "-" ).append( classifier );
}
if ( version != null )
{
sb.append( "-" ).append( version );
}
if ( extension != null )
{
sb.append( "." ).append( extension );
}
return sb.toString();
}
public void appendArtifactId( String piece ) public void appendArtifactId( String piece )
{ {
if ( artifactId == null ) if ( artifactId == null )

View File

@ -61,8 +61,8 @@ public class LegacyBidirectionalRepositoryLayout
public String toPath( ArchivaArtifact reference ) public String toPath( ArchivaArtifact reference )
{ {
return toPath( reference.getGroupId(), reference.getArtifactId(), reference return toPath( reference.getGroupId(), reference.getArtifactId(), reference.getVersion(), reference
.getVersion(), reference.getClassifier(), reference.getType() ); .getClassifier(), reference.getType() );
} }
public String toPath( ProjectReference reference ) public String toPath( ProjectReference reference )
@ -73,8 +73,8 @@ public class LegacyBidirectionalRepositoryLayout
public String toPath( ArtifactReference artifact ) public String toPath( ArtifactReference artifact )
{ {
return toPath( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getClassifier(), return toPath( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(),
artifact.getType() ); artifact.getClassifier(), artifact.getType() );
} }
private String toPath( String groupId, String artifactId, String version, String classifier, String type ) private String toPath( String groupId, String artifactId, String version, String classifier, String type )
@ -119,9 +119,22 @@ public class LegacyBidirectionalRepositoryLayout
return type + "s"; return type + "s";
} }
public ArchivaArtifact toArtifact( String path ) class PathReferences
{
public String groupId;
public String pathType;
public String type;
public FilenameParts fileParts;
}
private PathReferences toPathReferences( String path, boolean parseFilename )
throws LayoutException throws LayoutException
{ {
PathReferences prefs = new PathReferences();
String normalizedPath = StringUtils.replace( path, "\\", "/" ); String normalizedPath = StringUtils.replace( path, "\\", "/" );
String pathParts[] = StringUtils.split( normalizedPath, '/' ); String pathParts[] = StringUtils.split( normalizedPath, '/' );
@ -142,30 +155,49 @@ public class LegacyBidirectionalRepositoryLayout
} }
// The Group ID. // The Group ID.
String groupId = pathParts[0]; prefs.groupId = pathParts[0];
// The Expected Type. // The Expected Type.
String expectedType = pathParts[1]; prefs.pathType = pathParts[1];
if ( parseFilename )
{
// The Filename. // The Filename.
String filename = pathParts[2]; String filename = pathParts[2];
FilenameParts fileParts = RepositoryLayoutUtils.splitFilename( filename, null ); prefs.fileParts = RepositoryLayoutUtils.splitFilename( filename, null );
String type = extensionMapper.getType( filename ); prefs.type = extensionMapper.getType( filename );
}
ArchivaArtifact artifact = new ArchivaArtifact( groupId, fileParts.artifactId, fileParts.version, return prefs;
fileParts.classifier, type ); }
public ProjectReference toProjectReference( String path )
throws LayoutException
{
throw new LayoutException( "Cannot parse legacy paths to a Project Reference." );
}
public ArchivaArtifact toArtifact( String path )
throws LayoutException
{
PathReferences pathrefs = toPathReferences( path, true );
ArchivaArtifact artifact = new ArchivaArtifact( pathrefs.groupId, pathrefs.fileParts.artifactId,
pathrefs.fileParts.version, pathrefs.fileParts.classifier,
pathrefs.type );
// Sanity Checks. // Sanity Checks.
if ( StringUtils.isEmpty( fileParts.extension ) ) if ( StringUtils.isEmpty( pathrefs.fileParts.extension ) )
{ {
throw new LayoutException( "Invalid artifact, no extension." ); throw new LayoutException( "Invalid artifact, no extension." );
} }
if ( !expectedType.equals( fileParts.extension + "s" ) ) if ( !pathrefs.pathType.equals( pathrefs.fileParts.extension + "s" ) )
{ {
throw new LayoutException( "Invalid artifact, extension and layout specified type mismatch." ); throw new LayoutException( "Invalid artifact, mismatch on extension <" + pathrefs.fileParts.extension
+ "> and layout specified type<" + pathrefs.pathType + ">." );
} }
return artifact; return artifact;