mirror of https://github.com/apache/archiva.git
Refactoring to StorageAsset access
This commit is contained in:
parent
8e4acdc82a
commit
bb3b074aaf
|
@ -33,6 +33,10 @@
|
|||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-policies</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva.redback.components.registry</groupId>
|
||||
<artifactId>spring-registry-api</artifactId>
|
||||
|
|
|
@ -31,6 +31,8 @@ import org.apache.archiva.model.ArtifactReference;
|
|||
import org.apache.archiva.repository.ContentNotFoundException;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.events.RepositoryListener;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -211,22 +213,22 @@ public abstract class AbstractRepositoryPurge
|
|||
log.error( "Error during metadata retrieval {}: {}", metaBaseId, e.getMessage( ) );
|
||||
}
|
||||
}
|
||||
Path artifactFile = repository.toFile( reference );
|
||||
StorageAsset artifactFile = repository.toFile( reference );
|
||||
|
||||
for ( RepositoryListener listener : listeners )
|
||||
{
|
||||
listener.deleteArtifact( metadataRepository, repository.getId( ), reference.getGroupId( ),
|
||||
reference.getArtifactId( ), reference.getVersion( ),
|
||||
artifactFile.getFileName( ).toString( ) );
|
||||
artifactFile.getName( ));
|
||||
}
|
||||
try
|
||||
{
|
||||
Files.delete( artifactFile );
|
||||
log.debug( "File deleted: {}", artifactFile.toAbsolutePath( ) );
|
||||
artifactFile.getStorage().removeAsset(artifactFile);
|
||||
log.debug( "File deleted: {}", artifactFile );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
log.error( "Could not delete file {}: {}", artifactFile.toAbsolutePath( ), e.getMessage( ), e );
|
||||
log.error( "Could not delete file {}: {}", artifactFile.toString(), e.getMessage( ), e );
|
||||
continue;
|
||||
}
|
||||
try
|
||||
|
@ -364,11 +366,11 @@ public abstract class AbstractRepositoryPurge
|
|||
}
|
||||
}
|
||||
|
||||
private void deleteSilently( Path path )
|
||||
private void deleteSilently( StorageAsset path )
|
||||
{
|
||||
try
|
||||
{
|
||||
Files.deleteIfExists( path );
|
||||
path.getStorage().removeAsset(path);
|
||||
triggerAuditEvent( repository.getRepository( ).getId( ), path.toString( ), AuditEvent.PURGE_FILE );
|
||||
}
|
||||
catch ( IOException e )
|
||||
|
@ -387,22 +389,23 @@ public abstract class AbstractRepositoryPurge
|
|||
*
|
||||
* @param artifactFile the file to base off of.
|
||||
*/
|
||||
private void purgeSupportFiles( Path artifactFile )
|
||||
private void purgeSupportFiles( StorageAsset artifactFile )
|
||||
{
|
||||
Path parentDir = artifactFile.getParent( );
|
||||
StorageAsset parentDir = artifactFile.getParent( );
|
||||
|
||||
if ( !Files.exists( parentDir ) )
|
||||
if ( !parentDir.exists() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final String artifactName = artifactFile.getFileName( ).toString( );
|
||||
final String artifactName = artifactFile.getName( );
|
||||
|
||||
try
|
||||
{
|
||||
Files.find( parentDir, 3,
|
||||
( path, basicFileAttributes ) -> path.getFileName( ).toString( ).startsWith( artifactName )
|
||||
&& Files.isRegularFile( path ) ).forEach( this::deleteSilently );
|
||||
|
||||
StorageUtil.recurse(parentDir, a -> {
|
||||
if (!artifactFile.isContainer() && artifactFile.getName().startsWith(artifactName)) deleteSilently(a);
|
||||
}, true, 3 );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.apache.archiva.repository.ContentNotFoundException;
|
|||
import org.apache.archiva.repository.LayoutException;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.events.RepositoryListener;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.time.DateUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -115,12 +116,12 @@ public class DaysOldRepositoryPurge
|
|||
artifactFile.toAbsolutePath( ).toString() );
|
||||
newArtifactReference.setVersion( version );
|
||||
|
||||
Path newArtifactFile = repository.toFile( newArtifactReference );
|
||||
StorageAsset newArtifactFile = repository.toFile( newArtifactReference );
|
||||
|
||||
// Is this a generic snapshot "1.0-SNAPSHOT" ?
|
||||
if ( VersionUtil.isGenericSnapshot( newArtifactReference.getVersion( ) ) )
|
||||
{
|
||||
if ( Files.getLastModifiedTime( newArtifactFile ).toMillis() < olderThanThisDate.getTimeInMillis( ) )
|
||||
if ( newArtifactFile.getModificationTime().toEpochMilli() < olderThanThisDate.getTimeInMillis( ) )
|
||||
{
|
||||
artifactsToDelete.addAll( repository.getRelatedArtifacts( newArtifactReference ) );
|
||||
}
|
||||
|
@ -138,7 +139,7 @@ public class DaysOldRepositoryPurge
|
|||
}
|
||||
purge( artifactsToDelete );
|
||||
}
|
||||
catch ( ContentNotFoundException | IOException e )
|
||||
catch ( ContentNotFoundException e )
|
||||
{
|
||||
throw new RepositoryPurgeException( e.getMessage( ), e );
|
||||
}
|
||||
|
|
|
@ -38,6 +38,10 @@
|
|||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-checksum</artifactId>
|
||||
|
@ -81,6 +85,11 @@
|
|||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-fs</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-test-utils</artifactId>
|
||||
|
|
|
@ -20,16 +20,13 @@ package org.apache.archiva.policies;
|
|||
*/
|
||||
|
||||
import org.apache.archiva.common.utils.VersionUtil;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ package org.apache.archiva.policies;
|
|||
*/
|
||||
|
||||
import org.apache.archiva.policies.urlcache.UrlFailureCache;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
|
@ -22,7 +22,7 @@ package org.apache.archiva.policies;
|
|||
import org.apache.archiva.checksum.ChecksumAlgorithm;
|
||||
import org.apache.archiva.checksum.ChecksummedFile;
|
||||
import org.apache.archiva.checksum.UpdateStatus;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.archiva.policies;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.archiva.policies;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.archiva.policies;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
|
@ -19,11 +19,10 @@ package org.apache.archiva.policies;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
|
|
@ -20,7 +20,10 @@ package org.apache.archiva.policies;
|
|||
*/
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.policies.urlcache.UrlFailureCache;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
@ -28,6 +31,7 @@ import org.springframework.test.context.ContextConfiguration;
|
|||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Properties;
|
||||
|
@ -47,6 +51,8 @@ public class CachedFailuresPolicyTest
|
|||
@Inject
|
||||
private UrlFailureCache urlFailureCache;
|
||||
|
||||
private FilesystemStorage filesystemStorage;
|
||||
|
||||
@Inject
|
||||
@Named( value = "preDownloadPolicy#cache-failures" )
|
||||
DownloadPolicy downloadPolicy;
|
||||
|
@ -57,9 +63,11 @@ public class CachedFailuresPolicyTest
|
|||
return downloadPolicy;
|
||||
}
|
||||
|
||||
private Path getFile()
|
||||
{
|
||||
return Paths.get( "target/cache-failures/" + getName() + ".txt" );
|
||||
private StorageAsset getFile() throws IOException {
|
||||
if (filesystemStorage==null) {
|
||||
filesystemStorage = new FilesystemStorage(Paths.get("target/cache-failures"), new DefaultFileLockManager());
|
||||
}
|
||||
return filesystemStorage.getAsset( getName() + ".txt" );
|
||||
}
|
||||
|
||||
private Properties createRequest()
|
||||
|
@ -74,7 +82,7 @@ public class CachedFailuresPolicyTest
|
|||
throws Exception
|
||||
{
|
||||
DownloadPolicy policy = lookupPolicy();
|
||||
Path localFile = getFile();
|
||||
StorageAsset localFile = getFile();
|
||||
Properties request = createRequest();
|
||||
|
||||
request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" );
|
||||
|
@ -88,7 +96,7 @@ public class CachedFailuresPolicyTest
|
|||
{
|
||||
|
||||
DownloadPolicy policy = lookupPolicy();
|
||||
Path localFile = getFile();
|
||||
StorageAsset localFile = getFile();
|
||||
Properties request = createRequest();
|
||||
// make unique name
|
||||
String url = "http://a.bad.hostname.maven.org/path/to/resource"+ System.currentTimeMillis() +".txt";
|
||||
|
|
|
@ -19,6 +19,9 @@ package org.apache.archiva.policies;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.junit.Rule;
|
||||
|
@ -31,6 +34,7 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
@ -51,6 +55,8 @@ public class ChecksumPolicyTest
|
|||
|
||||
private static final String BAD = "bad";
|
||||
|
||||
private static FilesystemStorage filesystemStorage;
|
||||
|
||||
@Inject
|
||||
@Named( value = "postDownloadPolicy#checksum" )
|
||||
PostDownloadPolicy downloadPolicy;
|
||||
|
@ -195,7 +201,7 @@ public class ChecksumPolicyTest
|
|||
throws Exception
|
||||
{
|
||||
PostDownloadPolicy policy = lookupPolicy();
|
||||
Path localFile = createTestableFiles( null, null );
|
||||
StorageAsset localFile = createTestableFiles( null, null );
|
||||
Properties request = createRequest();
|
||||
|
||||
policy.applyPolicy( ChecksumPolicy.IGNORE, request, localFile );
|
||||
|
@ -205,7 +211,7 @@ public class ChecksumPolicyTest
|
|||
throws Exception
|
||||
{
|
||||
PostDownloadPolicy policy = lookupPolicy();
|
||||
Path localFile = createTestableFiles( md5State, sha1State );
|
||||
StorageAsset localFile = createTestableFiles( md5State, sha1State );
|
||||
Properties request = createRequest();
|
||||
|
||||
boolean actualResult;
|
||||
|
@ -220,9 +226,9 @@ public class ChecksumPolicyTest
|
|||
actualResult = false;
|
||||
String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State );
|
||||
|
||||
assertFalse( msg + " local file should not exist:", Files.exists(localFile) );
|
||||
Path md5File = localFile.toAbsolutePath().resolveSibling( localFile.getFileName() + ".sha1" );
|
||||
Path sha1File = localFile.toAbsolutePath().resolveSibling( localFile.getFileName() + ".md5" );
|
||||
assertFalse( msg + " local file should not exist:", localFile.exists() );
|
||||
Path md5File = localFile.getFilePath().toAbsolutePath().resolveSibling( localFile.getName() + ".sha1" );
|
||||
Path sha1File = localFile.getFilePath().toAbsolutePath().resolveSibling( localFile.getName() + ".md5" );
|
||||
assertFalse( msg + " local md5 file should not exist:", Files.exists(md5File) );
|
||||
assertFalse( msg + " local sha1 file should not exist:", Files.exists(sha1File) );
|
||||
}
|
||||
|
@ -234,7 +240,7 @@ public class ChecksumPolicyTest
|
|||
throws Exception
|
||||
{
|
||||
PostDownloadPolicy policy = lookupPolicy();
|
||||
Path localFile = createTestableFiles( md5State, sha1State );
|
||||
StorageAsset localFile = createTestableFiles( md5State, sha1State );
|
||||
Properties request = createRequest();
|
||||
|
||||
boolean actualResult;
|
||||
|
@ -252,8 +258,8 @@ public class ChecksumPolicyTest
|
|||
assertEquals( createMessage( ChecksumPolicy.FIX, md5State, sha1State ), expectedResult, actualResult );
|
||||
|
||||
// End result should be legitimate SHA1 and MD5 files.
|
||||
Path md5File = localFile.toAbsolutePath().resolveSibling( localFile.getFileName() + ".md5" );
|
||||
Path sha1File = localFile.toAbsolutePath().resolveSibling( localFile.getFileName() + ".sha1" );
|
||||
Path md5File = localFile.getFilePath().toAbsolutePath().resolveSibling( localFile.getName() + ".md5" );
|
||||
Path sha1File = localFile.getFilePath().toAbsolutePath().resolveSibling( localFile.getName() + ".sha1" );
|
||||
|
||||
assertTrue( "ChecksumPolicy.apply(FIX) md5 should exist.", Files.exists(md5File) && Files.isRegularFile(md5File) );
|
||||
assertTrue( "ChecksumPolicy.apply(FIX) sha1 should exist.", Files.exists(sha1File) && Files.isRegularFile(sha1File) );
|
||||
|
@ -336,37 +342,41 @@ public class ChecksumPolicyTest
|
|||
return request;
|
||||
}
|
||||
|
||||
private Path createTestableFiles( String md5State, String sha1State )
|
||||
private StorageAsset createTestableFiles(String md5State, String sha1State )
|
||||
throws Exception
|
||||
{
|
||||
Path sourceDir = getTestFile( "src/test/resources/checksums/" );
|
||||
Path destDir = getTestFile( "target/checksum-tests/" + name.getMethodName() + "/" );
|
||||
FilesystemStorage fs = new FilesystemStorage(Paths.get("target/checksum-tests"), new DefaultFileLockManager());
|
||||
StorageAsset sourceDir = getTestFile( "src/test/resources/checksums/" );
|
||||
StorageAsset destDir = getTestFile( "target/checksum-tests/" + name.getMethodName() + "/" );
|
||||
|
||||
FileUtils.copyFileToDirectory( sourceDir.resolve("artifact.jar" ).toFile(), destDir.toFile() );
|
||||
FileUtils.copyFileToDirectory( sourceDir.getFilePath().resolve("artifact.jar" ).toFile(), destDir.getFilePath().toFile() );
|
||||
|
||||
if ( md5State != null )
|
||||
{
|
||||
Path md5File = sourceDir.resolve("artifact.jar.md5-" + md5State );
|
||||
Path md5File = sourceDir.getFilePath().resolve("artifact.jar.md5-" + md5State );
|
||||
assertTrue( "Testable file exists: " + md5File.getFileName() + ":", Files.exists(md5File) && Files.isRegularFile(md5File) );
|
||||
Path destFile = destDir.resolve("artifact.jar.md5" );
|
||||
Path destFile = destDir.getFilePath().resolve("artifact.jar.md5" );
|
||||
FileUtils.copyFile( md5File.toFile(), destFile.toFile() );
|
||||
}
|
||||
|
||||
if ( sha1State != null )
|
||||
{
|
||||
Path sha1File = sourceDir.resolve("artifact.jar.sha1-" + sha1State );
|
||||
Path sha1File = sourceDir.getFilePath().resolve("artifact.jar.sha1-" + sha1State );
|
||||
assertTrue( "Testable file exists: " + sha1File.getFileName() + ":", Files.exists(sha1File) && Files.isRegularFile(sha1File) );
|
||||
Path destFile = destDir.resolve("artifact.jar.sha1" );
|
||||
Path destFile = destDir.getFilePath().resolve("artifact.jar.sha1" );
|
||||
FileUtils.copyFile( sha1File.toFile(), destFile.toFile() );
|
||||
}
|
||||
|
||||
Path localFile = destDir.resolve("artifact.jar" );
|
||||
return localFile;
|
||||
|
||||
StorageAsset localAsset = fs.getAsset("artifact.jar");
|
||||
return localAsset;
|
||||
}
|
||||
|
||||
public static Path getTestFile( String path )
|
||||
{
|
||||
return Paths.get( org.apache.archiva.common.utils.FileUtils.getBasedir(), path );
|
||||
public static StorageAsset getTestFile( String path ) throws IOException {
|
||||
if (filesystemStorage==null) {
|
||||
filesystemStorage = new FilesystemStorage(Paths.get(org.apache.archiva.common.utils.FileUtils.getBasedir()), new DefaultFileLockManager());
|
||||
}
|
||||
return filesystemStorage.getAsset( path );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.archiva.policies;
|
|||
*/
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
@ -338,17 +339,17 @@ public class ReleasePolicyTest
|
|||
request.setProperty( "version", "2.0" );
|
||||
}
|
||||
|
||||
Path targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
|
||||
Path localFile = targetDir.resolve( path );
|
||||
StorageAsset targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
|
||||
StorageAsset localFile = targetDir.resolve( path );
|
||||
|
||||
Files.deleteIfExists( localFile );
|
||||
Files.deleteIfExists( localFile.getFilePath() );
|
||||
|
||||
if ( createLocalFile )
|
||||
{
|
||||
Files.createDirectories( localFile.getParent());
|
||||
org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile, FILE_ENCODING, "random-junk" );
|
||||
Files.setLastModifiedTime( localFile,
|
||||
FileTime.fromMillis(Files.getLastModifiedTime(localFile).toMillis() - generatedLocalFileUpdateDelta));
|
||||
Files.createDirectories( localFile.getParent().getFilePath());
|
||||
org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile.getFilePath(), FILE_ENCODING, "random-junk" );
|
||||
Files.setLastModifiedTime( localFile.getFilePath(),
|
||||
FileTime.fromMillis(Files.getLastModifiedTime(localFile.getFilePath()).toMillis() - generatedLocalFileUpdateDelta));
|
||||
}
|
||||
|
||||
policy.applyPolicy( setting, request, localFile );
|
||||
|
|
|
@ -20,6 +20,8 @@ package org.apache.archiva.policies;
|
|||
*/
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
@ -80,6 +82,8 @@ public class SnapshotsPolicyTest
|
|||
@Inject @Named(value="preDownloadPolicy#snapshots")
|
||||
PreDownloadPolicy policy;
|
||||
|
||||
private FilesystemStorage filesystemStorage;
|
||||
|
||||
private PreDownloadPolicy lookupPolicy()
|
||||
throws Exception
|
||||
{
|
||||
|
@ -337,17 +341,17 @@ public class SnapshotsPolicyTest
|
|||
request.setProperty( "version", "2.0" );
|
||||
}
|
||||
|
||||
Path targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
|
||||
Path localFile = targetDir.resolve( path );
|
||||
StorageAsset targetDir = ChecksumPolicyTest.getTestFile( "target/test-policy/" );
|
||||
StorageAsset localFile = targetDir.resolve( path );
|
||||
|
||||
Files.deleteIfExists( localFile );
|
||||
Files.deleteIfExists( localFile.getFilePath() );
|
||||
|
||||
if ( createLocalFile )
|
||||
{
|
||||
Files.createDirectories( localFile.getParent());
|
||||
org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile, FILE_ENCODING, "random-junk" );
|
||||
Files.setLastModifiedTime( localFile,
|
||||
FileTime.fromMillis( Files.getLastModifiedTime( localFile ).toMillis() - generatedLocalFileUpdateDelta ));
|
||||
Files.createDirectories( localFile.getParent().getFilePath() );
|
||||
org.apache.archiva.common.utils.FileUtils.writeStringToFile( localFile.getFilePath(), FILE_ENCODING, "random-junk" );
|
||||
Files.setLastModifiedTime( localFile.getFilePath(),
|
||||
FileTime.fromMillis( Files.getLastModifiedTime( localFile.getFilePath() ).toMillis() - generatedLocalFileUpdateDelta ));
|
||||
}
|
||||
|
||||
policy.applyPolicy( setting, request, localFile );
|
||||
|
|
|
@ -20,9 +20,7 @@ package org.apache.archiva.proxy.model;
|
|||
*/
|
||||
|
||||
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
/**
|
||||
* A result from a proxy fetch operation.
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.apache.archiva.model.ArtifactReference;
|
|||
import org.apache.archiva.policies.ProxyDownloadException;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
|
|
@ -22,10 +22,7 @@ package org.apache.archiva.proxy;
|
|||
import org.apache.archiva.checksum.ChecksumAlgorithm;
|
||||
import org.apache.archiva.checksum.ChecksumUtil;
|
||||
import org.apache.archiva.proxy.model.ProxyConnectorRuleType;
|
||||
import org.apache.archiva.common.filelock.FileLockException;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockTimeoutException;
|
||||
import org.apache.archiva.common.filelock.Lock;
|
||||
import org.apache.archiva.configuration.*;
|
||||
import org.apache.archiva.model.ArtifactReference;
|
||||
import org.apache.archiva.model.Keys;
|
||||
|
@ -39,9 +36,9 @@ import org.apache.archiva.redback.components.registry.Registry;
|
|||
import org.apache.archiva.redback.components.registry.RegistryListener;
|
||||
import org.apache.archiva.redback.components.taskqueue.TaskQueueException;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.content.StorageUtil;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.archiva.repository.metadata.MetadataTools;
|
||||
import org.apache.archiva.repository.metadata.RepositoryMetadataException;
|
||||
import org.apache.archiva.scheduler.ArchivaTaskScheduler;
|
||||
|
@ -61,7 +58,6 @@ import javax.inject.Named;
|
|||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
|
|
@ -21,8 +21,8 @@ package org.apache.archiva.admin.model.group;
|
|||
import org.apache.archiva.admin.model.AuditInformation;
|
||||
import org.apache.archiva.admin.model.RepositoryAdminException;
|
||||
import org.apache.archiva.admin.model.beans.RepositoryGroup;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -75,5 +75,5 @@ public interface RepositoryGroupAdmin
|
|||
Map<String, List<String>> getRepositoryToGroupMap()
|
||||
throws RepositoryAdminException;
|
||||
|
||||
Path getMergedIndexDirectory(String repositoryGroupId );
|
||||
StorageAsset getMergedIndexDirectory(String repositoryGroupId );
|
||||
}
|
||||
|
|
|
@ -29,11 +29,11 @@ import org.apache.archiva.configuration.Configuration;
|
|||
import org.apache.archiva.configuration.RepositoryGroupConfiguration;
|
||||
import org.apache.archiva.metadata.model.facets.AuditEvent;
|
||||
import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
|
||||
import org.apache.archiva.repository.EditableRepository;
|
||||
import org.apache.archiva.repository.EditableRepositoryGroup;
|
||||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.RepositoryRegistry;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -47,9 +47,6 @@ import java.nio.file.Files;
|
|||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -112,9 +109,14 @@ public class DefaultRepositoryGroupAdmin
|
|||
|
||||
|
||||
@Override
|
||||
public Path getMergedIndexDirectory( String repositoryGroupId )
|
||||
public StorageAsset getMergedIndexDirectory(String repositoryGroupId )
|
||||
{
|
||||
return groupsDirectory.resolve( repositoryGroupId );
|
||||
org.apache.archiva.repository.RepositoryGroup group = repositoryRegistry.getRepositoryGroup(repositoryGroupId);
|
||||
if (group!=null) {
|
||||
return group.getFeature(IndexCreationFeature.class).get().getLocalIndexPath();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.archiva.admin.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.admin.model.RepositoryAdminException;
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.FileUtils;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.configuration.ArchivaConfiguration;
|
||||
|
@ -40,10 +40,12 @@ import org.apache.archiva.repository.RemoteRepository;
|
|||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
|
||||
import org.apache.archiva.repository.content.FilesystemAsset;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.index.ArtifactContext;
|
||||
import org.apache.maven.index.ArtifactContextProducer;
|
||||
|
@ -143,7 +145,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
|
||||
private Path getIndexPath( ArchivaIndexingContext ctx )
|
||||
{
|
||||
return PathUtil.getPathFromUri( ctx.getPath( ) );
|
||||
return ctx.getPath( ).getFilePath();
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
|
@ -378,9 +380,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void addArtifactsToIndex( final ArchivaIndexingContext context, final Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.addArtifactsToIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -394,9 +396,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void removeArtifactsFromIndex( ArchivaIndexingContext context, Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.deleteArtifactsFromIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -455,7 +457,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
log.warn("Index close failed");
|
||||
}
|
||||
try {
|
||||
FileUtils.deleteDirectory(Paths.get(context.getPath()));
|
||||
StorageUtil.deleteRecursively(context.getPath());
|
||||
} catch (IOException e) {
|
||||
throw new IndexUpdateFailedException("Could not delete index files");
|
||||
}
|
||||
|
@ -530,6 +532,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
URI indexDir = icf.getIndexPath();
|
||||
String indexPath = indexDir.getPath();
|
||||
Path indexDirectory = null;
|
||||
FilesystemStorage filesystemStorage = (FilesystemStorage) repo.getAsset("").getStorage();
|
||||
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
|
||||
{
|
||||
|
||||
|
@ -538,6 +541,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
if ( indexDirectory.isAbsolute( ) )
|
||||
{
|
||||
indexPath = indexDirectory.getFileName().toString();
|
||||
filesystemStorage = new FilesystemStorage(indexDirectory.getParent(), new DefaultFileLockManager());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -554,7 +558,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
{
|
||||
Files.createDirectories( indexDirectory );
|
||||
}
|
||||
return new FilesystemAsset( indexPath, indexDirectory);
|
||||
return new FilesystemAsset( filesystemStorage, indexPath, indexDirectory);
|
||||
}
|
||||
|
||||
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
|
||||
|
|
|
@ -19,8 +19,12 @@ package org.apache.archiva.admin.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.index.context.IndexingContext;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -38,10 +42,16 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
|
||||
private IndexingContext delegate;
|
||||
private Repository repository;
|
||||
private FilesystemStorage filesystemStorage;
|
||||
|
||||
MavenIndexContextMock(Repository repository, IndexingContext delegate) {
|
||||
this.delegate = delegate;
|
||||
this.repository = repository;
|
||||
try {
|
||||
this.filesystemStorage = new FilesystemStorage(delegate.getIndexDirectoryFile().toPath(), new DefaultFileLockManager());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -56,8 +66,9 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
}
|
||||
|
||||
@Override
|
||||
public URI getPath() {
|
||||
return delegate.getIndexDirectoryFile().toURI();
|
||||
public StorageAsset getPath() {
|
||||
return
|
||||
new FilesystemAsset(filesystemStorage, "", delegate.getIndexDirectoryFile().toPath());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -21,10 +21,9 @@ package org.apache.archiva.admin.mock;
|
|||
|
||||
import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
|
||||
import org.apache.archiva.repository.RepositoryGroup;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* @author Olivier Lamy
|
||||
*/
|
||||
|
@ -34,7 +33,7 @@ public class MockMergedRemoteIndexesScheduler
|
|||
{
|
||||
|
||||
@Override
|
||||
public void schedule( RepositoryGroup repositoryGroup, Path directory )
|
||||
public void schedule(RepositoryGroup repositoryGroup, StorageAsset directory )
|
||||
{
|
||||
// no op
|
||||
}
|
||||
|
|
|
@ -38,6 +38,10 @@
|
|||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
|
|
|
@ -21,10 +21,8 @@ package org.apache.archiva.indexer;
|
|||
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.apache.archiva.indexer;
|
|||
*/
|
||||
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
|
@ -48,7 +49,7 @@ public interface ArchivaIndexingContext {
|
|||
* The path where the index is stored.
|
||||
* @return
|
||||
*/
|
||||
URI getPath();
|
||||
StorageAsset getPath();
|
||||
|
||||
/**
|
||||
* Returns true, if the index has no entries or is not initialized.
|
||||
|
|
|
@ -18,6 +18,8 @@ package org.apache.archiva.indexer.merger;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collection;
|
||||
|
||||
|
@ -47,7 +49,7 @@ public class IndexMergerRequest
|
|||
|
||||
private int mergedIndexTtl;
|
||||
|
||||
private Path mergedIndexDirectory;
|
||||
private StorageAsset mergedIndexDirectory;
|
||||
|
||||
private boolean temporary;
|
||||
|
||||
|
@ -121,17 +123,17 @@ public class IndexMergerRequest
|
|||
this.mergedIndexTtl = mergedIndexTtl;
|
||||
}
|
||||
|
||||
public Path getMergedIndexDirectory()
|
||||
public StorageAsset getMergedIndexDirectory()
|
||||
{
|
||||
return mergedIndexDirectory;
|
||||
}
|
||||
|
||||
public void setMergedIndexDirectory( Path mergedIndexDirectory )
|
||||
public void setMergedIndexDirectory( StorageAsset mergedIndexDirectory )
|
||||
{
|
||||
this.mergedIndexDirectory = mergedIndexDirectory;
|
||||
}
|
||||
|
||||
public IndexMergerRequest mergedIndexDirectory( Path mergedIndexDirectory )
|
||||
public IndexMergerRequest mergedIndexDirectory( StorageAsset mergedIndexDirectory )
|
||||
{
|
||||
this.mergedIndexDirectory = mergedIndexDirectory;
|
||||
return this;
|
||||
|
|
|
@ -21,8 +21,7 @@ package org.apache.archiva.indexer.merger;
|
|||
|
||||
|
||||
import org.apache.archiva.repository.RepositoryGroup;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
/**
|
||||
* @author Olivier Lamy
|
||||
|
@ -35,8 +34,9 @@ public interface MergedRemoteIndexesScheduler
|
|||
* will check if this repository group need to a schedule a cron to download/merge
|
||||
* remote indexes
|
||||
* @param repositoryGroup
|
||||
* @param directory
|
||||
*/
|
||||
void schedule(RepositoryGroup repositoryGroup, Path directory );
|
||||
void schedule(RepositoryGroup repositoryGroup, StorageAsset directory );
|
||||
|
||||
void unschedule( RepositoryGroup repositoryGroup );
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@ package org.apache.archiva.indexer.merger;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Date;
|
||||
|
@ -30,7 +32,7 @@ public class TemporaryGroupIndex
|
|||
{
|
||||
private long creationTime = new Date().getTime();
|
||||
|
||||
private Path directory;
|
||||
private StorageAsset directory;
|
||||
|
||||
private String indexId;
|
||||
|
||||
|
@ -38,7 +40,7 @@ public class TemporaryGroupIndex
|
|||
|
||||
private int mergedIndexTtl;
|
||||
|
||||
public TemporaryGroupIndex(Path directory, String indexId, String groupId, int mergedIndexTtl)
|
||||
public TemporaryGroupIndex(StorageAsset directory, String indexId, String groupId, int mergedIndexTtl)
|
||||
{
|
||||
this.directory = directory;
|
||||
this.indexId = indexId;
|
||||
|
@ -57,12 +59,12 @@ public class TemporaryGroupIndex
|
|||
return this;
|
||||
}
|
||||
|
||||
public Path getDirectory()
|
||||
public StorageAsset getDirectory()
|
||||
{
|
||||
return directory;
|
||||
}
|
||||
|
||||
public TemporaryGroupIndex setDirectory( Path directory )
|
||||
public TemporaryGroupIndex setDirectory( StorageAsset directory )
|
||||
{
|
||||
this.directory = directory;
|
||||
return this;
|
||||
|
|
|
@ -20,8 +20,6 @@ package org.apache.archiva.repository;
|
|||
*/
|
||||
|
||||
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
|
|
|
@ -23,7 +23,7 @@ import org.apache.archiva.model.ArchivaArtifact;
|
|||
import org.apache.archiva.model.ArtifactReference;
|
||||
import org.apache.archiva.model.ProjectReference;
|
||||
import org.apache.archiva.model.VersionedReference;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ package org.apache.archiva.repository;
|
|||
*/
|
||||
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.features.RepositoryFeature;
|
||||
|
||||
import java.net.URI;
|
||||
|
|
|
@ -19,8 +19,7 @@ package org.apache.archiva.repository;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
|
@ -22,12 +22,11 @@ package org.apache.archiva.repository.features;
|
|||
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryEventListener;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import static org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
|
||||
import static org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_PACKED_INDEX_PATH;
|
||||
|
|
|
@ -41,6 +41,10 @@
|
|||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-model</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-fs</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-checksum</artifactId>
|
||||
|
|
|
@ -28,6 +28,8 @@ import org.apache.archiva.indexer.merger.IndexMergerRequest;
|
|||
import org.apache.archiva.indexer.merger.TemporaryGroupIndex;
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryRegistry;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.lang.time.StopWatch;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -87,7 +89,7 @@ public class DefaultIndexMerger
|
|||
stopWatch.reset();
|
||||
stopWatch.start();
|
||||
|
||||
Path mergedIndexDirectory = indexMergerRequest.getMergedIndexDirectory();
|
||||
StorageAsset mergedIndexDirectory = indexMergerRequest.getMergedIndexDirectory();
|
||||
Repository destinationRepository = repositoryRegistry.getRepository(indexMergerRequest.getGroupId());
|
||||
|
||||
ArchivaIndexManager idxManager = repositoryRegistry.getIndexManager(destinationRepository.getType());
|
||||
|
@ -131,10 +133,10 @@ public class DefaultIndexMerger
|
|||
ctx.close(true);
|
||||
temporaryGroupIndexes.remove( temporaryGroupIndex );
|
||||
temporaryContextes.remove( ctx );
|
||||
Path directory = temporaryGroupIndex.getDirectory();
|
||||
if ( directory != null && Files.exists(directory) )
|
||||
StorageAsset directory = temporaryGroupIndex.getDirectory();
|
||||
if ( directory != null && directory.exists() )
|
||||
{
|
||||
FileUtils.deleteDirectory( directory );
|
||||
StorageUtil.deleteRecursively( directory );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.apache.archiva.indexer.merger;
|
|||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.RepositoryGroup;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -59,7 +60,7 @@ public class DefaultMergedRemoteIndexesScheduler
|
|||
private Map<String, ScheduledFuture> scheduledFutureMap = new ConcurrentHashMap<>();
|
||||
|
||||
@Override
|
||||
public void schedule(RepositoryGroup repositoryGroup, Path directory )
|
||||
public void schedule(RepositoryGroup repositoryGroup, StorageAsset directory )
|
||||
{
|
||||
if ( StringUtils.isEmpty( repositoryGroup.getSchedulingDefinition() ) )
|
||||
{
|
||||
|
|
|
@ -20,17 +20,12 @@ package org.apache.archiva.repository;
|
|||
*/
|
||||
|
||||
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Simple implementation of a managed repository.
|
||||
|
|
|
@ -20,7 +20,7 @@ package org.apache.archiva.repository;
|
|||
*/
|
||||
|
||||
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.time.Duration;
|
||||
|
|
|
@ -23,10 +23,9 @@ import com.cronutils.model.CronType;
|
|||
import com.cronutils.model.definition.CronDefinition;
|
||||
import com.cronutils.model.definition.CronDefinitionBuilder;
|
||||
import com.cronutils.parser.CronParser;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.RepositoryFeature;
|
||||
import org.apache.archiva.repository.features.StagingRepositoryFeature;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
|
|
@ -19,18 +19,13 @@ package org.apache.archiva.repository;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.commons.collections4.map.ListOrderedMap;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Abstract repository group implementation.
|
||||
|
|
|
@ -21,9 +21,8 @@ package org.apache.archiva.repository;
|
|||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.StagingRepositoryFeature;
|
||||
|
@ -31,10 +30,8 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Locale;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
|
@ -21,8 +21,8 @@ package org.apache.archiva.repository;
|
|||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.slf4j.Logger;
|
||||
|
|
|
@ -26,8 +26,6 @@ import org.apache.archiva.indexer.IndexCreationFailedException;
|
|||
import org.apache.archiva.indexer.IndexManagerFactory;
|
||||
import org.apache.archiva.indexer.IndexUpdateFailedException;
|
||||
import org.apache.archiva.redback.components.registry.RegistryException;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationEvent;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.StagingRepositoryFeature;
|
||||
|
@ -44,11 +42,9 @@ import java.util.ArrayList;
|
|||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.apache.archiva.repository.ManagedRepository;
|
|||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.RepositoryContentFactory;
|
||||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
@ -53,4 +54,19 @@ public class ArtifactUtil {
|
|||
return Paths.get(repository.getLocation()).resolve(artifactPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the physical location of a given artifact in the repository. There is no check for the
|
||||
* existence of the returned file.
|
||||
*
|
||||
* @param repository The repository, where the artifact is stored.
|
||||
* @param artifactReference The artifact reference.
|
||||
* @return The asset representation of the artifact.
|
||||
* @throws RepositoryException
|
||||
*/
|
||||
public StorageAsset getArtifactAsset(ManagedRepository repository, ArtifactReference artifactReference) throws RepositoryException {
|
||||
final ManagedRepositoryContent content = repositoryContentFactory.getManagedRepositoryContent(repository);
|
||||
final String artifactPath = content.toPath( artifactReference );
|
||||
return repository.getAsset(artifactPath);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,192 +0,0 @@
|
|||
package org.apache.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.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.FileLockException;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockTimeoutException;
|
||||
import org.apache.archiva.common.filelock.Lock;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.nio.file.CopyOption;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* @author Martin Stockhammer <martin_s@apache.org>
|
||||
*/
|
||||
public class StorageUtil
|
||||
{
|
||||
private static final int DEFAULT_BUFFER_SIZE = 4096;
|
||||
|
||||
/**
|
||||
* Copies the source asset to the target. The assets may be from different RepositoryStorage instances.
|
||||
*
|
||||
* @param source The source asset
|
||||
* @param target The target asset
|
||||
* @param locked If true, a readlock is set on the source and a write lock is set on the target.
|
||||
* @param copyOptions Copy options
|
||||
* @throws IOException
|
||||
*/
|
||||
public static final void copyAsset( final StorageAsset source,
|
||||
final StorageAsset target,
|
||||
boolean locked,
|
||||
final CopyOption... copyOptions ) throws IOException
|
||||
{
|
||||
if (source.isFileBased() && target.isFileBased()) {
|
||||
// Short cut for FS operations
|
||||
final Path sourcePath = source.getFilePath();
|
||||
final Path targetPath = target.getFilePath( );
|
||||
if (locked) {
|
||||
final FileLockManager lmSource = ((FilesystemStorage)source.getStorage()).getFileLockManager();
|
||||
final FileLockManager lmTarget = ((FilesystemStorage)target.getStorage()).getFileLockManager();
|
||||
try (Lock lockRead = lmSource.readFileLock( sourcePath ); Lock lockWrite = lmTarget.writeFileLock( targetPath ) )
|
||||
{
|
||||
Files.copy( sourcePath, targetPath, copyOptions );
|
||||
}
|
||||
catch ( FileLockException e )
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
catch ( FileLockTimeoutException e )
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
} else
|
||||
{
|
||||
Files.copy( sourcePath, targetPath, copyOptions );
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
final RepositoryStorage sourceStorage = source.getStorage();
|
||||
final RepositoryStorage targetStorage = target.getStorage();
|
||||
sourceStorage.consumeDataFromChannel( source, is -> wrapWriteFunction( is, targetStorage, target, locked ), locked);
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (Throwable e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof IOException) {
|
||||
throw (IOException)cause;
|
||||
} else
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param source
|
||||
* @param target
|
||||
* @param locked
|
||||
* @param copyOptions
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void moveAsset(StorageAsset source, StorageAsset target, boolean locked, CopyOption... copyOptions) throws IOException
|
||||
{
|
||||
if (source.isFileBased() && target.isFileBased()) {
|
||||
// Short cut for FS operations
|
||||
// Move is atomic operation
|
||||
Files.move( source.getFilePath(), target.getFilePath(), copyOptions );
|
||||
} else {
|
||||
try {
|
||||
final RepositoryStorage sourceStorage = source.getStorage();
|
||||
final RepositoryStorage targetStorage = target.getStorage();
|
||||
sourceStorage.consumeDataFromChannel( source, is -> wrapWriteFunction( is, targetStorage, target, locked ), locked);
|
||||
sourceStorage.removeAsset( source );
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (Throwable e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof IOException) {
|
||||
throw (IOException)cause;
|
||||
} else
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void wrapWriteFunction(ReadableByteChannel is, RepositoryStorage targetStorage, StorageAsset target, boolean locked) {
|
||||
try {
|
||||
targetStorage.writeDataToChannel( target, os -> copy(is, os), locked );
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void copy( final ReadableByteChannel is, final WritableByteChannel os ) {
|
||||
if (is instanceof FileChannel) {
|
||||
copy( (FileChannel) is, os );
|
||||
} else if (os instanceof FileChannel) {
|
||||
copy(is, (FileChannel)os);
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
ByteBuffer buffer = ByteBuffer.allocate( DEFAULT_BUFFER_SIZE );
|
||||
while ( is.read( buffer ) != -1 )
|
||||
{
|
||||
buffer.flip( );
|
||||
while ( buffer.hasRemaining( ) )
|
||||
{
|
||||
os.write( buffer );
|
||||
}
|
||||
buffer.clear( );
|
||||
}
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void copy( final FileChannel is, final WritableByteChannel os ) {
|
||||
try
|
||||
{
|
||||
is.transferTo( 0, is.size( ), os );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
private static void copy( final ReadableByteChannel is, final FileChannel os ) {
|
||||
try
|
||||
{
|
||||
os.transferFrom( is, 0, Long.MAX_VALUE );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -42,6 +42,7 @@ import org.apache.archiva.repository.ContentNotFoundException;
|
|||
import org.apache.archiva.repository.LayoutException;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.RemoteRepositoryContent;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
@ -369,9 +370,9 @@ public class MetadataTools
|
|||
ProjectReference reference, String proxyId )
|
||||
{
|
||||
String metadataPath = getRepositorySpecificName( proxyId, toPath( reference ) );
|
||||
Path metadataFile = Paths.get( managedRepository.getRepoRoot(), metadataPath );
|
||||
StorageAsset metadataFile = managedRepository.getRepository().getAsset( metadataPath );
|
||||
|
||||
if ( !Files.exists(metadataFile) || !Files.isRegularFile( metadataFile ))
|
||||
if ( !metadataFile.exists() || metadataFile.isContainer())
|
||||
{
|
||||
// Nothing to do. return null.
|
||||
return null;
|
||||
|
@ -381,11 +382,11 @@ public class MetadataTools
|
|||
{
|
||||
return MavenMetadataReader.read( metadataFile );
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
// TODO: [monitor] consider a monitor for this event.
|
||||
// TODO: consider a read-redo on monitor return code?
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.toAbsolutePath(), e );
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.getPath(), e );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -394,9 +395,9 @@ public class MetadataTools
|
|||
String logicalResource, String proxyId )
|
||||
{
|
||||
String metadataPath = getRepositorySpecificName( proxyId, logicalResource );
|
||||
Path metadataFile = Paths.get( managedRepository.getRepoRoot(), metadataPath );
|
||||
StorageAsset metadataFile = managedRepository.getRepository().getAsset( metadataPath );
|
||||
|
||||
if ( !Files.exists(metadataFile) || !Files.isRegularFile( metadataFile))
|
||||
if ( !metadataFile.exists() || metadataFile.isContainer())
|
||||
{
|
||||
// Nothing to do. return null.
|
||||
return null;
|
||||
|
@ -406,11 +407,11 @@ public class MetadataTools
|
|||
{
|
||||
return MavenMetadataReader.read( metadataFile );
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
// TODO: [monitor] consider a monitor for this event.
|
||||
// TODO: consider a read-redo on monitor return code?
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.toAbsolutePath(), e );
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.getPath(), e );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -419,9 +420,9 @@ public class MetadataTools
|
|||
VersionedReference reference, String proxyId )
|
||||
{
|
||||
String metadataPath = getRepositorySpecificName( proxyId, toPath( reference ) );
|
||||
Path metadataFile = Paths.get( managedRepository.getRepoRoot(), metadataPath );
|
||||
StorageAsset metadataFile = managedRepository.getRepository().getAsset( metadataPath );
|
||||
|
||||
if ( !Files.exists(metadataFile) || !Files.isRegularFile(metadataFile))
|
||||
if ( !metadataFile.exists() || metadataFile.isContainer())
|
||||
{
|
||||
// Nothing to do. return null.
|
||||
return null;
|
||||
|
@ -431,11 +432,11 @@ public class MetadataTools
|
|||
{
|
||||
return MavenMetadataReader.read( metadataFile );
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
// TODO: [monitor] consider a monitor for this event.
|
||||
// TODO: consider a read-redo on monitor return code?
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.toAbsolutePath(), e );
|
||||
log.warn( "Unable to read metadata: {}", metadataFile.getPath(), e );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -443,7 +444,7 @@ public class MetadataTools
|
|||
public void updateMetadata( ManagedRepositoryContent managedRepository, String logicalResource )
|
||||
throws RepositoryMetadataException
|
||||
{
|
||||
final Path metadataFile = Paths.get( managedRepository.getRepoRoot(), logicalResource );
|
||||
final StorageAsset metadataFile = managedRepository.getRepository().getAsset( logicalResource );
|
||||
ArchivaRepositoryMetadata metadata = null;
|
||||
|
||||
//Gather and merge all metadata available
|
||||
|
@ -480,7 +481,7 @@ public class MetadataTools
|
|||
|
||||
RepositoryMetadataWriter.write( metadata, metadataFile );
|
||||
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile );
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile.getFilePath() );
|
||||
checksum.fixChecksums( algorithms );
|
||||
}
|
||||
|
||||
|
@ -491,30 +492,17 @@ public class MetadataTools
|
|||
* @param metadataParentDirectory
|
||||
* @return origional set plus newly found versions
|
||||
*/
|
||||
private Set<String> findPossibleVersions( Set<String> versions, Path metadataParentDirectory )
|
||||
private Set<String> findPossibleVersions( Set<String> versions, StorageAsset metadataParentDirectory )
|
||||
{
|
||||
|
||||
Set<String> result = new HashSet<String>( versions );
|
||||
|
||||
try (Stream<Path> stream = Files.list( metadataParentDirectory )) {
|
||||
stream.filter( Files::isDirectory ).filter(
|
||||
p ->
|
||||
{
|
||||
try(Stream<Path> substream = Files.list(p))
|
||||
{
|
||||
return substream.anyMatch( f -> Files.isRegularFile( f ) && f.toString().endsWith( ".pom" ));
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
metadataParentDirectory.list().stream().filter(asset ->
|
||||
asset.isContainer()).filter(asset -> {
|
||||
return asset.list().stream().anyMatch(f -> !f.isContainer() && f.getName().endsWith(".pom"));
|
||||
}
|
||||
).forEach(
|
||||
p -> result.add(p.getFileName().toString())
|
||||
);
|
||||
} catch (IOException e) {
|
||||
//
|
||||
}
|
||||
).forEach( p -> result.add(p.getName()));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -522,8 +510,9 @@ public class MetadataTools
|
|||
ManagedRepositoryContent managedRepository, String logicalResource )
|
||||
{
|
||||
List<ArchivaRepositoryMetadata> metadatas = new ArrayList<>();
|
||||
Path file = Paths.get( managedRepository.getRepoRoot(), logicalResource );
|
||||
if ( Files.exists(file) )
|
||||
StorageAsset file = managedRepository.getRepository().getAsset( logicalResource );
|
||||
|
||||
if ( file.exists() )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -533,10 +522,14 @@ public class MetadataTools
|
|||
metadatas.add( existingMetadata );
|
||||
}
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
log.debug( "Could not read metadata at {}. Metadata will be removed.", file.toAbsolutePath() );
|
||||
FileUtils.deleteQuietly( file );
|
||||
log.debug( "Could not read metadata at {}. Metadata will be removed.", file.getPath() );
|
||||
try {
|
||||
file.getStorage().removeAsset(file);
|
||||
} catch (IOException ex) {
|
||||
log.error("Could not remove asset {}", file.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -578,7 +571,8 @@ public class MetadataTools
|
|||
public void updateMetadata( ManagedRepositoryContent managedRepository, ProjectReference reference )
|
||||
throws LayoutException, RepositoryMetadataException, IOException, ContentNotFoundException
|
||||
{
|
||||
Path metadataFile = Paths.get( managedRepository.getRepoRoot(), toPath( reference ) );
|
||||
|
||||
StorageAsset metadataFile = managedRepository.getRepository().getAsset( toPath( reference ) );
|
||||
|
||||
long lastUpdated = getExistingLastUpdated( metadataFile );
|
||||
|
||||
|
@ -593,7 +587,7 @@ public class MetadataTools
|
|||
// TODO: do we know this information instead?
|
||||
// Set<Plugin> allPlugins = managedRepository.getPlugins( reference );
|
||||
Set<Plugin> allPlugins;
|
||||
if ( Files.exists(metadataFile))
|
||||
if ( metadataFile.exists())
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -653,7 +647,7 @@ public class MetadataTools
|
|||
|
||||
// Save the metadata model to disk.
|
||||
RepositoryMetadataWriter.write( metadata, metadataFile );
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile );
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile.getFilePath() );
|
||||
checksum.fixChecksums( algorithms );
|
||||
}
|
||||
|
||||
|
@ -748,9 +742,9 @@ public class MetadataTools
|
|||
}
|
||||
}
|
||||
|
||||
private long getExistingLastUpdated( Path metadataFile )
|
||||
private long getExistingLastUpdated( StorageAsset metadataFile )
|
||||
{
|
||||
if ( !Files.exists(metadataFile) )
|
||||
if ( !metadataFile.exists() )
|
||||
{
|
||||
// Doesn't exist.
|
||||
return 0;
|
||||
|
@ -762,7 +756,7 @@ public class MetadataTools
|
|||
|
||||
return getLastUpdated( metadata );
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
// Error.
|
||||
return 0;
|
||||
|
@ -788,7 +782,7 @@ public class MetadataTools
|
|||
public void updateMetadata( ManagedRepositoryContent managedRepository, VersionedReference reference )
|
||||
throws LayoutException, RepositoryMetadataException, IOException, ContentNotFoundException
|
||||
{
|
||||
Path metadataFile = Paths.get( managedRepository.getRepoRoot(), toPath( reference ) );
|
||||
StorageAsset metadataFile = managedRepository.getRepository().getAsset( toPath( reference ) );
|
||||
|
||||
long lastUpdated = getExistingLastUpdated( metadataFile );
|
||||
|
||||
|
@ -893,7 +887,7 @@ public class MetadataTools
|
|||
|
||||
// Save the metadata model to disk.
|
||||
RepositoryMetadataWriter.write( metadata, metadataFile );
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile );
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile.getFilePath() );
|
||||
checksum.fixChecksums( algorithms );
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.apache.archiva.repository.metadata;
|
|||
import org.apache.archiva.common.utils.FileUtils;
|
||||
import org.apache.archiva.model.ArchivaRepositoryMetadata;
|
||||
import org.apache.archiva.model.Plugin;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.archiva.xml.XMLWriter;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
|
@ -29,9 +30,12 @@ import org.apache.commons.lang.StringUtils;
|
|||
import org.dom4j.Document;
|
||||
import org.dom4j.DocumentHelper;
|
||||
import org.dom4j.Element;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collections;
|
||||
|
@ -44,11 +48,13 @@ import java.util.List;
|
|||
*/
|
||||
public class RepositoryMetadataWriter
|
||||
{
|
||||
public static void write( ArchivaRepositoryMetadata metadata, Path outputFile )
|
||||
private static final Logger log = LoggerFactory.getLogger(RepositoryMetadataWriter.class);
|
||||
|
||||
public static void write( ArchivaRepositoryMetadata metadata, StorageAsset outputFile )
|
||||
throws RepositoryMetadataException
|
||||
{
|
||||
boolean thrown = false;
|
||||
try (FileWriter writer = new FileWriter( outputFile.toFile() ))
|
||||
try (OutputStreamWriter writer = new OutputStreamWriter( outputFile.getWriteStream(true)))
|
||||
{
|
||||
write( metadata, writer );
|
||||
writer.flush();
|
||||
|
@ -57,13 +63,17 @@ public class RepositoryMetadataWriter
|
|||
{
|
||||
thrown = true;
|
||||
throw new RepositoryMetadataException(
|
||||
"Unable to write metadata file: " + outputFile.toAbsolutePath() + " - " + e.getMessage(), e );
|
||||
"Unable to write metadata file: " + outputFile.getPath() + " - " + e.getMessage(), e );
|
||||
}
|
||||
finally
|
||||
{
|
||||
if ( thrown )
|
||||
{
|
||||
FileUtils.deleteQuietly( outputFile );
|
||||
try {
|
||||
outputFile.getStorage().removeAsset(outputFile);
|
||||
} catch (IOException e) {
|
||||
log.error("Could not remove asset {}", outputFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,202 +0,0 @@
|
|||
package org.apache.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.
|
||||
*/
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Instant;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
public class FilesystemAssetTest {
|
||||
|
||||
Path assetPathFile;
|
||||
Path assetPathDir;
|
||||
|
||||
@Before
|
||||
public void init() throws IOException {
|
||||
assetPathFile = Files.createTempFile("assetFile", "dat");
|
||||
assetPathDir = Files.createTempDirectory("assetDir");
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanup() {
|
||||
|
||||
try {
|
||||
Files.deleteIfExists(assetPathFile);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Files.deleteIfExists(assetPathDir);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getPath() {
|
||||
FilesystemAsset asset = new FilesystemAsset("/"+assetPathFile.getFileName().toString(), assetPathFile);
|
||||
assertEquals("/"+assetPathFile.getFileName().toString(), asset.getPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getName() {
|
||||
FilesystemAsset asset = new FilesystemAsset("/"+assetPathFile.getFileName().toString(), assetPathFile);
|
||||
assertEquals(assetPathFile.getFileName().toString(), asset.getName());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getModificationTime() throws IOException {
|
||||
Instant modTime = Files.getLastModifiedTime(assetPathFile).toInstant();
|
||||
FilesystemAsset asset = new FilesystemAsset("/test123", assetPathFile);
|
||||
assertTrue(modTime.equals(asset.getModificationTime()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isContainer() {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1323", assetPathFile);
|
||||
assertFalse(asset.isContainer());
|
||||
FilesystemAsset asset2 = new FilesystemAsset("/test1234", assetPathDir);
|
||||
assertTrue(asset2.isContainer());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void list() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
assertEquals(0, asset.list().size());
|
||||
|
||||
FilesystemAsset asset2 = new FilesystemAsset("/test1235", assetPathDir);
|
||||
assertEquals(0, asset2.list().size());
|
||||
Path f1 = Files.createTempFile(assetPathDir, "testfile", "dat");
|
||||
Path f2 = Files.createTempFile(assetPathDir, "testfile", "dat");
|
||||
Path d1 = Files.createTempDirectory(assetPathDir, "testdir");
|
||||
assertEquals(3, asset2.list().size());
|
||||
assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(f1.getFileName().toString())));
|
||||
assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(f2.getFileName().toString())));
|
||||
assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(d1.getFileName().toString())));
|
||||
Files.deleteIfExists(f1);
|
||||
Files.deleteIfExists(f2);
|
||||
Files.deleteIfExists(d1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSize() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
assertEquals(0, asset.getSize());
|
||||
|
||||
Files.write(assetPathFile, new String("abcdef").getBytes("ASCII"));
|
||||
assertTrue(asset.getSize()>=6);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getData() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(InputStream is = asset.getReadStream()) {
|
||||
assertEquals("abcdef", IOUtils.toString(is, "ASCII"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDataExceptionOnDir() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathDir);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try {
|
||||
InputStream is = asset.getReadStream();
|
||||
assertFalse("Exception expected for data on dir", true);
|
||||
} catch (IOException e) {
|
||||
// fine
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeData() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(OutputStream os = asset.getWriteStream(true)) {
|
||||
IOUtils.write("test12345", os, "ASCII");
|
||||
}
|
||||
assertEquals("test12345", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeDataAppend() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(OutputStream os = asset.getWriteStream(false)) {
|
||||
IOUtils.write("test12345", os, "ASCII");
|
||||
}
|
||||
assertEquals("abcdeftest12345", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeDataExceptionOnDir() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathDir);
|
||||
try {
|
||||
|
||||
OutputStream os = asset.getWriteStream(true);
|
||||
assertTrue("Writing to a directory should throw a IOException", false);
|
||||
} catch (IOException e) {
|
||||
// Fine
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void storeDataFile() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
Path dataFile = Files.createTempFile("testdata", "dat");
|
||||
try(OutputStream os = Files.newOutputStream(dataFile)) {
|
||||
IOUtils.write("testkdkdkd", os, "ASCII");
|
||||
}
|
||||
asset.replaceDataFromFile(dataFile);
|
||||
assertEquals("testkdkdkd", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exists() {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
assertTrue(asset.exists());
|
||||
FilesystemAsset asset2 = new FilesystemAsset("/test1234", Paths.get("abcdefgkdkdk"));
|
||||
assertFalse(asset2.exists());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFilePath() {
|
||||
FilesystemAsset asset = new FilesystemAsset("/test1234", assetPathFile);
|
||||
assertEquals(assetPathFile, asset.getFilePath());
|
||||
}
|
||||
}
|
|
@ -28,7 +28,7 @@ import org.apache.archiva.repository.LayoutException;
|
|||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Set;
|
||||
|
|
|
@ -25,7 +25,7 @@ import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;
|
|||
import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
|
||||
import org.apache.archiva.consumers.RepositoryContentConsumer;
|
||||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
|
@ -29,7 +29,7 @@ import org.apache.archiva.repository.BasicRemoteRepository;
|
|||
import org.apache.archiva.repository.EditableManagedRepository;
|
||||
import org.apache.archiva.repository.EditableRemoteRepository;
|
||||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.scanner.mock.ManagedRepositoryContentMock;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.archiva.repository.scanner.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.VersionUtil;
|
||||
import org.apache.archiva.metadata.model.ArtifactMetadata;
|
||||
import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
|
||||
|
@ -27,9 +28,11 @@ import org.apache.archiva.model.ArtifactReference;
|
|||
import org.apache.archiva.model.ProjectReference;
|
||||
import org.apache.archiva.model.VersionedReference;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -48,6 +51,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
|
||||
|
||||
private ManagedRepository repository;
|
||||
private FilesystemStorage fsStorage;
|
||||
|
||||
public ManagedRepositoryContentMock(ManagedRepository repo) {
|
||||
this.repository = repo;
|
||||
|
@ -92,7 +96,18 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
@Override
|
||||
public String getRepoRoot( )
|
||||
{
|
||||
return Paths.get("", "target", "test-repository", "managed").toString();
|
||||
return getRepoRootAsset().getFilePath().toString();
|
||||
}
|
||||
|
||||
private StorageAsset getRepoRootAsset() {
|
||||
if (fsStorage==null) {
|
||||
try {
|
||||
fsStorage = new FilesystemStorage(Paths.get("", "target", "test-repository", "managed"), new DefaultFileLockManager());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return fsStorage.getAsset("");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -329,7 +344,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
@Override
|
||||
public StorageAsset toFile( ArtifactReference reference )
|
||||
{
|
||||
return Paths.get(getRepoRoot(), refs.get(reference));
|
||||
return getRepoRootAsset().resolve(refs.get(reference));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>archiva-base</artifactId>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
|
||||
<name>Archiva Base :: Repository API</name>
|
||||
|
||||
<properties>
|
||||
<site.staging.base>${project.parent.parent.basedir}</site.staging.base>
|
||||
</properties>
|
||||
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<basedir>${basedir}</basedir>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
|
@ -1,4 +1,4 @@
|
|||
package org.apache.archiva.repository.content;
|
||||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -28,15 +28,20 @@ import java.nio.file.CopyOption;
|
|||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Repository storage gives access to the files and directories on the storage.
|
||||
* The storage may be on a filesystem but can be any other storage system.
|
||||
*
|
||||
* This API is low level repository access. If you use this API you must
|
||||
* either have knowledge about the specific repository layout or use the structure
|
||||
* This is the low level API to access artifacts in a repository. Each artifact is represented
|
||||
* by one storage asset. Each asset can be accessed by a path that is independent on the underlying storage
|
||||
* implementation. Paths always use '/' as path separator. The path is local to the repository and
|
||||
* is unique for each asset.
|
||||
* The storage API knows nothing about the repository layout or repository specific metadata.
|
||||
* If you use this API you must either have knowledge about the specific repository layout or use the structure
|
||||
* as it is, e.g. for browsing.
|
||||
*
|
||||
* It is the decision of the implementation, if this API provides access to all elements, or
|
||||
* just a selected view.
|
||||
* The base implementation for the storage uses a directory structure on the local filesystem.
|
||||
*
|
||||
*
|
||||
* It is the decision of the repository type specific implementation, if this API provides access to all elements, that
|
||||
* is really stored or just a selected view.
|
||||
*
|
||||
* Checking access is not part of this API.
|
||||
*/
|
||||
|
@ -104,7 +109,9 @@ public interface RepositoryStorage {
|
|||
void removeAsset(StorageAsset asset) throws IOException;
|
||||
|
||||
/**
|
||||
* Moves the asset to the given location and returns the asset object for the destination.
|
||||
* Moves the asset to the given location and returns the asset object for the destination. Moves only assets that
|
||||
* belong to the same storage instance. It will throw a IOException if the assets are from differents storage
|
||||
* instances.
|
||||
*
|
||||
* @param origin The original asset
|
||||
* @param destination The destination path pointing to the new asset.
|
||||
|
@ -114,17 +121,20 @@ public interface RepositoryStorage {
|
|||
StorageAsset moveAsset(StorageAsset origin, String destination, CopyOption... copyOptions) throws IOException;
|
||||
|
||||
/**
|
||||
* Moves the asset to the new path.
|
||||
*
|
||||
* Moves the asset to the given location and returns the asset object for the destination. Moves only assets that
|
||||
* belong to the same storage instance. It will throw a IOException if the assets are from differents storage
|
||||
* instances.
|
||||
* *
|
||||
* @param origin The original asset
|
||||
* @param destination The destination asset.
|
||||
* @param destination The destination path.
|
||||
* @param copyOptions The copy options (e.g. {@link java.nio.file.StandardCopyOption#REPLACE_EXISTING}
|
||||
* @throws IOException If it was not possible to copy the asset.
|
||||
*/
|
||||
void moveAsset(StorageAsset origin, StorageAsset destination, CopyOption... copyOptions) throws IOException;
|
||||
|
||||
/**
|
||||
* Copies the given asset to the new destination.
|
||||
* Copies the given asset to the new destination. Copies only assets that belong to the same storage instance.
|
||||
* It will throw a IOException if the assets are from differents storage instances.
|
||||
*
|
||||
* @param origin The original asset
|
||||
* @param destination The path to the new asset
|
||||
|
@ -135,7 +145,8 @@ public interface RepositoryStorage {
|
|||
StorageAsset copyAsset(StorageAsset origin, String destination, CopyOption... copyOptions) throws IOException;
|
||||
|
||||
/**
|
||||
* Copies the given asset to the new destination.
|
||||
* Copies the given asset to the new destination. Copies only assets that belong to the same storage instance.
|
||||
* It will throw a IOException if the assets are from differents storage instances.
|
||||
*
|
||||
* @param origin The original asset
|
||||
* @param destination The path to the new asset
|
|
@ -1,4 +1,4 @@
|
|||
package org.apache.archiva.repository.content;
|
||||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -27,10 +27,9 @@ import java.nio.channels.WritableByteChannel;
|
|||
import java.nio.file.Path;
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* A instance of this interface represents information about an specific asset in a repository.
|
||||
* A instance of this interface represents information about a specific asset in a repository.
|
||||
* The asset may be an real artifact, a directory, or a virtual asset.
|
||||
*
|
||||
* Each asset has a unique path relative to the repository.
|
||||
|
@ -177,4 +176,11 @@ public interface StorageAsset
|
|||
* @return The asset, or <code>null</code>, if it does not exist.
|
||||
*/
|
||||
StorageAsset getParent();
|
||||
|
||||
/**
|
||||
* Returns the asset relative to the given path
|
||||
* @param toPath
|
||||
* @return
|
||||
*/
|
||||
StorageAsset resolve(String toPath);
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>archiva-base</artifactId>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<version>3.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>archiva-storage-fs</artifactId>
|
||||
|
||||
<name>Archiva Base :: Storage Filesystem Based</name>
|
||||
|
||||
<properties>
|
||||
<site.staging.base>${project.parent.parent.basedir}</site.staging.base>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-filelock</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<basedir>${basedir}</basedir>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
|
@ -1,4 +1,4 @@
|
|||
package org.apache.archiva.repository.content;
|
||||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -98,7 +98,7 @@ public class FilesystemAsset implements StorageAsset {
|
|||
|
||||
FilesystemAsset(RepositoryStorage storage, String path, Path assetPath, Path basePath) {
|
||||
this.assetPath = assetPath;
|
||||
this.relativePath = path;
|
||||
this.relativePath = normalizePath(path);
|
||||
this.setPermissionsForNew=false;
|
||||
this.basePath = basePath;
|
||||
this.storage = storage;
|
||||
|
@ -114,7 +114,7 @@ public class FilesystemAsset implements StorageAsset {
|
|||
*/
|
||||
public FilesystemAsset(RepositoryStorage storage, String path, Path assetPath) {
|
||||
this.assetPath = assetPath;
|
||||
this.relativePath = path;
|
||||
this.relativePath = normalizePath(path);
|
||||
this.setPermissionsForNew = false;
|
||||
this.basePath = null;
|
||||
this.storage = storage;
|
||||
|
@ -132,7 +132,7 @@ public class FilesystemAsset implements StorageAsset {
|
|||
*/
|
||||
public FilesystemAsset(RepositoryStorage storage, String path, Path assetPath, Path basePath, boolean directory) {
|
||||
this.assetPath = assetPath;
|
||||
this.relativePath = path;
|
||||
this.relativePath = normalizePath(path);
|
||||
this.directoryHint = directory;
|
||||
this.setPermissionsForNew = false;
|
||||
this.basePath = basePath;
|
||||
|
@ -151,7 +151,7 @@ public class FilesystemAsset implements StorageAsset {
|
|||
*/
|
||||
public FilesystemAsset(RepositoryStorage storage, String path, Path assetPath, Path basePath, boolean directory, boolean setPermissionsForNew) {
|
||||
this.assetPath = assetPath;
|
||||
this.relativePath = path;
|
||||
this.relativePath = normalizePath(path);
|
||||
this.directoryHint = directory;
|
||||
this.setPermissionsForNew = setPermissionsForNew;
|
||||
this.basePath = basePath;
|
||||
|
@ -159,6 +159,14 @@ public class FilesystemAsset implements StorageAsset {
|
|||
init();
|
||||
}
|
||||
|
||||
private String normalizePath(String path) {
|
||||
if (!path.startsWith("/")) {
|
||||
return "/"+path;
|
||||
} else {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
private void init() {
|
||||
|
||||
if (setPermissionsForNew) {
|
||||
|
@ -423,6 +431,11 @@ public class FilesystemAsset implements StorageAsset {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StorageAsset resolve(String toPath) {
|
||||
return storage.getAsset(this.getPath()+"/"+toPath);
|
||||
}
|
||||
|
||||
|
||||
public void setDefaultFileAcls(List<AclEntry> acl) {
|
||||
defaultFileAcls = acl;
|
|
@ -1,4 +1,4 @@
|
|||
package org.apache.archiva.repository.content;
|
||||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -81,7 +81,7 @@ public class FilesystemStorage implements RepositoryStorage {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void consumeData( StorageAsset asset, Consumer<InputStream> consumerFunction, boolean readLock ) throws IOException
|
||||
public void consumeData(StorageAsset asset, Consumer<InputStream> consumerFunction, boolean readLock ) throws IOException
|
||||
{
|
||||
final Path path = asset.getFilePath();
|
||||
try {
|
||||
|
@ -333,6 +333,12 @@ public class FilesystemStorage implements RepositoryStorage {
|
|||
@Override
|
||||
public void moveAsset( StorageAsset origin, StorageAsset destination, CopyOption... copyOptions ) throws IOException
|
||||
{
|
||||
if (origin.getStorage()!=this) {
|
||||
throw new IOException("The origin asset does not belong to this storage instance. Cannot copy between different storage instances.");
|
||||
}
|
||||
if (destination.getStorage()!=this) {
|
||||
throw new IOException("The destination asset does not belong to this storage instance. Cannot copy between different storage instances.");
|
||||
}
|
||||
Files.move(origin.getFilePath(), destination.getFilePath(), copyOptions);
|
||||
}
|
||||
|
||||
|
@ -348,6 +354,12 @@ public class FilesystemStorage implements RepositoryStorage {
|
|||
@Override
|
||||
public void copyAsset( StorageAsset origin, StorageAsset destination, CopyOption... copyOptions ) throws IOException
|
||||
{
|
||||
if (origin.getStorage()!=this) {
|
||||
throw new IOException("The origin asset does not belong to this storage instance. Cannot copy between different storage instances.");
|
||||
}
|
||||
if (destination.getStorage()!=this) {
|
||||
throw new IOException("The destination asset does not belong to this storage instance. Cannot copy between different storage instances.");
|
||||
}
|
||||
Path destinationPath = destination.getFilePath();
|
||||
boolean overwrite = false;
|
||||
for (int i=0; i<copyOptions.length; i++) {
|
|
@ -0,0 +1,346 @@
|
|||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.FileLockException;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockTimeoutException;
|
||||
import org.apache.archiva.common.filelock.Lock;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.nio.file.*;
|
||||
import java.util.HashSet;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
*
|
||||
* Utility class for assets. Allows to copy, move between different storage instances and
|
||||
* recursively consume the tree.
|
||||
*
|
||||
* @author Martin Stockhammer <martin_s@apache.org>
|
||||
*/
|
||||
public class StorageUtil
|
||||
{
|
||||
private static final int DEFAULT_BUFFER_SIZE = 4096;
|
||||
private static final Logger log = LoggerFactory.getLogger(StorageUtil.class);
|
||||
|
||||
/**
|
||||
* Copies the source asset to the target. The assets may be from different RepositoryStorage instances.
|
||||
* If you know that source and asset are from the same storage instance, the copy method of the storage
|
||||
* instance may be faster.
|
||||
*
|
||||
* @param source The source asset
|
||||
* @param target The target asset
|
||||
* @param locked If true, a readlock is set on the source and a write lock is set on the target.
|
||||
* @param copyOptions Copy options
|
||||
* @throws IOException
|
||||
*/
|
||||
public static final void copyAsset( final StorageAsset source,
|
||||
final StorageAsset target,
|
||||
boolean locked,
|
||||
final CopyOption... copyOptions ) throws IOException
|
||||
{
|
||||
if (source.isFileBased() && target.isFileBased()) {
|
||||
// Short cut for FS operations
|
||||
final Path sourcePath = source.getFilePath();
|
||||
final Path targetPath = target.getFilePath( );
|
||||
if (locked) {
|
||||
final FileLockManager lmSource = ((FilesystemStorage)source.getStorage()).getFileLockManager();
|
||||
final FileLockManager lmTarget = ((FilesystemStorage)target.getStorage()).getFileLockManager();
|
||||
try (Lock lockRead = lmSource.readFileLock( sourcePath ); Lock lockWrite = lmTarget.writeFileLock( targetPath ) )
|
||||
{
|
||||
Files.copy( sourcePath, targetPath, copyOptions );
|
||||
}
|
||||
catch ( FileLockException e )
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
catch ( FileLockTimeoutException e )
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
} else
|
||||
{
|
||||
Files.copy( sourcePath, targetPath, copyOptions );
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
final RepositoryStorage sourceStorage = source.getStorage();
|
||||
final RepositoryStorage targetStorage = target.getStorage();
|
||||
sourceStorage.consumeDataFromChannel( source, is -> wrapWriteFunction( is, targetStorage, target, locked ), locked);
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (Throwable e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof IOException) {
|
||||
throw (IOException)cause;
|
||||
} else
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves a asset between different storage instances.
|
||||
* If you know that source and asset are from the same storage instance, the move method of the storage
|
||||
* instance may be faster.
|
||||
*
|
||||
* @param source The source asset
|
||||
* @param target The target asset
|
||||
* @param locked If true, a lock is used for the move operation.
|
||||
* @param copyOptions Options for copying
|
||||
* @throws IOException If the move fails
|
||||
*/
|
||||
public static final void moveAsset(StorageAsset source, StorageAsset target, boolean locked, CopyOption... copyOptions) throws IOException
|
||||
{
|
||||
if (source.isFileBased() && target.isFileBased()) {
|
||||
// Short cut for FS operations
|
||||
// Move is atomic operation
|
||||
Files.move( source.getFilePath(), target.getFilePath(), copyOptions );
|
||||
} else {
|
||||
try {
|
||||
final RepositoryStorage sourceStorage = source.getStorage();
|
||||
final RepositoryStorage targetStorage = target.getStorage();
|
||||
sourceStorage.consumeDataFromChannel( source, is -> wrapWriteFunction( is, targetStorage, target, locked ), locked);
|
||||
sourceStorage.removeAsset( source );
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (Throwable e) {
|
||||
Throwable cause = e.getCause();
|
||||
if (cause instanceof IOException) {
|
||||
throw (IOException)cause;
|
||||
} else
|
||||
{
|
||||
throw new IOException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static final void wrapWriteFunction(ReadableByteChannel is, RepositoryStorage targetStorage, StorageAsset target, boolean locked) {
|
||||
try {
|
||||
targetStorage.writeDataToChannel( target, os -> copy(is, os), locked );
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static final void copy( final ReadableByteChannel is, final WritableByteChannel os ) {
|
||||
if (is instanceof FileChannel) {
|
||||
copy( (FileChannel) is, os );
|
||||
} else if (os instanceof FileChannel) {
|
||||
copy(is, (FileChannel)os);
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
ByteBuffer buffer = ByteBuffer.allocate( DEFAULT_BUFFER_SIZE );
|
||||
while ( is.read( buffer ) != -1 )
|
||||
{
|
||||
buffer.flip( );
|
||||
while ( buffer.hasRemaining( ) )
|
||||
{
|
||||
os.write( buffer );
|
||||
}
|
||||
buffer.clear( );
|
||||
}
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final void copy( final FileChannel is, final WritableByteChannel os ) {
|
||||
try
|
||||
{
|
||||
is.transferTo( 0, is.size( ), os );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
private static final void copy( final ReadableByteChannel is, final FileChannel os ) {
|
||||
try
|
||||
{
|
||||
os.transferFrom( is, 0, Long.MAX_VALUE );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the consumer function recursively on each asset found starting at the base path
|
||||
* @param baseAsset The base path where to start search
|
||||
* @param consumer The consumer function applied to each found asset
|
||||
* @param depthFirst If true, the deepest elements are consumed first.
|
||||
* @param maxDepth The maximum depth to recurse into. 0 means, only the baseAsset is consumed, 1 the base asset and its children and so forth.
|
||||
*/
|
||||
public static final void recurse(final StorageAsset baseAsset, final Consumer<StorageAsset> consumer, final boolean depthFirst, final int maxDepth) throws IOException {
|
||||
recurse(baseAsset, consumer, depthFirst, maxDepth, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the consumer function recursively on each asset found starting at the base path. The function descends into
|
||||
* maximum depth.
|
||||
*
|
||||
* @param baseAsset The base path where to start search
|
||||
* @param consumer The consumer function applied to each found asset
|
||||
* @param depthFirst If true, the deepest elements are consumed first.
|
||||
*/
|
||||
public static final void recurse(final StorageAsset baseAsset, final Consumer<StorageAsset> consumer, final boolean depthFirst) throws IOException {
|
||||
recurse(baseAsset, consumer, depthFirst, Integer.MAX_VALUE, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the consumer function recursively on each asset found starting at the base path. It does not recurse with
|
||||
* depth first and stops only if there are no more children available.
|
||||
*
|
||||
* @param baseAsset The base path where to start search
|
||||
* @param consumer The consumer function applied to each found asset
|
||||
*/
|
||||
public static final void recurse(final StorageAsset baseAsset, final Consumer<StorageAsset> consumer) throws IOException {
|
||||
recurse(baseAsset, consumer, false, Integer.MAX_VALUE, 0);
|
||||
}
|
||||
|
||||
private static final void recurse(final StorageAsset baseAsset, final Consumer<StorageAsset> consumer, final boolean depthFirst, final int maxDepth, final int currentDepth)
|
||||
throws IOException {
|
||||
if (!depthFirst) {
|
||||
consumer.accept(baseAsset);
|
||||
}
|
||||
if (currentDepth<maxDepth && baseAsset.isContainer()) {
|
||||
for(StorageAsset asset : baseAsset.list() ) {
|
||||
recurse(asset, consumer, depthFirst, maxDepth, currentDepth+1);
|
||||
}
|
||||
}
|
||||
if (depthFirst) {
|
||||
consumer.accept(baseAsset);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the given asset and all child assets recursively.
|
||||
* @param baseDir The base asset to remove.
|
||||
* @throws IOException
|
||||
*/
|
||||
public static final void deleteRecursively(StorageAsset baseDir) throws IOException {
|
||||
recurse(baseDir, a -> {
|
||||
try {
|
||||
a.getStorage().removeAsset(a);
|
||||
} catch (IOException e) {
|
||||
log.error("Could not delete asset {}", a.getPath());
|
||||
}
|
||||
},true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the extension of the name of a given asset. Extension is the substring after the last occurence of '.' in the
|
||||
* string. If no '.' is found, the empty string is returned.
|
||||
*
|
||||
* @param asset The asset from which to return the extension string.
|
||||
* @return The extension.
|
||||
*/
|
||||
public static final String getExtension(StorageAsset asset) {
|
||||
return StringUtils.substringAfterLast(asset.getName(),".");
|
||||
}
|
||||
|
||||
public static final void copyToLocalFile(StorageAsset asset, Path destination, CopyOption... copyOptions) throws IOException {
|
||||
if (asset.isFileBased()) {
|
||||
Files.copy(asset.getFilePath(), destination, copyOptions);
|
||||
} else {
|
||||
try {
|
||||
|
||||
HashSet<OpenOption> openOptions = new HashSet<>();
|
||||
for (CopyOption option : copyOptions) {
|
||||
if (option == StandardCopyOption.REPLACE_EXISTING) {
|
||||
openOptions.add(StandardOpenOption.CREATE);
|
||||
openOptions.add(StandardOpenOption.TRUNCATE_EXISTING);
|
||||
openOptions.add(StandardOpenOption.WRITE);
|
||||
} else {
|
||||
openOptions.add(StandardOpenOption.WRITE);
|
||||
openOptions.add(StandardOpenOption.CREATE_NEW);
|
||||
}
|
||||
}
|
||||
asset.getStorage().consumeDataFromChannel(asset, channel -> {
|
||||
try {
|
||||
FileChannel.open(destination, openOptions).transferFrom(channel, 0, Long.MAX_VALUE);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}, false);
|
||||
} catch (Throwable e) {
|
||||
if (e.getCause() instanceof IOException) {
|
||||
throw (IOException)e.getCause();
|
||||
} else {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class PathInformation {
|
||||
final Path path ;
|
||||
final boolean tmpFile;
|
||||
|
||||
PathInformation(Path path, boolean tmpFile) {
|
||||
this.path = path;
|
||||
this.tmpFile = tmpFile;
|
||||
}
|
||||
|
||||
public Path getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public boolean isTmpFile() {
|
||||
return tmpFile;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static final PathInformation getAssetDataAsPath(StorageAsset asset) throws IOException {
|
||||
if (!asset.exists()) {
|
||||
throw new IOException("Asset does not exist");
|
||||
}
|
||||
if (asset.isFileBased()) {
|
||||
return new PathInformation(asset.getFilePath(), false);
|
||||
} else {
|
||||
Path tmpFile = Files.createTempFile(asset.getName(), getExtension(asset));
|
||||
copyToLocalFile(asset, tmpFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
return new PathInformation(tmpFile, true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Instant;
|
||||
|
||||
public class FilesystemAssetTest {
|
||||
|
||||
Path assetPathFile;
|
||||
Path assetPathDir;
|
||||
FilesystemStorage filesystemStorage;
|
||||
|
||||
@Before
|
||||
public void init() throws IOException {
|
||||
assetPathDir = Files.createTempDirectory("assetDir");
|
||||
assetPathFile = Files.createTempFile(assetPathDir,"assetFile", "dat");
|
||||
filesystemStorage = new FilesystemStorage(assetPathDir, new DefaultFileLockManager());
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanup() {
|
||||
|
||||
try {
|
||||
Files.deleteIfExists(assetPathFile);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
FileUtils.deleteQuietly(assetPathDir.toFile());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getPath() {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, assetPathFile.getFileName().toString(), assetPathFile);
|
||||
Assert.assertEquals("/"+assetPathFile.getFileName().toString(), asset.getPath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getName() {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/"+assetPathFile.getFileName().toString(), assetPathFile);
|
||||
Assert.assertEquals(assetPathFile.getFileName().toString(), asset.getName());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getModificationTime() throws IOException {
|
||||
Instant modTime = Files.getLastModifiedTime(assetPathFile).toInstant();
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test123", assetPathFile);
|
||||
Assert.assertTrue(modTime.equals(asset.getModificationTime()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isContainer() {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1323", assetPathFile);
|
||||
Assert.assertFalse(asset.isContainer());
|
||||
FilesystemAsset asset2 = new FilesystemAsset(filesystemStorage, "/test1234", assetPathDir);
|
||||
Assert.assertTrue(asset2.isContainer());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void list() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Assert.assertEquals(0, asset.list().size());
|
||||
|
||||
FilesystemAsset asset2 = new FilesystemAsset(filesystemStorage, "/test1235", assetPathDir);
|
||||
Assert.assertEquals(1, asset2.list().size());
|
||||
Path f1 = Files.createTempFile(assetPathDir, "testfile", "dat");
|
||||
Path f2 = Files.createTempFile(assetPathDir, "testfile", "dat");
|
||||
Path d1 = Files.createTempDirectory(assetPathDir, "testdir");
|
||||
Assert.assertEquals(4, asset2.list().size());
|
||||
Assert.assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(f1.getFileName().toString())));
|
||||
Assert.assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(f2.getFileName().toString())));
|
||||
Assert.assertTrue(asset2.list().stream().anyMatch(p -> p.getName().equals(d1.getFileName().toString())));
|
||||
Files.deleteIfExists(f1);
|
||||
Files.deleteIfExists(f2);
|
||||
Files.deleteIfExists(d1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSize() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Assert.assertEquals(0, asset.getSize());
|
||||
|
||||
Files.write(assetPathFile, new String("abcdef").getBytes("ASCII"));
|
||||
Assert.assertTrue(asset.getSize()>=6);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getData() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(InputStream is = asset.getReadStream()) {
|
||||
Assert.assertEquals("abcdef", IOUtils.toString(is, "ASCII"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDataExceptionOnDir() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathDir);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try {
|
||||
InputStream is = asset.getReadStream();
|
||||
Assert.assertFalse("Exception expected for data on dir", true);
|
||||
} catch (IOException e) {
|
||||
// fine
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeData() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(OutputStream os = asset.getWriteStream(true)) {
|
||||
IOUtils.write("test12345", os, "ASCII");
|
||||
}
|
||||
Assert.assertEquals("test12345", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeDataAppend() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Files.write(assetPathFile, "abcdef".getBytes("ASCII"));
|
||||
try(OutputStream os = asset.getWriteStream(false)) {
|
||||
IOUtils.write("test12345", os, "ASCII");
|
||||
}
|
||||
Assert.assertEquals("abcdeftest12345", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeDataExceptionOnDir() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathDir);
|
||||
try {
|
||||
|
||||
OutputStream os = asset.getWriteStream(true);
|
||||
Assert.assertTrue("Writing to a directory should throw a IOException", false);
|
||||
} catch (IOException e) {
|
||||
// Fine
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void storeDataFile() throws IOException {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Path dataFile = Files.createTempFile("testdata", "dat");
|
||||
try(OutputStream os = Files.newOutputStream(dataFile)) {
|
||||
IOUtils.write("testkdkdkd", os, "ASCII");
|
||||
}
|
||||
asset.replaceDataFromFile(dataFile);
|
||||
Assert.assertEquals("testkdkdkd", IOUtils.toString(assetPathFile.toUri().toURL(), "ASCII"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exists() {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Assert.assertTrue(asset.exists());
|
||||
FilesystemAsset asset2 = new FilesystemAsset(filesystemStorage, "/test1234", Paths.get("abcdefgkdkdk"));
|
||||
Assert.assertFalse(asset2.exists());
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getFilePath() {
|
||||
FilesystemAsset asset = new FilesystemAsset(filesystemStorage, "/test1234", assetPathFile);
|
||||
Assert.assertEquals(assetPathFile, asset.getFilePath());
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package org.apache.archiva.repository.content;
|
||||
package org.apache.archiva.repository.storage;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
|
@ -20,8 +20,13 @@ package org.apache.archiva.repository.content;
|
|||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -30,6 +35,7 @@ import java.io.InputStream;
|
|||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
|
@ -51,8 +57,8 @@ public class FilesystemStorageTest {
|
|||
Files.createDirectories(baseDir.resolve("dir2"));
|
||||
file1 = Files.createFile(baseDir.resolve("dir1/testfile1.dat"));
|
||||
dir1 = Files.createDirectories(baseDir.resolve("dir1/testdir"));
|
||||
file1Asset = new FilesystemAsset("/dir1/testfile1.dat", file1);
|
||||
dir1Asset = new FilesystemAsset("/dir1/testdir", dir1);
|
||||
file1Asset = new FilesystemAsset(fsStorage, "/dir1/testfile1.dat", file1);
|
||||
dir1Asset = new FilesystemAsset(fsStorage, "/dir1/testdir", dir1);
|
||||
}
|
||||
|
||||
private class StringResult {
|
||||
|
@ -70,31 +76,11 @@ public class FilesystemStorageTest {
|
|||
|
||||
@After
|
||||
public void cleanup() {
|
||||
try {
|
||||
Files.deleteIfExists(file1);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Files.deleteIfExists(dir1);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Files.deleteIfExists(baseDir.resolve("dir1"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Files.deleteIfExists(baseDir.resolve("dir2"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
Files.deleteIfExists(baseDir);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
FileUtils.deleteQuietly(file1.toFile());
|
||||
FileUtils.deleteQuietly(dir1.toFile());
|
||||
FileUtils.deleteQuietly(baseDir.resolve("dir1").toFile());
|
||||
FileUtils.deleteQuietly(baseDir.resolve("dir2").toFile());
|
||||
FileUtils.deleteQuietly(baseDir.toFile());
|
||||
}
|
||||
|
||||
|
||||
|
@ -107,7 +93,7 @@ public class FilesystemStorageTest {
|
|||
}
|
||||
StringResult result = new StringResult();
|
||||
fsStorage.consumeData(file1Asset, is -> consume(is, result), false );
|
||||
assertEquals("abcdefghijkl" ,result.getData());
|
||||
Assert.assertEquals("abcdefghijkl" ,result.getData());
|
||||
}
|
||||
|
||||
private void consume(InputStream is, StringResult result) {
|
||||
|
@ -122,31 +108,31 @@ public class FilesystemStorageTest {
|
|||
@Test
|
||||
public void getAsset() {
|
||||
StorageAsset asset = fsStorage.getAsset("/dir1/testfile1.dat");
|
||||
assertEquals(file1, asset.getFilePath());
|
||||
Assert.assertEquals(file1, asset.getFilePath());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addAsset() {
|
||||
StorageAsset newAsset = fsStorage.addAsset("dir2/test", false);
|
||||
assertNotNull(newAsset);
|
||||
assertFalse(newAsset.isContainer());
|
||||
assertFalse(newAsset.exists());
|
||||
Assert.assertNotNull(newAsset);
|
||||
Assert.assertFalse(newAsset.isContainer());
|
||||
Assert.assertFalse(newAsset.exists());
|
||||
|
||||
StorageAsset newDirAsset = fsStorage.addAsset("/dir2/testdir2", true);
|
||||
assertNotNull(newDirAsset);
|
||||
assertTrue(newDirAsset.isContainer());
|
||||
assertFalse(newDirAsset.exists());
|
||||
Assert.assertNotNull(newDirAsset);
|
||||
Assert.assertTrue(newDirAsset.isContainer());
|
||||
Assert.assertFalse(newDirAsset.exists());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeAsset() throws IOException {
|
||||
assertTrue(Files.exists(file1));
|
||||
Assert.assertTrue(Files.exists(file1));
|
||||
fsStorage.removeAsset(file1Asset);
|
||||
assertFalse(Files.exists(file1));
|
||||
Assert.assertFalse(Files.exists(file1));
|
||||
|
||||
assertTrue(Files.exists(dir1));
|
||||
Assert.assertTrue(Files.exists(dir1));
|
||||
fsStorage.removeAsset(dir1Asset);
|
||||
assertFalse(Files.exists(dir1));
|
||||
Assert.assertFalse(Files.exists(dir1));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -154,23 +140,23 @@ public class FilesystemStorageTest {
|
|||
Path newFile=null;
|
||||
Path newDir=null;
|
||||
try {
|
||||
assertTrue(Files.exists(file1));
|
||||
Assert.assertTrue(Files.exists(file1));
|
||||
try (OutputStream os = Files.newOutputStream(file1)) {
|
||||
IOUtils.write("testakdkkdkdkdk", os, "ASCII");
|
||||
}
|
||||
long fileSize = Files.size(file1);
|
||||
fsStorage.moveAsset(file1Asset, "/dir2/testfile2.dat");
|
||||
assertFalse(Files.exists(file1));
|
||||
Assert.assertFalse(Files.exists(file1));
|
||||
newFile = baseDir.resolve("dir2/testfile2.dat");
|
||||
assertTrue(Files.exists(newFile));
|
||||
assertEquals(fileSize, Files.size(newFile));
|
||||
Assert.assertTrue(Files.exists(newFile));
|
||||
Assert.assertEquals(fileSize, Files.size(newFile));
|
||||
|
||||
|
||||
assertTrue(Files.exists(dir1));
|
||||
Assert.assertTrue(Files.exists(dir1));
|
||||
newDir = baseDir.resolve("dir2/testdir2");
|
||||
fsStorage.moveAsset(dir1Asset, "dir2/testdir2");
|
||||
assertFalse(Files.exists(dir1));
|
||||
assertTrue(Files.exists(newDir));
|
||||
Assert.assertFalse(Files.exists(dir1));
|
||||
Assert.assertTrue(Files.exists(newDir));
|
||||
} finally {
|
||||
if (newFile!=null) Files.deleteIfExists(newFile);
|
||||
if (newDir!=null) Files.deleteIfExists(newDir);
|
||||
|
@ -182,27 +168,33 @@ public class FilesystemStorageTest {
|
|||
Path newFile=null;
|
||||
Path newDir=null;
|
||||
try {
|
||||
assertTrue(Files.exists(file1));
|
||||
Assert.assertTrue(Files.exists(file1));
|
||||
try (OutputStream os = Files.newOutputStream(file1)) {
|
||||
IOUtils.write("testakdkkdkdkdk", os, "ASCII");
|
||||
}
|
||||
long fileSize = Files.size(file1);
|
||||
fsStorage.copyAsset(file1Asset, "/dir2/testfile2.dat");
|
||||
assertTrue(Files.exists(file1));
|
||||
assertEquals(fileSize, Files.size(file1));
|
||||
fsStorage.copyAsset(file1Asset, "/dir2/testfile2.dat", StandardCopyOption.REPLACE_EXISTING);
|
||||
Assert.assertTrue(Files.exists(file1));
|
||||
Assert.assertEquals(fileSize, Files.size(file1));
|
||||
newFile = baseDir.resolve("dir2/testfile2.dat");
|
||||
assertTrue(Files.exists(newFile));
|
||||
assertEquals(fileSize, Files.size(newFile));
|
||||
Assert.assertTrue(Files.exists(newFile));
|
||||
Assert.assertEquals(fileSize, Files.size(newFile));
|
||||
|
||||
try {
|
||||
fsStorage.copyAsset(file1Asset, "/dir2/testfile2.dat");
|
||||
Assert.assertTrue("IOException should be thrown (File exists)", false);
|
||||
} catch (IOException ex) {
|
||||
Assert.assertTrue("Exception must contain 'file exists'", ex.getMessage().contains("file exists"));
|
||||
}
|
||||
|
||||
assertTrue(Files.exists(dir1));
|
||||
Assert.assertTrue(Files.exists(dir1));
|
||||
newDir = baseDir.resolve("dir2/testdir2");
|
||||
fsStorage.copyAsset(dir1Asset, "dir2/testdir2");
|
||||
assertTrue(Files.exists(dir1));
|
||||
assertTrue(Files.exists(newDir));
|
||||
Assert.assertTrue(Files.exists(dir1));
|
||||
Assert.assertTrue(Files.exists(newDir));
|
||||
} finally {
|
||||
if (newFile!=null) Files.deleteIfExists(newFile);
|
||||
if (newDir!=null) Files.deleteIfExists(newDir);
|
||||
if (newDir!=null) FileUtils.deleteQuietly(newDir.toFile());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -52,5 +52,7 @@
|
|||
<module>archiva-repository-scanner</module>
|
||||
<module>archiva-repository-admin</module>
|
||||
<module>archiva-security-common</module>
|
||||
<module>archiva-storage-api</module>
|
||||
<module>archiva-storage-fs</module>
|
||||
</modules>
|
||||
</project>
|
||||
|
|
|
@ -28,12 +28,11 @@ import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;
|
|||
import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
|
||||
import org.apache.archiva.converter.RepositoryConversionException;
|
||||
import org.apache.archiva.repository.BasicManagedRepository;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent;
|
||||
import org.apache.archiva.repository.scanner.RepositoryScanner;
|
||||
import org.apache.archiva.repository.scanner.RepositoryScannerException;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
||||
import org.apache.maven.artifact.repository.MavenArtifactRepository;
|
||||
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
|
|
@ -19,14 +19,21 @@ package org.apache.archiva.indexer.maven;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.index.context.IndexingContext;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.sql.Date;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Set;
|
||||
|
@ -36,8 +43,11 @@ import java.util.Set;
|
|||
*/
|
||||
public class MavenIndexContext implements ArchivaIndexingContext {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(ArchivaIndexingContext.class);
|
||||
|
||||
private IndexingContext delegate;
|
||||
private Repository repository;
|
||||
private StorageAsset dir = null;
|
||||
|
||||
protected MavenIndexContext(Repository repository, IndexingContext delegate) {
|
||||
this.delegate = delegate;
|
||||
|
@ -56,8 +66,23 @@ public class MavenIndexContext implements ArchivaIndexingContext {
|
|||
}
|
||||
|
||||
@Override
|
||||
public URI getPath() {
|
||||
return delegate.getIndexDirectoryFile().toURI();
|
||||
public StorageAsset getPath() {
|
||||
if (dir==null) {
|
||||
StorageAsset repositoryDirAsset = repository.getAsset("");
|
||||
Path repositoryDir = repositoryDirAsset.getFilePath().toAbsolutePath();
|
||||
Path indexDir = delegate.getIndexDirectoryFile().toPath();
|
||||
if (indexDir.startsWith(repositoryDir)) {
|
||||
dir = repository.getAsset(repositoryDir.relativize(indexDir).toString());
|
||||
} else {
|
||||
try {
|
||||
FilesystemStorage storage = new FilesystemStorage(indexDir, new DefaultFileLockManager());
|
||||
dir = storage.getAsset("");
|
||||
} catch (IOException e) {
|
||||
log.error("Error occured while creating storage for index dir");
|
||||
}
|
||||
}
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -19,7 +19,6 @@ package org.apache.archiva.indexer.maven;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.admin.model.RepositoryAdminException;
|
||||
import org.apache.archiva.common.utils.FileUtils;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.configuration.ArchivaConfiguration;
|
||||
|
@ -28,8 +27,6 @@ import org.apache.archiva.indexer.ArchivaIndexingContext;
|
|||
import org.apache.archiva.indexer.IndexCreationFailedException;
|
||||
import org.apache.archiva.indexer.IndexUpdateFailedException;
|
||||
import org.apache.archiva.indexer.UnsupportedBaseContextException;
|
||||
import org.apache.archiva.indexer.merger.IndexMergerException;
|
||||
import org.apache.archiva.indexer.merger.TemporaryGroupIndex;
|
||||
import org.apache.archiva.proxy.ProxyRegistry;
|
||||
import org.apache.archiva.proxy.maven.WagonFactory;
|
||||
import org.apache.archiva.proxy.maven.WagonFactoryException;
|
||||
|
@ -42,10 +39,12 @@ import org.apache.archiva.repository.RemoteRepository;
|
|||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
|
||||
import org.apache.archiva.repository.content.FilesystemAsset;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.index.ArtifactContext;
|
||||
import org.apache.maven.index.ArtifactContextProducer;
|
||||
|
@ -142,7 +141,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
private ProxyRegistry proxyRegistry;
|
||||
|
||||
|
||||
private ConcurrentSkipListSet<Path> activeContexts = new ConcurrentSkipListSet<>( );
|
||||
private ConcurrentSkipListSet<StorageAsset> activeContexts = new ConcurrentSkipListSet<>( );
|
||||
|
||||
private static final int WAIT_TIME = 100;
|
||||
private static final int MAX_WAIT = 10;
|
||||
|
@ -158,9 +157,9 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
return context.getBaseContext( IndexingContext.class );
|
||||
}
|
||||
|
||||
private Path getIndexPath( ArchivaIndexingContext ctx )
|
||||
private StorageAsset getIndexPath( ArchivaIndexingContext ctx )
|
||||
{
|
||||
return PathUtil.getPathFromUri( ctx.getPath( ) );
|
||||
return ctx.getPath( );
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
|
@ -185,7 +184,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
{
|
||||
throw new IndexUpdateFailedException( "Maven index is not supported by this context", e );
|
||||
}
|
||||
final Path ctxPath = getIndexPath( context );
|
||||
final StorageAsset ctxPath = getIndexPath( context );
|
||||
int loop = MAX_WAIT;
|
||||
boolean active = false;
|
||||
while ( loop-- > 0 && !active )
|
||||
|
@ -395,9 +394,9 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void addArtifactsToIndex( final ArchivaIndexingContext context, final Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.addArtifactsToIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -411,9 +410,9 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void removeArtifactsFromIndex( ArchivaIndexingContext context, Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.deleteArtifactsFromIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -457,9 +456,8 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
throw new IndexCreationFailedException( "Could not create index context for repository " + repository.getId( )
|
||||
+ ( StringUtils.isNotEmpty( e.getMessage( ) ) ? ": " + e.getMessage( ) : "" ), e );
|
||||
}
|
||||
MavenIndexContext context = new MavenIndexContext( repository, mvnCtx );
|
||||
|
||||
return context;
|
||||
return new MavenIndexContext( repository, mvnCtx );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -472,7 +470,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
log.warn("Index close failed");
|
||||
}
|
||||
try {
|
||||
FileUtils.deleteDirectory(Paths.get(context.getPath()));
|
||||
StorageUtil.deleteRecursively(context.getPath());
|
||||
} catch (IOException e) {
|
||||
throw new IndexUpdateFailedException("Could not delete index files");
|
||||
}
|
||||
|
@ -593,51 +591,57 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
}
|
||||
}
|
||||
|
||||
private StorageAsset getIndexPath(URI indexDir, Path repoDir, String defaultDir) throws IOException
|
||||
private StorageAsset getIndexPath(URI indexDirUri, RepositoryStorage storage, String defaultDir) throws IOException
|
||||
{
|
||||
String indexPath = indexDir.getPath();
|
||||
Path indexDirectory = null;
|
||||
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
|
||||
Path indexDirectory;
|
||||
Path repositoryPath = storage.getAsset("").getFilePath().toAbsolutePath();
|
||||
StorageAsset indexDir;
|
||||
if ( ! StringUtils.isEmpty(indexDirUri.toString( ) ) )
|
||||
{
|
||||
|
||||
indexDirectory = PathUtil.getPathFromUri( indexDir );
|
||||
indexDirectory = PathUtil.getPathFromUri( indexDirUri );
|
||||
// not absolute so create it in repository directory
|
||||
if ( indexDirectory.isAbsolute( ) )
|
||||
if ( indexDirectory.isAbsolute( ) && !indexDirectory.startsWith(repositoryPath))
|
||||
{
|
||||
indexPath = indexDirectory.getFileName().toString();
|
||||
if (storage instanceof FilesystemStorage) {
|
||||
FilesystemStorage fsStorage = (FilesystemStorage) storage;
|
||||
FilesystemStorage indexStorage = new FilesystemStorage(indexDirectory.getParent(), fsStorage.getFileLockManager());
|
||||
indexDir = indexStorage.getAsset(indexDirectory.getFileName().toString());
|
||||
} else {
|
||||
throw new IOException("The given storage is not file based.");
|
||||
}
|
||||
} else if (indexDirectory.isAbsolute()) {
|
||||
indexDir = storage.getAsset(repositoryPath.relativize(indexDirectory).toString());
|
||||
}
|
||||
else
|
||||
{
|
||||
indexDirectory = repoDir.resolve( indexDirectory );
|
||||
indexDir = storage.getAsset(indexDirectory.toString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
indexDirectory = repoDir.resolve( defaultDir );
|
||||
indexPath = defaultDir;
|
||||
indexDir = storage.getAsset( defaultDir );
|
||||
}
|
||||
|
||||
if ( !Files.exists( indexDirectory ) )
|
||||
if ( !indexDir.exists() )
|
||||
{
|
||||
Files.createDirectories( indexDirectory );
|
||||
indexDir.create();
|
||||
}
|
||||
return new FilesystemAsset( indexPath, indexDirectory);
|
||||
return indexDir;
|
||||
}
|
||||
|
||||
private StorageAsset getIndexPath( Repository repo) throws IOException {
|
||||
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
|
||||
return getIndexPath( icf.getIndexPath(), repo.getAsset( "" ).getFilePath(), DEFAULT_INDEX_PATH);
|
||||
return getIndexPath( icf.getIndexPath(), repo, DEFAULT_INDEX_PATH);
|
||||
}
|
||||
|
||||
private StorageAsset getPackedIndexPath(Repository repo) throws IOException {
|
||||
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
|
||||
return getIndexPath(icf.getPackedIndexPath(), repo.getAsset( "" ).getFilePath(), DEFAULT_PACKED_INDEX_PATH);
|
||||
return getIndexPath(icf.getPackedIndexPath(), repo, DEFAULT_PACKED_INDEX_PATH);
|
||||
}
|
||||
|
||||
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
|
||||
{
|
||||
Path appServerBase = archivaConfiguration.getAppServerBaseDir( );
|
||||
|
||||
String contextKey = "remote-" + remoteRepository.getId( );
|
||||
|
||||
|
||||
|
@ -648,7 +652,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
Files.createDirectories( repoDir );
|
||||
}
|
||||
|
||||
StorageAsset indexDirectory = null;
|
||||
StorageAsset indexDirectory;
|
||||
|
||||
// is there configured indexDirectory ?
|
||||
if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
|
||||
|
@ -715,7 +719,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
}
|
||||
}
|
||||
|
||||
StorageAsset indexDirectory = null;
|
||||
StorageAsset indexDirectory;
|
||||
|
||||
if ( repository.supportsFeature( IndexCreationFeature.class ) )
|
||||
{
|
||||
|
@ -837,23 +841,18 @@ public class MavenIndexManager implements ArchivaIndexManager {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void connect( String id, String url )
|
||||
throws IOException
|
||||
{
|
||||
public void connect( String id, String url ) {
|
||||
//no op
|
||||
}
|
||||
|
||||
@Override
|
||||
public void disconnect( )
|
||||
throws IOException
|
||||
{
|
||||
public void disconnect( ) {
|
||||
// no op
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream retrieve( String name )
|
||||
throws IOException, FileNotFoundException
|
||||
{
|
||||
throws IOException {
|
||||
try
|
||||
{
|
||||
log.info( "index update retrieve file, name:{}", name );
|
||||
|
|
|
@ -208,7 +208,7 @@ public class MavenIndexManagerTest {
|
|||
assertNotNull(ctx);
|
||||
assertEquals(repository, ctx.getRepository());
|
||||
assertEquals("test-repo", ctx.getId());
|
||||
assertEquals(indexPath.toAbsolutePath(), Paths.get(ctx.getPath()).toAbsolutePath());
|
||||
assertEquals(indexPath.toAbsolutePath(), ctx.getPath().getFilePath().toAbsolutePath());
|
||||
assertTrue(Files.exists(indexPath));
|
||||
List<Path> li = Files.list(indexPath).collect(Collectors.toList());
|
||||
assertTrue(li.size()>0);
|
||||
|
|
|
@ -39,6 +39,10 @@
|
|||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-model</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-xml-tools</artifactId>
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.apache.archiva.maven2.metadata;
|
|||
import org.apache.archiva.model.ArchivaRepositoryMetadata;
|
||||
import org.apache.archiva.model.Plugin;
|
||||
import org.apache.archiva.model.SnapshotVersion;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.archiva.xml.XMLReader;
|
||||
import org.apache.commons.lang.math.NumberUtils;
|
||||
|
@ -64,6 +65,14 @@ public class MavenMetadataReader
|
|||
|
||||
private static final Logger log = LoggerFactory.getLogger( MavenMetadataReader.class );
|
||||
|
||||
public static ArchivaRepositoryMetadata read(StorageAsset metadataFile) throws XMLException, IOException {
|
||||
if (metadataFile.isFileBased()) {
|
||||
return read(metadataFile.getFilePath());
|
||||
} else {
|
||||
throw new IOException("StorageAsset is not file based");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read and return the {@link org.apache.archiva.model.ArchivaRepositoryMetadata} object from the provided xml file.
|
||||
*
|
||||
|
@ -72,8 +81,7 @@ public class MavenMetadataReader
|
|||
* @throws XMLException
|
||||
*/
|
||||
public static ArchivaRepositoryMetadata read( Path metadataFile )
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
|
||||
XMLReader xml = new XMLReader( "metadata", metadataFile );
|
||||
// invoke this to remove namespaces, see MRM-1136
|
||||
|
@ -85,25 +93,9 @@ public class MavenMetadataReader
|
|||
metadata.setArtifactId( xml.getElementText( "//metadata/artifactId" ) );
|
||||
metadata.setVersion( xml.getElementText( "//metadata/version" ) );
|
||||
Date modTime;
|
||||
try
|
||||
{
|
||||
modTime = new Date(Files.getLastModifiedTime( metadataFile ).toMillis( ));
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
modTime = new Date();
|
||||
log.error("Could not read modification time of {}", metadataFile);
|
||||
}
|
||||
modTime = new Date(Files.getLastModifiedTime(metadataFile).toMillis());
|
||||
metadata.setFileLastModified( modTime );
|
||||
try
|
||||
{
|
||||
metadata.setFileSize( Files.size( metadataFile ) );
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
metadata.setFileSize( 0 );
|
||||
log.error("Could not read file size of {}", metadataFile);
|
||||
}
|
||||
metadata.setFileSize( Files.size(metadataFile) );
|
||||
|
||||
metadata.setLastUpdated( xml.getElementText( "//metadata/versioning/lastUpdated" ) );
|
||||
metadata.setLatestVersion( xml.getElementText( "//metadata/versioning/latest" ) );
|
||||
|
|
|
@ -28,7 +28,7 @@ import org.apache.archiva.proxy.ProxyException;
|
|||
import org.apache.archiva.proxy.model.NetworkProxy;
|
||||
import org.apache.archiva.proxy.model.ProxyConnector;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.wagon.ConnectionException;
|
||||
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||
|
@ -113,7 +113,7 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
|
|||
* @throws NotModifiedException
|
||||
*/
|
||||
protected void transferResources( ProxyConnector connector, RemoteRepositoryContent remoteRepository,
|
||||
Path tmpResource, Path[] checksumFiles, String url, String remotePath, StorageAsset resource,
|
||||
StorageAsset tmpResource, StorageAsset[] checksumFiles, String url, String remotePath, StorageAsset resource,
|
||||
Path workingDirectory, ManagedRepositoryContent repository )
|
||||
throws ProxyException, NotModifiedException {
|
||||
Wagon wagon = null;
|
||||
|
@ -153,9 +153,9 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
|
|||
// to
|
||||
// save on connections since md5 is rarely used
|
||||
for (int i=0; i<checksumFiles.length; i++) {
|
||||
String ext = "."+StringUtils.substringAfterLast( checksumFiles[i].getFileName( ).toString( ), "." );
|
||||
String ext = "."+StringUtils.substringAfterLast(checksumFiles[i].getName( ), "." );
|
||||
transferChecksum(wagon, remoteRepository, remotePath, repository, resource.getFilePath(), ext,
|
||||
checksumFiles[i]);
|
||||
checksumFiles[i].getFilePath());
|
||||
}
|
||||
}
|
||||
} catch (NotFoundException e) {
|
||||
|
@ -182,9 +182,9 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler {
|
|||
|
||||
protected void transferArtifact(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath,
|
||||
ManagedRepositoryContent repository, Path resource, Path tmpDirectory,
|
||||
Path destFile)
|
||||
StorageAsset destFile)
|
||||
throws ProxyException {
|
||||
transferSimpleFile(wagon, remoteRepository, remotePath, repository, resource, destFile);
|
||||
transferSimpleFile(wagon, remoteRepository, remotePath, repository, resource, destFile.getFilePath());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.apache.archiva.policies.ChecksumPolicy;
|
|||
import org.apache.archiva.policies.ReleasesPolicy;
|
||||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.policies.urlcache.UrlFailureCache;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.Test;
|
||||
|
@ -82,7 +83,7 @@ public class CacheFailuresTransferTest
|
|||
|
||||
wagonMockControl.replay();
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
wagonMockControl.verify();
|
||||
|
||||
|
@ -92,7 +93,7 @@ public class CacheFailuresTransferTest
|
|||
downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
wagonMockControl.verify();
|
||||
|
||||
assertNotDownloaded( downloadedFile);
|
||||
assertNotDownloaded( downloadedFile.getFilePath());
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -124,7 +125,7 @@ public class CacheFailuresTransferTest
|
|||
|
||||
wagonMockControl.replay();
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
wagonMockControl.verify();
|
||||
|
||||
|
@ -140,7 +141,7 @@ public class CacheFailuresTransferTest
|
|||
|
||||
wagonMockControl.verify();
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -168,11 +169,11 @@ public class CacheFailuresTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied2", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.YES, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
// Validate that file actually came from proxied2 (as intended).
|
||||
Path proxied2File = Paths.get( REPOPATH_PROXIED2, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied2File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied2File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ import org.apache.archiva.policies.CachedFailuresPolicy;
|
|||
import org.apache.archiva.policies.ChecksumPolicy;
|
||||
import org.apache.archiva.policies.ReleasesPolicy;
|
||||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||
import org.easymock.EasyMock;
|
||||
import org.junit.Test;
|
||||
|
@ -63,7 +64,7 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, true );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNull( downloadedFile );
|
||||
}
|
||||
|
@ -85,10 +86,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "066d76e459f7782c312c31e8a11b3c0f1e3e43a7 *get-checksum-both-right-1.0.jar",
|
||||
"e58f30c6a150a2e843552438d18e15cb *get-checksum-both-right-1.0.jar" );
|
||||
|
@ -111,10 +112,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "748a3a013bf5eacf2bbb40a2ac7d37889b728837 *get-checksum-sha1-only-1.0.jar",
|
||||
null );
|
||||
|
@ -137,10 +138,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, null, "f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
|
||||
}
|
||||
|
@ -162,10 +163,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, null, null );
|
||||
}
|
||||
|
@ -187,10 +188,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "invalid checksum file", "invalid checksum file" );
|
||||
}
|
||||
|
@ -212,9 +213,9 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertChecksums( expectedFile, null, null );
|
||||
}
|
||||
|
||||
|
@ -235,10 +236,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "4ec20a12dc91557330bd0b39d1805be5e329ae56 get-checksum-both-bad-1.0.jar",
|
||||
"a292491a35925465e693a44809a078b5 get-checksum-both-bad-1.0.jar" );
|
||||
|
@ -261,9 +262,9 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertChecksums( expectedFile, null, null );
|
||||
}
|
||||
|
||||
|
@ -284,11 +285,11 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
// This is a success situation. No SHA1 with a Good MD5.
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, null, "f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
|
||||
}
|
||||
|
@ -310,9 +311,9 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FAIL, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertChecksums( expectedFile, null, null );
|
||||
}
|
||||
|
||||
|
@ -333,10 +334,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "3dd1a3a57b807d3ef3fbc6013d926c891cbb8670 *get-checksum-sha1-bad-md5-1.0.jar",
|
||||
"invalid checksum file" );
|
||||
|
@ -360,10 +361,10 @@ public class ChecksumTransferTest
|
|||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "3dd1a3a57b807d3ef3fbc6013d926c891cbb8670 *get-checksum-sha1-bad-md5-1.0.jar",
|
||||
"c35f3b76268b73a4ba617f6f275c49ab get-checksum-sha1-bad-md5-1.0.jar" );
|
||||
|
@ -386,10 +387,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "71f7dc3f72053a3f2d9fdd6fef9db055ef957ffb get-checksum-md5-only-1.0.jar",
|
||||
"f3af5201bf8da801da37db8842846e1c *get-checksum-md5-only-1.0.jar" );
|
||||
|
@ -412,10 +413,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "1f12821c5e43e1a0b76b9564a6ddb0548ccb9486 get-default-layout-1.0.jar",
|
||||
"3f7341545f21226b6f49a3c2704cb9be get-default-layout-1.0.jar" );
|
||||
|
@ -452,7 +453,7 @@ public class ChecksumTransferTest
|
|||
|
||||
wagonMockControl.replay();
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
wagonMockControl.verify();
|
||||
|
||||
|
@ -465,7 +466,7 @@ public class ChecksumTransferTest
|
|||
|
||||
// Test results.
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "748a3a013bf5eacf2bbb40a2ac7d37889b728837 *get-checksum-sha1-only-1.0.jar",
|
||||
null );
|
||||
|
@ -489,10 +490,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get( REPOPATH_PROXIED1, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
// There are no hashcodes on the proxy side to download, hence the local ones should remain invalid.
|
||||
assertChecksums( expectedFile, "invalid checksum file", "invalid checksum file" );
|
||||
|
@ -516,9 +517,9 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, ChecksumPolicy.FAIL, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNoTempFiles( expectedFile );
|
||||
// There are no hashcodes on the proxy side to download.
|
||||
// The FAIL policy will delete the checksums as bad.
|
||||
|
@ -544,10 +545,10 @@ public class ChecksumTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, "proxied1", ChecksumPolicy.FIX, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
assertChecksums( expectedFile, "96a08dc80a108cba8efd3b20aec91b32a0b2cbd4 get-bad-local-checksum-1.0.jar",
|
||||
"46fdd6ca55bf1d7a7eb0c858f41e0ccd get-bad-local-checksum-1.0.jar" );
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.apache.archiva.policies.ProxyDownloadException;
|
|||
import org.apache.archiva.policies.ReleasesPolicy;
|
||||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.repository.LayoutException;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||
import org.apache.maven.wagon.TransferFailedException;
|
||||
import org.apache.maven.wagon.authorization.AuthorizationException;
|
||||
|
@ -598,7 +599,7 @@ public class ErrorHandlingTest
|
|||
wagonMockControl.replay();
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = null;
|
||||
StorageAsset downloadedFile = null;
|
||||
try
|
||||
{
|
||||
downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository,
|
||||
|
@ -616,33 +617,33 @@ public class ErrorHandlingTest
|
|||
|
||||
wagonMockControl.verify();
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
}
|
||||
|
||||
private void confirmSuccess( String path, Path expectedFile, String basedir )
|
||||
throws Exception
|
||||
{
|
||||
Path downloadedFile = performDownload( path );
|
||||
StorageAsset downloadedFile = performDownload( path );
|
||||
|
||||
Path proxied1File = Paths.get( basedir, path );
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
}
|
||||
|
||||
private void confirmNotDownloadedNoError( String path )
|
||||
throws Exception
|
||||
{
|
||||
Path downloadedFile = performDownload( path );
|
||||
StorageAsset downloadedFile = performDownload( path );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
}
|
||||
|
||||
private Path performDownload( String path )
|
||||
private StorageAsset performDownload( String path )
|
||||
throws ProxyDownloadException, LayoutException
|
||||
{
|
||||
wagonMockControl.replay();
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toArtifactReference( path ) );
|
||||
|
||||
wagonMockControl.verify();
|
||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.archiva.policies.ReleasesPolicy;
|
|||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.proxy.model.RepositoryProxyHandler;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.assertj.core.api.Assertions;
|
||||
|
@ -208,18 +209,18 @@ public class HttpProxyTransferTest
|
|||
ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path sourceFile = Paths.get( PROXIED_BASEDIR, path );
|
||||
assertNotNull( "Expected File should not be null.", expectedFile );
|
||||
assertNotNull( "Actual File should not be null.", downloadedFile );
|
||||
|
||||
assertTrue( "Check actual file exists.", Files.exists(downloadedFile));
|
||||
assertTrue( "Check filename path is appropriate.", Files.isSameFile( expectedFile, downloadedFile));
|
||||
assertTrue( "Check file path matches.", Files.isSameFile( expectedFile, downloadedFile));
|
||||
assertTrue( "Check actual file exists.", Files.exists(downloadedFile.getFilePath()));
|
||||
assertTrue( "Check filename path is appropriate.", Files.isSameFile( expectedFile, downloadedFile.getFilePath()));
|
||||
assertTrue( "Check file path matches.", Files.isSameFile( expectedFile, downloadedFile.getFilePath()));
|
||||
|
||||
String expectedContents = FileUtils.readFileToString( sourceFile.toFile(), Charset.defaultCharset() );
|
||||
String actualContents = FileUtils.readFileToString( downloadedFile.toFile(), Charset.defaultCharset() );
|
||||
String actualContents = FileUtils.readFileToString( downloadedFile.getFilePath().toFile(), Charset.defaultCharset() );
|
||||
assertEquals( "Check file contents.", expectedContents, actualContents );
|
||||
|
||||
Assertions.assertThat( System.getProperty( "http.proxyHost" , "") ).isEmpty();
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.apache.archiva.policies.CachedFailuresPolicy;
|
|||
import org.apache.archiva.policies.ChecksumPolicy;
|
||||
import org.apache.archiva.policies.ReleasesPolicy;
|
||||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||
|
@ -64,7 +65,7 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, true );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
assertNull( "File should not have been downloaded", downloadedFile );
|
||||
}
|
||||
|
||||
|
@ -86,10 +87,10 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path sourceFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, sourceFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), sourceFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -110,13 +111,13 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
|
||||
|
||||
Path sourceFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, sourceFile );
|
||||
assertFalse( Files.exists( downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".sha1" )) );
|
||||
assertFalse( Files.exists(downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".md5" ) ));
|
||||
assertFalse( Files.exists( downloadedFile.getParent().resolve(downloadedFile.getFileName() + ".asc" ) ));
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), sourceFile );
|
||||
assertFalse( Files.exists( downloadedFile.getParent().getFilePath().resolve(downloadedFile.getName() + ".sha1" )) );
|
||||
assertFalse( Files.exists(downloadedFile.getParent().getFilePath().resolve(downloadedFile.getName() + ".md5" ) ));
|
||||
assertFalse( Files.exists( downloadedFile.getParent().getFilePath().resolve(downloadedFile.getName() + ".asc" ) ));
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -145,9 +146,9 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertFileEquals( expectedFile, downloadedFile, expectedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), expectedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -179,9 +180,9 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, path );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNotModified( expectedFile, originalModificationTime );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
@ -225,9 +226,9 @@ public class ManagedDefaultTransferTest
|
|||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNotModified( expectedFile, originalModificationTime );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
@ -270,10 +271,10 @@ public class ManagedDefaultTransferTest
|
|||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -302,10 +303,10 @@ public class ManagedDefaultTransferTest
|
|||
CachedFailuresPolicy.NO, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -326,15 +327,15 @@ public class ManagedDefaultTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied1File = Paths.get(REPOPATH_PROXIED1, path);
|
||||
Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied1File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied1File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
|
||||
// TODO: is this check even needed if it passes above?
|
||||
String actualContents = FileUtils.readFileToString( downloadedFile.toFile(), Charset.defaultCharset() );
|
||||
String actualContents = FileUtils.readFileToString( downloadedFile.getFilePath().toFile(), Charset.defaultCharset() );
|
||||
String badContents = FileUtils.readFileToString( proxied2File.toFile(), Charset.defaultCharset() );
|
||||
assertFalse( "Downloaded file contents should not be that of proxy 2",
|
||||
StringUtils.equals( actualContents, badContents ) );
|
||||
|
@ -357,10 +358,10 @@ public class ManagedDefaultTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied2File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied2File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -381,7 +382,7 @@ public class ManagedDefaultTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNull( "File returned was: " + downloadedFile + "; should have got a not found exception",
|
||||
downloadedFile );
|
||||
|
@ -412,12 +413,12 @@ public class ManagedDefaultTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, false );
|
||||
|
||||
// Attempt the proxy fetch.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
wagonMockControl.verify();
|
||||
|
||||
Path proxied2File = Paths.get(REPOPATH_PROXIED2, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxied2File );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxied2File );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -451,9 +452,9 @@ public class ManagedDefaultTransferTest
|
|||
|
||||
wagonMockControl.replay();
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
|
||||
wagonMockControl.verify();
|
||||
assertNoTempFiles( expectedFile );
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.archiva.proxy;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.VersionUtil;
|
||||
import org.apache.archiva.configuration.ProxyConnectorConfiguration;
|
||||
import org.apache.archiva.maven2.metadata.MavenMetadataReader;
|
||||
|
@ -34,6 +35,8 @@ import org.apache.archiva.policies.SnapshotsPolicy;
|
|||
import org.apache.archiva.repository.metadata.MetadataTools;
|
||||
import org.apache.archiva.repository.metadata.RepositoryMetadataException;
|
||||
import org.apache.archiva.repository.metadata.RepositoryMetadataWriter;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.wagon.TransferFailedException;
|
||||
import org.custommonkey.xmlunit.DetailedDiff;
|
||||
|
@ -125,7 +128,7 @@ public class MetadataTransferTest
|
|||
|
||||
ProjectReference metadata = createProjectReference( requestedResource );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toMetadataPath(
|
||||
metadata ) ).getFile();
|
||||
|
||||
|
@ -988,7 +991,7 @@ public class MetadataTransferTest
|
|||
|
||||
ProjectReference metadata = createProjectReference( requestedResource );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toMetadataPath(
|
||||
metadata ) ).getFile();
|
||||
|
||||
|
@ -1014,7 +1017,7 @@ public class MetadataTransferTest
|
|||
Path expectedFile = managedDefaultDir.resolve(requestedResource);
|
||||
ProjectReference metadata = createProjectReference( requestedResource );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toMetadataPath(
|
||||
metadata ) ).getFile();
|
||||
|
||||
|
@ -1035,7 +1038,7 @@ public class MetadataTransferTest
|
|||
|
||||
VersionedReference metadata = createVersionedReference( requestedResource );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toMetadataPath(
|
||||
metadata ) ).getFile();
|
||||
|
||||
|
@ -1061,7 +1064,7 @@ public class MetadataTransferTest
|
|||
Path expectedFile = managedDefaultDir.resolve(requestedResource);
|
||||
VersionedReference metadata = createVersionedReference( requestedResource );
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
StorageAsset downloadedFile = proxyHandler.fetchMetadataFromProxies( managedDefaultRepository,
|
||||
managedDefaultRepository.toMetadataPath(
|
||||
metadata ) ).getFile();
|
||||
|
||||
|
@ -1090,7 +1093,9 @@ public class MetadataTransferTest
|
|||
assertTrue( "Actual file exists.", Files.exists(actualFile) );
|
||||
|
||||
StringWriter actualContents = new StringWriter();
|
||||
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( actualFile );
|
||||
FilesystemStorage fsStorage = new FilesystemStorage(actualFile.getParent(), new DefaultFileLockManager());
|
||||
StorageAsset actualFileAsset = fsStorage.getAsset(actualFile.getFileName().toString());
|
||||
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( actualFileAsset );
|
||||
RepositoryMetadataWriter.write( metadata, actualContents );
|
||||
|
||||
DetailedDiff detailedDiff = new DetailedDiff( new Diff( expectedMetadataXml, actualContents.toString() ) );
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.apache.archiva.policies.CachedFailuresPolicy;
|
|||
import org.apache.archiva.policies.ChecksumPolicy;
|
||||
import org.apache.archiva.policies.ReleasesPolicy;
|
||||
import org.apache.archiva.policies.SnapshotsPolicy;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.nio.file.Files;
|
||||
|
@ -59,8 +60,8 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
assertNotDownloaded( downloadedFile );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -80,10 +81,10 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -103,10 +104,10 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -128,10 +129,10 @@ public class SnapshotTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false );
|
||||
|
||||
// Attempt to download.
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
// Should not have downloaded as managed is newer than remote.
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -220,9 +221,9 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -244,9 +245,9 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
assertNotDownloaded( downloadedFile );
|
||||
assertNotDownloaded( downloadedFile.getFilePath() );
|
||||
assertNotModified( expectedFile, expectedTimestamp );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
@ -270,10 +271,10 @@ public class SnapshotTransferTest
|
|||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED2, ChecksumPolicy.IGNORE, ReleasesPolicy.ALWAYS,
|
||||
SnapshotsPolicy.ALWAYS, CachedFailuresPolicy.YES , false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -293,10 +294,10 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
|
||||
|
@ -320,10 +321,10 @@ public class SnapshotTransferTest
|
|||
// Configure Connector (usually done within archiva.xml configuration)
|
||||
saveConnector( ID_DEFAULT_MANAGED, ID_PROXIED1, false);
|
||||
|
||||
Path downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
StorageAsset downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact );
|
||||
|
||||
Path proxiedFile = Paths.get(REPOPATH_PROXIED1, path);
|
||||
assertFileEquals( expectedFile, downloadedFile, proxiedFile );
|
||||
assertFileEquals( expectedFile, downloadedFile.getFilePath(), proxiedFile );
|
||||
assertNoTempFiles( expectedFile );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.archiva.repository.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.VersionUtil;
|
||||
import org.apache.archiva.metadata.model.ArtifactMetadata;
|
||||
import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
|
||||
|
@ -27,10 +28,12 @@ import org.apache.archiva.model.ArtifactReference;
|
|||
import org.apache.archiva.model.ProjectReference;
|
||||
import org.apache.archiva.model.VersionedReference;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
@ -50,6 +53,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
|
||||
|
||||
private ManagedRepository repository;
|
||||
private FilesystemStorage fsStorage;
|
||||
|
||||
ManagedRepositoryContentMock(ManagedRepository repo) {
|
||||
this.repository = repo;
|
||||
|
@ -94,7 +98,18 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
@Override
|
||||
public String getRepoRoot( )
|
||||
{
|
||||
return Paths.get("", "target", "test-repository", "managed").toString();
|
||||
return getRepoRootAsset().getFilePath().toString();
|
||||
}
|
||||
|
||||
private StorageAsset getRepoRootAsset() {
|
||||
if (fsStorage==null) {
|
||||
try {
|
||||
fsStorage = new FilesystemStorage(Paths.get("", "target", "test-repository", "managed"), new DefaultFileLockManager());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return fsStorage.getAsset("");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -331,7 +346,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
|
|||
@Override
|
||||
public StorageAsset toFile( ArtifactReference reference )
|
||||
{
|
||||
return Paths.get(getRepoRoot(), refs.get(reference));
|
||||
return getRepoRootAsset().resolve( refs.get(reference));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.archiva.repository.RemoteRepository;
|
|||
import org.apache.archiva.repository.RepositoryRegistry;
|
||||
import org.apache.archiva.repository.maven2.MavenSystemManager;
|
||||
import org.apache.archiva.repository.metadata.MetadataTools;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.artifact.Artifact;
|
||||
|
@ -55,8 +56,7 @@ import org.springframework.stereotype.Service;
|
|||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -233,22 +233,22 @@ public class Maven3DependencyTreeBuilder
|
|||
for ( String repoId : repositoryIds )
|
||||
{
|
||||
ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(repoId);
|
||||
Path repoDir = managedRepo.getAsset("").getFilePath();
|
||||
StorageAsset repoDir = managedRepo.getAsset("");
|
||||
|
||||
Path file = pathTranslator.toFile( repoDir, projectArtifact.getGroupId(), projectArtifact.getArtifactId(),
|
||||
StorageAsset file = pathTranslator.toFile( repoDir, projectArtifact.getGroupId(), projectArtifact.getArtifactId(),
|
||||
projectArtifact.getBaseVersion(),
|
||||
projectArtifact.getArtifactId() + "-" + projectArtifact.getVersion()
|
||||
+ ".pom" );
|
||||
|
||||
if ( Files.exists(file) )
|
||||
if ( file.exists() )
|
||||
{
|
||||
return managedRepo;
|
||||
}
|
||||
// try with snapshot version
|
||||
if ( StringUtils.endsWith( projectArtifact.getBaseVersion(), VersionUtil.SNAPSHOT ) )
|
||||
{
|
||||
Path metadataFile = file.getParent().resolve( MetadataTools.MAVEN_METADATA );
|
||||
if ( Files.exists(metadataFile) )
|
||||
StorageAsset metadataFile = file.getParent().resolve( MetadataTools.MAVEN_METADATA );
|
||||
if ( metadataFile.exists() )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -262,14 +262,14 @@ public class Maven3DependencyTreeBuilder
|
|||
"-" + VersionUtil.SNAPSHOT ) ).append( '-' ).append(
|
||||
timeStamp ).append( '-' ).append( Integer.toString( buildNumber ) ).append(
|
||||
".pom" ).toString();
|
||||
Path timeStampFile = file.getParent().resolve( timeStampFileName );
|
||||
StorageAsset timeStampFile = file.getParent().resolve( timeStampFileName );
|
||||
log.debug( "try to find timestamped snapshot version file: {}", timeStampFile);
|
||||
if ( Files.exists(timeStampFile) )
|
||||
if ( timeStampFile.exists() )
|
||||
{
|
||||
return managedRepo;
|
||||
}
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
log.warn( "skip fail to find timestamped snapshot pom: {}", e.getMessage() );
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.apache.archiva.common.utils.VersionUtil;
|
|||
import org.apache.archiva.metadata.model.ArtifactMetadata;
|
||||
import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
|
||||
import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
@ -78,13 +79,13 @@ public class Maven2RepositoryPathTranslator
|
|||
}
|
||||
|
||||
@Override
|
||||
public Path toFile(Path basedir, String namespace, String projectId, String projectVersion, String filename )
|
||||
public StorageAsset toFile(StorageAsset basedir, String namespace, String projectId, String projectVersion, String filename )
|
||||
{
|
||||
return basedir.resolve( toPath( namespace, projectId, projectVersion, filename ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path toFile( Path basedir, String namespace, String projectId, String projectVersion )
|
||||
public StorageAsset toFile( StorageAsset basedir, String namespace, String projectId, String projectVersion )
|
||||
{
|
||||
return basedir.resolve( toPath( namespace, projectId, projectVersion ) );
|
||||
}
|
||||
|
@ -148,13 +149,13 @@ public class Maven2RepositoryPathTranslator
|
|||
}
|
||||
|
||||
@Override
|
||||
public Path toFile( Path basedir, String namespace, String projectId )
|
||||
public StorageAsset toFile( StorageAsset basedir, String namespace, String projectId )
|
||||
{
|
||||
return basedir.resolve( toPath( namespace, projectId ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path toFile( Path basedir, String namespace )
|
||||
public StorageAsset toFile( StorageAsset basedir, String namespace )
|
||||
{
|
||||
return basedir.resolve( toPath( namespace ) );
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ import org.apache.archiva.proxy.model.RepositoryProxyHandler;
|
|||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.PathParser;
|
||||
import org.apache.archiva.repository.maven2.MavenSystemManager;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
@ -80,11 +81,9 @@ import javax.inject.Named;
|
|||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.Reader;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
@ -95,7 +94,6 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
// import java.io.FileNotFoundException;
|
||||
|
||||
|
@ -187,9 +185,9 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
}
|
||||
}
|
||||
Path basedir = Paths.get(managedRepository.getLocation());
|
||||
StorageAsset basedir = managedRepository.getAsset("");
|
||||
if (VersionUtil.isSnapshot(artifactVersion)) {
|
||||
Path metadataFile = pathTranslator.toFile(basedir, readMetadataRequest.getNamespace(),
|
||||
StorageAsset metadataFile = pathTranslator.toFile(basedir, readMetadataRequest.getNamespace(),
|
||||
readMetadataRequest.getProjectId(), artifactVersion,
|
||||
METADATA_FILENAME);
|
||||
try {
|
||||
|
@ -203,7 +201,7 @@ public class Maven2RepositoryStorage
|
|||
artifactVersion =
|
||||
artifactVersion + snapshotVersion.getTimestamp() + "-" + snapshotVersion.getBuildNumber();
|
||||
}
|
||||
} catch (XMLException e) {
|
||||
} catch (XMLException | IOException e) {
|
||||
// unable to parse metadata - LOGGER it, and continue with the version as the original SNAPSHOT version
|
||||
LOGGER.warn("Invalid metadata: {} - {}", metadataFile, e.getMessage());
|
||||
}
|
||||
|
@ -211,14 +209,14 @@ public class Maven2RepositoryStorage
|
|||
|
||||
// TODO: won't work well with some other layouts, might need to convert artifact parts to ID by path translator
|
||||
String id = readMetadataRequest.getProjectId() + "-" + artifactVersion + ".pom";
|
||||
Path file =
|
||||
StorageAsset file =
|
||||
pathTranslator.toFile(basedir, readMetadataRequest.getNamespace(), readMetadataRequest.getProjectId(),
|
||||
readMetadataRequest.getProjectVersion(), id);
|
||||
|
||||
if (!Files.exists(file)) {
|
||||
if (!file.exists()) {
|
||||
// metadata could not be resolved
|
||||
throw new RepositoryStorageMetadataNotFoundException(
|
||||
"The artifact's POM file '" + file.toAbsolutePath() + "' was missing");
|
||||
"The artifact's POM file '" + file.getPath() + "' was missing");
|
||||
}
|
||||
|
||||
// TODO: this is a workaround until we can properly resolve using proxies as well - this doesn't cache
|
||||
|
@ -254,7 +252,7 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
ModelBuildingRequest req =
|
||||
new DefaultModelBuildingRequest().setProcessPlugins(false).setPomFile(file.toFile()).setTwoPhaseBuilding(
|
||||
new DefaultModelBuildingRequest().setProcessPlugins(false).setPomFile(file.getFilePath().toFile()).setTwoPhaseBuilding(
|
||||
false).setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
|
||||
|
||||
//MRM-1607. olamy this will resolve jdk profiles on the current running archiva jvm
|
||||
|
@ -460,67 +458,52 @@ public class Maven2RepositoryStorage
|
|||
@Override
|
||||
public Collection<String> listRootNamespaces(String repoId, Filter<String> filter)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
Path dir = getRepositoryBasedir(repoId);
|
||||
StorageAsset dir = getRepositoryBasedir(repoId);
|
||||
|
||||
return getSortedFiles(dir, filter);
|
||||
}
|
||||
|
||||
private static Collection<String> getSortedFiles(Path dir, Filter<String> filter) {
|
||||
private static Collection<String> getSortedFiles(StorageAsset dir, Filter<String> filter) {
|
||||
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
final Predicate<Path> dFilter = new DirectoryFilter(filter);
|
||||
return stream.filter(Files::isDirectory)
|
||||
final Predicate<StorageAsset> dFilter = new DirectoryFilter(filter);
|
||||
return dir.list().stream().filter(f -> f.isContainer())
|
||||
.filter(dFilter)
|
||||
.map(path -> path.getFileName().toString())
|
||||
.map(path -> path.getName().toString())
|
||||
.sorted().collect(Collectors.toList());
|
||||
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not read directory list {}: {}", dir, e.getMessage(), e);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
private Path getRepositoryBasedir(String repoId)
|
||||
private StorageAsset getRepositoryBasedir(String repoId)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
ManagedRepository repositoryConfiguration = repositoryRegistry.getManagedRepository(repoId);
|
||||
|
||||
return Paths.get(repositoryConfiguration.getLocation());
|
||||
return repositoryConfiguration.getAsset("");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> listNamespaces(String repoId, String namespace, Filter<String> filter)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
Path dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace);
|
||||
if (!(Files.exists(dir) && Files.isDirectory(dir))) {
|
||||
StorageAsset dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace);
|
||||
if (!(dir.exists()) && !dir.isContainer()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// scan all the directories which are potential namespaces. Any directories known to be projects are excluded
|
||||
Predicate<Path> dFilter = new DirectoryFilter(filter);
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
return stream.filter(dFilter).filter(path -> !isProject(path, filter)).map(path -> path.getFileName().toString())
|
||||
Predicate<StorageAsset> dFilter = new DirectoryFilter(filter);
|
||||
return dir.list().stream().filter(dFilter).filter(path -> !isProject(path, filter)).map(path -> path.getName().toString())
|
||||
.sorted().collect(Collectors.toList());
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not read directory {}: {}", dir, e.getMessage(), e);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> listProjects(String repoId, String namespace, Filter<String> filter)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
Path dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace);
|
||||
if (!(Files.exists(dir) && Files.isDirectory(dir))) {
|
||||
StorageAsset dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace);
|
||||
if (!(dir.exists() && dir.isContainer())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// scan all directories in the namespace, and only include those that are known to be projects
|
||||
final Predicate<Path> dFilter = new DirectoryFilter(filter);
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
return stream.filter(dFilter).filter(path -> isProject(path, filter)).map(path -> path.getFileName().toString())
|
||||
final Predicate<StorageAsset> dFilter = new DirectoryFilter(filter);
|
||||
return dir.list().stream().filter(dFilter).filter(path -> isProject(path, filter)).map(path -> path.getName().toString())
|
||||
.sorted().collect(Collectors.toList());
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not read directory {}: {}", dir, e.getMessage(), e);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -528,8 +511,8 @@ public class Maven2RepositoryStorage
|
|||
public Collection<String> listProjectVersions(String repoId, String namespace, String projectId,
|
||||
Filter<String> filter)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
Path dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace, projectId);
|
||||
if (!(Files.exists(dir) && Files.isDirectory(dir))) {
|
||||
StorageAsset dir = pathTranslator.toFile(getRepositoryBasedir(repoId), namespace, projectId);
|
||||
if (!(dir.exists() && dir.isContainer())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
@ -540,18 +523,17 @@ public class Maven2RepositoryStorage
|
|||
@Override
|
||||
public Collection<ArtifactMetadata> readArtifactsMetadata(ReadMetadataRequest readMetadataRequest)
|
||||
throws RepositoryStorageRuntimeException {
|
||||
Path dir = pathTranslator.toFile(getRepositoryBasedir(readMetadataRequest.getRepositoryId()),
|
||||
StorageAsset dir = pathTranslator.toFile(getRepositoryBasedir(readMetadataRequest.getRepositoryId()),
|
||||
readMetadataRequest.getNamespace(), readMetadataRequest.getProjectId(),
|
||||
readMetadataRequest.getProjectVersion());
|
||||
if (!(Files.exists(dir) && Files.isDirectory(dir))) {
|
||||
if (!(dir.exists() && dir.isContainer())) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// all files that are not metadata and not a checksum / signature are considered artifacts
|
||||
final Predicate<Path> dFilter = new ArtifactDirectoryFilter(readMetadataRequest.getFilter());
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
final Predicate<StorageAsset> dFilter = new ArtifactDirectoryFilter(readMetadataRequest.getFilter());
|
||||
// Returns a map TRUE -> (success values), FALSE -> (Exceptions)
|
||||
Map<Boolean, List<Try<ArtifactMetadata>>> result = stream.filter(dFilter).map(path -> {
|
||||
Map<Boolean, List<Try<ArtifactMetadata>>> result = dir.list().stream().filter(dFilter).map(path -> {
|
||||
try {
|
||||
return Try.success(getArtifactFromFile(readMetadataRequest.getRepositoryId(), readMetadataRequest.getNamespace(),
|
||||
readMetadataRequest.getProjectId(), readMetadataRequest.getProjectVersion(),
|
||||
|
@ -573,10 +555,6 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
return result.get(Boolean.TRUE).stream().map(tr -> tr.get()).collect(Collectors.toList());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not read directory {}: {}", dir, e.getMessage(), e);
|
||||
}
|
||||
return Collections.emptyList();
|
||||
|
||||
}
|
||||
|
||||
|
@ -595,9 +573,9 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
private ArtifactMetadata getArtifactFromFile(String repoId, String namespace, String projectId,
|
||||
String projectVersion, Path file) throws IOException {
|
||||
String projectVersion, StorageAsset file) throws IOException {
|
||||
ArtifactMetadata metadata =
|
||||
pathTranslator.getArtifactFromId(repoId, namespace, projectId, projectVersion, file.getFileName().toString());
|
||||
pathTranslator.getArtifactFromId(repoId, namespace, projectId, projectVersion, file.getName());
|
||||
|
||||
populateArtifactMetadataFromFile(metadata, file);
|
||||
|
||||
|
@ -629,17 +607,17 @@ public class Maven2RepositoryStorage
|
|||
proxyHandler.fetchFromProxies(managedRepository, pomReference);
|
||||
|
||||
// Open and read the POM from the managed repo
|
||||
Path pom = managedRepository.toFile(pomReference);
|
||||
StorageAsset pom = managedRepository.toFile(pomReference);
|
||||
|
||||
if (!Files.exists(pom)) {
|
||||
if (!pom.exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// MavenXpp3Reader leaves the file open, so we need to close it ourselves.
|
||||
|
||||
Model model = null;
|
||||
try (Reader reader = Files.newBufferedReader(pom, Charset.defaultCharset())) {
|
||||
Model model;
|
||||
try (Reader reader = Channels.newReader(pom.getReadChannel(), Charset.defaultCharset().name())) {
|
||||
model = MAVEN_XPP_3_READER.read(reader);
|
||||
}
|
||||
|
||||
|
@ -708,7 +686,7 @@ public class Maven2RepositoryStorage
|
|||
|
||||
@Override
|
||||
public String getFilePathWithVersion(final String requestPath, ManagedRepositoryContent managedRepositoryContent)
|
||||
throws XMLException, RelocationException {
|
||||
throws RelocationException, XMLException, IOException {
|
||||
|
||||
if (StringUtils.endsWith(requestPath, METADATA_FILENAME)) {
|
||||
return getFilePath(requestPath, managedRepositoryContent.getRepository());
|
||||
|
@ -725,12 +703,12 @@ public class Maven2RepositoryStorage
|
|||
|
||||
if (StringUtils.endsWith(artifactReference.getVersion(), VersionUtil.SNAPSHOT)) {
|
||||
// read maven metadata to get last timestamp
|
||||
Path metadataDir = Paths.get(managedRepositoryContent.getRepoRoot(), filePath).getParent();
|
||||
if (!Files.exists(metadataDir)) {
|
||||
StorageAsset metadataDir = managedRepositoryContent.getRepository().getAsset( filePath).getParent();
|
||||
if (!metadataDir.exists()) {
|
||||
return filePath;
|
||||
}
|
||||
Path metadataFile = metadataDir.resolve(METADATA_FILENAME);
|
||||
if (!Files.exists(metadataFile)) {
|
||||
StorageAsset metadataFile = metadataDir.resolve(METADATA_FILENAME);
|
||||
if (!metadataFile.exists()) {
|
||||
return filePath;
|
||||
}
|
||||
ArchivaRepositoryMetadata archivaRepositoryMetadata = MavenMetadataReader.read(metadataFile);
|
||||
|
@ -788,10 +766,10 @@ public class Maven2RepositoryStorage
|
|||
return joinedString;
|
||||
}
|
||||
|
||||
private static void populateArtifactMetadataFromFile(ArtifactMetadata metadata, Path file) throws IOException {
|
||||
private static void populateArtifactMetadataFromFile(ArtifactMetadata metadata, StorageAsset file) throws IOException {
|
||||
metadata.setWhenGathered(new Date());
|
||||
metadata.setFileLastModified(Files.getLastModifiedTime(file).toMillis());
|
||||
ChecksummedFile checksummedFile = new ChecksummedFile(file);
|
||||
metadata.setFileLastModified(file.getModificationTime().toEpochMilli());
|
||||
ChecksummedFile checksummedFile = new ChecksummedFile(file.getFilePath());
|
||||
try {
|
||||
metadata.setMd5(checksummedFile.calculateChecksum(ChecksumAlgorithm.MD5));
|
||||
} catch (IOException e) {
|
||||
|
@ -802,52 +780,43 @@ public class Maven2RepositoryStorage
|
|||
} catch (IOException e) {
|
||||
LOGGER.error("Unable to checksum file {}: {},SHA1", file, e.getMessage());
|
||||
}
|
||||
metadata.setSize(Files.size(file));
|
||||
metadata.setSize(file.getSize());
|
||||
}
|
||||
|
||||
private boolean isProject(Path dir, Filter<String> filter) {
|
||||
private boolean isProject(StorageAsset dir, Filter<String> filter) {
|
||||
// scan directories for a valid project version subdirectory, meaning this must be a project directory
|
||||
final Predicate<Path> dFilter = new DirectoryFilter(filter);
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
boolean projFound = stream.filter(dFilter)
|
||||
final Predicate<StorageAsset> dFilter = new DirectoryFilter(filter);
|
||||
boolean projFound = dir.list().stream().filter(dFilter)
|
||||
.anyMatch(path -> isProjectVersion(path));
|
||||
if (projFound) {
|
||||
return true;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not read directory list {}: {}", dir, e.getMessage(), e);
|
||||
}
|
||||
|
||||
// if a metadata file is present, check if this is the "artifactId" directory, marking it as a project
|
||||
ArchivaRepositoryMetadata metadata = readMetadata(dir);
|
||||
if (metadata != null && dir.getFileName().toString().equals(metadata.getArtifactId())) {
|
||||
if (metadata != null && dir.getName().toString().equals(metadata.getArtifactId())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isProjectVersion(Path dir) {
|
||||
final String artifactId = dir.getParent().getFileName().toString();
|
||||
final String projectVersion = dir.getFileName().toString();
|
||||
private boolean isProjectVersion(StorageAsset dir) {
|
||||
final String artifactId = dir.getParent().getName();
|
||||
final String projectVersion = dir.getName();
|
||||
|
||||
// check if there is a POM artifact file to ensure it is a version directory
|
||||
|
||||
Predicate<Path> filter;
|
||||
Predicate<StorageAsset> filter;
|
||||
if (VersionUtil.isSnapshot(projectVersion)) {
|
||||
filter = new PomFilenameFilter(artifactId, projectVersion);
|
||||
} else {
|
||||
final String pomFile = artifactId + "-" + projectVersion + ".pom";
|
||||
filter = new PomFileFilter(pomFile);
|
||||
}
|
||||
try (Stream<Path> stream = Files.list(dir)) {
|
||||
if (stream.filter(Files::isRegularFile).anyMatch(filter)) {
|
||||
if (dir.list().stream().filter(f -> !f.isContainer()).anyMatch(filter)) {
|
||||
return true;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Could not list directory {}: {}", dir, e.getMessage(), e);
|
||||
}
|
||||
|
||||
// if a metadata file is present, check if this is the "version" directory, marking it as a project version
|
||||
ArchivaRepositoryMetadata metadata = readMetadata(dir);
|
||||
if (metadata != null && projectVersion.equals(metadata.getVersion())) {
|
||||
|
@ -857,13 +826,13 @@ public class Maven2RepositoryStorage
|
|||
return false;
|
||||
}
|
||||
|
||||
private ArchivaRepositoryMetadata readMetadata(Path directory) {
|
||||
private ArchivaRepositoryMetadata readMetadata(StorageAsset directory) {
|
||||
ArchivaRepositoryMetadata metadata = null;
|
||||
Path metadataFile = directory.resolve(METADATA_FILENAME);
|
||||
if (Files.exists(metadataFile)) {
|
||||
StorageAsset metadataFile = directory.resolve(METADATA_FILENAME);
|
||||
if (metadataFile.exists()) {
|
||||
try {
|
||||
metadata = MavenMetadataReader.read(metadataFile);
|
||||
} catch (XMLException e) {
|
||||
} catch (XMLException | IOException e) {
|
||||
// ignore missing or invalid metadata
|
||||
}
|
||||
}
|
||||
|
@ -871,7 +840,7 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
private static class DirectoryFilter
|
||||
implements Predicate<Path> {
|
||||
implements Predicate<StorageAsset> {
|
||||
private final Filter<String> filter;
|
||||
|
||||
public DirectoryFilter(Filter<String> filter) {
|
||||
|
@ -879,13 +848,13 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean test(Path dir) {
|
||||
final String name = dir.getFileName().toString();
|
||||
public boolean test(StorageAsset dir) {
|
||||
final String name = dir.getName();
|
||||
if (!filter.accept(name)) {
|
||||
return false;
|
||||
} else if (name.startsWith(".")) {
|
||||
return false;
|
||||
} else if (!Files.isDirectory(dir)) {
|
||||
} else if (!dir.isContainer()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -893,7 +862,7 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
private static class ArtifactDirectoryFilter
|
||||
implements Predicate<Path> {
|
||||
implements Predicate<StorageAsset> {
|
||||
private final Filter<String> filter;
|
||||
|
||||
private ArtifactDirectoryFilter(Filter<String> filter) {
|
||||
|
@ -901,8 +870,8 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean test(Path dir) {
|
||||
final String name = dir.getFileName().toString();
|
||||
public boolean test(StorageAsset dir) {
|
||||
final String name = dir.getName().toString();
|
||||
// TODO compare to logic in maven-repository-layer
|
||||
if (!filter.accept(name)) {
|
||||
return false;
|
||||
|
@ -912,7 +881,7 @@ public class Maven2RepositoryStorage
|
|||
return false;
|
||||
} else if (Arrays.binarySearch(IGNORED_FILES, name) >= 0) {
|
||||
return false;
|
||||
} else if (Files.isDirectory(dir)) {
|
||||
} else if (dir.isContainer()) {
|
||||
return false;
|
||||
}
|
||||
// some files from remote repositories can have name like maven-metadata-archiva-vm-all-public.xml
|
||||
|
@ -927,7 +896,7 @@ public class Maven2RepositoryStorage
|
|||
|
||||
|
||||
private static final class PomFilenameFilter
|
||||
implements Predicate<Path> {
|
||||
implements Predicate<StorageAsset> {
|
||||
|
||||
private final String artifactId, projectVersion;
|
||||
|
||||
|
@ -937,8 +906,8 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean test(Path dir) {
|
||||
final String name = dir.getFileName().toString();
|
||||
public boolean test(StorageAsset dir) {
|
||||
final String name = dir.getName();
|
||||
if (name.startsWith(artifactId + "-") && name.endsWith(".pom")) {
|
||||
String v = name.substring(artifactId.length() + 1, name.length() - 4);
|
||||
v = VersionUtil.getBaseVersion(v);
|
||||
|
@ -952,7 +921,7 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
private static class PomFileFilter
|
||||
implements Predicate<Path> {
|
||||
implements Predicate<StorageAsset> {
|
||||
private final String pomFile;
|
||||
|
||||
private PomFileFilter(String pomFile) {
|
||||
|
@ -960,8 +929,8 @@ public class Maven2RepositoryStorage
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean test(Path dir) {
|
||||
return pomFile.equals(dir.getFileName().toString());
|
||||
public boolean test(StorageAsset dir) {
|
||||
return pomFile.equals(dir.getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ import org.apache.archiva.repository.ManagedRepository;
|
|||
import org.apache.archiva.repository.RemoteRepository;
|
||||
import org.apache.archiva.repository.RepositoryCredentials;
|
||||
import org.apache.archiva.repository.maven2.MavenSystemManager;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.xml.XMLException;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.http.auth.UsernamePasswordCredentials;
|
||||
|
@ -78,7 +79,7 @@ public class RepositoryModelResolver
|
|||
private RepositorySystemSession session;
|
||||
private VersionRangeResolver versionRangeResolver;
|
||||
|
||||
private Path basedir;
|
||||
private StorageAsset basedir;
|
||||
|
||||
private RepositoryPathTranslator pathTranslator;
|
||||
|
||||
|
@ -98,7 +99,7 @@ public class RepositoryModelResolver
|
|||
|
||||
private ManagedRepository managedRepository;
|
||||
|
||||
public RepositoryModelResolver( Path basedir, RepositoryPathTranslator pathTranslator )
|
||||
public RepositoryModelResolver(StorageAsset basedir, RepositoryPathTranslator pathTranslator )
|
||||
{
|
||||
this.basedir = basedir;
|
||||
|
||||
|
@ -110,7 +111,7 @@ public class RepositoryModelResolver
|
|||
Map<String, NetworkProxy> networkProxiesMap, ManagedRepository targetRepository,
|
||||
MavenSystemManager mavenSystemManager)
|
||||
{
|
||||
this( Paths.get( managedRepository.getLocation() ), pathTranslator );
|
||||
this( managedRepository.getAsset(""), pathTranslator );
|
||||
|
||||
this.managedRepository = managedRepository;
|
||||
|
||||
|
@ -138,9 +139,9 @@ public class RepositoryModelResolver
|
|||
String filename = artifactId + "-" + version + ".pom";
|
||||
// TODO: we need to convert 1.0-20091120.112233-1 type paths to baseVersion for the below call - add a test
|
||||
|
||||
Path model = pathTranslator.toFile( basedir, groupId, artifactId, version, filename );
|
||||
StorageAsset model = pathTranslator.toFile( basedir, groupId, artifactId, version, filename );
|
||||
|
||||
if ( !Files.exists(model) )
|
||||
if ( !model.exists() )
|
||||
{
|
||||
/**
|
||||
*
|
||||
|
@ -161,10 +162,10 @@ public class RepositoryModelResolver
|
|||
try
|
||||
{
|
||||
boolean success = getModelFromProxy( remoteRepository, groupId, artifactId, version, filename );
|
||||
if ( success && Files.exists(model) )
|
||||
if ( success && model.exists() )
|
||||
{
|
||||
log.info( "Model '{}' successfully retrieved from remote repository '{}'",
|
||||
model.toAbsolutePath(), remoteRepository.getId() );
|
||||
model.getPath(), remoteRepository.getId() );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -172,20 +173,20 @@ public class RepositoryModelResolver
|
|||
{
|
||||
log.info(
|
||||
"An exception was caught while attempting to retrieve model '{}' from remote repository '{}'.Reason:{}",
|
||||
model.toAbsolutePath(), remoteRepository.getId(), e.getMessage() );
|
||||
model.getPath(), remoteRepository.getId(), e.getMessage() );
|
||||
}
|
||||
catch ( Exception e )
|
||||
{
|
||||
log.warn(
|
||||
"An exception was caught while attempting to retrieve model '{}' from remote repository '{}'.Reason:{}",
|
||||
model.toAbsolutePath(), remoteRepository.getId(), e.getMessage() );
|
||||
model.getPath(), remoteRepository.getId(), e.getMessage() );
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new FileModelSource( model.toFile() );
|
||||
return new FileModelSource( model.getFilePath().toFile() );
|
||||
}
|
||||
|
||||
public ModelSource resolveModel(Parent parent) throws UnresolvableModelException {
|
||||
|
@ -249,15 +250,15 @@ public class RepositoryModelResolver
|
|||
log.debug( "use snapshot path {} for maven coordinate {}:{}:{}", snapshotPath, groupId, artifactId,
|
||||
version );
|
||||
|
||||
Path model = basedir.resolve( snapshotPath );
|
||||
StorageAsset model = basedir.resolve( snapshotPath );
|
||||
//model = pathTranslator.toFile( basedir, groupId, artifactId, lastVersion, filename );
|
||||
if ( Files.exists(model) )
|
||||
if ( model.exists() )
|
||||
{
|
||||
return model;
|
||||
return model.getFilePath();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
log.warn( "fail to read {}, {}", mavenMetadata.toAbsolutePath(), e.getCause() );
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ import org.apache.archiva.repository.LayoutException;
|
|||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
|
|
@ -23,8 +23,7 @@ import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
|||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.content.maven2.MavenRepositoryRequestInfo;
|
||||
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
|
@ -38,7 +37,6 @@ import java.net.URI;
|
|||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Locale;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Maven2 managed repository implementation.
|
||||
|
|
|
@ -9,7 +9,7 @@ import org.apache.archiva.repository.RepositoryCapabilities;
|
|||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.StandardCapabilities;
|
||||
import org.apache.archiva.repository.UnsupportedFeatureException;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.apache.archiva.repository.features.RepositoryFeature;
|
||||
|
|
|
@ -22,13 +22,12 @@ package org.apache.archiva.repository.maven2;
|
|||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Locale;
|
||||
|
||||
|
|
|
@ -22,8 +22,7 @@ package org.apache.archiva.repository.maven2;
|
|||
import org.apache.archiva.common.filelock.FileLockManager;
|
||||
import org.apache.archiva.configuration.*;
|
||||
import org.apache.archiva.repository.*;
|
||||
import org.apache.archiva.repository.content.FilesystemAsset;
|
||||
import org.apache.archiva.repository.content.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.features.ArtifactCleanupFeature;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
|
@ -298,11 +297,19 @@ public class MavenRepositoryProvider implements RepositoryProvider {
|
|||
IndexCreationFeature indexCreationFeature = repositoryGroup.getFeature( IndexCreationFeature.class ).get();
|
||||
indexCreationFeature.setIndexPath( getURIFromString(configuration.getMergedIndexPath()) );
|
||||
Path localPath = Paths.get(configuration.getMergedIndexPath());
|
||||
if (localPath.isAbsolute()) {
|
||||
indexCreationFeature.setLocalIndexPath( new FilesystemAsset(localPath.getFileName().toString(), localPath) );
|
||||
Path repoGroupPath = repositoryGroup.getAsset("").getFilePath().toAbsolutePath();
|
||||
if (localPath.isAbsolute() && !localPath.startsWith(repoGroupPath)) {
|
||||
try {
|
||||
FilesystemStorage storage = new FilesystemStorage(localPath.getParent(), fileLockManager);
|
||||
indexCreationFeature.setLocalIndexPath(storage.getAsset(localPath.getFileName().toString()));
|
||||
} catch (IOException e) {
|
||||
throw new RepositoryException("Could not initialize storage for index path "+localPath);
|
||||
}
|
||||
} else if (localPath.isAbsolute()) {
|
||||
indexCreationFeature.setLocalIndexPath(repositoryGroup.getAsset(repoGroupPath.relativize(localPath).toString()));
|
||||
} else
|
||||
{
|
||||
indexCreationFeature.setLocalIndexPath( new FilesystemAsset(localPath.toString(), archivaConfiguration.getRepositoryGroupBaseDir( ).resolve( localPath )));
|
||||
indexCreationFeature.setLocalIndexPath(repositoryGroup.getAsset(localPath.toString()));
|
||||
}
|
||||
}
|
||||
// References to other repositories are set filled by the registry
|
||||
|
|
|
@ -29,6 +29,7 @@ import org.junit.Before;
|
|||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
|
@ -46,8 +47,7 @@ public class MavenRepositoryMetadataReaderTest
|
|||
|
||||
@Test
|
||||
public void testGroupMetadata()
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
Path metadataFile = defaultRepoDir.resolve( "org/apache/maven/plugins/maven-metadata.xml" );
|
||||
|
||||
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( metadataFile );
|
||||
|
@ -81,8 +81,7 @@ public class MavenRepositoryMetadataReaderTest
|
|||
|
||||
@Test
|
||||
public void testProjectMetadata()
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
Path metadataFile = defaultRepoDir.resolve( "org/apache/maven/shared/maven-downloader/maven-metadata.xml" );
|
||||
|
||||
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( metadataFile);
|
||||
|
@ -99,8 +98,7 @@ public class MavenRepositoryMetadataReaderTest
|
|||
|
||||
@Test
|
||||
public void testProjectVersionMetadata()
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
Path metadataFile = defaultRepoDir.resolve( "org/apache/apache/5-SNAPSHOT/maven-metadata.xml" );
|
||||
|
||||
ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( metadataFile );
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.archiva.repository.index.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.admin.model.RepositoryAdminException;
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.FileUtils;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.configuration.ArchivaConfiguration;
|
||||
|
@ -40,8 +40,9 @@ import org.apache.archiva.repository.RemoteRepository;
|
|||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
|
||||
import org.apache.archiva.repository.content.FilesystemAsset;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
@ -145,7 +146,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
|
||||
private Path getIndexPath( ArchivaIndexingContext ctx )
|
||||
{
|
||||
return PathUtil.getPathFromUri( ctx.getPath( ) );
|
||||
return ctx.getPath( ).getFilePath();
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
|
@ -380,9 +381,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void addArtifactsToIndex( final ArchivaIndexingContext context, final Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.addArtifactsToIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -396,9 +397,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void removeArtifactsFromIndex( ArchivaIndexingContext context, Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.deleteArtifactsFromIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -442,7 +443,12 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
throw new IndexCreationFailedException( "Could not create index context for repository " + repository.getId( )
|
||||
+ ( StringUtils.isNotEmpty( e.getMessage( ) ) ? ": " + e.getMessage( ) : "" ), e );
|
||||
}
|
||||
MavenIndexContextMock context = new MavenIndexContextMock( repository, mvnCtx );
|
||||
MavenIndexContextMock context = null;
|
||||
try {
|
||||
context = new MavenIndexContextMock( repository, mvnCtx );
|
||||
} catch (IOException e) {
|
||||
throw new IndexCreationFailedException(e);
|
||||
}
|
||||
|
||||
return context;
|
||||
}
|
||||
|
@ -457,7 +463,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
log.warn("Index close failed");
|
||||
}
|
||||
try {
|
||||
FileUtils.deleteDirectory(Paths.get(context.getPath()));
|
||||
FileUtils.deleteDirectory(context.getPath().getFilePath());
|
||||
} catch (IOException e) {
|
||||
throw new IndexUpdateFailedException("Could not delete index files");
|
||||
}
|
||||
|
@ -527,12 +533,14 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
}
|
||||
|
||||
|
||||
|
||||
private StorageAsset getIndexPath( Repository repo) throws IOException {
|
||||
IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
|
||||
Path repoDir = repo.getAsset( "" ).getFilePath();
|
||||
URI indexDir = icf.getIndexPath();
|
||||
String indexPath = indexDir.getPath();
|
||||
Path indexDirectory = null;
|
||||
FilesystemStorage fsStorage = (FilesystemStorage) repo.getAsset("").getStorage();
|
||||
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
|
||||
{
|
||||
|
||||
|
@ -541,6 +549,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
if ( indexDirectory.isAbsolute( ) )
|
||||
{
|
||||
indexPath = indexDirectory.getFileName().toString();
|
||||
fsStorage = new FilesystemStorage(indexDirectory.getParent(), new DefaultFileLockManager());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -557,7 +566,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
{
|
||||
Files.createDirectories( indexDirectory );
|
||||
}
|
||||
return new FilesystemAsset( indexPath, indexDirectory );
|
||||
return new FilesystemAsset( fsStorage, indexPath, indexDirectory );
|
||||
}
|
||||
|
||||
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
|
||||
|
|
|
@ -19,12 +19,14 @@ package org.apache.archiva.repository.index.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.index.context.IndexingContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.NoSuchFileException;
|
||||
import java.sql.Date;
|
||||
|
@ -38,10 +40,12 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
|
||||
private IndexingContext delegate;
|
||||
private Repository repository;
|
||||
private FilesystemStorage indexStorage;
|
||||
|
||||
MavenIndexContextMock(Repository repository, IndexingContext delegate) {
|
||||
MavenIndexContextMock(Repository repository, IndexingContext delegate) throws IOException {
|
||||
this.delegate = delegate;
|
||||
this.repository = repository;
|
||||
indexStorage = new FilesystemStorage(delegate.getIndexDirectoryFile().toPath(), new DefaultFileLockManager());
|
||||
|
||||
}
|
||||
|
||||
|
@ -56,8 +60,8 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
}
|
||||
|
||||
@Override
|
||||
public URI getPath() {
|
||||
return delegate.getIndexDirectoryFile().toURI();
|
||||
public StorageAsset getPath() {
|
||||
return indexStorage.getAsset("");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.apache.archiva.xml.XMLException;
|
|||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
|
@ -41,8 +42,7 @@ public class RepositoryMetadataReaderTest
|
|||
{
|
||||
@Test
|
||||
public void testLoadSimple()
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
Path defaultRepoDir = Paths.get( "src/test/repositories/default-repository" );
|
||||
Path metadataFile = defaultRepoDir.resolve( "org/apache/maven/shared/maven-downloader/maven-metadata.xml" );
|
||||
|
||||
|
@ -59,8 +59,7 @@ public class RepositoryMetadataReaderTest
|
|||
|
||||
@Test
|
||||
public void testLoadComplex()
|
||||
throws XMLException
|
||||
{
|
||||
throws XMLException, IOException {
|
||||
Path defaultRepoDir = Paths.get( "src/test/repositories/default-repository" );
|
||||
Path metadataFile = defaultRepoDir.resolve( "org/apache/maven/samplejar/maven-metadata.xml" );
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ import org.apache.archiva.repository.BasicManagedRepository;
|
|||
import org.apache.archiva.repository.ManagedRepository;
|
||||
import org.apache.archiva.repository.ReleaseScheme;
|
||||
import org.apache.archiva.repository.RepositoryRegistry;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
|
||||
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
package org.apache.archiva.scheduler.repository.model;
|
||||
|
||||
import org.apache.archiva.redback.components.taskqueue.Task;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.apache.archiva.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.common.utils.FileUtils;
|
||||
import org.apache.archiva.common.utils.PathUtil;
|
||||
import org.apache.archiva.configuration.ArchivaConfiguration;
|
||||
|
@ -27,7 +28,6 @@ import org.apache.archiva.indexer.ArchivaIndexingContext;
|
|||
import org.apache.archiva.indexer.IndexCreationFailedException;
|
||||
import org.apache.archiva.indexer.IndexUpdateFailedException;
|
||||
import org.apache.archiva.indexer.UnsupportedBaseContextException;
|
||||
import org.apache.archiva.proxy.ProxyRegistry;
|
||||
import org.apache.archiva.proxy.maven.WagonFactory;
|
||||
import org.apache.archiva.proxy.maven.WagonFactoryException;
|
||||
import org.apache.archiva.proxy.maven.WagonFactoryRequest;
|
||||
|
@ -39,10 +39,12 @@ import org.apache.archiva.repository.RemoteRepository;
|
|||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.RepositoryType;
|
||||
import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
|
||||
import org.apache.archiva.repository.content.FilesystemAsset;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.features.IndexCreationFeature;
|
||||
import org.apache.archiva.repository.features.RemoteIndexFeature;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.maven.index.ArtifactContext;
|
||||
import org.apache.maven.index.ArtifactContextProducer;
|
||||
|
@ -140,7 +142,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
|
||||
private Path getIndexPath( ArchivaIndexingContext ctx )
|
||||
{
|
||||
return PathUtil.getPathFromUri( ctx.getPath( ) );
|
||||
return ctx.getPath().getFilePath();
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
|
@ -365,9 +367,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void addArtifactsToIndex( final ArchivaIndexingContext context, final Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.addArtifactsToIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -381,9 +383,9 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
@Override
|
||||
public void removeArtifactsFromIndex( ArchivaIndexingContext context, Collection<URI> artifactReference ) throws IndexUpdateFailedException
|
||||
{
|
||||
final URI ctxUri = context.getPath();
|
||||
final StorageAsset ctxUri = context.getPath();
|
||||
executeUpdateFunction(context, indexingContext -> {
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
|
||||
Collection<ArtifactContext> artifacts = artifactReference.stream().map(r -> artifactContextProducer.getArtifactContext(indexingContext, Paths.get(ctxUri.getFilePath().toUri().resolve(r)).toFile())).collect(Collectors.toList());
|
||||
try {
|
||||
indexer.deleteArtifactsFromIndex(artifacts, indexingContext);
|
||||
} catch (IOException e) {
|
||||
|
@ -442,7 +444,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
log.warn("Index close failed");
|
||||
}
|
||||
try {
|
||||
FileUtils.deleteDirectory(Paths.get(context.getPath()));
|
||||
StorageUtil.deleteRecursively(context.getPath());
|
||||
} catch (IOException e) {
|
||||
throw new IndexUpdateFailedException("Could not delete index files");
|
||||
}
|
||||
|
@ -517,6 +519,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
URI indexDir = icf.getIndexPath();
|
||||
String indexPath = indexDir.getPath();
|
||||
Path indexDirectory = null;
|
||||
FilesystemStorage filesystemStorage = (FilesystemStorage) repo.getAsset("").getStorage();
|
||||
if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
|
||||
{
|
||||
|
||||
|
@ -525,6 +528,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
if ( indexDirectory.isAbsolute( ) )
|
||||
{
|
||||
indexPath = indexDirectory.getFileName().toString();
|
||||
filesystemStorage = new FilesystemStorage(indexDirectory, new DefaultFileLockManager());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -541,7 +545,7 @@ public class ArchivaIndexManagerMock implements ArchivaIndexManager {
|
|||
{
|
||||
Files.createDirectories( indexDirectory );
|
||||
}
|
||||
return new FilesystemAsset( indexPath, indexDirectory);
|
||||
return new FilesystemAsset( filesystemStorage, indexPath, indexDirectory);
|
||||
}
|
||||
|
||||
private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
|
||||
|
|
|
@ -19,8 +19,12 @@ package org.apache.archiva.mock;
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.indexer.ArchivaIndexingContext;
|
||||
import org.apache.archiva.repository.Repository;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.maven.index.context.IndexingContext;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -38,10 +42,16 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
|
||||
private IndexingContext delegate;
|
||||
private Repository repository;
|
||||
private FilesystemStorage filesystemStorage;
|
||||
|
||||
MavenIndexContextMock( Repository repository, IndexingContext delegate) {
|
||||
this.delegate = delegate;
|
||||
this.repository = repository;
|
||||
try {
|
||||
filesystemStorage = new FilesystemStorage(delegate.getIndexDirectoryFile().toPath().getParent(), new DefaultFileLockManager());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -56,8 +66,9 @@ public class MavenIndexContextMock implements ArchivaIndexingContext {
|
|||
}
|
||||
|
||||
@Override
|
||||
public URI getPath() {
|
||||
return delegate.getIndexDirectoryFile().toURI();
|
||||
public StorageAsset getPath() {
|
||||
return new FilesystemAsset(filesystemStorage, delegate.getIndexDirectoryFile().toPath().getFileName().toString(), delegate.getIndexDirectoryFile().toPath());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -44,6 +44,10 @@
|
|||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-storage-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.archiva</groupId>
|
||||
<artifactId>archiva-repository-admin-api</artifactId>
|
||||
|
|
|
@ -43,6 +43,8 @@ import org.apache.archiva.repository.ReleaseScheme;
|
|||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.RepositoryNotFoundException;
|
||||
import org.apache.archiva.repository.metadata.MetadataTools;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.archiva.rest.api.model.*;
|
||||
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
|
||||
import org.apache.archiva.rest.api.services.BrowseService;
|
||||
|
@ -62,6 +64,8 @@ import java.io.InputStream;
|
|||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.*;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
@ -696,8 +700,8 @@ public class DefaultBrowseService
|
|||
ArchivaArtifact archivaArtifact = new ArchivaArtifact( groupId, artifactId, version, classifier,
|
||||
StringUtils.isEmpty( type ) ? "jar" : type,
|
||||
repoId );
|
||||
Path file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
if ( Files.exists(file) )
|
||||
StorageAsset file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
if ( file.exists() )
|
||||
{
|
||||
return readFileEntries( file, path, repoId );
|
||||
}
|
||||
|
@ -781,8 +785,8 @@ public class DefaultBrowseService
|
|||
ArchivaArtifact archivaArtifact = new ArchivaArtifact( groupId, artifactId, version, classifier,
|
||||
StringUtils.isEmpty( type ) ? "jar" : type,
|
||||
repoId );
|
||||
Path file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
if ( !Files.exists(file) )
|
||||
StorageAsset file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
if ( !file.exists() )
|
||||
{
|
||||
log.debug( "file: {} not exists for repository: {} try next repository", file, repoId );
|
||||
continue;
|
||||
|
@ -790,7 +794,8 @@ public class DefaultBrowseService
|
|||
if ( StringUtils.isNotBlank( path ) )
|
||||
{
|
||||
// zip entry of the path -> path must a real file entry of the archive
|
||||
JarFile jarFile = new JarFile( file.toFile() );
|
||||
StorageUtil.PathInformation pathInfo = StorageUtil.getAssetDataAsPath(file);
|
||||
JarFile jarFile = new JarFile( pathInfo.getPath().toFile());
|
||||
ZipEntry zipEntry = jarFile.getEntry( path );
|
||||
try (InputStream inputStream = jarFile.getInputStream( zipEntry ))
|
||||
{
|
||||
|
@ -799,9 +804,14 @@ public class DefaultBrowseService
|
|||
finally
|
||||
{
|
||||
closeQuietly( jarFile );
|
||||
if (pathInfo.isTmpFile()) {
|
||||
Files.deleteIfExists(pathInfo.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
return new ArtifactContent( new String(Files.readAllBytes( file ), ARTIFACT_CONTENT_ENCODING), repoId );
|
||||
try(InputStream readStream = file.getReadStream()) {
|
||||
return new ArtifactContent(IOUtils.toString(readStream, ARTIFACT_CONTENT_ENCODING), repoId);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( IOException e )
|
||||
|
@ -846,9 +856,9 @@ public class DefaultBrowseService
|
|||
StringUtils.isEmpty( classifier )
|
||||
? ""
|
||||
: classifier, "jar", repoId );
|
||||
Path file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
StorageAsset file = managedRepositoryContent.toFile( archivaArtifact );
|
||||
|
||||
if ( file != null && Files.exists(file) )
|
||||
if ( file != null && file.exists() )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -856,8 +866,8 @@ public class DefaultBrowseService
|
|||
// in case of SNAPSHOT we can have timestamped version locally !
|
||||
if ( StringUtils.endsWith( version, VersionUtil.SNAPSHOT ) )
|
||||
{
|
||||
Path metadataFile = file.getParent().resolve(MetadataTools.MAVEN_METADATA );
|
||||
if ( Files.exists(metadataFile) )
|
||||
StorageAsset metadataFile = file.getStorage().getAsset(file.getParent().getPath()+"/"+MetadataTools.MAVEN_METADATA );
|
||||
if ( metadataFile.exists() )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
@ -873,14 +883,14 @@ public class DefaultBrowseService
|
|||
.append( ( StringUtils.isEmpty( classifier ) ? "" : "-" + classifier ) ) //
|
||||
.append( ".jar" ).toString();
|
||||
|
||||
Path timeStampFile = file.getParent().resolve( timeStampFileName );
|
||||
log.debug( "try to find timestamped snapshot version file: {}", timeStampFile.toAbsolutePath() );
|
||||
if ( Files.exists(timeStampFile) )
|
||||
StorageAsset timeStampFile = file.getStorage().getAsset(file.getParent().getPath() + "/" + timeStampFileName );
|
||||
log.debug( "try to find timestamped snapshot version file: {}", timeStampFile.getPath() );
|
||||
if ( timeStampFile.exists() )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
log.warn( "skip fail to find timestamped snapshot file: {}", e.getMessage() );
|
||||
}
|
||||
|
@ -891,7 +901,7 @@ public class DefaultBrowseService
|
|||
|
||||
file = proxyHandler.fetchFromProxies( managedRepositoryContent, path );
|
||||
|
||||
if ( file != null && Files.exists(file) )
|
||||
if ( file != null && file.exists() )
|
||||
{
|
||||
// download pom now
|
||||
String pomPath = StringUtils.substringBeforeLast( path, ".jar" ) + ".pom";
|
||||
|
@ -1075,7 +1085,7 @@ public class DefaultBrowseService
|
|||
}
|
||||
}
|
||||
|
||||
protected List<ArtifactContentEntry> readFileEntries(final Path file, final String filterPath, final String repoId )
|
||||
protected List<ArtifactContentEntry> readFileEntries(final StorageAsset file, final String filterPath, final String repoId )
|
||||
throws IOException
|
||||
{
|
||||
String cleanedfilterPath = filterPath==null ? "" : (StringUtils.startsWith(filterPath, "/") ?
|
||||
|
@ -1085,7 +1095,9 @@ public class DefaultBrowseService
|
|||
if (!StringUtils.endsWith(cleanedfilterPath,"/") && !StringUtils.isEmpty(cleanedfilterPath)) {
|
||||
filterDepth++;
|
||||
}
|
||||
JarFile jarFile = new JarFile( file.toFile() );
|
||||
|
||||
StorageUtil.PathInformation pathInfo = StorageUtil.getAssetDataAsPath(file);
|
||||
JarFile jarFile = new JarFile(pathInfo.getPath().toFile());
|
||||
try
|
||||
{
|
||||
Enumeration<JarEntry> jarEntryEnumeration = jarFile.entries();
|
||||
|
@ -1141,6 +1153,9 @@ public class DefaultBrowseService
|
|||
{
|
||||
jarFile.close();
|
||||
}
|
||||
if (pathInfo.isTmpFile()) {
|
||||
Files.deleteIfExists(pathInfo.getPath());
|
||||
}
|
||||
}
|
||||
List<ArtifactContentEntry> sorted = new ArrayList<>( artifactContentEntryMap.values() );
|
||||
Collections.sort( sorted, ArtifactContentEntryComparator.INSTANCE );
|
||||
|
|
|
@ -54,9 +54,9 @@ import org.apache.archiva.repository.ManagedRepositoryContent;
|
|||
import org.apache.archiva.repository.RepositoryException;
|
||||
import org.apache.archiva.repository.RepositoryNotFoundException;
|
||||
import org.apache.archiva.repository.RepositoryRegistry;
|
||||
import org.apache.archiva.repository.content.RepositoryStorage;
|
||||
import org.apache.archiva.repository.content.StorageAsset;
|
||||
import org.apache.archiva.repository.content.StorageUtil;
|
||||
import org.apache.archiva.repository.storage.RepositoryStorage;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.archiva.repository.events.RepositoryListener;
|
||||
import org.apache.archiva.repository.metadata.MetadataTools;
|
||||
import org.apache.archiva.repository.metadata.RepositoryMetadataException;
|
||||
|
@ -89,11 +89,10 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
import javax.ws.rs.core.Response;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
|
@ -522,7 +521,7 @@ public class DefaultRepositoriesService
|
|||
{
|
||||
metadata = MavenMetadataReader.read( metadataFile.getFilePath() );
|
||||
}
|
||||
catch ( XMLException e )
|
||||
catch (XMLException | IOException e )
|
||||
{
|
||||
throw new RepositoryMetadataException( e.getMessage(), e );
|
||||
}
|
||||
|
@ -543,7 +542,7 @@ public class DefaultRepositoriesService
|
|||
throws IOException
|
||||
{
|
||||
|
||||
StorageUtil.copyAsset( sourceStorage, sourceFile, targetStorage, targetPath, true );
|
||||
StorageUtil.copyAsset( sourceFile, targetPath, true );
|
||||
if ( fixChecksums )
|
||||
{
|
||||
fixChecksums( targetPath );
|
||||
|
@ -612,7 +611,11 @@ public class DefaultRepositoriesService
|
|||
projectMetadata.setReleasedVersion( latestVersion );
|
||||
}
|
||||
|
||||
RepositoryMetadataWriter.write( projectMetadata, projectMetadataFile.getFilePath());
|
||||
try(OutputStreamWriter writer = new OutputStreamWriter(projectMetadataFile.getWriteStream(true))) {
|
||||
RepositoryMetadataWriter.write(projectMetadata, writer);
|
||||
} catch (IOException e) {
|
||||
throw new RepositoryMetadataException(e);
|
||||
}
|
||||
|
||||
if ( fixChecksums )
|
||||
{
|
||||
|
@ -1177,7 +1180,11 @@ public class DefaultRepositoriesService
|
|||
metadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
|
||||
metadata.setAvailableVersions( availableVersions );
|
||||
|
||||
RepositoryMetadataWriter.write( metadata, metadataFile.getFilePath());
|
||||
try (OutputStreamWriter writer = new OutputStreamWriter(metadataFile.getWriteStream(true))) {
|
||||
RepositoryMetadataWriter.write(metadata, writer);
|
||||
} catch (IOException e) {
|
||||
throw new RepositoryMetadataException(e);
|
||||
}
|
||||
ChecksummedFile checksum = new ChecksummedFile( metadataFile.getFilePath() );
|
||||
checksum.fixChecksums( algorithms );
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ import org.apache.archiva.metadata.model.ArtifactMetadata;
|
|||
import org.apache.archiva.metadata.model.maven2.MavenArtifactFacet;
|
||||
import org.apache.archiva.model.ArtifactReference;
|
||||
import org.apache.archiva.repository.ManagedRepositoryContent;
|
||||
import org.apache.archiva.repository.storage.StorageAsset;
|
||||
import org.apache.archiva.repository.storage.StorageUtil;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
|
||||
import java.nio.file.Path;
|
||||
|
@ -79,7 +81,7 @@ public class ArtifactBuilder
|
|||
|
||||
ref.setClassifier( classifier );
|
||||
ref.setType( type );
|
||||
Path file = managedRepositoryContent.toFile( ref );
|
||||
StorageAsset file = managedRepositoryContent.toFile( ref );
|
||||
|
||||
String extension = getExtensionFromFile(file);
|
||||
|
||||
|
@ -124,10 +126,10 @@ public class ArtifactBuilder
|
|||
/**
|
||||
* Extract file extension
|
||||
*/
|
||||
String getExtensionFromFile( Path file )
|
||||
String getExtensionFromFile( StorageAsset file )
|
||||
{
|
||||
// we are just interested in the section after the last -
|
||||
String[] parts = file.getFileName().toString().split( "-" );
|
||||
String[] parts = file.getName().split( "-" );
|
||||
if ( parts.length > 0 )
|
||||
{
|
||||
// get anything after a dot followed by a letter a-z, including other dots
|
||||
|
@ -139,7 +141,7 @@ public class ArtifactBuilder
|
|||
}
|
||||
}
|
||||
// just in case
|
||||
return FilenameUtils.getExtension( file.toFile().getName() );
|
||||
return StorageUtil.getExtension( file );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,6 +19,9 @@ package org.apache.archiva.rest.services;
|
|||
*/
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.archiva.common.filelock.DefaultFileLockManager;
|
||||
import org.apache.archiva.repository.storage.FilesystemAsset;
|
||||
import org.apache.archiva.repository.storage.FilesystemStorage;
|
||||
import org.apache.archiva.rest.api.model.ArtifactContentEntry;
|
||||
import org.apache.archiva.test.utils.ArchivaBlockJUnit4ClassRunner;
|
||||
import org.junit.Test;
|
||||
|
@ -56,10 +59,11 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( file, null, "foo" );
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( new FilesystemAsset(filesystemStorage, file.toString(), file), null, "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
@ -74,10 +78,12 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( file, "", "foo" );
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries(
|
||||
new FilesystemAsset(filesystemStorage, file.toString(), file), "", "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
@ -92,10 +98,12 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( file, "/", "foo" );
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( new FilesystemAsset(filesystemStorage, file.toString(),file), "/", "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
@ -110,10 +118,12 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( file, "org", "foo" );
|
||||
List<ArtifactContentEntry> artifactContentEntries = browseService.readFileEntries( new FilesystemAsset(filesystemStorage, file.toString(), file), "org", "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
@ -127,11 +137,13 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries =
|
||||
browseService.readFileEntries( file, "org/apache/commons/logging/impl/", "foo" );
|
||||
browseService.readFileEntries( new FilesystemAsset(filesystemStorage, file.toString(), file), "org/apache/commons/logging/impl/", "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
@ -145,11 +157,13 @@ public class ArtifactContentEntriesTests
|
|||
throws Exception
|
||||
{
|
||||
|
||||
FilesystemStorage filesystemStorage = new FilesystemStorage(Paths.get(getBasedir()), new DefaultFileLockManager());
|
||||
|
||||
Path file = Paths.get( getBasedir(),
|
||||
"src/test/repo-with-osgi/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" );
|
||||
|
||||
List<ArtifactContentEntry> artifactContentEntries =
|
||||
browseService.readFileEntries( file, "org/apache/commons/logging/", "foo" );
|
||||
browseService.readFileEntries( new FilesystemAsset(filesystemStorage, file.toString(), file), "org/apache/commons/logging/", "foo" );
|
||||
|
||||
log.info( "artifactContentEntries: {}", artifactContentEntries );
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue