aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java62
-rw-r--r--archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java25
-rw-r--r--archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/applicationContext.xml24
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml4
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/SearchService.java30
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/Artifact.java124
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml6
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/ServiceMethodsPermissionsMapping.java16
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcAuthenticator.java52
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcUserRepositories.java48
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/test/java/org/apache/archiva/xmlrpc/security/XmlRpcAuthenticatorTest.java8
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml30
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java205
-rw-r--r--archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java387
-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.pom18
15 files changed, 996 insertions, 43 deletions
diff --git a/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
new file mode 100644
index 000000000..3a57ec8c8
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/util/SearchUtil.java
@@ -0,0 +1,62 @@
+package org.apache.archiva.indexer.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * SearchUtil - utility class for search.
+ *
+ * @version
+ */
+public class SearchUtil
+{
+ public static final String BYTECODE_KEYWORD = "bytecode:";
+
+ /**
+ * Determines whether the queryString has the bytecode keyword.
+ *
+ * @param queryString
+ * @return
+ */
+ public static boolean isBytecodeSearch( String queryString )
+ {
+ if ( queryString.startsWith( BYTECODE_KEYWORD ) )
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Removes the bytecode keyword from the query string.
+ *
+ * @param queryString
+ * @return
+ */
+ public static String removeBytecodeKeyword( String queryString )
+ {
+ String qString = StringUtils.uncapitalize( queryString );
+ qString = StringUtils.remove( queryString, BYTECODE_KEYWORD );
+
+ return qString;
+ }
+}
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
index c7b21e596..939dbc51a 100644
--- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
+++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
@@ -25,6 +25,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
+import org.apache.archiva.indexer.util.SearchUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
@@ -106,8 +107,6 @@ public class SearchAction
private static final String COMPLETE_QUERY_STRING_SEPARATOR = ";";
- private static final String BYTECODE_KEYWORD = "bytecode:";
-
private List<String> managedRepositoryList;
private String groupId;
@@ -232,9 +231,9 @@ public class SearchAction
return GlobalResults.ACCESS_TO_NO_REPOS;
}
- if( isBytecodeSearch( q ) )
+ if( SearchUtil.isBytecodeSearch( q ) )
{
- results = crossRepoSearch.searchForBytecode( getPrincipal(), selectedRepos, removeKeyword( q ), limits );
+ results = crossRepoSearch.searchForBytecode( getPrincipal(), selectedRepos, SearchUtil.removeBytecodeKeyword( q ), limits );
}
else
{
@@ -439,24 +438,6 @@ public class SearchAction
this.completeQueryString = completeQueryString;
}
- private boolean isBytecodeSearch( String queryString )
- {
- if ( queryString.startsWith( BYTECODE_KEYWORD ) )
- {
- return true;
- }
-
- return false;
- }
-
- private String removeKeyword( String queryString )
- {
- String qString = StringUtils.uncapitalize( queryString );
- qString = StringUtils.remove( queryString, BYTECODE_KEYWORD );
-
- return qString;
- }
-
public ArchivaConfiguration getArchivaConfiguration()
{
return archivaConfiguration;
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 a45d39c0b..ae629d574 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
@@ -32,7 +32,25 @@
</bean>
<bean name="testXmlRpcService" lazy-init="true" scope="singleton" class="org.apache.archiva.web.xmlrpc.services.PingServiceImpl"/>
+
+ <bean name="xmlRpcUserRepositories" class="org.apache.archiva.web.xmlrpc.security.XmlRpcUserRepositories">
+ <constructor-arg ref="userRepositories"/>
+ <constructor-arg ref="xmlRpcAuthenticator"/>
+ </bean>
+
+ <!-- Web Services : Search Service -->
+ <bean name="searchService" lazy-init="true" scope="singleton" class="org.apache.archiva.web.xmlrpc.services.SearchServiceImpl">
+ <!--
+ <constructor-arg ref="archivaConfiguration"/>
+ <constructor-arg ref="repositoryContentFactory"/>
+ -->
+ <constructor-arg ref="xmlRpcUserRepositories"/>
+ <constructor-arg ref="crossRepositorySearch"/>
+ <constructor-arg ref="archivaDAO#jdo"/>
+ <constructor-arg ref="repositoryBrowsing"/>
+ </bean>
+ <!-- Web Services : Administration Service -->
<bean name="administrationService" lazy-init="true" scope="singleton" class="org.apache.archiva.web.xmlrpc.services.AdministrationServiceImpl">
<constructor-arg ref="archivaConfiguration"/>
<constructor-arg ref="repositoryContentConsumers"/>
@@ -46,12 +64,12 @@
<bean name="xmlrpcServicesList" lazy-init="true" scope="singleton" class="java.util.ArrayList">
<constructor-arg ref="administrationService"/>
+ <!-- <constructor-arg ref="searchService"/> -->
</bean>
<bean name="xmlRpcAuthenticator" class="org.apache.archiva.web.xmlrpc.security.XmlRpcAuthenticator">
- <constructor-arg>
- <ref bean="securitySystem"/>
- </constructor-arg>
+ <constructor-arg ref="securitySystem"/>
+ <constructor-arg ref="userRepositories"/>
</bean>
<bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
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
index ac145568f..8dc30b5d3 100644
--- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/pom.xml
@@ -33,6 +33,10 @@
<name>Archiva Web :: XML-RPC API</name>
<dependencies>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-indexer</artifactId>
+ </dependency>
+ <dependency>
<groupId>com.atlassian.xmlrpc</groupId>
<artifactId>atlassian-xmlrpc-binder-annotations</artifactId>
</dependency>
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
index cbc47547f..d820be458 100644
--- 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
@@ -19,10 +19,40 @@ package org.apache.archiva.web.xmlrpc.api;
* under the License.
*/
+import java.util.Date;
+import java.util.List;
+
+import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
import com.atlassian.xmlrpc.ServiceObject;
@ServiceObject("Search")
public interface SearchService
{
+ /*
+ * quick/general text search which returns a list of artifacts
+ * query for an artifact based on a checksum
+ * query for all available versions of an artifact, sorted in version significance order
+ * query for all available versions of an artifact since a given date
+ * query for an artifact's direct dependencies
+ * query for an artifact's dependency tree (as with mvn dependency:tree - no duplicates should be included)
+ * query for all artifacts that depend on a given artifact
+ */
+
+ public List<Artifact> quickSearch( String queryString )
+ throws Exception;
+
+ public List<Artifact> getArtifactByChecksum( String checksum) throws Exception;
+
+ public List<Artifact> getArtifactVersions( String groupId, String artifactId ) throws Exception;
+
+ public List<Artifact> getArtifactVersionsByDate( String groupId, String artifactId, String version, Date whenGathered )
+ throws Exception;
+ public List<Artifact> getDirectDependencies( String repositoryId, String groupId, String artifactId, String version )
+ throws Exception;
+
+ public List<Artifact> getDependencyTree( String groupId, String artifactId, String version ) throws Exception;
+
+ public List<Artifact> getDependees( String groupId, String artifactId, String version )
+ throws Exception;
}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/Artifact.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/Artifact.java
new file mode 100644
index 000000000..bc553e3cd
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-api/src/main/java/org/apache/archiva/web/xmlrpc/api/beans/Artifact.java
@@ -0,0 +1,124 @@
+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 java.util.Date;
+
+import com.atlassian.xmlrpc.ServiceBean;
+import com.atlassian.xmlrpc.ServiceBeanField;
+
+@ServiceBean
+public class Artifact
+ implements Serializable
+{
+ private String repositoryId;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private String version;
+
+ private String type;
+
+ private Date whenGathered;
+
+ public Artifact()
+ {
+
+ }
+
+ public Artifact( String repositoryId, String groupId, String artifactId, String version,
+ String type, Date whenGathered )
+ {
+ this.repositoryId = repositoryId;
+ this.groupId = groupId;
+ this.artifactId = artifactId;
+ this.version = version;
+ this.type = type;
+ this.whenGathered = whenGathered;
+ }
+
+ public String getGroupId()
+ {
+ return groupId;
+ }
+
+ public String getArtifactId()
+ {
+ return artifactId;
+ }
+
+ public String getVersion()
+ {
+ return version;
+ }
+
+ public String getType()
+ {
+ return type;
+ }
+
+ public Date getWhenGathered()
+ {
+ return whenGathered;
+ }
+
+ @ServiceBeanField( "groupId" )
+ public void setGroupId( String groupId )
+ {
+ this.groupId = groupId;
+ }
+
+ @ServiceBeanField( "artifactId" )
+ public void setArtifactId( String artifactId )
+ {
+ this.artifactId = artifactId;
+ }
+
+ @ServiceBeanField( "version" )
+ public void setVersion( String version )
+ {
+ this.version = version;
+ }
+
+ @ServiceBeanField( "type" )
+ public void setType( String type )
+ {
+ this.type = type;
+ }
+
+ @ServiceBeanField( "whenGathered" )
+ public void setWhenGathered( Date whenGathered )
+ {
+ this.whenGathered = whenGathered;
+ }
+
+ public String getRepositoryId()
+ {
+ return repositoryId;
+ }
+
+ public void setRepositoryId( String repositoryId )
+ {
+ this.repositoryId = repositoryId;
+ }
+}
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
index 1e73dc933..8410e2267 100644
--- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-client/pom.xml
@@ -54,9 +54,9 @@
URL: ex. http://127.0.0.1:8080/archiva/xmlrpc
USERNAME & PASSWORD: Archiva credentials
-->
- <argument>URL</argument>
- <argument>USERNAME</argument>
- <argument>PASSWORD</argument>
+ <argument>http://127.0.0.1:8080/archiva/xmlrpc</argument>
+ <argument>admin</argument>
+ <argument>admin1</argument>
</arguments>
</configuration>
</plugin>
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
index 333b4218e..133820a8e 100644
--- 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
@@ -1,6 +1,5 @@
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
@@ -56,7 +55,18 @@ public class ServiceMethodsPermissionsMapping
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_REPOSITORY_ACCESS = new ArrayList<String>()
+ {
+ {
+ add( "SearchService.quickSearch" );
+ add( "SearchService.getArtifactByChecksum" );
+ add( "SearchService.getArtifactVersions" );
+ add( "SearchService.queryArtifactVersionsByDate" );
+ add(" SearchService.getDirectDependencies" );
+ add(" SearchService.getDirectDependencyTree" );
+ add(" SearchService.getDependees" );
+ }
+ };
public static final List<String> SERVICE_METHODS_FOR_OPERATION_ADD_REPOSITORY = new ArrayList<String>();
@@ -64,6 +74,6 @@ public class ServiceMethodsPermissionsMapping
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>();
+ 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
index 40ee2fd6f..de7419e58 100644
--- 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
@@ -19,7 +19,11 @@ package org.apache.archiva.web.xmlrpc.security;
* under the License.
*/
+import java.util.List;
+
import org.apache.maven.archiva.security.ArchivaRoleConstants;
+import org.apache.maven.archiva.security.ArchivaSecurityException;
+import org.apache.maven.archiva.security.UserRepositories;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.XmlRpcRequest;
import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
@@ -44,23 +48,32 @@ public class XmlRpcAuthenticator
implements AuthenticationHandler
{
private final SecuritySystem securitySystem;
-
- public XmlRpcAuthenticator( SecuritySystem securitySystem )
+
+ private UserRepositories userRepositories;
+
+ private String username;
+
+ public XmlRpcAuthenticator( SecuritySystem securitySystem, UserRepositories userRepositories )
{
this.securitySystem = securitySystem;
+ this.userRepositories = userRepositories;
}
-
+
public boolean isAuthorized( XmlRpcRequest pRequest )
throws XmlRpcException
{
+ System.out.println( "authenticator is called for request '" + pRequest.getMethodName() + "'" );
+
if ( pRequest.getConfig() instanceof XmlRpcHttpRequestConfigImpl )
{
XmlRpcHttpRequestConfigImpl config = (XmlRpcHttpRequestConfigImpl) pRequest.getConfig();
+ username = config.getBasicUserName();
SecuritySession session =
- authenticate( new PasswordBasedAuthenticationDataSource( config.getBasicUserName(),
+ authenticate( new PasswordBasedAuthenticationDataSource( username,
config.getBasicPassword() ) );
+
String method = pRequest.getMethodName();
- AuthorizationResult result = authorize( session, method );
+ AuthorizationResult result = authorize( session, method, username );
return result.isAuthorized();
}
@@ -89,13 +102,12 @@ public class XmlRpcAuthenticator
}
}
- private AuthorizationResult authorize( SecuritySession session, String methodName )
+ private AuthorizationResult authorize( SecuritySession session, String methodName, String username )
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 );
@@ -104,6 +116,25 @@ public class XmlRpcAuthenticator
{
return securitySystem.authorize( session, ArchivaRoleConstants.OPERATION_RUN_INDEXER );
}
+ else if ( ServiceMethodsPermissionsMapping.SERVICE_METHODS_FOR_OPERATION_REPOSITORY_ACCESS.contains( methodName ) )
+ {
+ try
+ {
+ List<String> observableRepos = userRepositories.getObservableRepositoryIds( username );
+ if( observableRepos != null && observableRepos.size() > 1 )
+ {
+ return new AuthorizationResult( true, username, null );
+ }
+ else
+ {
+ return new AuthorizationResult( false, username, null );
+ }
+ }
+ catch ( ArchivaSecurityException e )
+ {
+ throw new XmlRpcException( 401, e.getMessage() );
+ }
+ }
else
{
return securitySystem.authorize( session, ArchivaRoleConstants.GLOBAL_REPOSITORY_MANAGER_ROLE );
@@ -114,4 +145,9 @@ public class XmlRpcAuthenticator
throw new XmlRpcException( 401, e.getMessage(), e );
}
}
+
+ public String getActiveUser()
+ {
+ return username;
+ }
}
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcUserRepositories.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcUserRepositories.java
new file mode 100644
index 000000000..996458e95
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-security/src/main/java/org/apache/archiva/web/xmlrpc/security/XmlRpcUserRepositories.java
@@ -0,0 +1,48 @@
+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.List;
+
+import org.apache.maven.archiva.security.ArchivaSecurityException;
+import org.apache.maven.archiva.security.PrincipalNotFoundException;
+import org.apache.maven.archiva.security.UserRepositories;
+import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
+
+public class XmlRpcUserRepositories
+{
+ private UserRepositories userRepositories;
+
+ private AuthenticationHandler authnHandler;
+
+ public XmlRpcUserRepositories( UserRepositories userRepositories, AuthenticationHandler authnHandler )
+ {
+ this.userRepositories = userRepositories;
+ this.authnHandler = authnHandler;
+ }
+
+ public List<String> getObservableRepositories()
+ throws PrincipalNotFoundException, ArchivaSecurityException
+ {
+ XmlRpcAuthenticator xmlRpcAuthn = (XmlRpcAuthenticator) authnHandler;
+
+ return userRepositories.getObservableRepositoryIds( xmlRpcAuthn.getActiveUser() );
+ }
+}
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
index 721aa828d..e3640d249 100644
--- 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
@@ -89,7 +89,7 @@ public class XmlRpcAuthenticatorTest
xmlRpcRequestControl = MockControl.createControl( XmlRpcRequest.class );
xmlRpcRequest = ( XmlRpcRequest ) xmlRpcRequestControl.getMock();
- authenticator = new XmlRpcAuthenticator( securitySystem );
+ authenticator = new XmlRpcAuthenticator( securitySystem, null );
}
private User createUser( String principal, String fullname, String password )
@@ -131,7 +131,7 @@ public class XmlRpcAuthenticatorTest
configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
- "AdministrationService.getAllManagedRepositories" );
+ "AdministrationService.getAllManagedRepositories", 2 );
xmlRpcRequestControl.replay();
configControl.replay();
@@ -171,7 +171,7 @@ public class XmlRpcAuthenticatorTest
configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
- "AdministrationService.getAllManagedRepositories" );
+ "AdministrationService.getAllManagedRepositories", 2 );
xmlRpcRequestControl.replay();
configControl.replay();
@@ -205,7 +205,7 @@ public class XmlRpcAuthenticatorTest
configControl.expectAndReturn( config.getBasicPassword(), PASSWORD );
xmlRpcRequestControl.expectAndReturn( xmlRpcRequest.getMethodName(),
- "AdministrationService.getAllManagedRepositories" );
+ "AdministrationService.getAllManagedRepositories", 2 );
xmlRpcRequestControl.replay();
configControl.replay();
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
index 8d68c8df3..edb8e9a00 100644
--- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/pom.xml
@@ -33,6 +33,36 @@
<name>Archiva Web :: XML-RPC Services</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.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xmlrpc-security</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-model</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-security</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-indexer</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-xmlrpc-api</artifactId>
</dependency>
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java
new file mode 100644
index 000000000..407412466
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java
@@ -0,0 +1,205 @@
+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.Date;
+import java.util.List;
+
+import org.apache.archiva.indexer.util.SearchUtil;
+import org.apache.archiva.web.xmlrpc.api.SearchService;
+import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
+import org.apache.archiva.web.xmlrpc.security.XmlRpcUserRepositories;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.browsing.BrowsingResults;
+import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
+import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
+import org.apache.maven.archiva.indexer.search.CrossRepositorySearch;
+import org.apache.maven.archiva.indexer.search.SearchResultHit;
+import org.apache.maven.archiva.indexer.search.SearchResultLimits;
+import org.apache.maven.archiva.indexer.search.SearchResults;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+
+/**
+ * SearchServiceImpl
+ *
+ * @version $Id: SearchServiceImpl.java
+ */
+public class SearchServiceImpl
+ implements SearchService
+{
+
+ private CrossRepositorySearch crossRepoSearch;
+
+ private XmlRpcUserRepositories xmlRpcUserRepositories;
+
+ private ArchivaDAO archivaDAO;
+
+ private RepositoryBrowsing repoBrowsing;
+
+ public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories, CrossRepositorySearch crossRepoSearch,
+ ArchivaDAO archivaDAO, RepositoryBrowsing repoBrowsing )
+ {
+ this.xmlRpcUserRepositories = xmlRpcUserRepositories;
+ this.crossRepoSearch = crossRepoSearch;
+ this.archivaDAO = archivaDAO;
+ this.repoBrowsing = repoBrowsing;
+ }
+
+ /*
+ * quick/general text search which returns a list of artifacts
+ * query for an artifact based on a checksum
+ * query for all available versions of an artifact, sorted in version significance order
+ * query for all available versions of an artifact since a given date
+ * query for an artifact's direct dependencies
+ * query for an artifact's dependency tree (as with mvn dependency:tree - no duplicates should be included)
+ * query for all artifacts that depend on a given artifact
+ */
+
+ public List<Artifact> quickSearch( String queryString )
+ throws Exception
+ {
+ // 1. check whether bytecode search or ordinary search
+ // 2. get observable repos
+ // 3. convert results to a list of Artifact objects
+
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
+ SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
+ SearchResults results = null;
+
+ if( SearchUtil.isBytecodeSearch( queryString ) )
+ {
+ results = crossRepoSearch.searchForBytecode( "", observableRepos, SearchUtil.removeBytecodeKeyword( queryString ), limits );
+ }
+ else
+ {
+ results = crossRepoSearch.searchForTerm( "", observableRepos, queryString, limits );
+ }
+
+ List<SearchResultHit> hits = results.getHits();
+ for( SearchResultHit hit : hits )
+ {
+ ArtifactDAO artifactDAO = archivaDAO.getArtifactDAO();
+ ArchivaArtifact pomArtifact = artifactDAO.getArtifact(
+ hit.getGroupId(), hit.getArtifactId(), hit.getVersion(), "", "pom" );
+
+ if( pomArtifact != null )
+ {
+ Artifact artifact = new Artifact( pomArtifact.getModel().getRepositoryId(), pomArtifact.getGroupId(), pomArtifact.getArtifactId(), pomArtifact.getVersion(),
+ pomArtifact.getType(), pomArtifact.getModel().getWhenGathered() );
+ artifacts.add( artifact );
+ }
+ else
+ {
+ continue;
+ }
+ }
+
+ return artifacts;
+ }
+
+ public List<Artifact> getArtifactByChecksum( String checksum )
+ throws Exception
+ {
+ // 1. get ArtifactDAO from ArchivaDAO
+ // 2. create ArtifactsByChecksumConstraint( "queryTerm" )
+ // 3. query artifacts using constraint
+ // 4. convert results to list of Artifact objects
+
+ List<Artifact> results = new ArrayList<Artifact>();
+ ArtifactDAO artifactDAO = archivaDAO.getArtifactDAO();
+
+ ArtifactsByChecksumConstraint constraint = new ArtifactsByChecksumConstraint( checksum );
+ List<ArchivaArtifact> artifacts = artifactDAO.queryArtifacts( constraint );
+
+ for( ArchivaArtifact archivaArtifact : artifacts )
+ {
+ Artifact artifact = new Artifact( archivaArtifact.getModel().getRepositoryId(), archivaArtifact.getModel().getGroupId(),
+ archivaArtifact.getModel().getArtifactId(), archivaArtifact.getModel().getVersion(), archivaArtifact.getType(),
+ archivaArtifact.getModel().getWhenGathered() );
+ results.add( artifact );
+ }
+
+ return results;
+ }
+
+ public List<Artifact> getArtifactVersions( String groupId, String artifactId )
+ throws Exception
+ {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+ List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
+
+ BrowsingResults results = repoBrowsing.selectArtifactId( "", observableRepos, groupId, artifactId );
+ ArtifactDAO artifactDAO = archivaDAO.getArtifactDAO();
+
+ for( String version : results.getVersions() )
+ {
+ ArchivaArtifact pomArtifact = artifactDAO.getArtifact( groupId, artifactId, version, "", "pom" );
+ Artifact artifact = new Artifact( "", groupId, artifactId, version, pomArtifact.getType(),
+ pomArtifact.getModel().getWhenGathered() );
+
+ artifacts.add( artifact );
+ }
+
+ // 1. get observable repositories
+ // 2. use RepositoryBrowsing method to query uniqueVersions?
+ return artifacts;
+ }
+
+ public List<Artifact> getArtifactVersionsByDate( String groupId, String artifactId, String version, Date since )
+ throws Exception
+ {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+
+ // 1. get observable repositories
+ // 2. use RepositoryBrowsing method to query uniqueVersions? (but with date)
+
+ return artifacts;
+ }
+
+ public List<Artifact> getDirectDependencies( String repositoryId, String groupId, String artifactId, String version )
+ throws Exception
+ {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+
+ return artifacts;
+ }
+
+ public List<Artifact> getDependencyTree( String groupId, String artifactId, String version )
+ throws Exception
+ {
+ List<Artifact> a = new ArrayList<Artifact>();
+
+ return a;
+ }
+
+ //get artifacts that depend on a given artifact
+ public List<Artifact> getDependees( String groupId, String artifactId, String version )
+ throws Exception
+ {
+ List<Artifact> artifacts = new ArrayList<Artifact>();
+
+ // repo browsing usedBy?
+
+ return artifacts;
+ }
+} \ No newline at end of file
diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java
new file mode 100644
index 000000000..a03f2ace7
--- /dev/null
+++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java
@@ -0,0 +1,387 @@
+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.Date;
+import java.util.List;
+
+import org.apache.archiva.web.xmlrpc.api.SearchService;
+import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
+import org.apache.archiva.web.xmlrpc.security.XmlRpcAuthenticator;
+import org.apache.archiva.web.xmlrpc.security.XmlRpcUserRepositories;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.FileTypes;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.browsing.BrowsingResults;
+import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
+import org.apache.maven.archiva.database.constraints.ArtifactsByChecksumConstraint;
+import org.apache.maven.archiva.indexer.filecontent.FileContentRecord;
+import org.apache.maven.archiva.indexer.lucene.LuceneRepositoryContentRecord;
+import org.apache.maven.archiva.indexer.search.CrossRepositorySearch;
+import org.apache.maven.archiva.indexer.search.SearchResultLimits;
+import org.apache.maven.archiva.indexer.search.SearchResults;
+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.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
+import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
+import org.apache.maven.archiva.repository.content.PathParser;
+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.ArgumentsMatcher;
+import org.easymock.MockControl;
+import org.easymock.classextension.MockClassControl;
+
+import sun.security.action.GetLongAction;
+
+/**
+ * SearchServiceImplTest
+ *
+ * @version $Id: SearchServiceImplTest.java
+ */
+public class SearchServiceImplTest
+ extends PlexusInSpringTestCase
+{
+ private SearchService searchService;
+
+ private MockControl userReposControl;
+
+ private XmlRpcUserRepositories userRepos;
+
+ private MockControl crossRepoSearchControl;
+
+ private CrossRepositorySearch crossRepoSearch;
+
+ private MockControl archivaDAOControl;
+
+ private ArchivaDAO archivaDAO;
+
+ private MockControl artifactDAOControl;
+
+ private ArtifactDAO artifactDAO;
+
+ private MockControl repoBrowsingControl;
+
+ private RepositoryBrowsing repoBrowsing;
+
+ public void setUp()
+ throws Exception
+ {
+ userReposControl = MockClassControl.createControl( XmlRpcUserRepositories.class );
+ userRepos = ( XmlRpcUserRepositories ) userReposControl.getMock();
+
+ crossRepoSearchControl = MockControl.createControl( CrossRepositorySearch.class );
+ crossRepoSearch = ( CrossRepositorySearch ) crossRepoSearchControl.getMock();
+
+ archivaDAOControl = MockControl.createControl( ArchivaDAO.class );
+ archivaDAO = ( ArchivaDAO ) archivaDAOControl.getMock();
+
+ repoBrowsingControl = MockControl.createControl( RepositoryBrowsing.class );
+ repoBrowsing = ( RepositoryBrowsing ) repoBrowsingControl.getMock();
+
+ searchService = new SearchServiceImpl( userRepos, crossRepoSearch, archivaDAO, repoBrowsing );
+
+ artifactDAOControl = MockControl.createControl( ArtifactDAO.class );
+ artifactDAO = ( ArtifactDAO ) artifactDAOControl.getMock();
+ }
+
+ /*
+ * quick/general text search which returns a list of artifacts
+ * query for an artifact based on a checksum
+ * query for all available versions of an artifact, sorted in version significance order
+ * query for all available versions of an artifact since a given date
+ * query for an artifact's direct dependencies
+ * query for an artifact's dependency tree (as with mvn dependency:tree - no duplicates should be included)
+ * query for all artifacts that depend on a given artifact
+ */
+
+ /* quick search */
+
+ public void testQuickSearchArtifactBytecodeSearch()
+ throws Exception
+ {
+ // 1. check whether bytecode search or ordinary search
+ // 2. get observable repos
+ // 3. convert results to a list of Artifact objects
+
+ List<String> observableRepoIds = new ArrayList<String>();
+ observableRepoIds.add( "repo1.mirror" );
+ observableRepoIds.add( "public.releases" );
+
+ userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
+
+ Date whenGathered = new Date();
+ SearchResults results = new SearchResults();
+ ArchivaArtifact artifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", "1.0", "", "jar" );
+ artifact.getModel().setWhenGathered( whenGathered );
+
+ FileContentRecord record = new FileContentRecord();
+ record.setRepositoryId( "repo1.mirror" );
+ record.setArtifact( artifact );
+ record.setContents( "org.apache.archiva:archiva-test:1.0:jar org.apache.archiva.test.MyClassName" );
+ record.setFilename( "archiva-test-1.0.jar" );
+
+ results.addHit( record );
+
+ SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
+
+ crossRepoSearchControl.expectAndDefaultReturn(
+ crossRepoSearch.searchForBytecode( "", observableRepoIds, "MyClassName", limits ), results );
+
+ archivaDAOControl.expectAndReturn( archivaDAO.getArtifactDAO(), artifactDAO );
+ artifactDAOControl.expectAndReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", "1.0", "", "pom" ), artifact );
+
+ userReposControl.replay();
+ crossRepoSearchControl.replay();
+ archivaDAOControl.replay();
+ artifactDAOControl.replay();
+
+ List<Artifact> artifacts = searchService.quickSearch( "bytecode:MyClassName" );
+
+ userReposControl.verify();
+ crossRepoSearchControl.verify();
+ archivaDAOControl.verify();
+ artifactDAOControl.verify();
+
+ assertNotNull( artifacts );
+ assertEquals( 1, artifacts.size() );
+ }
+
+ public void testQuickSearchArtifactRegularSearch()
+ throws Exception
+ {
+ List<String> observableRepoIds = new ArrayList<String>();
+ observableRepoIds.add( "repo1.mirror" );
+ observableRepoIds.add( "public.releases" );
+
+ userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
+
+ Date whenGathered = new Date();
+ SearchResults results = new SearchResults();
+ ArchivaArtifact artifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", "1.0", "", "jar" );
+ artifact.getModel().setWhenGathered( whenGathered );
+
+ FileContentRecord record = new FileContentRecord();
+ record.setRepositoryId( "repo1.mirror" );
+ record.setArtifact( artifact );
+ record.setContents( "org.apache.archiva:archiva-test:1.0:jar" );
+ record.setFilename( "archiva-test-1.0.jar" );
+
+ results.addHit( record );
+
+ SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
+
+ crossRepoSearchControl.expectAndDefaultReturn(
+ crossRepoSearch.searchForTerm( "", observableRepoIds, "archiva", limits ), results );
+
+ archivaDAOControl.expectAndReturn( archivaDAO.getArtifactDAO(), artifactDAO );
+ artifactDAOControl.expectAndReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", "1.0", "", "pom" ), artifact );
+
+ userReposControl.replay();
+ crossRepoSearchControl.replay();
+ archivaDAOControl.replay();
+ artifactDAOControl.replay();
+
+ List<Artifact> artifacts = searchService.quickSearch( "archiva" );
+
+ userReposControl.verify();
+ crossRepoSearchControl.verify();
+ archivaDAOControl.verify();
+ artifactDAOControl.verify();
+
+ assertNotNull( artifacts );
+ assertEquals( 1, artifacts.size() );
+ }
+
+/* query artifact by checksum */
+
+ public void testGetArtifactByChecksum()
+ throws Exception
+ {
+ Date whenGathered = new Date();
+
+ ArtifactsByChecksumConstraint constraint = new ArtifactsByChecksumConstraint( "a1b2c3aksjhdasfkdasasd" );
+ List<ArchivaArtifact> artifacts = new ArrayList<ArchivaArtifact>();
+ ArchivaArtifact artifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", "1.0", "", "jar" );
+ artifact.getModel().setWhenGathered( whenGathered );
+ artifacts.add( artifact );
+
+ archivaDAOControl.expectAndReturn( archivaDAO.getArtifactDAO(), artifactDAO );
+ artifactDAO.queryArtifacts( constraint );
+ artifactDAOControl.setMatcher( MockControl.ALWAYS_MATCHER );
+ artifactDAOControl.setReturnValue( artifacts );
+
+ archivaDAOControl.replay();
+ artifactDAOControl.replay();
+
+ List<Artifact> results = searchService.getArtifactByChecksum( "a1b2c3aksjhdasfkdasasd" );
+
+ archivaDAOControl.verify();
+ artifactDAOControl.verify();
+
+ assertNotNull( results );
+ assertEquals( 1, results.size() );
+ }
+
+/* query artifact versions */
+
+ public void testGetArtifactVersionsArtifactExists()
+ throws Exception
+ {
+ Date whenGathered = new Date();
+
+ List<String> observableRepoIds = new ArrayList<String>();
+ observableRepoIds.add( "repo1.mirror" );
+ observableRepoIds.add( "public.releases" );
+
+ List<String> versions = new ArrayList<String>();
+ versions.add( "1.0" );
+ versions.add( "1.1-beta-1" );
+ versions.add( "1.1-beta-2" );
+ versions.add( "1.1" );
+ versions.add( "1.2" );
+ versions.add( "1.2.1-SNAPSHOT" );
+
+ BrowsingResults results = new BrowsingResults( "org.apache.archiva", "archiva-test" );
+ results.setSelectedRepositoryIds( observableRepoIds );
+ results.setVersions( versions );
+
+ List<ArchivaArtifact> archivaArtifacts = new ArrayList<ArchivaArtifact>();
+ ArchivaArtifact archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 0 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 1 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 2 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 3 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 4 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ archivaArtifact = new ArchivaArtifact( "org.apache.archiva", "archiva-test", versions.get( 5 ), "", "pom" );
+ archivaArtifact.getModel().setWhenGathered( whenGathered );
+ archivaArtifacts.add( archivaArtifact );
+
+ userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
+ repoBrowsingControl.expectAndReturn( repoBrowsing.selectArtifactId( "", observableRepoIds, "org.apache.archiva", "archiva-test" ), results );
+ archivaDAOControl.expectAndReturn( archivaDAO.getArtifactDAO(), artifactDAO );
+
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 0 ), "", "pom" ), archivaArtifacts.get( 0 ) );
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 1 ), "", "pom" ), archivaArtifacts.get( 1 ) );
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 2 ), "", "pom" ), archivaArtifacts.get( 2 ) );
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 3 ), "", "pom" ), archivaArtifacts.get( 3 ) );
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 4 ), "", "pom" ), archivaArtifacts.get( 4 ) );
+ artifactDAOControl.expectAndDefaultReturn( artifactDAO.getArtifact( "org.apache.archiva", "archiva-test", versions.get( 5 ), "", "pom" ), archivaArtifacts.get( 5 ) );
+
+ userReposControl.replay();
+ repoBrowsingControl.replay();
+ archivaDAOControl.replay();
+ artifactDAOControl.replay();
+
+ List<Artifact> artifacts = searchService.getArtifactVersions( "org.apache.archiva", "archiva-test" );
+
+ userReposControl.verify();
+ repoBrowsingControl.verify();
+ archivaDAOControl.verify();
+ artifactDAOControl.verify();
+
+ assertNotNull( artifacts );
+ assertEquals( 6, artifacts.size() );
+ }
+
+/* query artifact versions since a given date */
+
+ public void testGetArtifactVersionsByDateArtifactExists()
+ throws Exception
+ {
+
+ }
+
+ public void testGetArtifactVersionsByDateArtifactDoesNotExist()
+ throws Exception
+ {
+
+ }
+
+/* query artifact dependencies */
+
+ public void testGetDependenciesArtifactExists()
+ throws Exception
+ {
+
+ }
+
+ public void testGetDependenciesArtifactDoesNotExist()
+ throws Exception
+ {
+
+ }
+
+/* get dependency tree */
+
+ public void testGetDependencyTreeArtifactExists()
+ throws Exception
+ {
+
+ }
+
+ public void testGetDependencyTreeArtifactDoesNotExist()
+ throws Exception
+ {
+
+ }
+
+/* get dependees */
+
+ public void testGetDependeneesArtifactExists()
+ throws Exception
+ {
+
+ }
+
+ public void testGetDependeneesArtifactDoesNotExist()
+ throws Exception
+ {
+
+ }
+} \ 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.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
index e69de29bb..f80e1dec1 100644
--- 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
@@ -0,0 +1,18 @@
+<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>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-test</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0</version>
+ <name>Maven Quick Start Archetype</name>
+ <url>http://maven.apache.org</url>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>