This is an automated email from the ASF dual-hosted git repository. martin_s pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/archiva.git
commit 7a0e81d5156822c0e1b1a5b954be8f7f0199b2a3 Author: Martin Stockhammer <[email protected]> AuthorDate: Sun Feb 10 12:53:02 2019 +0100 Fixing unit tests after refactoring --- .../src/test/resources/spring-context.xml | 16 +- .../archiva-base/archiva-proxy-maven/pom.xml | 20 +- .../proxy/maven/MavenRepositoryProxyHandler.java | 294 +++++++++------------ .../src/main/resources/META-INF/spring-context.xml | 2 +- .../archiva/proxy/AbstractProxyTestCase.java | 1 + .../archiva/proxy/HttpProxyTransferTest.java | 14 +- .../mock/ManagedRepositoryContentMock.java | 235 +++++++++++++++- .../mock/RemoteRepositoryContentMock.java | 22 +- .../mock/RepositoryContentProviderMock.java | 4 +- .../src/test/resources/META-INF/spring-context.xml | 41 ++- .../apache/archiva/proxy/ArchivaProxyRegistry.java | 5 + .../proxy/DefaultRepositoryProxyHandler.java | 27 +- .../org/apache/archiva/proxy/ProxyRegistry.java | 8 + .../src/test/resources/spring-context.xml | 123 --------- .../archiva/repository/metadata/MetadataTools.java | 3 + .../rest/services/DefaultBrowseService.java | 13 +- archiva-modules/archiva-web/archiva-webdav/pom.xml | 4 + .../archiva/webdav/ArchivaDavResourceFactory.java | 29 +- .../webdav/AbstractRepositoryServletTestCase.java | 9 +- .../webdav/ArchivaDavResourceFactoryTest.java | 33 +-- .../webdav/OverridingRepositoryProxyHandler.java | 55 ++++ archiva-modules/plugins/maven2-repository/pom.xml | 5 + .../storage/maven2/Maven2RepositoryStorage.java | 17 +- .../MockRepositoryArchivaTaskScheduler.java | 58 ++++ ...sitoryMetadataResolverMRM1411RepoGroupTest.java | 4 +- ...aven2RepositoryMetadataResolverMRM1411Test.java | 12 +- .../metadata/Maven2RepositoryStorageTest.java | 2 +- .../src/test/resources/META-INF/spring-context.xml | 1 + ...ring-context.xml => spring-context-storage.xml} | 27 +- .../src/test/resources/spring-context.xml | 28 +- src/ci/scripts/prepareWorkspace.sh | 2 +- 31 files changed, 725 insertions(+), 389 deletions(-) diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml index 908c9b5..d50eea7 100644 --- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml +++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/resources/spring-context.xml @@ -32,7 +32,7 @@ <mockito:mock id="mockManagedRepositoryAdmin" class="org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin" /> <mockito:mock id="mockRemoteRepositoryAdmin" class="org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin" /> - <context:component-scan base-package="org.apache.archiva.repository.mock,org.apache.archiva.repository.content.maven2"/> + <context:component-scan base-package="org.apache.archiva.scheduler.repository,org.apache.archiva.repository.mock,org.apache.archiva.repository.content.maven2"/> <alias name="mockRepositoryProvider" alias="mavenRepositoryProvider" /> @@ -40,4 +40,18 @@ <bean name="proxyConnectorAdmin#mock" class="org.apache.archiva.mock.MockProxyConnectorAdmin"/> <bean name="networkProxyAdmin#mock" class="org.apache.archiva.mock.MockNetworkProxyAdmin"/> + + + <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler"> + <property name="properties"> + <props> + <prop key="org.quartz.scheduler.instanceName">scheduler1</prop> + <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> + <prop key="org.quartz.threadPool.threadCount">1</prop> + <prop key="org.quartz.threadPool.threadPriority">4</prop> + <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> + </props> + </property> + </bean> + </beans> \ No newline at end of file diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml b/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml index a6d77c3..8feac8d 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml +++ b/archiva-modules/archiva-base/archiva-proxy-maven/pom.xml @@ -17,7 +17,8 @@ ~ specific language governing permissions and limitations ~ under the License. --> -<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"> +<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"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>archiva-base</artifactId> @@ -161,4 +162,21 @@ </dependencies> + <build> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <configuration> + <excludes> + <exclude>src/test/repositories/**</exclude> + </excludes> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + </project> diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java index 2ab7243..b59d998 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/java/org/apache/archiva/proxy/maven/MavenRepositoryProxyHandler.java @@ -58,6 +58,7 @@ import java.util.concurrent.ConcurrentMap; public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { private static final List<RepositoryType> REPOSITORY_TYPES = new ArrayList<>(); + static { REPOSITORY_TYPES.add(RepositoryType.MAVEN); } @@ -75,20 +76,19 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { private void updateWagonProxyInfo(Map<String, NetworkProxy> proxyList) { this.networkProxyMap.clear(); List<NetworkProxyConfiguration> networkProxies = getArchivaConfiguration().getConfiguration().getNetworkProxies(); - for ( Map.Entry<String, NetworkProxy> proxyEntry: proxyList.entrySet() ) - { + for (Map.Entry<String, NetworkProxy> proxyEntry : proxyList.entrySet()) { String key = proxyEntry.getKey(); NetworkProxy networkProxyDef = proxyEntry.getValue(); ProxyInfo proxy = new ProxyInfo(); - proxy.setType( networkProxyDef.getProtocol() ); - proxy.setHost( networkProxyDef.getHost() ); - proxy.setPort( networkProxyDef.getPort() ); - proxy.setUserName( networkProxyDef.getUsername() ); - proxy.setPassword( networkProxyDef.getPassword() ); + proxy.setType(networkProxyDef.getProtocol()); + proxy.setHost(networkProxyDef.getHost()); + proxy.setPort(networkProxyDef.getPort()); + proxy.setUserName(networkProxyDef.getUsername()); + proxy.setPassword(networkProxyDef.getPassword()); - this.networkProxyMap.put( key, proxy ); + this.networkProxyMap.put(key, proxy); } } @@ -111,98 +111,79 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { * @param repository * @throws ProxyException * @throws NotModifiedException - * */ - protected void transferResources( ProxyConnector connector, RemoteRepositoryContent remoteRepository, Path tmpMd5, - Path tmpSha1, Path tmpResource, String url, String remotePath, Path resource, - Path workingDirectory, ManagedRepositoryContent repository ) - throws ProxyException, NotModifiedException - { + protected void transferResources(ProxyConnector connector, RemoteRepositoryContent remoteRepository, Path tmpMd5, + Path tmpSha1, Path tmpResource, String url, String remotePath, Path resource, + Path workingDirectory, ManagedRepositoryContent repository) + throws ProxyException, NotModifiedException { Wagon wagon = null; - try - { + try { RepositoryURL repoUrl = remoteRepository.getURL(); String protocol = repoUrl.getProtocol(); NetworkProxy networkProxy = null; String proxyId = connector.getProxyId(); - if ( StringUtils.isNotBlank( proxyId ) ) - { + if (StringUtils.isNotBlank(proxyId)) { - networkProxy = getNetworkProxy( proxyId ); + networkProxy = getNetworkProxy(proxyId); } - if (networkProxy==null) { - throw new ProxyException("No network proxy configurations found for id "+proxyId); + WagonFactoryRequest wagonFactoryRequest = new WagonFactoryRequest("wagon#" + protocol, + remoteRepository.getRepository().getExtraHeaders()); + if (networkProxy == null) { + + log.warn("No network proxy with id {} found for connector {}->{}", proxyId, + connector.getSourceRepository().getId(), connector.getTargetRepository().getId()); + } else { + wagonFactoryRequest = wagonFactoryRequest.networkProxy(networkProxy); } - WagonFactoryRequest wagonFactoryRequest = new WagonFactoryRequest( "wagon#" + protocol, - remoteRepository.getRepository().getExtraHeaders() ).networkProxy( - networkProxy ); - wagon = wagonFactory.getWagon( wagonFactoryRequest ); - if ( wagon == null ) - { - throw new ProxyException( "Unsupported target repository protocol: " + protocol ); + wagon = wagonFactory.getWagon(wagonFactoryRequest); + if (wagon == null) { + throw new ProxyException("Unsupported target repository protocol: " + protocol); } - if ( wagon == null ) - { - throw new ProxyException( "Unsupported target repository protocol: " + protocol ); + if (wagon == null) { + throw new ProxyException("Unsupported target repository protocol: " + protocol); } - boolean connected = connectToRepository( connector, wagon, remoteRepository ); - if ( connected ) - { - transferArtifact( wagon, remoteRepository, remotePath, repository, resource, workingDirectory, - tmpResource ); + boolean connected = connectToRepository(connector, wagon, remoteRepository); + if (connected) { + transferArtifact(wagon, remoteRepository, remotePath, repository, resource, workingDirectory, + tmpResource); // TODO: these should be used to validate the download based on the policies, not always downloaded // to // save on connections since md5 is rarely used - transferChecksum( wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".sha1", - tmpSha1 ); - transferChecksum( wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".md5", - tmpMd5 ); + transferChecksum(wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".sha1", + tmpSha1); + transferChecksum(wagon, remoteRepository, remotePath, repository, resource, workingDirectory, ".md5", + tmpMd5); } - } - catch ( NotFoundException e ) - { - urlFailureCache.cacheFailure( url ); + } catch (NotFoundException e) { + urlFailureCache.cacheFailure(url); throw e; - } - catch ( NotModifiedException e ) - { + } catch (NotModifiedException e) { // Do not cache url here. throw e; - } - catch ( ProxyException e ) - { - urlFailureCache.cacheFailure( url ); + } catch (ProxyException e) { + urlFailureCache.cacheFailure(url); throw e; - } - catch ( WagonFactoryException e ) - { - throw new ProxyException( e.getMessage(), e ); - } - finally - { - if ( wagon != null ) - { - try - { + } catch (WagonFactoryException e) { + throw new ProxyException(e.getMessage(), e); + } finally { + if (wagon != null) { + try { wagon.disconnect(); - } - catch ( ConnectionException e ) - { - log.warn( "Unable to disconnect wagon.", e ); + } catch (ConnectionException e) { + log.warn("Unable to disconnect wagon.", e); } } } } - protected void transferArtifact( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, - ManagedRepositoryContent repository, Path resource, Path tmpDirectory, - Path destFile ) - throws ProxyException - { - transferSimpleFile( wagon, remoteRepository, remotePath, repository, resource, destFile ); + protected void transferArtifact(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, + ManagedRepositoryContent repository, Path resource, Path tmpDirectory, + Path destFile) + throws ProxyException { + transferSimpleFile(wagon, remoteRepository, remotePath, repository, resource, destFile); } /** @@ -219,39 +200,30 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { * @param ext the type of checksum to transfer (example: ".md5" or ".sha1") * @throws ProxyException if copying the downloaded file into place did not succeed. */ - protected void transferChecksum( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, - ManagedRepositoryContent repository, Path resource, Path tmpDirectory, String ext, - Path destFile ) - throws ProxyException - { + protected void transferChecksum(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, + ManagedRepositoryContent repository, Path resource, Path tmpDirectory, String ext, + Path destFile) + throws ProxyException { String url = remoteRepository.getURL().getUrl() + remotePath + ext; // Transfer checksum does not use the policy. - if ( urlFailureCache.hasFailedBefore( url ) ) - { + if (urlFailureCache.hasFailedBefore(url)) { return; } - try - { - transferSimpleFile( wagon, remoteRepository, remotePath + ext, repository, resource, destFile ); - log.debug( "Checksum {} Downloaded: {} to move to {}", url, destFile, resource ); - } - catch ( NotFoundException e ) - { - urlFailureCache.cacheFailure( url ); - log.debug( "Transfer failed, checksum not found: {}", url ); + try { + transferSimpleFile(wagon, remoteRepository, remotePath + ext, repository, resource, destFile); + log.debug("Checksum {} Downloaded: {} to move to {}", url, destFile, resource); + } catch (NotFoundException e) { + urlFailureCache.cacheFailure(url); + log.debug("Transfer failed, checksum not found: {}", url); // Consume it, do not pass this on. - } - catch ( NotModifiedException e ) - { - log.debug( "Transfer skipped, checksum not modified: {}", url ); + } catch (NotModifiedException e) { + log.debug("Transfer skipped, checksum not modified: {}", url); // Consume it, do not pass this on. - } - catch ( ProxyException e ) - { - urlFailureCache.cacheFailure( url ); - log.warn( "Transfer failed on checksum: {} : {}", url, e.getMessage(), e ); + } catch (ProxyException e) { + urlFailureCache.cacheFailure(url); + log.warn("Transfer failed on checksum: {} : {}", url, e.getMessage(), e); // Critical issue, pass it on. throw e; } @@ -267,67 +239,52 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { * @param origFile the local file to save to * @throws ProxyException if there was a problem moving the downloaded file into place. */ - protected void transferSimpleFile( Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, - ManagedRepositoryContent repository, Path origFile, Path destFile ) - throws ProxyException - { - assert ( remotePath != null ); + protected void transferSimpleFile(Wagon wagon, RemoteRepositoryContent remoteRepository, String remotePath, + ManagedRepositoryContent repository, Path origFile, Path destFile) + throws ProxyException { + assert (remotePath != null); // Transfer the file. - try - { + try { boolean success = false; - if ( !Files.exists(origFile)) - { - log.debug( "Retrieving {} from {}", remotePath, remoteRepository.getRepository().getName() ); - wagon.get( addParameters( remotePath, remoteRepository.getRepository() ), destFile.toFile() ); + if (!Files.exists(origFile)) { + log.debug("Retrieving {} from {}", remotePath, remoteRepository.getRepository().getName()); + wagon.get(addParameters(remotePath, remoteRepository.getRepository()), destFile.toFile()); success = true; // You wouldn't get here on failure, a WagonException would have been thrown. - log.debug( "Downloaded successfully." ); - } - else - { - log.debug( "Retrieving {} from {} if updated", remotePath, remoteRepository.getRepository().getName() ); - try - { - success = wagon.getIfNewer( addParameters( remotePath, remoteRepository.getRepository() ), destFile.toFile(), - Files.getLastModifiedTime(origFile).toMillis()); + log.debug("Downloaded successfully."); + } else { + log.debug("Retrieving {} from {} if updated", remotePath, remoteRepository.getRepository().getName()); + try { + success = wagon.getIfNewer(addParameters(remotePath, remoteRepository.getRepository()), destFile.toFile(), + Files.getLastModifiedTime(origFile).toMillis()); + } catch (IOException e) { + throw new ProxyException("Failed to the modification time of " + origFile.toAbsolutePath()); } - catch ( IOException e ) - { - throw new ProxyException( "Failed to the modification time of "+origFile.toAbsolutePath() ); - } - if ( !success ) - { + if (!success) { throw new NotModifiedException( - "Not downloaded, as local file is newer than remote side: " + origFile.toAbsolutePath() ); + "Not downloaded, as local file is newer than remote side: " + origFile.toAbsolutePath()); } - if ( Files.exists(destFile)) - { - log.debug( "Downloaded successfully." ); + if (Files.exists(destFile)) { + log.debug("Downloaded successfully."); } } - } - catch ( ResourceDoesNotExistException e ) - { + } catch (ResourceDoesNotExistException e) { throw new NotFoundException( - "Resource [" + remoteRepository.getURL() + "/" + remotePath + "] does not exist: " + e.getMessage(), - e ); - } - catch ( WagonException e ) - { + "Resource [" + remoteRepository.getURL() + "/" + remotePath + "] does not exist: " + e.getMessage(), + e); + } catch (WagonException e) { // TODO: shouldn't have to drill into the cause, but TransferFailedException is often not descriptive enough String msg = - "Download failure on resource [" + remoteRepository.getURL() + "/" + remotePath + "]:" + e.getMessage(); - if ( e.getCause() != null ) - { + "Download failure on resource [" + remoteRepository.getURL() + "/" + remotePath + "]:" + e.getMessage(); + if (e.getCause() != null) { msg += " (cause: " + e.getCause() + ")"; } - throw new ProxyException( msg, e ); + throw new ProxyException(msg, e); } } @@ -339,30 +296,25 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { * @param remoteRepository the remote repository to connect to. * @return true if the connection was successful. false if not connected. */ - protected boolean connectToRepository( ProxyConnector connector, Wagon wagon, - RemoteRepositoryContent remoteRepository ) - { + protected boolean connectToRepository(ProxyConnector connector, Wagon wagon, + RemoteRepositoryContent remoteRepository) { boolean connected = false; final ProxyInfo networkProxy = - connector.getProxyId() == null ? null : this.networkProxyMap.get( connector.getProxyId() ); + connector.getProxyId() == null ? null : this.networkProxyMap.get(connector.getProxyId()); - if ( log.isDebugEnabled() ) - { - if ( networkProxy != null ) - { + if (log.isDebugEnabled()) { + if (networkProxy != null) { // TODO: move to proxyInfo.toString() String msg = "Using network proxy " + networkProxy.getHost() + ":" + networkProxy.getPort() - + " to connect to remote repository " + remoteRepository.getURL(); - if ( networkProxy.getNonProxyHosts() != null ) - { + + " to connect to remote repository " + remoteRepository.getURL(); + if (networkProxy.getNonProxyHosts() != null) { msg += "; excluding hosts: " + networkProxy.getNonProxyHosts(); } - if ( StringUtils.isNotBlank( networkProxy.getUserName() ) ) - { + if (StringUtils.isNotBlank(networkProxy.getUserName())) { msg += "; as user: " + networkProxy.getUserName(); } - log.debug( msg ); + log.debug(msg); } } @@ -370,18 +322,17 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { String username = ""; String password = ""; RepositoryCredentials repCred = remoteRepository.getRepository().getLoginCredentials(); - if (repCred!=null && repCred instanceof PasswordCredentials) { + if (repCred != null && repCred instanceof PasswordCredentials) { PasswordCredentials pwdCred = (PasswordCredentials) repCred; username = pwdCred.getUsername(); - password = pwdCred.getPassword()==null ? "" : new String(pwdCred.getPassword()); + password = pwdCred.getPassword() == null ? "" : new String(pwdCred.getPassword()); } - if ( StringUtils.isNotBlank( username ) && StringUtils.isNotBlank( password ) ) - { - log.debug( "Using username {} to connect to remote repository {}", username, remoteRepository.getURL() ); + if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { + log.debug("Using username {} to connect to remote repository {}", username, remoteRepository.getURL()); authInfo = new AuthenticationInfo(); - authInfo.setUserName( username ); - authInfo.setPassword( password ); + authInfo.setUserName(username); + authInfo.setPassword(password); } // Convert seconds to milliseconds @@ -390,19 +341,16 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { // Set timeout read and connect // FIXME olamy having 2 config values - wagon.setReadTimeout( (int) timeoutInMilliseconds ); - wagon.setTimeout( (int) timeoutInMilliseconds ); + wagon.setReadTimeout((int) timeoutInMilliseconds); + wagon.setTimeout((int) timeoutInMilliseconds); - try - { + try { Repository wagonRepository = - new Repository( remoteRepository.getId(), remoteRepository.getURL().toString() ); - wagon.connect( wagonRepository, authInfo, networkProxy ); + new Repository(remoteRepository.getId(), remoteRepository.getURL().toString()); + wagon.connect(wagonRepository, authInfo, networkProxy); connected = true; - } - catch ( ConnectionException | AuthenticationException e ) - { - log.warn( "Could not connect to {}: {}", remoteRepository.getRepository().getName(), e.getMessage() ); + } catch (ConnectionException | AuthenticationException e) { + log.warn("Could not connect to {}: {}", remoteRepository.getRepository().getName(), e.getMessage()); connected = false; } @@ -410,13 +358,11 @@ public class MavenRepositoryProxyHandler extends DefaultRepositoryProxyHandler { } - public WagonFactory getWagonFactory() - { + public WagonFactory getWagonFactory() { return wagonFactory; } - public void setWagonFactory( WagonFactory wagonFactory ) - { + public void setWagonFactory(WagonFactory wagonFactory) { this.wagonFactory = wagonFactory; } diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml index 7374f36..ac08cdb 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/main/resources/META-INF/spring-context.xml @@ -28,7 +28,7 @@ default-lazy-init="true"> <context:annotation-config/> - <context:component-scan base-package="org.apache.archiva.proxy.common"/> + <context:component-scan base-package="org.apache.archiva.proxy.maven"/> <bean name="wagon#http" scope="prototype" class="org.apache.maven.wagon.providers.http.HttpWagon"/> diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java index 4813ddd..30f780c 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java @@ -381,6 +381,7 @@ public abstract class AbstractProxyTestCase ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration(); connectorConfig.setSourceRepoId( sourceRepoId ); connectorConfig.setTargetRepoId( targetRepoId ); + connectorConfig.setProxyId(sourceRepoId); connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, checksumPolicy ); connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, releasePolicy ); connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, snapshotPolicy ); diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java index d3e207a..c3d7c11 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java @@ -125,7 +125,6 @@ public class HttpProxyTransferTest // Make the destination dir. Files.createDirectories(destRepoDir); - managedDefaultRepository = createRepository(MANAGED_ID, "Default Managed Repository", repoPath, "default"); Handler handler = new AbstractHandler() { @@ -168,6 +167,7 @@ public class HttpProxyTransferTest proxyConfig.setProtocol( "http" ); proxyConfig.setId( PROXY_ID ); config.getConfiguration().addNetworkProxy( proxyConfig ); + ( (MockConfiguration) config ).triggerChange("networkProxies.networkProxy(0).host", "localhost"); // Setup target (proxied to) repository. RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration(); @@ -179,6 +179,10 @@ public class HttpProxyTransferTest config.getConfiguration().addRemoteRepository( repoConfig ); + repositoryRegistry.reload(); + + managedDefaultRepository = createRepository(MANAGED_ID, "Default Managed Repository", repoPath, "default"); + } @After @@ -192,8 +196,8 @@ public class HttpProxyTransferTest public void testGetOverHttpProxy() throws Exception { - Assertions.assertThat( System.getProperty( "http.proxyHost" ) ).isEmpty(); - Assertions.assertThat( System.getProperty( "http.proxyPort" ) ).isEmpty(); + Assertions.assertThat( System.getProperty( "http.proxyHost", "" ) ).isEmpty(); + Assertions.assertThat( System.getProperty( "http.proxyPort", "" ) ).isEmpty(); String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar"; @@ -218,8 +222,8 @@ public class HttpProxyTransferTest String actualContents = FileUtils.readFileToString( downloadedFile.toFile(), Charset.defaultCharset() ); assertEquals( "Check file contents.", expectedContents, actualContents ); - Assertions.assertThat( System.getProperty( "http.proxyHost" ) ).isEmpty(); - Assertions.assertThat( System.getProperty( "http.proxyPort" ) ).isEmpty(); + Assertions.assertThat( System.getProperty( "http.proxyHost" , "") ).isEmpty(); + Assertions.assertThat( System.getProperty( "http.proxyPort" , "") ).isEmpty(); } private void addConnector() diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java index 2b06667..e185c3e 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java @@ -19,16 +19,25 @@ package org.apache.archiva.repository.mock; * under the License. */ +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.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.*; +import org.apache.archiva.repository.content.PathParser; +import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author Martin Stockhammer <[email protected]> @@ -36,8 +45,17 @@ import java.util.Set; @Service("managedRepositoryContent#mock") public class ManagedRepositoryContentMock implements ManagedRepositoryContent { + private static final String PATH_SEPARATOR = "/"; + private static final String GROUP_SEPARATOR = "."; + public static final String MAVEN_METADATA = "maven-metadata.xml"; + + private ManagedRepository repository; + ManagedRepositoryContentMock(ManagedRepository repo) { + this.repository = repo; + } + @Override public void deleteVersion( VersionedReference reference ) throws ContentNotFoundException { @@ -65,7 +83,7 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent @Override public String getId( ) { - return null; + return repository.getId(); } @Override @@ -122,16 +140,199 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent this.repository = repo; } + private Map<ArtifactReference, String> refs = new HashMap<>(); + @Override public ArtifactReference toArtifactReference( String path ) throws LayoutException { - return null; + if ( StringUtils.isBlank( path ) ) + { + throw new LayoutException( "Unable to convert blank path." ); + } + + ArtifactMetadata metadata = getArtifactForPath("test-repository", path); + + ArtifactReference artifact = new ArtifactReference(); + artifact.setGroupId( metadata.getNamespace() ); + artifact.setArtifactId( metadata.getProject() ); + artifact.setVersion( metadata.getVersion() ); + MavenArtifactFacet facet = (MavenArtifactFacet) metadata.getFacet( MavenArtifactFacet.FACET_ID ); + if ( facet != null ) + { + artifact.setClassifier( facet.getClassifier() ); + artifact.setType( facet.getType() ); + } + refs.put(artifact, path); + return artifact; + } + + public ArtifactMetadata getArtifactForPath( String repoId, String relativePath ) + { + String[] parts = relativePath.replace( '\\', '/' ).split( "/" ); + + int len = parts.length; + if ( len < 4 ) + { + throw new IllegalArgumentException( + "Not a valid artifact path in a Maven 2 repository, not enough directories: " + relativePath ); + } + + String id = parts[--len]; + String baseVersion = parts[--len]; + String artifactId = parts[--len]; + StringBuilder groupIdBuilder = new StringBuilder(); + for ( int i = 0; i < len - 1; i++ ) + { + groupIdBuilder.append( parts[i] ); + groupIdBuilder.append( '.' ); + } + groupIdBuilder.append( parts[len - 1] ); + + return getArtifactFromId( repoId, groupIdBuilder.toString(), artifactId, baseVersion, id ); + } + + private static final Pattern TIMESTAMP_PATTERN = Pattern.compile( "([0-9]{8}.[0-9]{6})-([0-9]+).*" ); + + + + public ArtifactMetadata getArtifactFromId( String repoId, String namespace, String projectId, String projectVersion, + String id ) + { + if ( !id.startsWith( projectId + "-" ) ) + { + throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id + + "' doesn't start with artifact ID '" + projectId + "'" ); + } + + MavenArtifactFacet facet = new MavenArtifactFacet(); + + int index = projectId.length() + 1; + String version; + String idSubStrFromVersion = id.substring( index ); + if ( idSubStrFromVersion.startsWith( projectVersion ) && !VersionUtil.isUniqueSnapshot( projectVersion ) ) + { + // non-snapshot versions, or non-timestamped snapshot versions + version = projectVersion; + } + else if ( VersionUtil.isGenericSnapshot( projectVersion ) ) + { + // timestamped snapshots + try + { + int mainVersionLength = projectVersion.length() - 8; // 8 is length of "SNAPSHOT" + if ( mainVersionLength == 0 ) + { + throw new IllegalArgumentException( + "Timestamped snapshots must contain the main version, filename was '" + id + "'" ); + } + + Matcher m = TIMESTAMP_PATTERN.matcher( idSubStrFromVersion.substring( mainVersionLength ) ); + m.matches(); + String timestamp = m.group( 1 ); + String buildNumber = m.group( 2 ); + facet.setTimestamp( timestamp ); + facet.setBuildNumber( Integer.parseInt( buildNumber ) ); + version = idSubStrFromVersion.substring( 0, mainVersionLength ) + timestamp + "-" + buildNumber; + } + catch ( IllegalStateException e ) + { + throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id + + "' doesn't contain a timestamped version matching snapshot '" + + projectVersion + "'", e); + } + } + else + { + // invalid + throw new IllegalArgumentException( + "Not a valid artifact path in a Maven 2 repository, filename '" + id + "' doesn't contain version '" + + projectVersion + "'" ); + } + + String classifier; + String ext; + index += version.length(); + if ( index == id.length() ) + { + // no classifier or extension + classifier = null; + ext = null; + } + else + { + char c = id.charAt( index ); + if ( c == '-' ) + { + // classifier up until '.' + int extIndex = id.indexOf( '.', index ); + if ( extIndex >= 0 ) + { + classifier = id.substring( index + 1, extIndex ); + ext = id.substring( extIndex + 1 ); + } + else + { + classifier = id.substring( index + 1 ); + ext = null; + } + } + else if ( c == '.' ) + { + // rest is the extension + classifier = null; + ext = id.substring( index + 1 ); + } + else + { + throw new IllegalArgumentException( "Not a valid artifact path in a Maven 2 repository, filename '" + id + + "' expected classifier or extension but got '" + + id.substring( index ) + "'" ); + } + } + + ArtifactMetadata metadata = new ArtifactMetadata(); + metadata.setId( id ); + metadata.setNamespace( namespace ); + metadata.setProject( projectId ); + metadata.setRepositoryId( repoId ); + metadata.setProjectVersion( projectVersion ); + metadata.setVersion( version ); + + facet.setClassifier( classifier ); + + // we use our own provider here instead of directly accessing Maven's artifact handlers as it has no way + // to select the correct order to apply multiple extensions mappings to a preferred type + // TODO: this won't allow the user to decide order to apply them if there are conflicts or desired changes - + // perhaps the plugins could register missing entries in configuration, then we just use configuration + // here? + + String type = null; + + + // use extension as default + if ( type == null ) + { + type = ext; + } + + // TODO: should we allow this instead? + if ( type == null ) + { + throw new IllegalArgumentException( + "Not a valid artifact path in a Maven 2 repository, filename '" + id + "' does not have a type" ); + } + + facet.setType( type ); + metadata.addFacet( facet ); + + return metadata; } + @Override public Path toFile( ArtifactReference reference ) { - return null; + return Paths.get(getRepoRoot(), refs.get(reference)); } @Override @@ -140,16 +341,36 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent return null; } - @Override + private String formatAsDirectory( String directory ) + { + return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR ); + } + public String toMetadataPath( ProjectReference reference ) { - return null; + StringBuilder path = new StringBuilder(); + + path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR ); + path.append( reference.getArtifactId() ).append( PATH_SEPARATOR ); + path.append( MAVEN_METADATA ); + + return path.toString(); } - @Override public String toMetadataPath( VersionedReference reference ) { - return null; + StringBuilder path = new StringBuilder(); + + path.append( formatAsDirectory( reference.getGroupId() ) ).append( PATH_SEPARATOR ); + path.append( reference.getArtifactId() ).append( PATH_SEPARATOR ); + if ( reference.getVersion() != null ) + { + // add the version only if it is present + path.append( VersionUtil.getBaseVersion( reference.getVersion() ) ).append( PATH_SEPARATOR ); + } + path.append( MAVEN_METADATA ); + + return path.toString(); } @Override diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java index c797b56..4ab4a5a 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RemoteRepositoryContentMock.java @@ -19,11 +19,13 @@ package org.apache.archiva.repository.mock; * under the License. */ +import org.apache.archiva.common.utils.VersionUtil; import org.apache.archiva.model.ArtifactReference; import org.apache.archiva.model.RepositoryURL; import org.apache.archiva.repository.LayoutException; import org.apache.archiva.repository.RemoteRepository; import org.apache.archiva.repository.RemoteRepositoryContent; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; /** @@ -34,22 +36,26 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent { RemoteRepository repository; + RemoteRepositoryContentMock(RemoteRepository repo) { + this.repository = repo; + } + @Override public String getId( ) { - return null; + return repository.getId(); } @Override public RemoteRepository getRepository( ) { - return null; + return repository; } @Override public RepositoryURL getURL( ) { - return null; + return new RepositoryURL(repository.getLocation().toString()); } @Override @@ -67,7 +73,15 @@ public class RemoteRepositoryContentMock implements RemoteRepositoryContent @Override public String toPath( ArtifactReference reference ) { - return null; + String baseVersion; + if (VersionUtil.isSnapshot(reference.getVersion())) { + baseVersion=VersionUtil.getBaseVersion(reference.getVersion()); + } else { + baseVersion=reference.getVersion(); + } + return reference.getGroupId().replaceAll("\\.", "/")+"/"+reference.getArtifactId()+"/"+baseVersion+"/" + +reference.getArtifactId()+"-"+reference.getVersion()+( + StringUtils.isNotEmpty(reference.getClassifier()) ? "-"+reference.getClassifier() : "")+"."+reference.getType(); } @Override diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java index 3693e07..2822ae9 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/java/org/apache/archiva/repository/mock/RepositoryContentProviderMock.java @@ -51,12 +51,12 @@ public class RepositoryContentProviderMock implements RepositoryContentProvider @Override public RemoteRepositoryContent createRemoteContent(RemoteRepository repository) throws RepositoryException { - return new RemoteRepositoryContentMock(); + return new RemoteRepositoryContentMock(repository); } @Override public ManagedRepositoryContent createManagedContent(ManagedRepository repository) throws RepositoryException { - return new ManagedRepositoryContentMock(); + return new ManagedRepositoryContentMock(repository); } @Override diff --git a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml index 7afd4a4..f900a93 100644 --- a/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml +++ b/archiva-modules/archiva-base/archiva-proxy-maven/src/test/resources/META-INF/spring-context.xml @@ -20,10 +20,49 @@ <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd" + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" default-lazy-init="true"> + <context:component-scan base-package="org.apache.archiva.proxy.maven"/> + <bean name="wagon#file" scope="prototype" class="org.apache.maven.wagon.providers.file.FileWagon"/> + <alias name="userConfiguration#redback" alias="userConfiguration#default"/> + + <!-- *** + JPA settings + *** --> + <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> + <property name="jpaVendorAdapter" > + <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" /> + </property> + <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" /> + <property name="jpaPropertyMap"> + <map> + <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" /> + <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" /> + <entry key="openjpa.ConnectionUserName" value="sa" /> + <entry key="openjpa.ConnectionPassword" value="" /> + <entry key="openjpa.Log" value="${openjpa.Log:DefaultLevel=INFO,Runtime=ERROR,Tool=ERROR,SQL=ERROR,Schema=ERROR,MetaData=ERROR}" /> + <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /> + <entry key="openjpa.jdbc.MappingDefaults" + value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/> + </map> + </property> + + </bean> + + <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" > + <property name="entityManagerFactory" ref="entityManagerFactory" /> + </bean> + + <tx:annotation-driven /> + <!-- *** + End of JPA settings + *** --> + </beans> \ No newline at end of file diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java index 7331614..6869c34 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ArchivaProxyRegistry.java @@ -150,6 +150,11 @@ public class ArchivaProxyRegistry implements ProxyRegistry, ConfigurationListene } @Override + public boolean hasHandler(RepositoryType type) { + return this.handlerMap.containsKey(type); + } + + @Override public void configurationEvent(ConfigurationEvent event) { log.debug("Config changed updating proxy list"); updateNetworkProxies(); diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java index 3f6bfe6..5622fe5 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyHandler.java @@ -60,6 +60,7 @@ import java.nio.file.Paths; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHandler, RegistryListener { @@ -97,13 +98,13 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa @PostConstruct public void initialize() { - initConnectorsAndNetworkProxies(); + initConnectors(); archivaConfiguration.addChangeListener( this ); } @SuppressWarnings("unchecked") - private void initConnectorsAndNetworkProxies() + private void initConnectors() { ProxyConnectorOrderComparator proxyOrderSorter = new ProxyConnectorOrderComparator(); @@ -226,6 +227,21 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa return proxyConnectorRuleConfigurations; } + private void updateNetworkProxies() { + Map<String, NetworkProxy> proxies = archivaConfiguration.getConfiguration().getNetworkProxies().stream().map(p -> { + NetworkProxy np = new NetworkProxy(); + np.setId(p.getId()); + np.setUseNtlm(p.isUseNtlm()); + np.setUsername(p.getUsername()); + np.setPassword(p.getPassword()); + np.setProtocol(p.getProtocol()); + np.setHost(p.getHost()); + np.setPort(p.getPort()); + return np; + }).collect(Collectors.toMap(p -> p.getId(), p -> p)); + setNetworkProxies(proxies); + } + @Override public Path fetchFromProxies(ManagedRepositoryContent repository, ArtifactReference artifact ) throws ProxyDownloadException @@ -911,12 +927,13 @@ public abstract class DefaultRepositoryProxyHandler implements RepositoryProxyHa @Override public void afterConfigurationChange(Registry registry, String propertyName, Object propertyValue ) { - if ( ConfigurationNames.isNetworkProxy( propertyName ) // - || ConfigurationNames.isManagedRepositories( propertyName ) // + if ( ConfigurationNames.isManagedRepositories( propertyName ) // || ConfigurationNames.isRemoteRepositories( propertyName ) // || ConfigurationNames.isProxyConnector( propertyName ) ) // { - initConnectorsAndNetworkProxies(); + initConnectors(); + } else if (ConfigurationNames.isNetworkProxy(propertyName)) { + updateNetworkProxies(); } } diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java index 56f3d51..95c096a 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/ProxyRegistry.java @@ -52,6 +52,14 @@ public interface ProxyRegistry { List<RepositoryProxyHandler> getHandler(RepositoryType type); /** + * Returns true, if there are proxy handler registered for the given type. + * + * @param type The repository type + * @return True, if a handler is registered, otherwise false. + */ + boolean hasHandler(RepositoryType type); + + /** * Returns the list of all proxy connectors. * @return */ diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml deleted file mode 100755 index 9917806..0000000 --- a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/spring-context.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ 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. - --> - -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" - default-lazy-init="true"> - - <context:annotation-config/> - <context:component-scan base-package="org.apache.archiva.metadata.repository,org.apache.archiva.proxy,org.apache.archiva.repository.mock"/> - <alias name="mockRepositoryProvider" alias="mavenRepositoryProvider" /> - - <alias name="archivaConfiguration#mock" alias="archivaConfiguration#default"/> - <alias name="archivaConfiguration#mock" alias="archivaConfiguration"/> - <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" /> - - <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler"> - <property name="properties"> - <props> - <prop key="org.quartz.scheduler.instanceName">scheduler1</prop> - <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> - <prop key="org.quartz.threadPool.threadCount">1</prop> - <prop key="org.quartz.threadPool.threadPriority">4</prop> - <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> - </props> - </property> - </bean> - - <bean name="repositoryContentFactory#mocked" class="org.apache.archiva.repository.RepositoryContentFactory"> - <property name="archivaConfiguration" ref="archivaConfiguration#mock"/> - </bean> - - - - <bean name="repositoryProxyConnectors#test" class="org.apache.archiva.proxy.maven.MavenRepositoryProxyHandler"> - <property name="archivaConfiguration" ref="archivaConfiguration#mock"/> - <property name="repositoryFactory" ref="repositoryContentFactory#mocked"/> - <property name="metadataTools" ref="metadataTools#mocked"/> - </bean> - - <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools"> - <property name="configuration" ref="archivaConfiguration#mock"/> - </bean> - - <bean name="metadataTools#mocked" class="org.apache.archiva.repository.metadata.MetadataTools"> - <property name="configuration" ref="archivaConfiguration#mock"/> - </bean> - - - <bean name="cache#url-failures-cache" class="org.apache.archiva.redback.components.cache.ehcache.EhcacheCache" lazy-init="true" - destroy-method="dispose"> - <property name="diskExpiryThreadIntervalSeconds" value="600"/> - <property name="diskPersistent" value="false"/> - <property name="diskStorePath" value="${appserver.base}/tmp/urlcache"/> - <property name="maxElementsInMemory" value="1000"/> - <property name="memoryEvictionPolicy" value="LRU"/> - <property name="name" value="url-failures-cache"/> - <property name="overflowToDisk" value="false"/> - <!-- 45 minutes = 2700 seconds --> - <property name="timeToIdleSeconds" value="2700"/> - <!-- 30 minutes = 1800 seconds --> - <property name="timeToLiveSeconds" value="1800"/> - </bean> - - <bean name="wagon#test" class="org.apache.archiva.proxy.WagonDelegate" scope="singleton"/> - <bean name="wagon#file" scope="prototype" class="org.apache.maven.wagon.providers.file.FileWagon"/> - - <alias name="userConfiguration#redback" alias="userConfiguration#default"/> - - <!-- *** - JPA settings - *** --> - <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> - <property name="jpaVendorAdapter" > - <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" /> - </property> - <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" /> - <property name="jpaPropertyMap"> - <map> - <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" /> - <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" /> - <entry key="openjpa.ConnectionUserName" value="sa" /> - <entry key="openjpa.ConnectionPassword" value="" /> - <entry key="openjpa.Log" value="${openjpa.Log:DefaultLevel=INFO,Runtime=ERROR,Tool=ERROR,SQL=ERROR,Schema=ERROR,MetaData=ERROR}" /> - <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /> - <entry key="openjpa.jdbc.MappingDefaults" - value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/> - </map> - </property> - - </bean> - - <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" > - <property name="entityManagerFactory" ref="entityManagerFactory" /> - </bean> - - <tx:annotation-driven /> - <!-- *** - End of JPA settings - *** --> - -</beans> \ No newline at end of file diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java index 8312e2b..9df3f49 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/MetadataTools.java @@ -357,6 +357,7 @@ public class MetadataTools @PostConstruct public void initialize() { + assert(configuration != null); this.artifactPatterns = new ArrayList<>(); this.proxies = new HashMap<>(); initConfigVariables(); @@ -898,6 +899,8 @@ public class MetadataTools private void initConfigVariables() { + assert(this.artifactPatterns!=null); + assert(proxies!=null); synchronized ( this.artifactPatterns ) { this.artifactPatterns.clear(); diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java index c1ffe62..9488261 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java @@ -35,6 +35,7 @@ import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMetadataVer import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; import org.apache.archiva.model.ArchivaArtifact; import org.apache.archiva.model.ArchivaRepositoryMetadata; +import org.apache.archiva.proxy.ProxyRegistry; import org.apache.archiva.proxy.model.RepositoryProxyHandler; import org.apache.archiva.redback.components.cache.Cache; import org.apache.archiva.repository.ManagedRepositoryContent; @@ -82,8 +83,7 @@ public class DefaultBrowseService private DependencyTreeBuilder dependencyTreeBuilder; @Inject - @Named( value = "repositoryProxyConnectors#default" ) - private RepositoryProxyHandler connectors; + ProxyRegistry proxyRegistry; @Inject @Named( value = "browse#versionMetadata" ) @@ -830,7 +830,10 @@ public class DefaultBrowseService { org.apache.archiva.repository.ManagedRepository managedRepo = repositoryRegistry.getManagedRepository(repoId); - + if (!proxyRegistry.hasHandler(managedRepo.getType())) { + throw new RepositoryException( "No proxy handler found for repository type "+managedRepo.getType()); + } + RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(managedRepo.getType()).get(0); if ( ( snapshot && !managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) ) || ( !snapshot && managedRepo.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT) ) ) { @@ -886,13 +889,13 @@ public class DefaultBrowseService String path = managedRepositoryContent.toPath( archivaArtifact ); - file = connectors.fetchFromProxies( managedRepositoryContent, path ); + file = proxyHandler.fetchFromProxies( managedRepositoryContent, path ); if ( file != null && Files.exists(file) ) { // download pom now String pomPath = StringUtils.substringBeforeLast( path, ".jar" ) + ".pom"; - connectors.fetchFromProxies( managedRepositoryContent, pomPath ); + proxyHandler.fetchFromProxies( managedRepositoryContent, pomPath ); return true; } } diff --git a/archiva-modules/archiva-web/archiva-webdav/pom.xml b/archiva-modules/archiva-web/archiva-webdav/pom.xml index 0da5b2e..45ccdd8 100644 --- a/archiva-modules/archiva-web/archiva-webdav/pom.xml +++ b/archiva-modules/archiva-web/archiva-webdav/pom.xml @@ -89,6 +89,10 @@ </dependency> <dependency> <groupId>org.apache.archiva</groupId> + <artifactId>archiva-proxy-maven</artifactId> + </dependency> + <dependency> + <groupId>org.apache.archiva</groupId> <artifactId>archiva-security</artifactId> </dependency> <dependency> diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java index 3abf50c..b229ec9 100644 --- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java +++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java @@ -46,6 +46,7 @@ import org.apache.archiva.metadata.repository.storage.RepositoryStorage; import org.apache.archiva.model.ArchivaRepositoryMetadata; import org.apache.archiva.model.ArtifactReference; import org.apache.archiva.policies.ProxyDownloadException; +import org.apache.archiva.proxy.ProxyRegistry; import org.apache.archiva.proxy.model.RepositoryProxyHandler; import org.apache.archiva.redback.authentication.AuthenticationException; import org.apache.archiva.redback.authentication.AuthenticationResult; @@ -137,8 +138,7 @@ public class ArchivaDavResourceFactory private RepositoryRequest repositoryRequest; @Inject - @Named( value = "repositoryProxyConnectors#default" ) - private RepositoryProxyHandler connectors; + private ProxyRegistry proxyRegistry; @Inject private MetadataTools metadataTools; @@ -753,9 +753,13 @@ public class ArchivaDavResourceFactory throws DavException { String path = resource.getPath(); + if (!proxyRegistry.hasHandler(managedRepository.getRepository().getType())) { + throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "No proxy handler found for repository type "+managedRepository.getRepository().getType()); + } + RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(managedRepository.getRepository().getType()).get(0); if ( repositoryRequest.isSupportFile( path ) ) { - Path proxiedFile = connectors.fetchFromProxies( managedRepository, path ); + Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, path ); return ( proxiedFile != null ); } @@ -763,14 +767,14 @@ public class ArchivaDavResourceFactory // Is it a Metadata resource? if ( repositoryRequest.isDefault( path ) && repositoryRequest.isMetadata( path ) ) { - return connectors.fetchMetadataFromProxies( managedRepository, path ).isModified(); + return proxyHandler.fetchMetadataFromProxies( managedRepository, path ).isModified(); } // Is it an Archetype Catalog? if ( repositoryRequest.isArchetypeCatalog( path ) ) { // FIXME we must implement a merge of remote archetype catalog from remote servers. - Path proxiedFile = connectors.fetchFromProxies( managedRepository, path ); + Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, path ); return ( proxiedFile != null ); } @@ -789,7 +793,7 @@ public class ArchivaDavResourceFactory this.applicationContext.getBean( "repositoryStorage#" + repositoryLayout, RepositoryStorage.class ); repositoryStorage.applyServerSideRelocation( managedRepository, artifact ); - Path proxiedFile = connectors.fetchFromProxies( managedRepository, artifact ); + Path proxiedFile = proxyHandler.fetchFromProxies( managedRepository, artifact ); resource.setPath( managedRepository.toPath( artifact ) ); @@ -917,6 +921,14 @@ public class ArchivaDavResourceFactory + path; } + public void setProxyRegistry(ProxyRegistry proxyRegistry) { + this.proxyRegistry = proxyRegistry; + } + + public ProxyRegistry getProxyRegistry() { + return this.proxyRegistry; + } + private static class LogicalResource { private String path; @@ -1416,11 +1428,6 @@ public class ArchivaDavResourceFactory this.repositoryRequest = repositoryRequest; } - public void setConnectors( RepositoryProxyHandler connectors ) - { - this.connectors = connectors; - } - public RemoteRepositoryAdmin getRemoteRepositoryAdmin() { return remoteRepositoryAdmin; diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java index 3b82377..a55d891 100644 --- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java +++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java @@ -19,15 +19,10 @@ package org.apache.archiva.webdav; * under the License. */ -import com.gargoylesoftware.htmlunit.HttpMethod; -import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; -import com.gargoylesoftware.htmlunit.WebClient; -import com.gargoylesoftware.htmlunit.WebRequest; -import com.gargoylesoftware.htmlunit.WebResponse; +import com.gargoylesoftware.htmlunit.*; import junit.framework.TestCase; import net.sf.ehcache.CacheManager; import org.apache.archiva.admin.model.beans.ManagedRepository; -import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin; import org.apache.archiva.configuration.ArchivaConfiguration; import org.apache.archiva.configuration.Configuration; import org.apache.archiva.configuration.ManagedRepositoryConfiguration; @@ -101,8 +96,6 @@ public abstract class AbstractRepositoryServletTestCase @Inject protected ApplicationContext applicationContext; - @Inject - protected ManagedRepositoryAdmin managedRepositoryAdmin; @Inject RepositoryRegistry repositoryRegistry; diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java index b568076..22a99f3 100644 --- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java +++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java @@ -34,8 +34,7 @@ import org.apache.archiva.configuration.Configuration; import org.apache.archiva.configuration.FileTypes; import org.apache.archiva.configuration.RepositoryGroupConfiguration; import org.apache.archiva.metadata.repository.storage.maven2.ArtifactMappingProvider; -import org.apache.archiva.proxy.maven.MavenRepositoryProxyHandler; -import org.apache.archiva.proxy.model.ProxyFetchResult; +import org.apache.archiva.proxy.ProxyRegistry; import org.apache.archiva.repository.EditableManagedRepository; import org.apache.archiva.repository.ManagedRepositoryContent; import org.apache.archiva.repository.RemoteRepository; @@ -50,7 +49,6 @@ import org.apache.archiva.repository.RepositoryType; import org.apache.archiva.repository.content.maven2.ManagedDefaultRepositoryContent; import org.apache.archiva.repository.content.maven2.RepositoryRequest; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavResourceLocator; @@ -68,7 +66,6 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.test.context.ContextConfiguration; import javax.inject.Inject; -import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -139,6 +136,9 @@ public class ArchivaDavResourceFactoryTest @Inject RemoteRepositoryAdmin remoteRepositoryAdmin; + @Inject + ProxyRegistry proxyRegistry; + @Inject DefaultRepositoryGroupAdmin defaultRepositoryGroupAdmin; @@ -149,7 +149,7 @@ public class ArchivaDavResourceFactoryTest @Inject FileTypes fileTypes; - private Path getProjectBase() { + public Path getProjectBase() { if (this.projectBase.get()==null) { String pathVal = System.getProperty("mvn.project.base.dir"); Path baseDir; @@ -229,7 +229,9 @@ public class ArchivaDavResourceFactoryTest resourceFactory.setArchivaConfiguration( archivaConfiguration ); resourceFactory.setRepositoryFactory( repoFactory ); resourceFactory.setRepositoryRequest( repoRequest ); - resourceFactory.setConnectors( new OverridingRepositoryProxyHandler() ); + proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).clear(); + proxyRegistry.getAllHandler().get(RepositoryType.MAVEN).add(new OverridingRepositoryProxyHandler(this)); + resourceFactory.setProxyRegistry(proxyRegistry); resourceFactory.setRemoteRepositoryAdmin( remoteRepositoryAdmin ); resourceFactory.setManagedRepositoryAdmin( defaultManagedRepositoryAdmin ); resourceFactory.setRepositoryRegistry( repositoryRegistry ); @@ -749,23 +751,4 @@ public class ArchivaDavResourceFactoryTest } } - class OverridingRepositoryProxyHandler - extends MavenRepositoryProxyHandler - { - @Override - public ProxyFetchResult fetchMetadataFromProxies( ManagedRepositoryContent repository, String logicalPath ) - { - Path target = Paths.get(repository.getRepoRoot(), logicalPath ); - try - { - FileUtils.copyFile( getProjectBase().resolve( "target/test-classes/maven-metadata.xml" ).toFile(), target.toFile() ); - } - catch ( IOException e ) - { - - } - - return new ProxyFetchResult( target, true ); - } - } } diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java new file mode 100644 index 0000000..75f6726 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/OverridingRepositoryProxyHandler.java @@ -0,0 +1,55 @@ +package org.apache.archiva.webdav; + +/* + * 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.proxy.maven.MavenRepositoryProxyHandler; +import org.apache.archiva.proxy.model.ProxyFetchResult; +import org.apache.archiva.repository.ManagedRepositoryContent; +import org.apache.commons.io.FileUtils; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +class OverridingRepositoryProxyHandler + extends MavenRepositoryProxyHandler +{ + private ArchivaDavResourceFactoryTest archivaDavResourceFactoryTest; + + public OverridingRepositoryProxyHandler(ArchivaDavResourceFactoryTest archivaDavResourceFactoryTest) { + this.archivaDavResourceFactoryTest = archivaDavResourceFactoryTest; + } + + @Override + public ProxyFetchResult fetchMetadataFromProxies(ManagedRepositoryContent repository, String logicalPath ) + { + Path target = Paths.get(repository.getRepoRoot(), logicalPath ); + try + { + FileUtils.copyFile( archivaDavResourceFactoryTest.getProjectBase().resolve( "target/test-classes/maven-metadata.xml" ).toFile(), target.toFile() ); + } + catch ( IOException e ) + { + + } + + return new ProxyFetchResult( target, true ); + } +} diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml index 0691eb7..d16eb97 100644 --- a/archiva-modules/plugins/maven2-repository/pom.xml +++ b/archiva-modules/plugins/maven2-repository/pom.xml @@ -54,6 +54,10 @@ </dependency> <dependency> <groupId>org.apache.archiva</groupId> + <artifactId>archiva-model</artifactId> + </dependency> + <dependency> + <groupId>org.apache.archiva</groupId> <artifactId>archiva-proxy-maven</artifactId> <exclusions> <exclusion> @@ -202,6 +206,7 @@ <scope>test</scope> </dependency> + </dependencies> <build> <plugins> diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java index 45a699a..b7011ca 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java @@ -45,12 +45,7 @@ import org.apache.archiva.proxy.maven.WagonFactory; import org.apache.archiva.proxy.model.NetworkProxy; import org.apache.archiva.proxy.model.ProxyConnector; import org.apache.archiva.proxy.model.RepositoryProxyHandler; -import org.apache.archiva.repository.LayoutException; -import org.apache.archiva.repository.ManagedRepository; -import org.apache.archiva.repository.ManagedRepositoryContent; -import org.apache.archiva.repository.ReleaseScheme; -import org.apache.archiva.repository.RemoteRepository; -import org.apache.archiva.repository.RepositoryRegistry; +import org.apache.archiva.repository.*; import org.apache.archiva.repository.content.PathParser; import org.apache.archiva.repository.maven2.MavenSystemManager; import org.apache.archiva.xml.XMLException; @@ -623,11 +618,15 @@ public class Maven2RepositoryStorage pomReference.setVersion(artifact.getVersion()); pomReference.setType("pom"); - RepositoryProxyHandler connectors = - applicationContext.getBean("repositoryProxyConnectors#default", RepositoryProxyHandler.class); + RepositoryType repositoryType = managedRepository.getRepository().getType(); + if (!proxyRegistry.hasHandler(repositoryType)) { + throw new ProxyDownloadException("No proxy handler found for repository type "+repositoryType, new HashMap<>()); + } + + RepositoryProxyHandler proxyHandler = proxyRegistry.getHandler(repositoryType).get(0); // Get the artifact POM from proxied repositories if needed - connectors.fetchFromProxies(managedRepository, pomReference); + proxyHandler.fetchFromProxies(managedRepository, pomReference); // Open and read the POM from the managed repo Path pom = managedRepository.toFile(pomReference); diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java new file mode 100644 index 0000000..08bcd96 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/MockRepositoryArchivaTaskScheduler.java @@ -0,0 +1,58 @@ +package org.apache.archiva.metadata.repository; +/* + * 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.redback.components.taskqueue.TaskQueueException; +import org.apache.archiva.scheduler.repository.model.RepositoryArchivaTaskScheduler; +import org.apache.archiva.scheduler.repository.model.RepositoryTask; +import org.springframework.stereotype.Service; + +/** + * @author Olivier Lamy + */ +@Service ("archivaTaskScheduler#repositoryMock") +public class MockRepositoryArchivaTaskScheduler + implements RepositoryArchivaTaskScheduler +{ + @Override + public boolean isProcessingRepositoryTask( String repositoryId ) + { + return false; + } + + @Override + public boolean isProcessingRepositoryTask( RepositoryTask task ) + { + return false; + } + + @Override + public void queueTask( RepositoryTask task ) + throws TaskQueueException + { + // no op + } + + @Override + public boolean unQueueTask( RepositoryTask task ) + throws TaskQueueException + { + return false; + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java index 6594fda..c10f13d 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java @@ -395,8 +395,10 @@ public class Maven2RepositoryMetadataResolverMRM1411RepoGroupTest { copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-module-b", "target/test-repository/com/example/test/test-artifact-module-b" ); + copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent", + "target/test-repository/com/example/test/test-artifact-parent" ); copyTestArtifactWithParent( "src/test/resources/com/example/test/test-snapshot-artifact-root", - "target/test-repositorys/com/example/test/test-snapshot-artifact-root" ); + "target/test-repository/com/example/test/test-snapshot-artifact-root" ); ReadMetadataRequest readMetadataRequest = new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( "com.example.test" ).projectId( diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java index 55ef898..e094a20 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java @@ -155,6 +155,11 @@ public class Maven2RepositoryMetadataResolverMRM1411Test { copyTestArtifactWithParent( "target/test-classes/com/example/test/test-artifact-module-a", "target/test-repository/com/example/test/test-artifact-module-a" ); + copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent", + "target/test-repository/com/example/test/test-artifact-parent" ); + + copyTestArtifactWithParent( "target/test-classes/com/example/test/test-artifact-root", + "target/test-repository/com/example/test/test-artifact-root" ); ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "test-artifact-module-a", "1.0" ) ); @@ -258,8 +263,11 @@ public class Maven2RepositoryMetadataResolverMRM1411Test copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-module-a", "target/test-repository/com/example/test/test-snapshot-artifact-module-a" ); - //copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-root", - // "target/test-repository/com/example/test/test-snapshot-artifact-root" ); + copyTestArtifactWithParent( "src/test/resources/com/example/test/test-artifact-parent", + "target/test-repository/com/example/test/test-artifact-parent" ); + + copyTestArtifactWithParent( "target/test-classes/com/example/test/test-snapshot-artifact-root", + "target/test-repository/com/example/test/test-snapshot-artifact-root" ); ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( new ReadMetadataRequest( TEST_REPO_ID, "com.example.test", "test-snapshot-artifact-module-a", diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java index 4c3168f..dd4ecd9 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java @@ -35,7 +35,7 @@ import java.nio.file.Paths; * @author Olivier Lamy */ @RunWith( ArchivaSpringJUnit4ClassRunner.class ) -@ContextConfiguration( { "classpath*:/META-INF/spring-context.xml" } ) +@ContextConfiguration( { "classpath*:/spring-context-storage.xml", "classpath*:META-INF/spring-context.xml" } ) public class Maven2RepositoryStorageTest { @Inject diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml similarity index 99% rename from archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml rename to archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml index 537762d..5b72119 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/META-INF/spring-context.xml +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/META-INF/spring-context.xml @@ -26,4 +26,5 @@ + </beans> \ No newline at end of file diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml similarity index 52% copy from archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml copy to archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml index 064fdb6..f88f88f 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context-storage.xml @@ -28,11 +28,36 @@ default-lazy-init="true"> <context:annotation-config/> - <context:component-scan base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/> + <context:component-scan base-package="org.apache.archiva.policies.urlcache,org.apache.archiva.proxy,org.apache.archiva.proxy.maven,org.apache.archiva.indexer,org.apache.maven.index,org.apache.archiva.repository,org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/> + <bean name="archivaConfiguration#test" class="org.apache.archiva.metadata.repository.storage.maven2.conf.MockConfiguration"/> <alias name="archivaConfiguration#test" alias="archivaConfiguration#default"/> <alias name="archivaConfiguration#test" alias="archivaConfiguration"/> <alias name="metadataResolver#test" alias="metadataResolver#default"/> + + <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" /> + + <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler"> + <property name="properties"> + <props> + <prop key="org.quartz.scheduler.instanceName">scheduler1</prop> + <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> + <prop key="org.quartz.threadPool.threadCount">1</prop> + <prop key="org.quartz.threadPool.threadPriority">4</prop> + <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> + </props> + </property> + </bean> + + <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools"> + <property name="configuration" ref="archivaConfiguration#default"/> + </bean> + + <bean name="filetypes" class="org.apache.archiva.configuration.FileTypes"> + <property name="archivaConfiguration" ref="archivaConfiguration#default"/> + </bean> + + </beans> \ No newline at end of file diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml index 064fdb6..85fa73c 100644 --- a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml @@ -28,11 +28,37 @@ default-lazy-init="true"> <context:annotation-config/> - <context:component-scan base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/> + <context:component-scan base-package="org.apache.archiva.repository,org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/> + <bean name="archivaConfiguration#test" class="org.apache.archiva.configuration.DefaultArchivaConfiguration"> + </bean> <alias name="archivaConfiguration#test" alias="archivaConfiguration#default"/> <alias name="archivaConfiguration#test" alias="archivaConfiguration"/> <alias name="metadataResolver#test" alias="metadataResolver#default"/> + + <alias name="archivaTaskScheduler#repositoryMock" alias="archivaTaskScheduler#repository" /> + + <bean name="scheduler" class="org.apache.archiva.redback.components.scheduler.DefaultScheduler"> + <property name="properties"> + <props> + <prop key="org.quartz.scheduler.instanceName">scheduler1</prop> + <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop> + <prop key="org.quartz.threadPool.threadCount">1</prop> + <prop key="org.quartz.threadPool.threadPriority">4</prop> + <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> + </props> + </property> + </bean> + + <bean name="metadataTools#default" class="org.apache.archiva.repository.metadata.MetadataTools"> + <property name="configuration" ref="archivaConfiguration#default"/> + </bean> + + <bean name="filetypes" class="org.apache.archiva.configuration.FileTypes"> + <property name="archivaConfiguration" ref="archivaConfiguration#default"/> + </bean> + + </beans> \ No newline at end of file diff --git a/src/ci/scripts/prepareWorkspace.sh b/src/ci/scripts/prepareWorkspace.sh index b93c7a0..bdb31ee 100755 --- a/src/ci/scripts/prepareWorkspace.sh +++ b/src/ci/scripts/prepareWorkspace.sh @@ -22,7 +22,7 @@ # # Removes directories that are not used anymore. ## -ATTIC_DIRS="archiva-modules/archiva-base/archiva-indexer" +ATTIC_DIRS="archiva-modules/archiva-base/archiva-indexer archiva-modules/archiva-base/archiva-proxy-common" REMOVE_DIRS=".indexer" TMP_DIRECTORY=".tmp"
