Author: oching
Date: Mon Jul 14 02:04:34 2008
New Revision: 676516
URL: http://svn.apache.org/viewvc?rev=676516&view=rev
Log:
[MRM-872]
-generate checksums for the merged metadata
-additional fixes for handling the requests for the merged metadata and it's
checksums
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/RepositoryServlet.java
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java?rev=676516&r1=676515&r2=676516&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
Mon Jul 14 02:04:34 2008
@@ -30,6 +30,7 @@
import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavResource;
@@ -73,10 +74,9 @@
import org.apache.maven.model.Model;
import org.apache.maven.model.Relocation;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.codehaus.plexus.evaluator.DefaultExpressionEvaluator;
-import org.codehaus.plexus.evaluator.EvaluatorException;
-import org.codehaus.plexus.evaluator.ExpressionEvaluator;
-import org.codehaus.plexus.evaluator.sources.SystemPropertyExpressionSource;
+import org.codehaus.plexus.digest.ChecksumFile;
+import org.codehaus.plexus.digest.Digester;
+import org.codehaus.plexus.digest.DigesterException;
import org.codehaus.plexus.redback.authentication.AuthenticationException;
import org.codehaus.plexus.redback.authentication.AuthenticationResult;
import org.codehaus.plexus.redback.authorization.AuthorizationException;
@@ -155,11 +155,28 @@
*/
private final LockManager lockManager = new SimpleLockManager();
- /** @plexus.requirement */
+ /**
+ * @plexus.requirement
+ */
private RepositoryContentConsumers consumers;
-
- private String defaultMergedMetadataLocation =
"${appserver.base}/data/maven-metadata.xml";
+ /**
+ * @plexus.requirement
+ */
+ private ChecksumFile checksum;
+
+ /**
+ * @plexus.requirement role-hint="sha1"
+ */
+ private Digester digestSha1;
+
+ /**
+ * @plexus.requirement role-hint="md5";
+ */
+ private Digester digestMd5;
+
+ private static final String mergedMetadataFilename =
"/merged-maven-metadata.xml";
+
public DavResource createResource( final DavResourceLocator locator, final
DavServletRequest request,
final DavServletResponse response )
throws DavException
@@ -242,7 +259,7 @@
}
}
}
- catch ( DavException de )
+ catch ( DavException de )
{
e = de;
continue;
@@ -271,56 +288,91 @@
{
throw e;
}
-
- // merge metadata only when requested via the repo group
- if ( request.getRequestURI().endsWith( "metadata.xml" ) &&
repoGroupConfig != null )
+
+ String requestedResource = request.getRequestURI();
+
+ // MRM-872 : merge all available metadata
+ // merge metadata only when requested via the repo group
+ if ( ( repositoryRequest.isMetadata( requestedResource ) || (
requestedResource.endsWith( "metadata.xml.sha1" ) ||
requestedResource.endsWith( "metadata.xml.md5" ) ) ) &&
+ repoGroupConfig != null )
{
- // TODO MRM-872 : must merge all available metadatas
- ArchivaRepositoryMetadata mergedMetadata = new
ArchivaRepositoryMetadata();
- for ( String resourceAbsPath : resourcesInAbsolutePath )
- {
- try
- {
- File metadataFile = new File( resourceAbsPath );
- ArchivaRepositoryMetadata repoMetadata =
RepositoryMetadataReader.read( metadataFile );
- mergedMetadata = RepositoryMetadataMerge.merge(
mergedMetadata, repoMetadata );
- }
- catch ( RepositoryMetadataException r )
- {
- throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
- "Error occurred while reading
metadata file." );
- }
- }
-
- try
- {
- if( StringUtils.contains( defaultMergedMetadataLocation, "${"
) )
- {
- defaultMergedMetadataLocation =
- evaluateExpressions( defaultMergedMetadataLocation );
- }
- File resourceFile = writeMergedMetadataToFile( mergedMetadata,
defaultMergedMetadataLocation );
+ // this should only be at the project level not version level!
+ if( isProjectReference( requestedResource ) )
+ {
+ String artifactId = StringUtils.substringBeforeLast(
requestedResource.replace( '\\', '/' ), "/" );
+ artifactId = StringUtils.substringAfterLast( artifactId, "/" );
- LogicalResource logicalResource =
- new LogicalResource(
RepositoryPathUtil.getLogicalResource( locator.getResourcePath() ) );
-
- ArchivaDavResource metadataResource =
- new ArchivaDavResource( resourceFile.getAbsolutePath(),
logicalResource.getPath(), null,
- request.getRemoteAddr(),
request.getDavSession(), archivaLocator, this,
- mimeTypes, auditListeners,
consumers );
- availableResources.add( 0, metadataResource );
- }
- catch ( EvaluatorException ee )
- {
- throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ee.getMessage() );
- }
- catch ( RepositoryMetadataException r )
- {
- throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
- "Error occurred while writing metadata
file." );
+ ArchivaDavResource res = ( ArchivaDavResource )
availableResources.get( 0 );
+ String filePath = StringUtils.substringBeforeLast(
res.getLocalResource().getAbsolutePath().replace( '\\', '/' ), "/" );
+ filePath = filePath + mergedMetadataFilename;
+
+ // for MRM-872 handle checksums of the merged metadata files
+ if( repositoryRequest.isSupportFile( requestedResource ) )
+ {
+ File metadataChecksum = new File( filePath + "."
+ + StringUtils.substringAfterLast(
requestedResource, "." ) );
+ if( metadataChecksum.exists() )
+ {
+ LogicalResource logicalResource =
+ new LogicalResource(
RepositoryPathUtil.getLogicalResource( locator.getResourcePath() ) );
+
+ ArchivaDavResource metadataChecksumResource =
+ new ArchivaDavResource(
metadataChecksum.getAbsolutePath(), logicalResource.getPath(), null,
+ request.getRemoteAddr(),
request.getDavSession(), archivaLocator, this,
+ mimeTypes, auditListeners,
consumers );
+ availableResources.add( 0, metadataChecksumResource );
+ }
+ }
+ else
+ { // merge the metadata of all repos under group
+ ArchivaRepositoryMetadata mergedMetadata = new
ArchivaRepositoryMetadata();
+ for ( String resourceAbsPath : resourcesInAbsolutePath )
+ {
+ try
+ {
+ File metadataFile = new File( resourceAbsPath );
+ ArchivaRepositoryMetadata repoMetadata =
RepositoryMetadataReader.read( metadataFile );
+ mergedMetadata = RepositoryMetadataMerge.merge(
mergedMetadata, repoMetadata );
+ }
+ catch ( RepositoryMetadataException r )
+ {
+ throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Error occurred while
reading metadata file." );
+ }
+ }
+
+ try
+ {
+ File resourceFile = writeMergedMetadataToFile(
mergedMetadata, filePath );
+
+ LogicalResource logicalResource =
+ new LogicalResource(
RepositoryPathUtil.getLogicalResource( locator.getResourcePath() ) );
+
+ ArchivaDavResource metadataResource =
+ new ArchivaDavResource(
resourceFile.getAbsolutePath(), logicalResource.getPath(), null,
+ request.getRemoteAddr(),
request.getDavSession(), archivaLocator, this,
+ mimeTypes, auditListeners,
consumers );
+ availableResources.add( 0, metadataResource );
+ }
+ catch ( RepositoryMetadataException r )
+ {
+ throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Error occurred while writing
metadata file." );
+ }
+ catch ( IOException ie )
+ {
+ throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Error occurred while generating checksum files."
);
+ }
+ catch ( DigesterException de )
+ {
+ throw new DavException(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+ "Error occurred while generating checksum files."
);
+ }
+ }
}
}
-
+
DavResource resource = availableResources.get( 0 );
setHeaders(response, locator, resource );
@@ -888,31 +940,48 @@
}
private File writeMergedMetadataToFile( ArchivaRepositoryMetadata
mergedMetadata, String outputFilename )
- throws EvaluatorException, RepositoryMetadataException
- {
- File outputFile = new File( outputFilename );
+ throws RepositoryMetadataException, DigesterException, IOException
+ {
+ File outputFile = new File( outputFilename );
+ if( outputFile.exists() )
+ {
+ FileUtils.deleteQuietly( outputFile );
+ }
+
outputFile.getParentFile().mkdirs();
RepositoryMetadataWriter.write( mergedMetadata, outputFile );
+ createChecksumFile( outputFilename, digestSha1 );
+ createChecksumFile( outputFilename, digestMd5 );
+
return outputFile;
}
- private String evaluateExpressions( String outputFilename )
- throws EvaluatorException
- {
- ExpressionEvaluator expressionEvaluator = new
DefaultExpressionEvaluator();
- expressionEvaluator.addExpressionSource( new
SystemPropertyExpressionSource() );
-
- return expressionEvaluator.expand( outputFilename );
+ private void createChecksumFile( String path, Digester digester )
+ throws DigesterException, IOException
+ {
+ File checksumFile = new File( path + digester.getFilenameExtension()
);
+ if ( !checksumFile.exists() )
+ {
+ FileUtils.deleteQuietly( checksumFile );
+ checksum.createChecksum( new File( path ), digester );
+ }
+ else if ( !checksumFile.isFile() )
+ {
+ log.error( "Checksum file is not a file." );
+ }
}
-
- public String getDefaultMergedMetadataLocation()
- {
- return defaultMergedMetadataLocation;
+
+ private boolean isProjectReference( String requestedResource )
+ {
+ try
+ {
+ VersionedReference versionRef = metadataTools.toVersionedReference(
requestedResource );
+ return false;
+ }
+ catch ( RepositoryMetadataException re )
+ {
+ return true;
+ }
}
-
- public void setDefaultMergedMetadataLocation( String
defaultMergedMetadataLocation )
- {
- this.defaultMergedMetadataLocation = defaultMergedMetadataLocation;
- }
}
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/RepositoryServlet.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/RepositoryServlet.java?rev=676516&r1=676515&r2=676516&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/RepositoryServlet.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/RepositoryServlet.java
Mon Jul 14 02:04:34 2008
@@ -29,6 +29,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavLocatorFactory;
import org.apache.jackrabbit.webdav.DavMethods;
@@ -45,7 +46,6 @@
import org.apache.maven.archiva.configuration.ConfigurationEvent;
import org.apache.maven.archiva.configuration.ConfigurationListener;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
-import org.apache.maven.archiva.repository.audit.AuditEvent;
import org.apache.maven.archiva.security.ServletAuthenticator;
import
org.codehaus.plexus.redback.xwork.filter.authentication.HttpAuthenticator;
import org.codehaus.plexus.spring.PlexusToSpringUtils;
@@ -157,12 +157,7 @@
}
}
finally
- {
- if( resource != null && resource.getResourcePath().endsWith(
"metadata.xml" ) );
- {
- String tmpFile = ( (ArchivaDavResourceFactory)
getResourceFactory() ).getDefaultMergedMetadataLocation();
- FileUtils.deleteQuietly( new File( tmpFile ) );
- }
+ {
getDavSessionProvider().releaseSession( webdavRequest );
}
}
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java?rev=676516&r1=676515&r2=676516&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/RepositoryServletRepositoryGroupTest.java
Mon Jul 14 02:04:34 2008
@@ -252,13 +252,40 @@
File returnedMetadata = new File( getBasedir(),
"/target/test-classes/retrievedMetadataFile.xml");
FileUtils.writeStringToFile( returnedMetadata, response.getText() );
ArchivaRepositoryMetadata metadata = RepositoryMetadataReader.read(
returnedMetadata );
-
+
assertResponseOK( response );
assertEquals( "Versions list size", 4,
metadata.getAvailableVersions().size() );
assertTrue( "Versions list contains version 1.0",
metadata.getAvailableVersions().contains( "1.0" ) );
assertTrue( "Versions list contains version 1.5",
metadata.getAvailableVersions().contains( "1.5" ) );
assertTrue( "Versions list contains version 2.0",
metadata.getAvailableVersions().contains( "2.0" ) );
assertTrue( "Versions list contains version 2.5",
metadata.getAvailableVersions().contains( "2.5" ) );
+
+ //check if the checksum files were generated
+ File checksumFileSha1 = new File( repoRootFirst, resourceName +
".sha1" );
+ checksumFileSha1.getParentFile().mkdirs();
+ FileUtils.writeStringToFile( checksumFileSha1, "3290853214d3687134",
null );
+
+ File checksumFileMd5 = new File( repoRootFirst, resourceName + ".md5"
);
+ checksumFileMd5.getParentFile().mkdirs();
+ FileUtils.writeStringToFile( checksumFileMd5,
"98745897234eda12836423", null );
+
+ // request the sha1 checksum of the metadata
+ request =
+ new GetMethodWebRequest( "http://machine.com/repository/" +
REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
+ "dummy-merged-metadata-resource/maven-metadata.xml.sha1" );
+ response = sc.getResource( request );
+
+ assertResponseOK( response );
+ assertEquals( "d2321a573e0488bca571b624f891104009408dd8
merged-maven-metadata.xml", response.getText() );
+
+ // request the md5 checksum of the metadata
+ request =
+ new GetMethodWebRequest( "http://machine.com/repository/" +
REPO_GROUP_WITH_VALID_REPOS + "/dummy/" +
+ "dummy-merged-metadata-resource/maven-metadata.xml.md5" );
+ response = sc.getResource( request );
+
+ assertResponseOK( response );
+ assertEquals( "79d271fbe8bd1d17b23273937750d407
merged-maven-metadata.xml", response.getText().trim() );
}
protected void assertResponseMethodNotAllowed( WebResponse response )
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml?rev=676516&r1=676515&r2=676516&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/resources/org/apache/maven/archiva/webdav/RepositoryServletTest.xml
Mon Jul 14 02:04:34 2008
@@ -152,6 +152,20 @@
<role>org.apache.maven.archiva.repository.scanner.RepositoryContentConsumers</role>
<role-hint>default</role-hint>
</requirement>
+ <requirement>
+ <role>org.codehaus.plexus.digest.ChecksumFile</role>
+ <field-name>checksum</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.digest.Digester</role>
+ <role-hint>sha1</role-hint>
+ <field-name>digestSha1</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.digest.Digester</role>
+ <role-hint>md5</role-hint>
+ <field-name>digestMd5</field-name>
+ </requirement>
</requirements>
</component>
</components>