git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1177069 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.4-M1
@@ -450,8 +450,6 @@ public class NexusRepositorySearch | |||
hit.setArtifactId( artifactInfo.artifactId ); | |||
hit.setGroupId( artifactInfo.groupId ); | |||
hit.setRepositoryId( artifactInfo.repository ); | |||
// FIXME archiva url ?? | |||
hit.setUrl( artifactInfo.repository + "/" + artifactInfo.fname ); | |||
hit.addVersion( artifactInfo.version ); | |||
hit.setBundleExportPackage( artifactInfo.bundleExportPackage ); | |||
hit.setBundleExportService( artifactInfo.bundleExportService ); | |||
@@ -459,7 +457,6 @@ public class NexusRepositorySearch | |||
hit.setBundleVersion( artifactInfo.bundleVersion ); | |||
hit.setBundleDescription( artifactInfo.bundleDescription ); | |||
hit.setBundleDocUrl( artifactInfo.bundleDocUrl ); | |||
hit.setBundleRequireBundle( artifactInfo.bundleRequireBundle ); | |||
hit.setBundleImportPackage( artifactInfo.bundleImportPackage ); | |||
hit.setBundleLicense( artifactInfo.bundleLicense ); | |||
@@ -469,7 +466,6 @@ public class NexusRepositorySearch | |||
hit.setPrefix( artifactInfo.prefix ); | |||
hit.setPackaging( artifactInfo.packaging ); | |||
hit.setClassifier( artifactInfo.classifier ); | |||
// sure ?? | |||
hit.setUrl( artifactInfo.remoteUrl ); | |||
} | |||
@@ -30,6 +30,8 @@ import org.apache.archiva.rest.api.model.Dependency; | |||
import org.apache.archiva.rest.api.model.SearchRequest; | |||
import org.apache.archiva.rest.api.services.ArchivaRestServiceException; | |||
import org.apache.archiva.rest.api.services.SearchService; | |||
import org.apache.archiva.rest.services.interceptors.HttpContext; | |||
import org.apache.archiva.rest.services.interceptors.HttpContextThreadLocal; | |||
import org.apache.archiva.security.AccessDeniedException; | |||
import org.apache.archiva.security.ArchivaSecurityException; | |||
import org.apache.archiva.security.PrincipalNotFoundException; | |||
@@ -43,6 +45,7 @@ import org.slf4j.LoggerFactory; | |||
import org.springframework.stereotype.Service; | |||
import javax.inject.Inject; | |||
import javax.servlet.http.HttpServletRequest; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.List; | |||
@@ -78,7 +81,7 @@ public class DefaultSearchService | |||
SearchResults searchResults = | |||
repositorySearch.search( getPrincipal(), getObservableRepos(), queryString, limits, | |||
Collections.<String>emptyList() ); | |||
return getArtifacts( searchResults); | |||
return getArtifacts( searchResults ); | |||
} | |||
catch ( RepositorySearchException e ) | |||
@@ -182,6 +185,8 @@ public class DefaultSearchService | |||
protected List<Artifact> getArtifacts( SearchResults searchResults ) | |||
{ | |||
HttpContext httpContext = HttpContextThreadLocal.get(); | |||
if ( searchResults == null || searchResults.isEmpty() ) | |||
{ | |||
return Collections.emptyList(); | |||
@@ -221,11 +226,13 @@ public class DefaultSearchService | |||
// FIXME archiva url ?? | |||
Artifact versionned = new BeanReplicator().replicateBean( hit, Artifact.class ); | |||
if ( StringUtils.isNotBlank( version ) ) | |||
{ | |||
versionned.setVersion( version ); | |||
versionned.setUrl( getArtifactUrl( httpContext, versionned ) ); | |||
artifacts.add( versionned ); | |||
artifacts.add( versionned ); | |||
} | |||
} | |||
@@ -233,4 +240,47 @@ public class DefaultSearchService | |||
} | |||
return artifacts; | |||
} | |||
private String getArtifactUrl( HttpContext httpContext, Artifact artifact ) | |||
{ | |||
if ( httpContext == null ) | |||
{ | |||
return null; | |||
} | |||
if ( httpContext.getHttpServletRequest() == null ) | |||
{ | |||
return null; | |||
} | |||
StringBuilder sb = new StringBuilder( getBaseUrl( httpContext.getHttpServletRequest() ) ); | |||
sb.append( "/repository" ); | |||
if ( StringUtils.startsWith( artifact.getContext(), "remote-" ) ) | |||
{ | |||
// if context is 'remote-*' we have to set a repo which the current user can use | |||
} | |||
else | |||
{ | |||
sb.append( '/' ).append( artifact.getContext() ); | |||
} | |||
sb.append( '/' ).append( StringUtils.replaceChars( artifact.getGroupId(), '.', '/' ) ); | |||
sb.append( '/' ).append( artifact.getArtifactId() ); | |||
sb.append( '/' ).append( artifact.getVersion() ); | |||
sb.append( '/' ).append( artifact.getArtifactId() ); | |||
if ( StringUtils.isNotBlank( artifact.getClassifier() ) ) | |||
{ | |||
sb.append( '-' ).append( artifact.getClassifier() ); | |||
} | |||
sb.append( '-' ).append( artifact.getVersion() ); | |||
sb.append( '.' ).append( artifact.getPackaging() ); | |||
return sb.toString(); | |||
} | |||
protected String getBaseUrl( HttpServletRequest req ) | |||
{ | |||
return req.getScheme() + "://" + req.getServerName() | |||
+ ( req.getServerPort() == 80 ? "" : ":" + req.getServerPort() ) + req.getContextPath(); | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
package org.apache.archiva.rest.services.interceptors; | |||
/* | |||
* 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 javax.servlet.http.HttpServletRequest; | |||
import java.io.Serializable; | |||
/** | |||
* @author Olivier Lamy | |||
* @since 1.4 | |||
*/ | |||
public class HttpContext | |||
implements Serializable | |||
{ | |||
private HttpServletRequest httpServletRequest; | |||
public HttpContext() | |||
{ | |||
// no op | |||
} | |||
public HttpServletRequest getHttpServletRequest() | |||
{ | |||
return httpServletRequest; | |||
} | |||
public HttpContext setHttpServletRequest( HttpServletRequest httpServletRequest ) | |||
{ | |||
this.httpServletRequest = httpServletRequest; | |||
return this; | |||
} | |||
} |
@@ -0,0 +1,41 @@ | |||
package org.apache.archiva.rest.services.interceptors; | |||
/* | |||
* 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.codehaus.redback.rest.services.RedbackRequestInformation; | |||
/** | |||
* @author Olivier Lamy | |||
* @since 1.4 | |||
*/ | |||
public class HttpContextThreadLocal | |||
{ | |||
private static final ThreadLocal<HttpContext> userThreadLocal = | |||
new ThreadLocal<HttpContext>(); | |||
public static void set( HttpContext httpContext ) | |||
{ | |||
userThreadLocal.set( httpContext ); | |||
} | |||
public static HttpContext get() | |||
{ | |||
return userThreadLocal.get(); | |||
} | |||
} |
@@ -0,0 +1,77 @@ | |||
package org.apache.archiva.rest.services.interceptors; | |||
/* | |||
* 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.cxf.interceptor.Fault; | |||
import org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor; | |||
import org.apache.cxf.jaxrs.model.OperationResourceInfo; | |||
import org.apache.cxf.message.Message; | |||
import org.apache.cxf.phase.AbstractPhaseInterceptor; | |||
import org.apache.cxf.phase.Phase; | |||
import org.apache.cxf.phase.PhaseInterceptor; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.stereotype.Service; | |||
import javax.ws.rs.core.Response; | |||
/** | |||
* @author Olivier Lamy | |||
* @since 1.4 | |||
*/ | |||
@Service( "httpContextThreadLocalCleaner#rest" ) | |||
public class HttpContextThreadLocalCleaner | |||
extends AbstractPhaseInterceptor<Message> | |||
implements PhaseInterceptor<Message> | |||
{ | |||
private Logger log = LoggerFactory.getLogger( getClass() ); | |||
public HttpContextThreadLocalCleaner( String phase ) | |||
{ | |||
super( phase ); | |||
addAfter( JAXRSInInterceptor.class.getName() ); | |||
} | |||
public HttpContextThreadLocalCleaner() | |||
{ | |||
super( Phase.PRE_STREAM ); | |||
addAfter( JAXRSInInterceptor.class.getName() ); | |||
} | |||
public Response handleResponse( Message message, OperationResourceInfo operationResourceInfo, Response response ) | |||
{ | |||
log.debug( "handleResponse" ); | |||
cleanup(); | |||
return null; | |||
} | |||
private void cleanup() | |||
{ | |||
HttpContextThreadLocal.set( null ); | |||
} | |||
public void handleMessage( Message message ) | |||
throws Fault | |||
{ | |||
log.debug( "handleMessage" ); | |||
cleanup(); | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
package org.apache.archiva.rest.services.interceptors; | |||
/* | |||
* 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.cxf.jaxrs.ext.RequestHandler; | |||
import org.apache.cxf.jaxrs.model.ClassResourceInfo; | |||
import org.apache.cxf.message.Message; | |||
import org.springframework.stereotype.Service; | |||
import javax.servlet.http.HttpServletRequest; | |||
import javax.ws.rs.core.Response; | |||
/** | |||
* @author Olivier Lamy | |||
*/ | |||
@Service( "httpContextThreadLocalInterceptor#rest" ) | |||
public class HttpContextThreadLocalInterceptor | |||
implements RequestHandler | |||
{ | |||
public Response handleRequest( Message m, ClassResourceInfo resourceClass ) | |||
{ | |||
HttpContextThreadLocal.set( new HttpContext().setHttpServletRequest( getHttpServletRequest( m ) ) ); | |||
return null; | |||
} | |||
public HttpServletRequest getHttpServletRequest( Message message ) | |||
{ | |||
// FIXME use a constant from cxf | |||
return (HttpServletRequest) message.get( "HTTP.REQUEST" ); | |||
} | |||
} |
@@ -44,7 +44,7 @@ | |||
<jaxrs:providers> | |||
<ref bean="authenticationInterceptor#rest"/> | |||
<ref bean="permissionInterceptor#rest"/> | |||
<ref bean="repositoriesService#rest"/> | |||
<ref bean="httpContextThreadLocalInterceptor#rest"/> | |||
</jaxrs:providers> | |||
<jaxrs:serviceBeans> | |||
@@ -61,6 +61,7 @@ | |||
<jaxrs:outInterceptors> | |||
<ref bean="threadLocalUserCleaner#rest"/> | |||
<ref bean="httpContextThreadLocalCleaner#rest"/> | |||
</jaxrs:outInterceptors> | |||
</jaxrs:server> |
@@ -214,6 +214,7 @@ public class SearchServiceTest | |||
assertTrue( " not 1 results for Bundle ExportPackage org.apache.karaf.features.command.completers but " | |||
+ artifacts.size() + ":" + artifacts, artifacts.size() == 1 ); | |||
log.info( "artifcat url " + artifacts.get( 0 ).getUrl() ); | |||
deleteTestRepo( testRepoId, targetRepo ); | |||
} | |||