summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/AbstractLegacyRepositoryContent.java5
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedDefaultRepositoryContent.java4
-rw-r--r--archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedLegacyRepositoryContent.java5
-rw-r--r--archiva-modules/archiva-base/archiva-xml-tools/src/test/java/org/apache/maven/archiva/xml/AbstractArchivaXmlTestCase.java5
-rw-r--r--archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraint.java12
-rw-r--r--archiva-modules/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraintTest.java4
-rw-r--r--archiva-modules/archiva-web/archiva-webapp/pom.xml17
-rw-r--r--archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml23
-rw-r--r--archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml241
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml40
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/AdministrationService.java115
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/SearchService.java28
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/TestService.java28
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/ManagedRepository.java152
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/RemoteRepository.java121
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml94
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/src/main/java/org/apache/archiva/web/xmlrpc/client/SampleClient.java193
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/pom.xml83
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/ServiceMethodsPermissionsMapping.java69
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcAuthenticator.java117
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/java/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.java220
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/META-INF/redback/redback-core.xml210
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.xml192
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml60
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java440
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/PingServiceImpl.java30
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java954
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.md50
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.sha10
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.md50
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.sha10
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.md50
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.sha10
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.jar0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.pom0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-diff-1.0.jar0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.0.jar0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.1.jar0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-diff-1.0.pom0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.0.pom0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.1.pom0
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.xml27
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/pom.xml37
-rw-r--r--archiva-modules/archiva-web/pom.xml5
-rw-r--r--pom.xml64
48 files changed, 3484 insertions, 111 deletions
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/AbstractLegacyRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/AbstractLegacyRepositoryContent.java
index f135d5aad..5ff3c783b 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/AbstractLegacyRepositoryContent.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/AbstractLegacyRepositoryContent.java
@@ -117,4 +117,9 @@ public abstract class AbstractLegacyRepositoryContent
// Default process.
return type + "s";
}
+
+ public void setLegacyPathParser( PathParser parser )
+ {
+ this.legacyPathParser = parser;
+ }
}
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedDefaultRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedDefaultRepositoryContent.java
index 53bfc1bcb..93545f3dd 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedDefaultRepositoryContent.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedDefaultRepositoryContent.java
@@ -78,6 +78,10 @@ public class ManagedDefaultRepositoryContent
// TODO: log this somewhere?
}
}
+ else
+ {
+ throw new ContentNotFoundException( "Unable to delete non-existing project directory." );
+ }
}
public String getId()
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedLegacyRepositoryContent.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedLegacyRepositoryContent.java
index 6b59d86f3..03216fd8a 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedLegacyRepositoryContent.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/content/ManagedLegacyRepositoryContent.java
@@ -454,4 +454,9 @@ public class ManagedLegacyRepositoryContent
}
}
}
+
+ public void setFileTypes( FileTypes fileTypes )
+ {
+ this.filetypes = fileTypes;
+ }
}
diff --git a/archiva-modules/archiva-base/archiva-xml-tools/src/test/java/org/apache/maven/archiva/xml/AbstractArchivaXmlTestCase.java b/archiva-modules/archiva-base/archiva-xml-tools/src/test/java/org/apache/maven/archiva/xml/AbstractArchivaXmlTestCase.java
index 7fd49274a..c26889d55 100644
--- a/archiva-modules/archiva-base/archiva-xml-tools/src/test/java/org/apache/maven/archiva/xml/AbstractArchivaXmlTestCase.java
+++ b/archiva-modules/archiva-base/archiva-xml-tools/src/test/java/org/apache/maven/archiva/xml/AbstractArchivaXmlTestCase.java
@@ -33,10 +33,13 @@ public abstract class AbstractArchivaXmlTestCase
extends TestCase
{
protected static final String OSLASH = "\u00f8";
+
protected static final String TRYGVIS = "Trygve Laugst" + OSLASH + "l";
+
protected static final String INFIN = "\u221e";
+
protected static final String INFINITE_ARCHIVA = "The " + INFIN + " Archiva";
-
+
protected File getExampleXml( String filename )
{
File examplesDir = new File( "src/test/examples" );
diff --git a/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraint.java b/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraint.java
index c7eee23a5..4307022ba 100644
--- a/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraint.java
+++ b/archiva-modules/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraint.java
@@ -35,18 +35,20 @@ public class ArtifactVersionsConstraint
private String sortColumn = "repositoryId";
- public ArtifactVersionsConstraint( String repoId, String groupId, String artifactId )
+ public ArtifactVersionsConstraint( String repoId, String groupId, String artifactId, boolean includeWhenGathered )
{
if( repoId != null )
{
- whereClause = "repositoryId.equals(selectedRepoId) && groupId.equals(selectedGroupId) && artifactId.equals(selectedArtifactId) " +
- "&& whenGathered != null";
+ whereClause = "repositoryId.equals(selectedRepoId) && groupId.equals(selectedGroupId) && artifactId.equals(selectedArtifactId) "
+ + ( includeWhenGathered ? "&& whenGathered != null" : "" );
declParams = new String[] { "String selectedRepoId", "String selectedGroupId", "String selectedArtifactId" };
params = new Object[] { repoId, groupId, artifactId };
}
else
{
- whereClause = "groupId.equals(selectedGroupId) && artifactId.equals(selectedArtifactId) && this.whenGathered != null";
+ whereClause =
+ "groupId.equals(selectedGroupId) && artifactId.equals(selectedArtifactId) " +
+ ( includeWhenGathered ? "&& whenGathered != null" : "" );
declParams = new String[] { "String selectedGroupId", "String selectedArtifactId" };
params = new Object[] { groupId, artifactId };
}
@@ -54,7 +56,7 @@ public class ArtifactVersionsConstraint
public ArtifactVersionsConstraint( String repoId, String groupId, String artifactId, String sortColumn )
{
- this( repoId, groupId, artifactId );
+ this( repoId, groupId, artifactId, true );
this.sortColumn = sortColumn;
}
diff --git a/archiva-modules/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraintTest.java b/archiva-modules/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraintTest.java
index f7fa5b4ff..d00c6dcf5 100644
--- a/archiva-modules/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraintTest.java
+++ b/archiva-modules/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactVersionsConstraintTest.java
@@ -87,14 +87,14 @@ public class ArtifactVersionsConstraintTest
{
populateDb();
assertConstraint( "Artifacts By Repository", 3,
- new ArtifactVersionsConstraint( null, "org.apache.archiva", "artifact-one" ) );
+ new ArtifactVersionsConstraint( null, "org.apache.archiva", "artifact-one", true ) );
}
public void testQueryAllVersionsOfArtifactInARepo() throws Exception
{
populateDb();
assertConstraint( "Artifacts By Repository", 2,
- new ArtifactVersionsConstraint( TEST_REPO, "org.apache.archiva", "artifact-one" ) );
+ new ArtifactVersionsConstraint( TEST_REPO, "org.apache.archiva", "artifact-one", true ) );
}
private void assertConstraint( String msg, int count, ArtifactVersionsConstraint constraint )
diff --git a/archiva-modules/archiva-web/archiva-webapp/pom.xml b/archiva-modules/archiva-web/archiva-webapp/pom.xml
index 5c6a5a8f7..127d08b25 100644
--- a/archiva-modules/archiva-web/archiva-webapp/pom.xml
+++ b/archiva-modules/archiva-web/archiva-webapp/pom.xml
@@ -85,6 +85,18 @@
<artifactId>archiva-rss</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-services</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-security</artifactId>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
@@ -221,6 +233,11 @@
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder-server-spring</artifactId>
+ <scope>runtime</scope>
+ </dependency>
</dependencies>
<build>
<resources>
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml
index 93bd4a30b..d8604065c 100644
--- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml
+++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml
@@ -30,4 +30,27 @@
<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:application.properties" />
</bean>
+
+ <bean name="testXmlRpcService" lazy-init="true" scope="singleton" class="org.apache.archiva.web.xmlrpc.services.PingServiceImpl"/>
+
+ <bean name="administrationService" lazy-init="true" scope="singleton" class="org.apache.archiva.web.xmlrpc.services.AdministrationServiceImpl">
+ <constructor-arg ref="archivaConfiguration"/>
+ <constructor-arg ref="repositoryContentConsumers"/>
+ <constructor-arg ref="databaseConsumers"/>
+ <constructor-arg ref="repositoryContentFactory"/>
+ <constructor-arg ref="artifactDAO#jdo"/>
+ <constructor-arg ref="databaseCleanupConsumer#not-present-remove-db-artifact"/>
+ <constructor-arg ref="databaseCleanupConsumer#not-present-remove-db-project"/>
+ <constructor-arg ref="archivaTaskScheduler"/>
+ </bean>
+
+ <bean name="xmlrpcServicesList" lazy-init="true" scope="singleton" class="java.util.ArrayList">
+ <constructor-arg ref="administrationService"/>
+ </bean>
+
+ <bean name="xmlRpcAuthenticator" class="org.apache.archiva.web.xmlrpc.security.XmlRpcAuthenticator">
+ <constructor-arg>
+ <ref bean="securitySystem"/>
+ </constructor-arg>
+ </bean>
</beans>
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml
index d002c0fb5..a8c61356e 100644
--- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml
+++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?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
@@ -18,106 +18,143 @@
~ under the License.
-->
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
-
- <display-name>Apache Archiva</display-name>
-
- <filter>
- <filter-name>webwork-cleanup</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
- </filter>
-
- <filter>
- <filter-name>sitemesh</filter-name>
- <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
- </filter>
-
- <filter>
- <filter-name>webwork</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
-
- <!-- this must be before the sitemesh filter -->
- <filter-mapping>
- <filter-name>webwork-cleanup</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <filter-mapping>
- <filter-name>sitemesh</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <filter-mapping>
- <filter-name>webwork</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <listener>
- <!-- TODO: some Spring technique for this? -->
- <listener-class>org.apache.maven.archiva.web.startup.ArchivaStartup</listener-class>
- </listener>
-
- <context-param>
- <param-name>contextClass</param-name>
- <param-value>org.codehaus.plexus.spring.PlexusWebApplicationContext</param-value>
- </context-param>
-
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- classpath*:META-INF/plexus/components.xml
- classpath*:META-INF/spring-context.xml
- /WEB-INF/classes/META-INF/plexus/application.xml
- /WEB-INF/classes/META-INF/plexus/components.xml
- /WEB-INF/applicationContext.xml
- </param-value>
- </context-param>
-
- <servlet>
- <servlet-name>RepositoryServlet</servlet-name>
- <servlet-class>org.apache.maven.archiva.webdav.RepositoryServlet</servlet-class>
- <!-- Loading this on startup so as to take advantage of configuration listeners -->
- <load-on-startup>1</load-on-startup>
- </servlet>
-
- <servlet>
- <servlet-name>RssFeedServlet</servlet-name>
- <servlet-class>org.apache.maven.archiva.web.rss.RssFeedServlet</servlet-class>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>RssFeedServlet</servlet-name>
- <url-pattern>/feeds/*</url-pattern>
- </servlet-mapping>
-
- <servlet-mapping>
- <servlet-name>RepositoryServlet</servlet-name>
- <url-pattern>/repository/*</url-pattern>
- </servlet-mapping>
-
- <resource-ref>
- <res-ref-name>jdbc/users</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- <res-sharing-scope>Shareable</res-sharing-scope>
- </resource-ref>
- <resource-ref>
- <res-ref-name>jdbc/archiva</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- <res-sharing-scope>Shareable</res-sharing-scope>
- </resource-ref>
- <resource-ref>
- <res-ref-name>mail/Session</res-ref-name>
- <res-type>javax.mail.Session</res-type>
- <res-auth>Container</res-auth>
- <res-sharing-scope>Shareable</res-sharing-scope>
- </resource-ref>
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <display-name>Apache Archiva</display-name>
+
+ <filter>
+ <filter-name>webwork-cleanup</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
+ </filter>
+
+ <filter>
+ <filter-name>sitemesh</filter-name>
+ <filter-class>
+ com.opensymphony.module.sitemesh.filter.PageFilter
+ </filter-class>
+ </filter>
+
+ <filter>
+ <filter-name>webwork</filter-name>
+ <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
+ </filter>
+
+ <!-- this must be before the sitemesh filter -->
+ <filter-mapping>
+ <filter-name>webwork-cleanup</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>sitemesh</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>webwork</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <listener>
+ <listener-class>
+ org.springframework.web.context.ContextLoaderListener
+ </listener-class>
+ </listener>
+ <listener>
+ <!-- TODO: some Spring technique for this? -->
+ <listener-class>
+ org.apache.maven.archiva.web.startup.ArchivaStartup
+ </listener-class>
+ </listener>
+
+ <context-param>
+ <param-name>contextClass</param-name>
+ <param-value>
+ org.codehaus.plexus.spring.PlexusWebApplicationContext
+ </param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>
+ classpath*:META-INF/plexus/components.xml
+ classpath*:META-INF/spring-context.xml
+ /WEB-INF/classes/META-INF/plexus/application.xml
+ /WEB-INF/classes/META-INF/plexus/components.xml
+ /WEB-INF/applicationContext.xml
+ </param-value>
+ </context-param>
+
+ <servlet>
+ <servlet-name>RepositoryServlet</servlet-name>
+ <servlet-class>
+ org.apache.maven.archiva.webdav.RepositoryServlet
+ </servlet-class>
+ <!-- Loading this on startup so as to take advantage of configuration listeners -->
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet>
+ <servlet-name>XmlRpcServlet</servlet-name>
+ <servlet-class>
+ com.atlassian.xmlrpc.spring.BinderSpringXmlRpcServlet
+ </servlet-class>
+ <init-param>
+ <param-name>serviceListBeanName</param-name>
+ <param-value>xmlrpcServicesList</param-value>
+ </init-param>
+ <init-param>
+ <param-name>authHandlerBeanName</param-name>
+ <param-value>xmlRpcAuthenticator</param-value>
+ </init-param>
+ <init-param>
+ <param-name>enabledForExtensions</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet>
+ <servlet-name>RssFeedServlet</servlet-name>
+ <servlet-class>
+ org.apache.maven.archiva.web.rss.RssFeedServlet
+ </servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>RssFeedServlet</servlet-name>
+ <url-pattern>/feeds/*</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>RepositoryServlet</servlet-name>
+ <url-pattern>/repository/*</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>XmlRpcServlet</servlet-name>
+ <url-pattern>/xmlrpc</url-pattern>
+ </servlet-mapping>
+
+ <resource-ref>
+ <res-ref-name>jdbc/users</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <resource-ref>
+ <res-ref-name>jdbc/archiva</res-ref-name>
+ <res-type>javax.sql.DataSource</res-type>
+ <res-auth>Container</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
+ <resource-ref>
+ <res-ref-name>mail/Session</res-ref-name>
+ <res-type>javax.mail.Session</res-type>
+ <res-auth>Container</res-auth>
+ <res-sharing-scope>Shareable</res-sharing-scope>
+ </resource-ref>
</web-app>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml
new file mode 100644
index 000000000..ac145568f
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+ ~ 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.
+ -->
+
+<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/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ <name>Archiva Web :: XML-RPC API</name>
+ <dependencies>
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder-annotations</artifactId>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/AdministrationService.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/AdministrationService.java
new file mode 100644
index 000000000..814933446
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/AdministrationService.java
@@ -0,0 +1,115 @@
+package org.apache.archiva.web.xmlrpc.api;
+
+/*
+ * 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 java.util.List;
+
+import org.apache.archiva.web.xmlrpc.api.beans.ManagedRepository;
+import org.apache.archiva.web.xmlrpc.api.beans.RemoteRepository;
+
+import com.atlassian.xmlrpc.ServiceObject;
+
+@ServiceObject( "AdministrationService" )
+public interface AdministrationService
+{
+ /**
+ * Executes repository scanner on the given repository.
+ *
+ * @param repoId id of the repository to be scanned
+ * @return
+ * @throws Exception
+ */
+ public Boolean executeRepositoryScanner( String repoId ) throws Exception;
+
+ /**
+ * Executes the database scanner.
+ *
+ * @return
+ * @throws Exception
+ */
+ public Boolean executeDatabaseScanner() throws Exception;
+
+ /**
+ * Gets all available database consumers.
+ * @return
+ */
+ public List<String> getAllDatabaseConsumers();
+
+ /**
+ * Configures (enable or disable) database consumer.
+ *
+ * @param consumerId id of the database consumer
+ * @param enable flag whether to enable or disable the specified consumer
+ * @return
+ * @throws Exception
+ */
+ public Boolean configureDatabaseConsumer( String consumerId, boolean enable ) throws Exception;
+
+ /**
+ * Gets all available repository consumers.
+ *
+ * @return
+ */
+ public List<String> getAllRepositoryConsumers();
+
+ // TODO should we already implement config of consumers per repository?
+ /**
+ * Configures (enable or disable) repository consumer.
+ *
+ * @param repoId
+ * @param consumerId
+ * @param enable
+ * @return
+ * @throws Exception
+ */
+ public Boolean configureRepositoryConsumer( String repoId, String consumerId, boolean enable ) throws Exception;
+
+ /**
+ * Gets all managed repositories.
+ *
+ * @return
+ */
+ public List<ManagedRepository> getAllManagedRepositories();
+
+ /**
+ * Gets all remote repositories.
+ *
+ * @return
+ */
+ public List<RemoteRepository> getAllRemoteRepositories();
+
+ /**
+ * Deletes given artifact from the specified repository.
+ *
+ * @param repoId id of the repository where the artifact to be deleted resides
+ * @param groupId groupId of the artifact to be deleted
+ * @param artifactId artifactId of the artifact to be deleted
+ * @param version version of the artifact to be deleted
+ * @return
+ * @throws Exception
+ */
+ public Boolean deleteArtifact( String repoId, String groupId, String artifactId, String version )
+ throws Exception;
+
+ //TODO
+ // consider the following as additional services:
+ // - getAllConfiguredRepositoryConsumers( String repoId ) - list all enabled consumers for the repo
+ // - getAllConfiguredDatabaseConsumers() - list all enabled db consumers
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/SearchService.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/SearchService.java
new file mode 100644
index 000000000..cbc47547f
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/SearchService.java
@@ -0,0 +1,28 @@
+package org.apache.archiva.web.xmlrpc.api;
+
+/*
+ * 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 com.atlassian.xmlrpc.ServiceObject;
+
+@ServiceObject("Search")
+public interface SearchService
+{
+
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/TestService.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/TestService.java
new file mode 100644
index 000000000..5eba5144d
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/TestService.java
@@ -0,0 +1,28 @@
+package org.apache.archiva.web.xmlrpc.api;
+
+/*
+ * 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 com.atlassian.xmlrpc.ServiceObject;
+
+@ServiceObject("Test")
+public interface TestService
+{
+ public String ping();
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/ManagedRepository.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/ManagedRepository.java
new file mode 100644
index 000000000..fd0f9ef4f
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/ManagedRepository.java
@@ -0,0 +1,152 @@
+package org.apache.archiva.web.xmlrpc.api.beans;
+
+/*
+ * 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 java.io.Serializable;
+
+import com.atlassian.xmlrpc.ServiceBean;
+import com.atlassian.xmlrpc.ServiceBeanField;
+
+@ServiceBean
+public class ManagedRepository
+ implements Serializable
+{
+ private String id;
+
+ private String name;
+
+ private String url;
+
+ private String layout;
+
+ private boolean snapshots = false;
+
+ private boolean releases = false;
+
+ public ManagedRepository()
+ {
+
+ }
+
+ public ManagedRepository( String id, String name, String url, String layout, boolean snapshots, boolean releases )
+ {
+ this.id = id;
+ this.name = name;
+ this.url = url;
+ this.layout = layout;
+ this.snapshots = snapshots;
+ this.releases = releases;
+ }
+
+ public boolean equals(Object other)
+ {
+ if ( this == other)
+ {
+ return true;
+ }
+
+ if ( !(other instanceof ManagedRepository) )
+ {
+ return false;
+ }
+
+ ManagedRepository that = (ManagedRepository) other;
+ boolean result = true;
+ result = result && ( getId() == null ? that.getId() == null : getId().equals( that.getId() ) );
+ return result;
+ }
+
+ public String getId()
+ {
+ return this.id;
+ }
+
+ public String getLayout()
+ {
+ return this.layout;
+ }
+
+ public String getName()
+ {
+ return this.name;
+ }
+
+ public String getUrl()
+ {
+ return this.url;
+ }
+
+ public int hashCode()
+ {
+ int result = 17;
+ long tmp;
+ result = 37 * result + ( id != null ? id.hashCode() : 0 );
+ return result;
+ }
+
+ public boolean isReleases()
+ {
+ return this.releases;
+ }
+
+ /**
+ * Get null
+ */
+ public boolean isSnapshots()
+ {
+ return this.snapshots;
+ }
+
+ @ServiceBeanField( "id" )
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ @ServiceBeanField( "layout" )
+ public void setLayout(String layout)
+ {
+ this.layout = layout;
+ }
+
+ @ServiceBeanField( "name" )
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @ServiceBeanField( "releases" )
+ public void setReleases(boolean releases)
+ {
+ this.releases = releases;
+ }
+
+ @ServiceBeanField( "snapshots" )
+ public void setSnapshots(boolean snapshots)
+ {
+ this.snapshots = snapshots;
+ }
+
+ @ServiceBeanField( "url" )
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+} \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/RemoteRepository.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/RemoteRepository.java
new file mode 100644
index 000000000..399b59e57
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/RemoteRepository.java
@@ -0,0 +1,121 @@
+package org.apache.archiva.web.xmlrpc.api.beans;
+
+/*
+ * 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 java.io.Serializable;
+
+import com.atlassian.xmlrpc.ServiceBean;
+import com.atlassian.xmlrpc.ServiceBeanField;
+
+@ServiceBean
+public class RemoteRepository
+ implements Serializable
+{
+ private String id;
+
+ private String name;
+
+ private String url;
+
+ private String layout;
+
+ public RemoteRepository()
+ {
+
+ }
+
+ public RemoteRepository( String id, String name, String url, String layout )
+ {
+ this.id = id;
+ this.name = name;
+ this.url = url;
+ this.layout = layout;
+ }
+
+ public boolean equals(Object other)
+ {
+ if ( this == other)
+ {
+ return true;
+ }
+
+ if ( !(other instanceof RemoteRepository) )
+ {
+ return false;
+ }
+
+ RemoteRepository that = (RemoteRepository) other;
+ boolean result = true;
+ result = result && ( getId() == null ? that.getId() == null : getId().equals( that.getId() ) );
+ return result;
+ }
+
+ public String getId()
+ {
+ return this.id;
+ }
+
+ public String getLayout()
+ {
+ return this.layout;
+ }
+
+ public String getName()
+ {
+ return this.name;
+ }
+
+ public String getUrl()
+ {
+ return this.url;
+ }
+
+ public int hashCode()
+ {
+ int result = 17;
+ long tmp;
+ result = 37 * result + ( id != null ? id.hashCode() : 0 );
+ return result;
+ }
+
+ @ServiceBeanField( "id" )
+ public void setId(String id)
+ {
+ this.id = id;
+ }
+
+ @ServiceBeanField( "layout" )
+ public void setLayout(String layout)
+ {
+ this.layout = layout;
+ }
+
+ @ServiceBeanField( "name" )
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ @ServiceBeanField( "url" )
+ public void setUrl(String url)
+ {
+ this.url = url;
+ }
+} \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml
new file mode 100644
index 000000000..1e73dc933
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2005-2006 The Apache Software Foundation.
+ ~
+ ~ Licensed 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.
+ -->
+
+<project>
+ <parent>
+ <artifactId>archiva-xmlrpc</artifactId>
+ <groupId>org.apache.archiva</groupId>
+ <version>1.2-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>archiva-xmlrpc-client</artifactId>
+ <name>Archiva Web :: XML-RPC Client</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.xmlrpc</groupId>
+ <artifactId>xmlrpc-client</artifactId>
+ <version>3.1</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ <version>1.8.0</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <configuration>
+ <executable>java</executable>
+ <mainClass>org.apache.archiva.web.xmlrpc.client.SampleClient</mainClass>
+ <arguments>
+ <!--
+ URL: ex. http://127.0.0.1:8080/archiva/xmlrpc
+ USERNAME & PASSWORD: Archiva credentials
+ -->
+ <argument>URL</argument>
+ <argument>USERNAME</argument>
+ <argument>PASSWORD</argument>
+ </arguments>
+ </configuration>
+ </plugin>
+ <!-- override parent config, commons-logging cannot be excluded from commons-beanutils - NoClassDef error occurs -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>1.0-alpha-3</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <bannedDependencies>
+ <excludes>
+ <exclude>org.codehaus.plexus:plexus-container-default</exclude>
+ <exclude>velocity:velocity-dep</exclude>
+ <exclude>classworlds:classworlds</exclude>
+ <exclude>javax.transaction:jta</exclude>
+ <exclude>javax.sql:jdbc-stdext</exclude>
+ <exclude>ant:ant-optional</exclude>
+ <!-- exclude>org.apache.maven.wagon:wagon-http-lightweight</exclude -->
+ <exclude>xom:xom</exclude>
+ </excludes>
+ </bannedDependencies>
+ </rules>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/src/main/java/org/apache/archiva/web/xmlrpc/client/SampleClient.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/src/main/java/org/apache/archiva/web/xmlrpc/client/SampleClient.java
new file mode 100644
index 000000000..7f94734a1
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/src/main/java/org/apache/archiva/web/xmlrpc/client/SampleClient.java
@@ -0,0 +1,193 @@
+package org.apache.archiva.web.xmlrpc.client;
+
+/*
+ * 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 java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.archiva.web.xmlrpc.api.AdministrationService;
+import org.apache.archiva.web.xmlrpc.api.beans.ManagedRepository;
+import org.apache.archiva.web.xmlrpc.api.beans.RemoteRepository;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.apache.xmlrpc.client.XmlRpcClientRequestImpl;
+import org.apache.xmlrpc.client.util.ClientFactory;
+
+/**
+ * TestClient
+ *
+ * Test client for Archiva Web Services.
+ * To execute:
+ *
+ * 1. set the <arguments> in the exec-maven-plugin config in the pom.xml in the following order:
+ * - url
+ * - username
+ * - password
+ * 2. execute 'mvn exec:java' from the command-line
+ *
+ * @author
+ * @version $Id$
+ */
+public class SampleClient
+{
+ public static void main( String[] args )
+ {
+ try
+ {
+ XmlRpcClient client = new XmlRpcClient();
+
+ XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
+ config.setServerURL( new URL( args[0] ) );
+ config.setBasicUserName( args[1] );
+ config.setBasicPassword( args[2] );
+ config.setEnabledForExtensions( true );
+
+ client.setConfig( config );
+
+ /* managed repositories */
+ Object[] params = new Object[]{};
+ Object[] managedRepos = (Object[])
+ client.execute( "AdministrationService.getAllManagedRepositories", params );
+
+ System.out.println( "\n******** Managed Repositories ********" );
+ for( int i = 0; i < managedRepos.length; i++ )
+ {
+ System.out.println( "=================================" );
+ ManagedRepository managedRepo = new ManagedRepository();
+ try
+ {
+ BeanUtils.populate( managedRepo, (Map)managedRepos[i] );
+ }
+ catch ( IllegalAccessException e )
+ {
+ e.printStackTrace();
+ }
+ catch ( InvocationTargetException e )
+ {
+ e.printStackTrace();
+ }
+ System.out.println( "Id: " + managedRepo.getId() );
+ System.out.println( "Name: " + managedRepo.getName() );
+ System.out.println( "Layout: " + managedRepo.getLayout() );
+ System.out.println( "URL: " + managedRepo.getUrl() );
+ System.out.println( "Releases: " + managedRepo.isReleases() );
+ System.out.println( "Snapshots: " + managedRepo.isSnapshots() );
+ }
+
+ /* remote repositories */
+ params = new Object[]{};
+ Object[] remoteRepos = (Object[])
+ client.execute( "AdministrationService.getAllRemoteRepositories", params );
+
+ System.out.println( "\n******** Remote Repositories ********" );
+ for( int i = 0; i < remoteRepos.length; i++ )
+ {
+ System.out.println( "=================================" );
+ RemoteRepository remoteRepo = new RemoteRepository();
+
+ try
+ {
+ BeanUtils.populate( remoteRepo, (Map) remoteRepos[i] );
+ }
+ catch ( IllegalAccessException e )
+ {
+ e.printStackTrace();
+ }
+ catch ( InvocationTargetException e )
+ {
+ e.printStackTrace();
+ }
+ System.out.println( "Id: " + remoteRepo.getId() );
+ System.out.println( "Name: " + remoteRepo.getName() );
+ System.out.println( "Layout: " + remoteRepo.getLayout() );
+ System.out.println( "URL: " + remoteRepo.getUrl() );
+ }
+
+ /* repo consumers */
+ params = new Object[]{};
+ Object[] repoConsumers = (Object[])
+ client.execute( "AdministrationService.getAllRepositoryConsumers", params );
+
+ System.out.println( "\n******** Repository Consumers ********" );
+ for( int i = 0; i < repoConsumers.length; i++ )
+ {
+ System.out.println( repoConsumers[i] );
+ }
+
+ /* db consumers */
+ params = new Object[]{};
+ Object[] dbConsumers = (Object[])
+ client.execute( "AdministrationService.getAllDatabaseConsumers", params );
+
+ System.out.println( "\n******** Database Consumers ********" );
+ for( int i = 0; i < dbConsumers.length; i++ )
+ {
+ System.out.println( dbConsumers[i] );
+ }
+
+ /* configure repo consumer */
+ Object[] configureRepoConsumerParams = new Object[] { "internal", "repository-purge", true };
+ Object configured = client.execute( "AdministrationService.configureRepositoryConsumer", configureRepoConsumerParams );
+ System.out.println( "\nConfigured repo consumer 'repository-purge' : " + ( ( Boolean ) configured ).booleanValue() );
+
+
+ /* configure db consumer */
+ Object[] configureDbConsumerParams = new Object[] { "update-db-bytecode-stats", false };
+ configured = client.execute( "AdministrationService.configureDatabaseConsumer", configureDbConsumerParams );
+ System.out.println( "\nConfigured db consumer 'update-db-bytecode-stats' : " + ( ( Boolean ) configured ).booleanValue() );
+
+
+ /* execute repo scanner */
+ Object[] executeRepoScanParams = new Object[] { "internal" };
+ configured = client.execute( "AdministrationService.executeRepositoryScanner", executeRepoScanParams );
+ System.out.println( "\nExecuted repo scanner of repository 'internal' : " + ( ( Boolean ) configured ).booleanValue() );
+
+
+ /* execute db scanner */
+ Object[] executeDbScanParams = new Object[] {};
+ configured = client.execute( "AdministrationService.executeDatabaseScanner", executeDbScanParams );
+ System.out.println( "\nExecuted database scanner : " + ( ( Boolean ) configured ).booleanValue() );
+
+ /* delete artifact */
+ /*
+ * NOTE: before enabling & invoking deleteArtifact, make sure that the repository and artifact exists first!
+ Object[] deleteArtifactParams = new Object[] { "internal", "javax.activation", "activation", "1.1" };
+ Object artifactDeleted = client.execute( "AdministrationService.deleteArtifact", deleteArtifactParams );
+ System.out.println( "\nDeleted artifact 'javax.activation:activation:1.1' from repository 'internal' : " +
+ ( (Boolean) artifactDeleted ).booleanValue() );
+ */
+ }
+ catch ( MalformedURLException e )
+ {
+ e.printStackTrace();
+ }
+ catch ( XmlRpcException e )
+ {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/pom.xml
new file mode 100644
index 000000000..8736f8071
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2005-2006 The Apache Software Foundation.
+ ~
+ ~ Licensed 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.
+ -->
+
+<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/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>archiva-xmlrpc-security</artifactId>
+ <name>Archiva Web :: XML-RPC Security</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.xmlrpc</groupId>
+ <artifactId>xmlrpc-server</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-system</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-security</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- use spring for the unit tests?
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ -->
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-authorization-rbac</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-keys-memory</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-users-memory</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.redback</groupId>
+ <artifactId>redback-rbac-memory</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/ServiceMethodsPermissionsMapping.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/ServiceMethodsPermissionsMapping.java
new file mode 100644
index 000000000..333b4218e
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/ServiceMethodsPermissionsMapping.java
@@ -0,0 +1,69 @@
+package org.apache.archiva.web.xmlrpc.security;
+
+
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ServiceMethodsPermissionsMapping
+ *
+ * Used by the XmlRpcAuthenticationHandler to check the permissions specific to the requested service method.
+ * New methods in exposed services must be registered in the appropriate operation below.
+ *
+ * @version $Id: ServiceMethodsPermissionsMapping.java
+ */
+public class ServiceMethodsPermissionsMapping
+{
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_MANAGE_CONFIGURATION = new ArrayList<String>()
+ {
+ {
+ add( "AdministrationService.configureRepositoryConsumer" );
+ add( "AdministrationService.configureDatabaseConsumer" );
+ add( "AdministrationService.executeDatabaseScanner" );
+ add( "AdministrationService.getAllManagedRepositories" );
+ add( "AdministrationService.getAllRemoteRepositories" );
+ add( "AdministrationService.getAllDatabaseConsumers" );
+ add( "AdministrationService.getAllRepositoryConsumers" );
+ add( "AdministrationService.deleteArtifact" );
+ }
+ };
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_RUN_INDEXER = new ArrayList<String>()
+ {
+ {
+ add( "AdministrationService.executeRepositoryScanner");
+ }
+ };
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_ACCESS_REPORT = new ArrayList<String>();
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_REPOSITORY_ACCESS = new ArrayList<String>();
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_ADD_REPOSITORY = new ArrayList<String>();
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_DELETE_REPOSITORY = new ArrayList<String>();
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_EDIT_REPOSITORY = new ArrayList<String>();
+
+ public static final List<String> SERVICE_METHODS_FOR_OPERATION_REPOSITORY_UPLOAD = new ArrayList<String>();
+
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcAuthenticator.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcAuthenticator.java
new file mode 100644
index 000000000..40ee2fd6f
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcAuthenticator.java
@@ -0,0 +1,117 @@
+package org.apache.archiva.web.xmlrpc.security;
+
+/*
+ * 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.maven.archiva.security.ArchivaRoleConstants;
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
+import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
+import org.codehaus.plexus.redback.authentication.AuthenticationException;
+import org.codehaus.plexus.redback.authentication.PasswordBasedAuthenticationDataSource;
+import org.codehaus.plexus.redback.authorization.AuthorizationException;
+import org.codehaus.plexus.redback.authorization.AuthorizationResult;
+import org.codehaus.plexus.redback.policy.AccountLockedException;
+import org.codehaus.plexus.redback.system.SecuritySession;
+import org.codehaus.plexus.redback.system.SecuritySystem;
+import org.codehaus.plexus.redback.users.UserNotFoundException;
+
+/**
+ * XmlRpcAuthenticator
+ *
+ * Custom authentication and authorization handler for xmlrpc requests.
+ *
+ * @version $Id
+ */
+public class XmlRpcAuthenticator
+ implements AuthenticationHandler
+{
+ private final SecuritySystem securitySystem;
+
+ public XmlRpcAuthenticator( SecuritySystem securitySystem )
+ {
+ this.securitySystem = securitySystem;
+ }
+
+ public boolean isAuthorized( XmlRpcRequest pRequest )
+ throws XmlRpcException
+ {
+ if ( pRequest.getConfig() instanceof XmlRpcHttpRequestConfigImpl )
+ {
+ XmlRpcHttpRequestConfigImpl config = (XmlRpcHttpRequestConfigImpl) pRequest.getConfig();
+ SecuritySession session =
+ authenticate( new PasswordBasedAuthenticationDataSource( config.getBasicUserName(),
+ config.getBasicPassword() ) );
+ String method = pRequest.getMethodName();
+ AuthorizationResult result = authorize( session, method );
+
+ return result.isAuthorized();
+ }
+
+ throw new XmlRpcException( "Unsupported transport (must be http)" );
+ }
+
+ private SecuritySession authenticate( PasswordBasedAuthenticationDataSource authenticationDataSource )
+ throws XmlRpcException
+ {
+ try
+ {
+ return securitySystem.authenticate( authenticationDataSource );
+ }
+ catch ( AccountLockedException e )
+ {
+ throw new XmlRpcException( 401, e.getMessage(), e );
+ }
+ catch ( AuthenticationException e )
+ {
+ throw new XmlRpcException( 401, e.getMessage(), e );
+ }
+ catch ( UserNotFoundException e )
+ {
+ throw new XmlRpcException( 401, e.getMessage(), e );
+ }
+ }
+
+ private AuthorizationResult authorize( SecuritySession session, String methodName )
+ throws XmlRpcException
+ {
+ try
+ {
+ // sample attempt at simplifying authorization checking of requested service method
+ // TODO test with a sample client to see if this would work!
+ if ( ServiceMethodsPermissionsMapping.SERVICE_METHODS_FOR_OPERATION_MANAGE_CONFIGURATION.contains( methodName ) )
+ {
+ return securitySystem.authorize( session, ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION );
+ }
+ else if ( ServiceMethodsPermissionsMapping.SERVICE_METHODS_FOR_OPERATION_RUN_INDEXER.contains( methodName ) )
+ {
+ return securitySystem.authorize( session, ArchivaRoleConstants.OPERATION_RUN_INDEXER );
+ }
+ else
+ {
+ return securitySystem.authorize( session, ArchivaRoleConstants.GLOBAL_REPOSITORY_MANAGER_ROLE );
+ }
+ }
+ catch ( AuthorizationException e )
+ {
+ throw new XmlRpcException( 401, e.getMessage(), e );
+ }
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/java/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/java/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.java
new file mode 100644
index 000000000..721aa828d
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/java/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.java
@@ -0,0 +1,220 @@
+package org.apache.archiva.xmlrpc.security;
+
+/*
+ * 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.web.xmlrpc.security.XmlRpcAuthenticator;
+import org.apache.maven.archiva.security.ArchivaRoleConstants;
+import org.apache.xmlrpc.XmlRpcRequest;
+import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
+import org.codehaus.plexus.redback.role.RoleManager;
+import org.codehaus.plexus.redback.system.SecuritySystem;
+import org.codehaus.plexus.redback.users.User;
+import org.codehaus.plexus.redback.users.UserManager;
+import org.codehaus.plexus.redback.users.UserNotFoundException;
+import org.codehaus.plexus.spring.PlexusInSpringTestCase;
+import org.easymock.MockControl;
+import org.easymock.classextension.MockClassControl;
+
+/**
+ * XmlRpcAuthenticatorTest
+ *
+ * @version $Id XmlRpcAuthenticatorTest.java
+ */
+public class XmlRpcAuthenticatorTest
+//extends AbstractDependencyInjectionSpringContextTests
+ extends PlexusInSpringTestCase
+{
+ protected static final String USER_GUEST = "guest";
+
+ protected static final String USER_ADMIN = "admin";
+
+ protected static final String USER_ALPACA = "alpaca";
+
+ private static final String PASSWORD = "password123";
+
+ protected SecuritySystem securitySystem;
+
+ protected RoleManager roleManager;
+
+ private MockControl xmlRpcRequestControl;
+
+ private XmlRpcRequest xmlRpcRequest;
+
+ private XmlRpcAuthenticator authenticator;
+
+ private MockControl configControl;
+
+ private XmlRpcHttpRequestConfigImpl config;
+
+ public void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ securitySystem = (SecuritySystem) lookup( SecuritySystem.class, "testable" );
+ roleManager = (RoleManager) lookup( RoleManager.class, "default" );
+
+ // Some basic asserts.
+ assertNotNull( securitySystem );
+ assertNotNull( roleManager );
+
+ // Setup Admin User.
+ User adminUser = createUser( USER_ADMIN, "Admin User", null );
+ roleManager.assignRole( ArchivaRoleConstants.TEMPLATE_SYSTEM_ADMIN, adminUser.getPrincipal().toString() );
+
+ // Setup Guest User.
+ User guestUser = createUser( USER_GUEST, "Guest User", null );
+ roleManager.assignRole( ArchivaRoleConstants.TEMPLATE_GUEST, guestUser.getPrincipal().toString() );
+
+ configControl = MockClassControl.createControl( XmlRpcHttpRequestConfigImpl.class );
+ config = ( XmlRpcHttpRequestConfigImpl ) configControl.getMock();
+
+ xmlRpcRequestControl = MockControl.createControl( XmlRpcRequest.class );
+ xmlRpcRequest = ( XmlRpcRequest ) xmlRpcRequestControl.getMock();
+
+ authenticator = new XmlRpcAuthenticator( securitySystem );
+ }
+
+ private User createUser( String principal, String fullname, String password )
+ throws UserNotFoundException
+ {
+ UserManager userManager = securitySystem.getUserManager();
+
+ User user = userManager.createUser( principal, fullname, principal + "@testable.archiva.apache.org" );
+ securitySystem.getPolicy().setEnabled( false );
+ userManager.addUser( user );
+ securitySystem.getPolicy().setEnabled( true );
+
+ user.setPassword( password );
+ userManager.updateUser( user );
+
+ return user;
+ }
+
+ public void testIsAuthorizedUserExistsButNotAuthorized()
+ throws Exception
+ {
+ createUser( USER_ALPACA, "Al 'Archiva' Paca", PASSWORD );
+
+ UserManager userManager = securitySystem.getUserManager();
+ try
+ {
+ User user = userManager.findUser( USER_ALPACA );
+ assertEquals( USER_ALPACA, user.getPrincipal() );
+ }
+ catch ( UserNotFoundException e )
+ {
+ fail( "User should exist in the database." );
+ }
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getConfig(), config, 2 );
+
+ configControl.expectAndReturn( config.getBasicUserName(), USER_ALPACA );
+
+ configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
+ "AdministrationService.getAllManagedRepositories" );
+
+ xmlRpcRequestControl.replay();
+ configControl.replay();
+
+ boolean isAuthorized = authenticator.isAuthorized( xmlRpcRequest );
+
+ xmlRpcRequestControl.verify();
+ configControl.verify();
+
+ assertFalse( isAuthorized );
+ }
+
+ public void testIsAuthorizedUserExistsAndAuthorized()
+ throws Exception
+ {
+ createUser( USER_ALPACA, "Al 'Archiva' Paca", PASSWORD );
+
+ UserManager userManager = securitySystem.getUserManager();
+ try
+ {
+ User user = userManager.findUser( USER_ALPACA );
+ assertEquals( USER_ALPACA, user.getPrincipal() );
+ }
+ catch ( UserNotFoundException e )
+ {
+ fail( "User should exist in the database." );
+ }
+
+ //TODO cannot assign global repo manager role - it says role does not exist :|
+
+ //roleManager.assignRole( ArchivaRoleConstants.GLOBAL_REPOSITORY_MANAGER_ROLE, USER_ALPACA );
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getConfig(), config, 2 );
+
+ configControl.expectAndReturn( config.getBasicUserName(), USER_ALPACA );
+
+ configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
+ "AdministrationService.getAllManagedRepositories" );
+
+ xmlRpcRequestControl.replay();
+ configControl.replay();
+
+ boolean isAuthorized = authenticator.isAuthorized( xmlRpcRequest );
+
+ xmlRpcRequestControl.verify();
+ configControl.verify();
+
+ //assertTrue( isAuthorized );
+ }
+
+ public void testIsAuthorizedUserDoesNotExist()
+ throws Exception
+ {
+ UserManager userManager = securitySystem.getUserManager();
+ try
+ {
+ userManager.findUser( USER_ALPACA );
+ fail( "User should not exist in the database." );
+ }
+ catch ( UserNotFoundException e )
+ {
+ assertEquals( "Unable to find user 'alpaca'", e.getMessage() );
+ }
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getConfig(), config, 2 );
+
+ configControl.expectAndReturn( config.getBasicUserName(), USER_ALPACA );
+
+ configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
+
+ xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
+ "AdministrationService.getAllManagedRepositories" );
+
+ xmlRpcRequestControl.replay();
+ configControl.replay();
+
+ boolean isAuthorized = authenticator.isAuthorized( xmlRpcRequest );
+
+ xmlRpcRequestControl.verify();
+ configControl.verify();
+
+ assertFalse( isAuthorized );
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/META-INF/redback/redback-core.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/META-INF/redback/redback-core.xml
new file mode 100644
index 000000000..289043991
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/META-INF/redback/redback-core.xml
@@ -0,0 +1,210 @@
+<redback-role-model>
+ <modelVersion>1.0.0</modelVersion>
+ <applications>
+ <application>
+ <id>Redback XWork Integration Security Core</id>
+ <version>1.0</version>
+ <resources>
+ <resource>
+ <id>global</id>
+ <name>*</name>
+ <permanent>true</permanent>
+ <description>
+ global resource implies full access for authorization
+ </description>
+ </resource>
+ <resource>
+ <id>username</id>
+ <name>${username}</name>
+ <permanent>true</permanent>
+ <description>
+ replaced with the username of the principal at authorization
+ check time
+ </description>
+ </resource>
+ </resources>
+ <operations>
+ <operation>
+ <id>configuration-edit</id>
+ <name>configuration-edit</name>
+ <description>edit configuration</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-create</id>
+ <name>user-management-user-create</name>
+ <description>create user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-edit</id>
+ <name>user-management-user-edit</name>
+ <description>edit user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-role</id>
+ <name>user-management-user-role</name>
+ <description>user roles</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-delete</id>
+ <name>user-management-user-delete</name>
+ <description>delete user</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-user-list</id>
+ <name>user-management-user-list</name>
+ <description>list users</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-role-grant</id>
+ <name>user-management-role-grant</name>
+ <description>grant role</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-role-drop</id>
+ <name>user-management-role-drop</name>
+ <description>drop role</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>user-management-rbac-admin</id>
+ <name>user-management-rbac-admin</name>
+ <description>administer rbac</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>guest-access</id>
+ <name>guest-access</name>
+ <description>access guest</description>
+ <permanent>true</permanent>
+ </operation>
+ <operation>
+ <id>add-repository</id>
+ <name>add-repository</name>
+ <description>add repository</description>
+ <permanent>true</permanent>
+ </operation>
+ </operations>
+ <roles>
+ <role>
+ <id>system-administrator</id>
+ <name>System Administrator</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>edit-redback-configuration</id>
+ <name>Edit Redback Configuration</name>
+ <operation>configuration-edit</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>manage-rbac-setup</id>
+ <name>User RBAC Management</name>
+ <operation>user-management-rbac-admin</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ <childRoles>
+ <childRole>user-administrator</childRole>
+ </childRoles>
+ </role>
+ <role>
+ <id>user-administrator</id>
+ <name>User Administrator</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>drop-roles-for-anyone</id>
+ <name>Drop Roles for Anyone</name>
+ <operation>user-management-role-drop</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>grant-roles-for-anyone</id>
+ <name>Grant Roles for Anyone</name>
+ <operation>user-management-role-grant</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-create</id>
+ <name>Create Users</name>
+ <operation>user-management-user-create</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-delete</id>
+ <name>Delete Users</name>
+ <operation>user-management-user-delete</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>user-edit</id>
+ <name>Edit Users</name>
+ <operation>user-management-user-edit</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>access-users-roles</id>
+ <name>Access Users Roles</name>
+ <operation>user-management-user-role</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ <permission>
+ <id>access-user-list</id>
+ <name>Access User List</name>
+ <operation>user-management-user-list</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ <role>
+ <id>registered-user</id>
+ <name>Registered User</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>edit-user-by-username</id>
+ <name>Edit User Data by Username</name>
+ <operation>user-management-user-edit</operation>
+ <resource>username</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ <role>
+ <id>guest</id>
+ <name>Guest</name>
+ <permanent>true</permanent>
+ <assignable>true</assignable>
+ <permissions>
+ <permission>
+ <id>guest-permission</id>
+ <name>Guest Permission</name>
+ <operation>guest-access</operation>
+ <resource>global</resource>
+ <permanent>true</permanent>
+ </permission>
+ </permissions>
+ </role>
+ </roles>
+ </application>
+ </applications>
+</redback-role-model> \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.xml
new file mode 100644
index 000000000..9c7b9344f
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/resources/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.xml
@@ -0,0 +1,192 @@
+<?xml version="1.0" ?>
+<component-set>
+ <components>
+
+ <!-- x
+ <component>
+ <role>org.apache.maven.archiva.security.UserRepositories</role>
+ <role-hint>default</role-hint>
+ <implementation>org.apache.maven.archiva.security.DefaultUserRepositories</implementation>
+ <description>DefaultUserRepositories</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.system.SecuritySystem</role>
+ <role-hint>testable</role-hint>
+ <field-name>securitySystem</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.rbac.RBACManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>rbacManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.role.RoleManager</role>
+ <role-hint>default</role-hint>
+ <field-name>roleManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role>
+ <field-name>archivaConfiguration</field-name>
+ </requirement>
+ </requirements>
+ </component>
+ -->
+
+ <component>
+ <role>org.codehaus.plexus.redback.system.SecuritySystem</role>
+ <role-hint>testable</role-hint>
+ <implementation>org.codehaus.plexus.redback.system.DefaultSecuritySystem</implementation>
+ <description>DefaultSecuritySystem:</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.authentication.AuthenticationManager</role>
+ <field-name>authnManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.authorization.Authorizer</role>
+ <role-hint>rbac</role-hint>
+ <field-name>authorizer</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.users.UserManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>userManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.keys.KeyManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>keyManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.policy.UserSecurityPolicy</role>
+ <field-name>policy</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.codehaus.plexus.redback.authorization.Authorizer</role>
+ <role-hint>rbac</role-hint>
+ <implementation>org.codehaus.plexus.redback.authorization.rbac.RbacAuthorizer</implementation>
+ <description>RbacAuthorizer:</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.rbac.RBACManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>manager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.users.UserManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>userManager</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.authorization.rbac.evaluator.PermissionEvaluator</role>
+ <role-hint>default</role-hint>
+ <field-name>evaluator</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.configuration.UserConfiguration</role>
+ <role-hint>default</role-hint>
+ <field-name>config</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.codehaus.plexus.redback.authorization.rbac.evaluator.PermissionEvaluator</role>
+ <role-hint>default</role-hint>
+ <implementation>org.codehaus.plexus.redback.authorization.rbac.evaluator.DefaultPermissionEvaluator</implementation>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.users.UserManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>userManager</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.codehaus.plexus.redback.role.RoleManager</role>
+ <role-hint>default</role-hint>
+ <implementation>org.codehaus.plexus.redback.role.DefaultRoleManager</implementation>
+ <description>RoleProfileManager:</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.role.validator.RoleModelValidator</role>
+ <role-hint>default</role-hint>
+ <field-name>modelValidator</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.role.processor.RoleModelProcessor</role>
+ <role-hint>default</role-hint>
+ <field-name>modelProcessor</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.role.template.RoleTemplateProcessor</role>
+ <role-hint>default</role-hint>
+ <field-name>templateProcessor</field-name>
+ </requirement>
+ <requirement>
+ <role>org.codehaus.plexus.redback.rbac.RBACManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>rbacManager</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.codehaus.plexus.redback.role.processor.RoleModelProcessor</role>
+ <role-hint>default</role-hint>
+ <implementation>org.codehaus.plexus.redback.role.processor.DefaultRoleModelProcessor</implementation>
+ <description>DefaultRoleModelProcessor: inserts the components of the model that can be populated into the rbac manager</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.rbac.RBACManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>rbacManager</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <component>
+ <role>org.codehaus.plexus.redback.role.template.RoleTemplateProcessor</role>
+ <role-hint>default</role-hint>
+ <implementation>org.codehaus.plexus.redback.role.template.DefaultRoleTemplateProcessor</implementation>
+ <description>DefaultRoleTemplateProcessor: inserts the components of a template into the rbac manager</description>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.redback.rbac.RBACManager</role>
+ <role-hint>memory</role-hint>
+ <field-name>rbacManager</field-name>
+ </requirement>
+ </requirements>
+ </component>
+
+ <!--
+ <component>
+ <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role>
+ <implementation>org.apache.maven.archiva.configuration.DefaultArchivaConfiguration</implementation>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.registry.Registry</role>
+ <role-hint>configured</role-hint>
+ </requirement>
+ </requirements>
+ </component>
+ <component>
+ <role>org.codehaus.plexus.registry.Registry</role>
+ <role-hint>configured</role-hint>
+ <implementation>org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry</implementation>
+ <configuration>
+ <properties>
+ <system/>
+ <xml fileName="${basedir}/target/test-conf/archiva.xml"
+ config-name="org.apache.maven.archiva.base" config-at="org.apache.maven.archiva"/>
+ </properties>
+ </configuration>
+ </component>
+ -->
+
+ </components>
+</component-set> \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml
new file mode 100644
index 000000000..8d68c8df3
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<!--
+ ~ 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.
+ -->
+
+<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/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>archiva-xmlrpc-services</artifactId>
+ <name>Archiva Web :: XML-RPC Services</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-configuration</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-scheduled</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java
new file mode 100644
index 000000000..7bb2882b2
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java
@@ -0,0 +1,440 @@
+package org.apache.archiva.web.xmlrpc.services;
+
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.apache.archiva.web.xmlrpc.api.AdministrationService;
+import org.apache.archiva.web.xmlrpc.api.beans.ManagedRepository;
+import org.apache.archiva.web.xmlrpc.api.beans.RemoteRepository;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.DatabaseScanningConfiguration;
+import org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
+import org.apache.maven.archiva.consumers.ConsumerException;
+import org.apache.maven.archiva.consumers.DatabaseCleanupConsumer;
+import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
+import org.apache.maven.archiva.consumers.InvalidRepositoryContentConsumer;
+import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.constraints.ArtifactVersionsConstraint;
+import org.apache.maven.archiva.database.updater.DatabaseConsumers;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.ContentNotFoundException;
+import org.apache.maven.archiva.repository.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
+import org.apache.maven.archiva.repository.RepositoryException;
+import org.apache.maven.archiva.repository.RepositoryNotFoundException;
+import org.apache.maven.archiva.repository.scanner.RepositoryContentConsumers;
+import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler;
+import org.apache.maven.archiva.scheduled.DefaultArchivaTaskScheduler;
+import org.apache.maven.archiva.scheduled.tasks.ArchivaTask;
+import org.apache.maven.archiva.scheduled.tasks.DatabaseTask;
+import org.apache.maven.archiva.scheduled.tasks.RepositoryTask;
+import org.codehaus.plexus.registry.RegistryException;
+
+/**
+ * AdministrationServiceImpl
+ *
+ * @version $Id: AdministrationServiceImpl.java
+ */
+public class AdministrationServiceImpl
+ implements AdministrationService
+{
+ private ArchivaConfiguration archivaConfiguration;
+
+ private RepositoryContentConsumers repoConsumersUtil;
+
+ private DatabaseConsumers dbConsumersUtil;
+
+ private RepositoryContentFactory repoFactory;
+
+ private ArtifactDAO artifactDAO;
+
+ private DatabaseCleanupConsumer cleanupArtifacts;
+
+ private DatabaseCleanupConsumer cleanupProjects;
+
+ private ArchivaTaskScheduler taskScheduler;
+
+ public AdministrationServiceImpl( ArchivaConfiguration archivaConfig, RepositoryContentConsumers repoConsumersUtil,
+ DatabaseConsumers dbConsumersUtil, RepositoryContentFactory repoFactory,
+ ArtifactDAO artifactDAO, DatabaseCleanupConsumer cleanupArtifacts,
+ DatabaseCleanupConsumer cleanupProjects, ArchivaTaskScheduler taskScheduler )
+ {
+ this.archivaConfiguration = archivaConfig;
+ this.repoConsumersUtil = repoConsumersUtil;
+ this.dbConsumersUtil = dbConsumersUtil;
+ this.repoFactory = repoFactory;
+ this.artifactDAO = artifactDAO;
+ this.cleanupArtifacts = cleanupArtifacts;
+ this.cleanupProjects = cleanupProjects;
+ this.taskScheduler = taskScheduler;
+ }
+
+ /**
+ * @see AdministrationService#configureDatabaseConsumer(String, boolean)
+ */
+ public Boolean configureDatabaseConsumer( String consumerId, boolean enable ) throws Exception
+ {
+ List<DatabaseCleanupConsumer> cleanupConsumers = dbConsumersUtil.getAvailableCleanupConsumers();
+ List<DatabaseUnprocessedArtifactConsumer> unprocessedConsumers =
+ dbConsumersUtil.getAvailableUnprocessedConsumers();
+
+ boolean found = false;
+ boolean isCleanupConsumer = false;
+ for( DatabaseCleanupConsumer consumer : cleanupConsumers )
+ {
+ if( consumer.getId().equals( consumerId ) )
+ {
+ found = true;
+ isCleanupConsumer = true;
+ break;
+ }
+ }
+
+ if( !found )
+ {
+ for( DatabaseUnprocessedArtifactConsumer consumer : unprocessedConsumers )
+ {
+ if( consumer.getId().equals( consumerId ) )
+ {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if( !found )
+ {
+ throw new Exception( "Invalid database consumer." );
+ }
+
+ Configuration config = archivaConfiguration.getConfiguration();
+ DatabaseScanningConfiguration dbScanningConfig = config.getDatabaseScanning();
+
+ if( isCleanupConsumer )
+ {
+ dbScanningConfig.addCleanupConsumer( consumerId );
+ }
+ else
+ {
+ dbScanningConfig.addUnprocessedConsumer( consumerId );
+ }
+
+ config.setDatabaseScanning( dbScanningConfig );
+ saveConfiguration( config );
+
+ return new Boolean( true );
+ }
+
+ /**
+ * @see AdministrationService#configureRepositoryConsumer(String, String, boolean)
+ */
+ public Boolean configureRepositoryConsumer( String repoId, String consumerId, boolean enable )
+ throws Exception
+ {
+ // TODO use repoId once consumers are configured per repository! (MRM-930)
+
+ List<KnownRepositoryContentConsumer> knownConsumers = repoConsumersUtil.getAvailableKnownConsumers();
+ List<InvalidRepositoryContentConsumer> invalidConsumers = repoConsumersUtil.getAvailableInvalidConsumers();
+
+ boolean found = false;
+ boolean isKnownContentConsumer = false;
+ for( KnownRepositoryContentConsumer consumer : knownConsumers )
+ {
+ if( consumer.getId().equals( consumerId ) )
+ {
+ found = true;
+ isKnownContentConsumer = true;
+ break;
+ }
+ }
+
+ if( !found )
+ {
+ for( InvalidRepositoryContentConsumer consumer : invalidConsumers )
+ {
+ if( consumer.getId().equals( consumerId ) )
+ {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if( !found )
+ {
+ throw new Exception( "Invalid repository consumer." );
+ }
+
+ Configuration config = archivaConfiguration.getConfiguration();
+ RepositoryScanningConfiguration repoScanningConfig = config.getRepositoryScanning();
+
+ if( isKnownContentConsumer )
+ {
+ repoScanningConfig.addKnownContentConsumer( consumerId );
+ }
+ else
+ {
+ repoScanningConfig.addInvalidContentConsumer( consumerId );
+ }
+
+ config.setRepositoryScanning( repoScanningConfig );
+ saveConfiguration( config );
+
+ return new Boolean( true );
+ }
+
+ /**
+ * @see AdministrationService#deleteArtifact(String, String, String, String)
+ */
+ public Boolean deleteArtifact( String repoId, String groupId, String artifactId, String version )
+ throws Exception
+ {
+ Configuration config = archivaConfiguration.getConfiguration();
+ ManagedRepositoryConfiguration repoConfig = config.findManagedRepositoryById( repoId );
+
+ if( repoConfig == null )
+ {
+ throw new Exception( "Repository does not exist." );
+ }
+
+ try
+ {
+ ManagedRepositoryContent repoContent = repoFactory.getManagedRepositoryContent( repoId );
+ VersionedReference ref = new VersionedReference();
+ ref.setGroupId( groupId );
+ ref.setArtifactId( artifactId );
+ ref.setVersion( version );
+
+ // delete from file system
+ repoContent.deleteVersion( ref );
+
+ ArtifactVersionsConstraint constraint = new ArtifactVersionsConstraint( repoId, groupId, artifactId, false );
+ List<ArchivaArtifact> artifacts = null;
+
+ try
+ {
+ artifacts = artifactDAO.queryArtifacts( constraint );
+ if( artifacts == null )
+ {
+ return true;
+ }
+ }
+ catch ( ArchivaDatabaseException e )
+ {
+ throw new Exception( "Error occurred while cleaning up database." );
+ }
+
+ // cleanup db manually? or use the cleanup consumers as what is done now?
+ for( ArchivaArtifact artifact : artifacts )
+ {
+ if( artifact.getVersion().equals( version ) )
+ {
+ try
+ {
+ cleanupArtifacts.processArchivaArtifact( artifact );
+ cleanupProjects.processArchivaArtifact( artifact );
+ }
+ catch ( ConsumerException ce )
+ {
+ // log error
+ continue;
+ }
+ }
+ }
+ }
+ catch ( ContentNotFoundException e )
+ {
+ throw new Exception( "Artifact does not exist." );
+ }
+ catch ( RepositoryNotFoundException e )
+ {
+ throw new Exception( "Repository does not exist." );
+ }
+ catch ( RepositoryException e )
+ {
+ throw new Exception( "Repository exception occurred." );
+ }
+
+ return new Boolean( true );
+ }
+
+ /**
+ * @see AdministrationService#executeDatabaseScanner()
+ */
+ public Boolean executeDatabaseScanner() throws Exception
+ {
+ if ( taskScheduler.isProcessingDatabaseTask() )
+ {
+ return false;
+ }
+
+ DatabaseTask task = new DatabaseTask();
+ task.setName( DefaultArchivaTaskScheduler.DATABASE_JOB + ":user-requested-via-web-service" );
+ task.setQueuePolicy( ArchivaTask.QUEUE_POLICY_WAIT );
+
+ taskScheduler.queueDatabaseTask( task );
+
+ return new Boolean( true );
+ }
+
+ /**
+ * @see AdministrationService#executeRepositoryScanner(String)
+ */
+ public Boolean executeRepositoryScanner( String repoId ) throws Exception
+ {
+ Configuration config = archivaConfiguration.getConfiguration();
+ if( config.findManagedRepositoryById( repoId ) == null )
+ {
+ throw new Exception( "Repository does not exist." );
+ }
+
+ if ( taskScheduler.isProcessingAnyRepositoryTask() )
+ {
+ if ( taskScheduler.isProcessingRepositoryTask( repoId ) )
+ {
+ return false;
+ }
+ }
+
+ RepositoryTask task = new RepositoryTask();
+ task.setRepositoryId( repoId );
+ task.setName( DefaultArchivaTaskScheduler.REPOSITORY_JOB + ":" + repoId );
+ task.setQueuePolicy( ArchivaTask.QUEUE_POLICY_WAIT );
+
+ taskScheduler.queueRepositoryTask( task );
+
+ return new Boolean( true );
+ }
+
+ /**
+ * @see AdministrationService#getAllDatabaseConsumers()
+ */
+ public List<String> getAllDatabaseConsumers()
+ {
+ List<String> consumers = new ArrayList<String>();
+
+ List<DatabaseCleanupConsumer> cleanupConsumers = dbConsumersUtil.getAvailableCleanupConsumers();
+ List<DatabaseUnprocessedArtifactConsumer> unprocessedConsumers = dbConsumersUtil.getAvailableUnprocessedConsumers();
+
+ for( DatabaseCleanupConsumer consumer : cleanupConsumers )
+ {
+ consumers.add( consumer.getId() );
+ }
+
+ for( DatabaseUnprocessedArtifactConsumer consumer : unprocessedConsumers )
+ {
+ consumers.add( consumer.getId() );
+ }
+
+ return consumers;
+ }
+
+ /**
+ * @see AdministrationService#getAllRepositoryConsumers()
+ */
+ public List<String> getAllRepositoryConsumers()
+ {
+ List<String> consumers = new ArrayList<String>();
+
+ List<KnownRepositoryContentConsumer> knownConsumers = repoConsumersUtil.getAvailableKnownConsumers();
+ List<InvalidRepositoryContentConsumer> invalidConsumers = repoConsumersUtil.getAvailableInvalidConsumers();
+
+ for( KnownRepositoryContentConsumer consumer : knownConsumers )
+ {
+ consumers.add( consumer.getId() );
+ }
+
+ for( InvalidRepositoryContentConsumer consumer : invalidConsumers )
+ {
+ consumers.add( consumer.getId() );
+ }
+
+ return consumers;
+ }
+
+ /**
+ * @see AdministrationService#getAllManagedRepositories()
+ */
+ public List<ManagedRepository> getAllManagedRepositories()
+ {
+ List<ManagedRepository> managedRepos = new ArrayList<ManagedRepository>();
+
+ Configuration config = archivaConfiguration.getConfiguration();
+ List<ManagedRepositoryConfiguration> managedRepoConfigs = config.getManagedRepositories();
+
+ for( ManagedRepositoryConfiguration repoConfig : managedRepoConfigs )
+ {
+ // TODO fix resolution of repo url!
+ ManagedRepository repo =
+ new ManagedRepository( repoConfig.getId(), repoConfig.getName(), "URL", repoConfig.getLayout(),
+ repoConfig.isSnapshots(), repoConfig.isReleases() );
+ managedRepos.add( repo );
+ }
+
+ return managedRepos;
+ }
+
+ /**
+ * @see AdministrationService#getAllRemoteRepositories()
+ */
+ public List<RemoteRepository> getAllRemoteRepositories()
+ {
+ List<RemoteRepository> remoteRepos = new ArrayList<RemoteRepository>();
+
+ Configuration config = archivaConfiguration.getConfiguration();
+ List<RemoteRepositoryConfiguration> remoteRepoConfigs = config.getRemoteRepositories();
+
+ for( RemoteRepositoryConfiguration repoConfig : remoteRepoConfigs )
+ {
+ RemoteRepository repo =
+ new RemoteRepository( repoConfig.getId(), repoConfig.getName(), repoConfig.getUrl(),
+ repoConfig.getLayout() );
+ remoteRepos.add( repo );
+ }
+
+ return remoteRepos;
+ }
+
+ private void saveConfiguration( Configuration config )
+ throws Exception
+ {
+ try
+ {
+ archivaConfiguration.save( config );
+ }
+ catch( RegistryException e )
+ {
+ throw new Exception( "Error occurred in the registry." );
+ }
+ catch ( IndeterminateConfigurationException e )
+ {
+ throw new Exception( "Error occurred while saving the configuration." );
+ }
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/PingServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/PingServiceImpl.java
new file mode 100644
index 000000000..aa47f5f0e
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/PingServiceImpl.java
@@ -0,0 +1,30 @@
+package org.apache.archiva.web.xmlrpc.services;
+
+/*
+ * 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.web.xmlrpc.api.TestService;
+
+public class PingServiceImpl implements TestService
+{
+ public String ping()
+ {
+ return "pong";
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java
new file mode 100644
index 000000000..a7f85f7e1
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java
@@ -0,0 +1,954 @@
+package org.apache.archiva.web.xmlrpc.services;
+
+/*
+ * 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 java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.archiva.web.xmlrpc.api.beans.ManagedRepository;
+import org.apache.archiva.web.xmlrpc.api.beans.RemoteRepository;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.DatabaseScanningConfiguration;
+import org.apache.maven.archiva.configuration.FileTypes;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
+import org.apache.maven.archiva.consumers.DatabaseCleanupConsumer;
+import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
+import org.apache.maven.archiva.consumers.InvalidRepositoryContentConsumer;
+import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.updater.DatabaseConsumers;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArchivaArtifactModel;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
+import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
+import org.apache.maven.archiva.repository.content.ManagedLegacyRepositoryContent;
+import org.apache.maven.archiva.repository.content.PathParser;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.apache.maven.archiva.repository.scanner.RepositoryContentConsumers;
+import org.apache.maven.archiva.scheduled.ArchivaTaskScheduler;
+import org.apache.maven.archiva.scheduled.tasks.DatabaseTask;
+import org.apache.maven.archiva.scheduled.tasks.RepositoryTask;
+import org.codehaus.plexus.spring.PlexusInSpringTestCase;
+import org.easymock.MockControl;
+import org.easymock.classextension.MockClassControl;
+
+/**
+ * AdministrationServiceImplTest
+ *
+ * @version $Id: AdministrationServiceImplTest.java
+ */
+public class AdministrationServiceImplTest
+ extends PlexusInSpringTestCase
+{
+ private MockControl archivaConfigControl;
+
+ private ArchivaConfiguration archivaConfig;
+
+ private MockControl configControl;
+
+ private Configuration config;
+
+ private AdministrationServiceImpl service;
+
+ private MockControl taskSchedulerControl;
+
+ private ArchivaTaskScheduler taskScheduler;
+
+ // repository consumers
+ private MockControl repoConsumerUtilsControl;
+
+ private RepositoryContentConsumers repoConsumersUtil;
+
+ private MockControl knownContentConsumerControl;
+
+ private MockControl invalidContentConsumerControl;
+
+ private KnownRepositoryContentConsumer indexArtifactConsumer;
+
+ private KnownRepositoryContentConsumer indexPomConsumer;
+
+ private InvalidRepositoryContentConsumer checkPomConsumer;
+
+ private InvalidRepositoryContentConsumer checkMetadataConsumer;
+
+ // database consumers
+ private MockControl dbConsumersUtilControl;
+
+ private DatabaseConsumers dbConsumersUtil;
+
+ private MockControl unprocessedConsumersControl;
+
+ private MockControl cleanupConsumersControl;
+
+ private DatabaseUnprocessedArtifactConsumer processArtifactConsumer;
+
+ private DatabaseUnprocessedArtifactConsumer processPomConsumer;
+
+ private DatabaseCleanupConsumer cleanupIndexConsumer;
+
+ private DatabaseCleanupConsumer cleanupDbConsumer;
+
+ // delete artifact
+ private MockControl repoFactoryControl;
+
+ private RepositoryContentFactory repositoryFactory;
+
+ private MockControl artifactDaoControl;
+
+ private ArtifactDAO artifactDao;
+
+ private MockControl cleanupControl;
+
+ private DatabaseCleanupConsumer cleanupConsumer;
+
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class );
+ archivaConfig = ( ArchivaConfiguration ) archivaConfigControl.getMock();
+
+ configControl = MockClassControl.createControl( Configuration.class );
+ config = ( Configuration ) configControl.getMock();
+
+ taskSchedulerControl = MockControl.createControl( ArchivaTaskScheduler.class );
+ taskScheduler = ( ArchivaTaskScheduler ) taskSchedulerControl.getMock();
+
+ // repo consumers
+ repoConsumerUtilsControl = MockClassControl.createControl( RepositoryContentConsumers.class );
+ repoConsumersUtil = ( RepositoryContentConsumers ) repoConsumerUtilsControl.getMock();
+
+ knownContentConsumerControl = MockControl.createControl( KnownRepositoryContentConsumer.class );
+ indexArtifactConsumer = ( KnownRepositoryContentConsumer ) knownContentConsumerControl.getMock();
+ indexPomConsumer = ( KnownRepositoryContentConsumer ) knownContentConsumerControl.getMock();
+
+ invalidContentConsumerControl = MockControl.createControl( InvalidRepositoryContentConsumer.class );
+ checkPomConsumer = ( InvalidRepositoryContentConsumer ) invalidContentConsumerControl.getMock();
+ checkMetadataConsumer = ( InvalidRepositoryContentConsumer ) invalidContentConsumerControl.getMock();
+
+ // db consumers
+ dbConsumersUtilControl = MockClassControl.createControl( DatabaseConsumers.class );
+ dbConsumersUtil = ( DatabaseConsumers ) dbConsumersUtilControl.getMock();
+
+ cleanupConsumersControl = MockControl.createControl( DatabaseCleanupConsumer.class );
+ cleanupIndexConsumer = ( DatabaseCleanupConsumer ) cleanupConsumersControl.getMock();
+ cleanupDbConsumer = ( DatabaseCleanupConsumer ) cleanupConsumersControl.getMock();
+
+ unprocessedConsumersControl = MockControl.createControl( DatabaseUnprocessedArtifactConsumer.class );
+ processArtifactConsumer = ( DatabaseUnprocessedArtifactConsumer ) unprocessedConsumersControl.getMock();
+ processPomConsumer = ( DatabaseUnprocessedArtifactConsumer ) unprocessedConsumersControl.getMock();
+
+ // delete artifact
+ repoFactoryControl = MockClassControl.createControl( RepositoryContentFactory.class );
+ repositoryFactory = ( RepositoryContentFactory ) repoFactoryControl.getMock();
+
+ artifactDaoControl = MockControl.createControl( ArtifactDAO.class );
+ artifactDao = ( ArtifactDAO ) artifactDaoControl.getMock();
+
+ cleanupControl = MockClassControl.createControl( DatabaseCleanupConsumer.class );
+ cleanupConsumer = ( DatabaseCleanupConsumer ) cleanupControl.getMock();
+
+ service = new AdministrationServiceImpl( archivaConfig, repoConsumersUtil, dbConsumersUtil,
+ repositoryFactory, artifactDao, cleanupConsumer, cleanupConsumer, taskScheduler );
+ }
+
+/* Tests for database consumers */
+
+ public void testGetAllDbConsumers()
+ throws Exception
+ {
+ recordDbConsumers();
+
+ dbConsumersUtilControl.replay();
+ cleanupConsumersControl.replay();
+ unprocessedConsumersControl.replay();
+
+ List<String> dbConsumers = service.getAllDatabaseConsumers();
+
+ dbConsumersUtilControl.verify();
+ cleanupConsumersControl.verify();
+ unprocessedConsumersControl.verify();
+
+ assertNotNull( dbConsumers );
+ assertEquals( 4, dbConsumers.size() );
+ assertTrue( dbConsumers.contains( "cleanup-index" ) );
+ assertTrue( dbConsumers.contains( "cleanup-database" ) );
+ assertTrue( dbConsumers.contains( "process-artifact" ) );
+ assertTrue( dbConsumers.contains( "process-pom" ) );
+ }
+
+ public void testConfigureValidDatabaseConsumer()
+ throws Exception
+ {
+ DatabaseScanningConfiguration dbScanning = new DatabaseScanningConfiguration();
+ dbScanning.addCleanupConsumer( "cleanup-index" );
+ dbScanning.addCleanupConsumer( "cleanup-database" );
+ dbScanning.addUnprocessedConsumer( "process-artifact" );
+
+ recordDbConsumers();
+
+ // test enable "process-pom" db consumer
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getDatabaseScanning(), dbScanning );
+
+ config.setDatabaseScanning( dbScanning );
+ configControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ configControl.setVoidCallable();
+
+ archivaConfig.save( config );
+ archivaConfigControl.setVoidCallable();
+
+ dbConsumersUtilControl.replay();
+ cleanupConsumersControl.replay();
+ unprocessedConsumersControl.replay();
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ boolean success = service.configureDatabaseConsumer( "process-pom", true );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ dbConsumersUtilControl.verify();
+ cleanupConsumersControl.verify();
+ unprocessedConsumersControl.verify();
+ archivaConfigControl.verify();
+ configControl.verify();
+
+ // test disable "process-pom" db consumer
+ dbConsumersUtilControl.reset();
+ cleanupConsumersControl.reset();
+ unprocessedConsumersControl.reset();
+ archivaConfigControl.reset();
+ configControl.reset();
+
+ dbScanning.addUnprocessedConsumer( "process-pom" );
+
+ recordDbConsumers();
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getDatabaseScanning(), dbScanning );
+
+ config.setDatabaseScanning( dbScanning );
+ configControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ configControl.setVoidCallable();
+
+ archivaConfig.save( config );
+ archivaConfigControl.setVoidCallable();
+
+ dbConsumersUtilControl.replay();
+ cleanupConsumersControl.replay();
+ unprocessedConsumersControl.replay();
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ boolean success = service.configureDatabaseConsumer( "process-pom", false );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ dbConsumersUtilControl.verify();
+ cleanupConsumersControl.verify();
+ unprocessedConsumersControl.verify();
+ archivaConfigControl.verify();
+ configControl.verify();
+ }
+
+ public void testConfigureInvalidDatabaseConsumer()
+ throws Exception
+ {
+ recordDbConsumers();
+
+ dbConsumersUtilControl.replay();
+ cleanupConsumersControl.replay();
+ unprocessedConsumersControl.replay();
+
+ try
+ {
+ service.configureDatabaseConsumer( "invalid-consumer", true );
+ fail( "An exception should have been thrown." );
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "Invalid database consumer.", e.getMessage() );
+ }
+
+ dbConsumersUtilControl.verify();
+ cleanupConsumersControl.verify();
+ unprocessedConsumersControl.verify();
+ }
+
+/* Tests for repository consumers */
+
+ public void testGetAllRepoConsumers()
+ throws Exception
+ {
+ recordRepoConsumers();
+
+ repoConsumerUtilsControl.replay();
+ knownContentConsumerControl.replay();
+ invalidContentConsumerControl.replay();
+
+ List<String> repoConsumers = service.getAllRepositoryConsumers();
+
+ repoConsumerUtilsControl.verify();
+ knownContentConsumerControl.verify();
+ invalidContentConsumerControl.verify();
+
+ assertNotNull( repoConsumers );
+ assertEquals( 4, repoConsumers.size() );
+ assertTrue( repoConsumers.contains( "index-artifact" ) );
+ assertTrue( repoConsumers.contains( "index-pom" ) );
+ assertTrue( repoConsumers.contains( "check-pom" ) );
+ assertTrue( repoConsumers.contains( "check-metadata" ) );
+ }
+
+ public void testConfigureValidRepositoryConsumer()
+ throws Exception
+ {
+ RepositoryScanningConfiguration repoScanning = new RepositoryScanningConfiguration();
+ repoScanning.addKnownContentConsumer( "index-artifact" );
+ repoScanning.addKnownContentConsumer( "index-pom" );
+ repoScanning.addInvalidContentConsumer( "check-pom" );
+
+ // test enable "check-metadata" consumer
+ recordRepoConsumers();
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getRepositoryScanning(), repoScanning );
+
+ config.setRepositoryScanning( repoScanning );
+ configControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ configControl.setVoidCallable();
+
+ archivaConfig.save( config );
+ archivaConfigControl.setVoidCallable();
+
+ repoConsumerUtilsControl.replay();
+ knownContentConsumerControl.replay();
+ invalidContentConsumerControl.replay();
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ boolean success = service.configureRepositoryConsumer( null, "check-metadata", true );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ repoConsumerUtilsControl.verify();
+ knownContentConsumerControl.verify();
+ invalidContentConsumerControl.verify();
+ archivaConfigControl.verify();
+ configControl.verify();
+
+ // test disable "check-metadata" consumer
+ repoConsumerUtilsControl.reset();
+ knownContentConsumerControl.reset();
+ invalidContentConsumerControl.reset();
+ archivaConfigControl.reset();
+ configControl.reset();
+
+ repoScanning.addInvalidContentConsumer( "check-metadata" );
+
+ recordRepoConsumers();
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getRepositoryScanning(), repoScanning );
+
+ config.setRepositoryScanning( repoScanning );
+ configControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ configControl.setVoidCallable();
+
+ archivaConfig.save( config );
+ archivaConfigControl.setVoidCallable();
+
+ repoConsumerUtilsControl.replay();
+ knownContentConsumerControl.replay();
+ invalidContentConsumerControl.replay();
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ boolean success = service.configureRepositoryConsumer( null, "check-metadata", false );
+
+ repoConsumerUtilsControl.verify();
+ knownContentConsumerControl.verify();
+ invalidContentConsumerControl.verify();
+ archivaConfigControl.verify();
+ configControl.verify();
+
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An excecption should not have been thrown." );
+ }
+ }
+
+
+ public void testConfigureInvalidRepositoryConsumer()
+ throws Exception
+ {
+ recordRepoConsumers();
+
+ repoConsumerUtilsControl.replay();
+ knownContentConsumerControl.replay();
+ invalidContentConsumerControl.replay();
+
+ try
+ {
+ service.configureRepositoryConsumer( null, "invalid-consumer", true );
+ fail( "An exception should have been thrown." );
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "Invalid repository consumer.", e.getMessage() );
+ }
+
+ repoConsumerUtilsControl.verify();
+ knownContentConsumerControl.verify();
+ invalidContentConsumerControl.verify();
+ }
+
+/* Tests for delete artifact */
+
+ public void testDeleteM2ArtifactArtifactExists()
+ throws Exception
+ {
+ File file = new File( getBasedir(), "/target/test-classes/default-repo/" );
+ assertTrue( file.exists() );
+
+ ManagedRepositoryConfiguration managedRepo = createManagedRepo( "internal", "default", "Internal Repository", true, false );
+ managedRepo.setLocation( file.getAbsolutePath() );
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ), managedRepo );
+
+ ManagedDefaultRepositoryContent repoContent = new ManagedDefaultRepositoryContent();
+ repoContent.setRepository( managedRepo );
+
+ repoFactoryControl.expectAndReturn( repositoryFactory.getManagedRepositoryContent( "internal" ), repoContent );
+
+ List<ArchivaArtifact> artifacts = getArtifacts();
+
+ artifactDao.queryArtifacts( null );
+ artifactDaoControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ artifactDaoControl.setReturnValue( artifacts );
+
+ cleanupConsumer.processArchivaArtifact( artifacts.get( 0 ) );
+ cleanupControl.setVoidCallable( 2 );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+ repoFactoryControl.replay();
+ artifactDaoControl.replay();
+ cleanupControl.replay();
+
+ try
+ {
+ boolean success = service.deleteArtifact( "internal", "org.apache.archiva", "archiva-test", "1.0" );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ repoFactoryControl.verify();
+ artifactDaoControl.verify();
+ cleanupControl.verify();
+
+ assertFalse( new File( getBasedir(), "/target/test-classes/default-repo/org/apache/archiva/archiva-test/1.0" ).exists() );
+ assertTrue( new File( getBasedir(), "/target/test-classes/default-repo/org/apache/archiva/archiva-test/1.1" ).exists() );
+ }
+
+ public void testDeleteM1ArtifactArtifactExists()
+ throws Exception
+ {
+ MockControl fileTypesControl = MockClassControl.createControl( FileTypes.class );
+ FileTypes fileTypes = ( FileTypes ) fileTypesControl.getMock();
+
+ MockControl pathParserControl = MockClassControl.createControl( PathParser.class );
+ PathParser parser = ( PathParser ) pathParserControl.getMock();
+
+ File file = new File( getBasedir(), "/target/test-classes/legacy-repo/" );
+ assertTrue( file.exists() );
+
+ ManagedRepositoryConfiguration managedRepo = createManagedRepo( "internal", "legacy", "Internal Repository", true, false );
+ managedRepo.setLocation( file.getAbsolutePath() );
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ), managedRepo );
+
+ ManagedLegacyRepositoryContent repoContent = new ManagedLegacyRepositoryContent();
+ repoContent.setRepository( managedRepo );
+ repoContent.setFileTypes( fileTypes );
+ repoContent.setLegacyPathParser( parser );
+
+ repoFactoryControl.expectAndReturn( repositoryFactory.getManagedRepositoryContent( "internal" ), repoContent );
+
+ recordInManagedLegacyRepoContent( fileTypesControl, fileTypes, pathParserControl, parser );
+
+ List<ArchivaArtifact> artifacts = getArtifacts();
+
+ artifactDao.queryArtifacts( null );
+ artifactDaoControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ artifactDaoControl.setReturnValue( artifacts );
+
+ cleanupConsumer.processArchivaArtifact( artifacts.get( 0 ) );
+ cleanupControl.setVoidCallable( 2 );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+ repoFactoryControl.replay();
+ artifactDaoControl.replay();
+ cleanupControl.replay();
+ fileTypesControl.replay();
+ pathParserControl.replay();
+
+ try
+ {
+ boolean success = service.deleteArtifact( "internal", "org.apache.archiva", "archiva-test", "1.0" );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ repoFactoryControl.verify();
+ artifactDaoControl.verify();
+ cleanupControl.verify();
+ fileTypesControl.verify();
+ pathParserControl.verify();
+
+ assertFalse( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/jars/archiva-test-1.0.jar" ).exists() );
+ assertFalse( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/poms/archiva-test-1.0.pom" ).exists() );
+
+ assertTrue( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/jars/archiva-test-1.1.jar" ).exists() );
+ assertTrue( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/jars/archiva-diff-1.0.jar" ).exists() );
+ assertTrue( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/poms/archiva-test-1.1.pom" ).exists() );
+ assertTrue( new File( getBasedir(), "/target/test-classes/legacy-repo/org.apache.archiva/poms/archiva-diff-1.0.pom" ).exists() );
+ }
+
+ public void testDeleteArtifactArtifactDoesNotExist()
+ throws Exception
+ {
+ File file = new File( getBasedir(), "/target/test-classes/default-repo/" );
+ assertTrue( file.exists() );
+
+ ManagedRepositoryConfiguration managedRepo = createManagedRepo( "internal", "default", "Internal Repository", true, false );
+ managedRepo.setLocation( file.getAbsolutePath() );
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ), managedRepo );
+
+ ManagedDefaultRepositoryContent repoContent = new ManagedDefaultRepositoryContent();
+ repoContent.setRepository( managedRepo );
+
+ repoFactoryControl.expectAndReturn( repositoryFactory.getManagedRepositoryContent( "internal" ), repoContent );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+ repoFactoryControl.replay();
+
+ try
+ {
+ service.deleteArtifact( "internal", "org.apache.archiva", "archiva-non-existing", "1.0" );
+ fail( "An exception should have been thrown." );
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "Artifact does not exist.", e.getMessage() );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ repoFactoryControl.verify();
+ }
+
+ public void testDeleteArtifacRepositoryDoesNotExist()
+ throws Exception
+ {
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "non-existing-repo" ), null );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ service.deleteArtifact( "non-existing-repo", "org.apache.archiva", "archiva-test", "1.0" );
+ fail( "An exception should have been thrown." );
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "Repository does not exist.", e.getMessage() );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ }
+
+/* Tests for repository scanning */
+
+ public void testExecuteRepoScannerRepoExistsAndNotBeingScanned()
+ throws Exception
+ {
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ),
+ createManagedRepo( "internal", "default", "Internal Repository", true, false ) );
+
+ RepositoryTask task = new RepositoryTask();
+
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingAnyRepositoryTask(), true );
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingRepositoryTask( "internal" ), false );
+
+ taskScheduler.queueRepositoryTask( task );
+ taskSchedulerControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ taskSchedulerControl.setVoidCallable();
+
+ archivaConfigControl.replay();
+ configControl.replay();
+ taskSchedulerControl.replay();
+
+ try
+ {
+ boolean success = service.executeRepositoryScanner( "internal" );
+ assertTrue( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ taskSchedulerControl.verify();
+ }
+
+ public void testExecuteRepoScannerRepoExistsButBeingScanned()
+ throws Exception
+ {
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ),
+ createManagedRepo( "internal", "default", "Internal Repository", true, false ) );
+
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingAnyRepositoryTask(), true );
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingRepositoryTask( "internal" ), true);
+
+ archivaConfigControl.replay();
+ configControl.replay();
+ taskSchedulerControl.replay();
+
+ try
+ {
+ boolean success = service.executeRepositoryScanner( "internal" );
+ assertFalse( success );
+ }
+ catch ( Exception e )
+ {
+ fail( "An exception should not have been thrown." );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ taskSchedulerControl.verify();
+ }
+
+ public void testExecuteRepoScannerRepoDoesNotExist()
+ throws Exception
+ {
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.findManagedRepositoryById( "internal" ), null );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ try
+ {
+ service.executeRepositoryScanner( "internal" );
+ fail( "An exception should have been thrown." );
+ }
+ catch ( Exception e )
+ {
+ assertEquals( "Repository does not exist.", e.getMessage() );
+ }
+
+ archivaConfigControl.verify();
+ configControl.verify();
+ }
+
+/* Tests for db scanning */
+
+ public void testExecuteDbScannerDbNotBeingScanned()
+ throws Exception
+ {
+ DatabaseTask task = new DatabaseTask();
+
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingDatabaseTask(), false );
+
+ taskScheduler.queueDatabaseTask( task );
+ taskSchedulerControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ taskSchedulerControl.setVoidCallable();
+
+ taskSchedulerControl.replay();
+
+ boolean success = service.executeDatabaseScanner();
+
+ taskSchedulerControl.verify();
+
+ assertTrue( success );
+ }
+
+ public void testExecuteDbScannerDbIsBeingScanned()
+ throws Exception
+ {
+ taskSchedulerControl.expectAndReturn( taskScheduler.isProcessingDatabaseTask(), true );
+
+ taskSchedulerControl.replay();
+
+ boolean success = service.executeDatabaseScanner();
+
+ taskSchedulerControl.verify();
+
+ assertFalse( success );
+ }
+
+/* Tests for querying repositories */
+
+ public void testGetAllManagedRepositories()
+ throws Exception
+ {
+ List<ManagedRepositoryConfiguration> managedRepos = new ArrayList<ManagedRepositoryConfiguration>();
+ managedRepos.add( createManagedRepo( "internal", "default", "Internal Repository", true, false ) );
+ managedRepos.add( createManagedRepo( "snapshots", "default", "Snapshots Repository", false, true ) );
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getManagedRepositories(), managedRepos );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ List<ManagedRepository> repos = service.getAllManagedRepositories();
+
+ archivaConfigControl.verify();
+ configControl.verify();
+
+ assertNotNull( repos );
+ assertEquals( 2, repos.size() );
+
+ assertManagedRepo( ( ManagedRepository ) repos.get( 0 ), managedRepos.get( 0 ) );
+ assertManagedRepo( ( ManagedRepository ) repos.get( 1 ), managedRepos.get( 1 ) );
+ }
+
+ public void testGetAllRemoteRepositories()
+ throws Exception
+ {
+ List<RemoteRepositoryConfiguration> remoteRepos = new ArrayList<RemoteRepositoryConfiguration>();
+ remoteRepos.add( createRemoteRepository( "central", "Central Repository", "default", "http://repo1.maven.org/maven2") );
+ remoteRepos.add( createRemoteRepository( "dummy", "Dummy Remote Repository", "legacy", "http://dummy.com/dummy") );
+
+ archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config );
+ configControl.expectAndReturn( config.getRemoteRepositories(), remoteRepos );
+
+ archivaConfigControl.replay();
+ configControl.replay();
+
+ List<RemoteRepository> repos = service.getAllRemoteRepositories();
+
+ archivaConfigControl.verify();
+ configControl.verify();
+
+ assertNotNull( repos );
+ assertEquals( 2, repos.size() );
+
+ assertRemoteRepo( (RemoteRepository) repos.get( 0 ), remoteRepos.get( 0 ) );
+ assertRemoteRepo( (RemoteRepository) repos.get( 1 ), remoteRepos.get( 1 ) );
+ }
+
+/* private methods */
+
+ private void assertRemoteRepo( RemoteRepository remoteRepo, RemoteRepositoryConfiguration expectedRepoConfig )
+ {
+ assertEquals( expectedRepoConfig.getId(), remoteRepo.getId() );
+ assertEquals( expectedRepoConfig.getLayout(), remoteRepo.getLayout() );
+ assertEquals( expectedRepoConfig.getName(), remoteRepo.getName() );
+ assertEquals( expectedRepoConfig.getUrl(), remoteRepo.getUrl() );
+ }
+
+ private RemoteRepositoryConfiguration createRemoteRepository(String id, String name, String layout, String url)
+ {
+ RemoteRepositoryConfiguration remoteConfig = new RemoteRepositoryConfiguration();
+ remoteConfig.setId( id );
+ remoteConfig.setName( name );
+ remoteConfig.setLayout( layout );
+ remoteConfig.setUrl( url );
+
+ return remoteConfig;
+ }
+
+ private void assertManagedRepo( ManagedRepository managedRepo, ManagedRepositoryConfiguration expectedRepoConfig )
+ {
+ assertEquals( expectedRepoConfig.getId(), managedRepo.getId() );
+ assertEquals( expectedRepoConfig.getLayout(), managedRepo.getLayout() );
+ assertEquals( expectedRepoConfig.getName(), managedRepo.getName() );
+
+ //TODO enable assert once fixed in AdministrationServiceImpl!
+ //assertEquals( "http://localhost:8080/archiva/repository/" + expectedRepoConfig.getId(), managedRepo.getUrl() );
+ assertEquals( expectedRepoConfig.isReleases(), managedRepo.isReleases() );
+ assertEquals( expectedRepoConfig.isSnapshots(), managedRepo.isSnapshots() );
+ }
+
+ private ManagedRepositoryConfiguration createManagedRepo( String id, String layout, String name,
+ boolean hasReleases, boolean hasSnapshots )
+ {
+ ManagedRepositoryConfiguration repoConfig = new ManagedRepositoryConfiguration();
+ repoConfig.setId( id );
+ repoConfig.setLayout( layout );
+ repoConfig.setName( name );
+ repoConfig.setReleases( hasReleases );
+ repoConfig.setSnapshots( hasSnapshots );
+
+ return repoConfig;
+ }
+
+ private void recordRepoConsumers()
+ {
+ List<KnownRepositoryContentConsumer> availableKnownConsumers = new ArrayList<KnownRepositoryContentConsumer>();
+ availableKnownConsumers.add( indexArtifactConsumer );
+ availableKnownConsumers.add( indexPomConsumer );
+
+ List<InvalidRepositoryContentConsumer> availableInvalidConsumers = new ArrayList<InvalidRepositoryContentConsumer>();
+ availableInvalidConsumers.add( checkPomConsumer );
+ availableInvalidConsumers.add( checkMetadataConsumer );
+
+ repoConsumerUtilsControl.expectAndReturn( repoConsumersUtil.getAvailableKnownConsumers(), availableKnownConsumers );
+ knownContentConsumerControl.expectAndReturn( indexArtifactConsumer.getId(), "index-artifact" );
+ knownContentConsumerControl.expectAndReturn( indexPomConsumer.getId(), "index-pom" );
+
+ repoConsumerUtilsControl.expectAndReturn( repoConsumersUtil.getAvailableInvalidConsumers(), availableInvalidConsumers );
+ invalidContentConsumerControl.expectAndReturn( checkPomConsumer.getId(), "check-pom" );
+ invalidContentConsumerControl.expectAndReturn( checkMetadataConsumer.getId(), "check-metadata" );
+ }
+
+ private void recordDbConsumers()
+ {
+ List<DatabaseCleanupConsumer> cleanupConsumers = new ArrayList<DatabaseCleanupConsumer>();
+ cleanupConsumers.add( cleanupIndexConsumer );
+ cleanupConsumers.add( cleanupDbConsumer );
+
+ List<DatabaseUnprocessedArtifactConsumer> unprocessedConsumers =
+ new ArrayList<DatabaseUnprocessedArtifactConsumer>();
+ unprocessedConsumers.add( processArtifactConsumer );
+ unprocessedConsumers.add( processPomConsumer );
+
+ dbConsumersUtilControl.expectAndReturn( dbConsumersUtil.getAvailableCleanupConsumers(), cleanupConsumers );
+ cleanupConsumersControl.expectAndReturn( cleanupIndexConsumer.getId(), "cleanup-index" );
+ cleanupConsumersControl.expectAndReturn( cleanupDbConsumer.getId(), "cleanup-database" );
+
+ dbConsumersUtilControl.expectAndReturn( dbConsumersUtil.getAvailableUnprocessedConsumers(), unprocessedConsumers );
+ unprocessedConsumersControl.expectAndReturn( processArtifactConsumer.getId(), "process-artifact" );
+ unprocessedConsumersControl.expectAndReturn( processPomConsumer.getId(), "process-pom" );
+ }
+
+ private void recordInManagedLegacyRepoContent( MockControl fileTypesControl, FileTypes fileTypes,
+ MockControl pathParserControl, PathParser parser )
+ throws LayoutException
+ {
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/poms/archiva-test-1.0.pom" ), true );
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/poms/archiva-test-1.1.pom" ), true );
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/poms/archiva-diff-1.0.pom" ), true );
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/jars/archiva-diff-1.0.jar" ), true );
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/jars/archiva-test-1.0.jar" ), true );
+ fileTypesControl.expectAndReturn( fileTypes.matchesArtifactPattern( "org.apache.archiva/jars/archiva-test-1.1.jar" ), true );
+
+ ArtifactReference aRef = createArtifactReference("archiva-test", "org.apache.archiva", "1.1", "pom");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/poms/archiva-test-1.1.pom" ), aRef );
+
+ aRef = createArtifactReference("archiva-test", "org.apache.archiva", "1.0", "pom");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/poms/archiva-test-1.0.pom" ), aRef );
+
+ aRef = createArtifactReference("archiva-diff", "org.apache.archiva", "1.0", "pom");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/poms/archiva-diff-1.0.pom" ), aRef );
+
+ aRef = createArtifactReference("archiva-diff", "org.apache.archiva", "1.0", "jar");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/jars/archiva-diff-1.0.jar" ), aRef );
+
+ aRef = createArtifactReference("archiva-test", "org.apache.archiva", "1.0", "jar");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/jars/archiva-test-1.0.jar" ), aRef );
+
+ aRef = createArtifactReference("archiva-test", "org.apache.archiva", "1.1", "jar");
+ pathParserControl.expectAndReturn( parser.toArtifactReference( "org.apache.archiva/jars/archiva-test-1.1.jar" ), aRef );
+ }
+
+ private List<ArchivaArtifact> getArtifacts()
+ {
+ List<ArchivaArtifact> artifacts = new ArrayList<ArchivaArtifact>();
+
+ ArchivaArtifactModel model = new ArchivaArtifactModel();
+ model.setRepositoryId( "internal" );
+ model.setGroupId( "org.apache.archiva" );
+ model.setArtifactId( "archiva-test" );
+ model.setVersion( "1.0" );
+ model.setType( "jar" );
+
+ ArchivaArtifact artifact = new ArchivaArtifact( model );
+ artifacts.add( artifact );
+ return artifacts;
+ }
+
+ private ArtifactReference createArtifactReference( String artifactId, String groupId, String version, String type )
+ {
+ ArtifactReference aRef = new ArtifactReference();
+ aRef.setArtifactId( artifactId );
+ aRef.setGroupId( groupId );
+ aRef.setType( type );
+ aRef.setVersion( version );
+
+ return aRef;
+ }
+} \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.md5 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.md5
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.md5
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.sha1 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.sha1
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.jar.sha1
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.md5 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.md5
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.md5
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.sha1 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.sha1
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/archiva-test-1.0.pom.sha1
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.md5 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.md5
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.md5
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.sha1 b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.sha1
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.0/maven-metadata.xml.sha1
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.jar b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.jar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.jar
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.pom b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.pom
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/default-repo/org/apache/archiva/archiva-test/1.1/archiva-test-1.1.pom
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-diff-1.0.jar b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-diff-1.0.jar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-diff-1.0.jar
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.0.jar b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.0.jar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.0.jar
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.1.jar b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.1.jar
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/jars/archiva-test-1.1.jar
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-diff-1.0.pom b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-diff-1.0.pom
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-diff-1.0.pom
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.0.pom b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.0.pom
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.0.pom
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.1.pom b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.1.pom
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/legacy-repo/org.apache.archiva/poms/archiva-test-1.1.pom
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.xml b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.xml
new file mode 100644
index 000000000..fc0308c69
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/resources/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.xml
@@ -0,0 +1,27 @@
+<component-set>
+ <components>
+ <component>
+ <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role>
+ <implementation>org.apache.maven.archiva.configuration.DefaultArchivaConfiguration</implementation>
+ <requirements>
+ <requirement>
+ <role>org.codehaus.plexus.registry.Registry</role>
+ <role-hint>configured</role-hint>
+ </requirement>
+ </requirements>
+ </component>
+ <component>
+ <role>org.codehaus.plexus.registry.Registry</role>
+ <role-hint>configured</role-hint>
+ <implementation>org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry</implementation>
+ <configuration>
+ <properties>
+ <system/>
+ <xml fileName="${basedir}/target/test-conf/archiva.xml"
+ config-name="org.apache.maven.archiva.base" config-at="org.apache.maven.archiva"/>
+ </properties>
+ </configuration>
+ </component>
+
+ </components>
+</component-set> \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/pom.xml b/archiva-modules/archiva-web/archiva-xmlrpc/pom.xml
new file mode 100644
index 000000000..df9b70aed
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/pom.xml
@@ -0,0 +1,37 @@
+<?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.
+ -->
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-web</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>archiva-xmlrpc</artifactId>
+ <name>Archiva Web :: XML-RPC</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>archiva-xmlrpc-api</module>
+ <module>archiva-xmlrpc-services</module>
+ <module>archiva-xmlrpc-security</module>
+ <module>archiva-xmlrpc-client</module>
+ </modules>
+</project>
diff --git a/archiva-modules/archiva-web/pom.xml b/archiva-modules/archiva-web/pom.xml
index a46196010..e3421d23e 100644
--- a/archiva-modules/archiva-web/pom.xml
+++ b/archiva-modules/archiva-web/pom.xml
@@ -13,7 +13,9 @@
~ 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.
- --><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/maven-v4_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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.archiva</groupId>
@@ -32,6 +34,7 @@
<module>archiva-webapp</module>
<module>archiva-webdav</module>
<module>archiva-rss</module>
+ <module>archiva-xmlrpc</module>
</modules>
<profiles>
diff --git a/pom.xml b/pom.xml
index 0dcf1418e..1d3daa95b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -394,6 +394,21 @@
<version>1.2-SNAPSHOT</version>
</dependency>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-services</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-security</artifactId>
+ <version>1.2-SNAPSHOT</version>
+ </dependency>
+ <dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-spring</artifactId>
<version>1.2</version>
@@ -509,6 +524,11 @@
<version>1.4</version>
</dependency>
<dependency>
+ <groupId>org.apache.xmlrpc</groupId>
+ <artifactId>xmlrpc-server</artifactId>
+ <version>3.1</version>
+ </dependency>
+ <dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact-manager</artifactId>
<version>${maven.version}</version>
@@ -894,6 +914,36 @@
<version>${jetty.version}</version>
</dependency>
+ <!-- xmlrpc -->
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder-annotations</artifactId>
+ <version>${binder.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder-server-spring</artifactId>
+ <version>${binder.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder</artifactId>
+ <version>${binder.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.atlassian.xmlrpc</groupId>
+ <artifactId>atlassian-xmlrpc-binder-testing</artifactId>
+ <version>${binder.version}</version>
+ <scope>test</scope>
+ </dependency>
+
<!-- Transitive versions to manage -->
<dependency>
<groupId>org.springframework</groupId>
@@ -928,6 +978,19 @@
</exclusion>
</exclusions>
</dependency>
+ <!-- use spring test in xmlrpc?
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>2.5.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
@@ -978,6 +1041,7 @@
<wagon.version>1.0-beta-4</wagon.version>
<redback.version>1.2-SNAPSHOT</redback.version>
<jetty.version>6.1.6</jetty.version>
+ <binder.version>0.8.1</binder.version>
</properties>
<profiles>
<profile>