Author: olamy
Date: Wed Sep 28 21:34:34 2011
New Revision: 1177069

URL: http://svn.apache.org/viewvc?rev=1177069&view=rev
Log:
rest search service must provide the real url artifact

Added:
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
   (with props)
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
   (with props)
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
   (with props)
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
   (with props)
Modified:
    
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultSearchService.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java

Modified: 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java?rev=1177069&r1=1177068&r2=1177069&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-base/archiva-indexer/src/main/java/org/apache/archiva/indexer/search/NexusRepositorySearch.java
 Wed Sep 28 21:34:34 2011
@@ -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 );
             }
 

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultSearchService.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultSearchService.java?rev=1177069&r1=1177068&r2=1177069&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultSearchService.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultSearchService.java
 Wed Sep 28 21:34:34 2011
@@ -30,6 +30,8 @@ import org.apache.archiva.rest.api.model
 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();
+    }
 }

Added: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java?rev=1177069&view=auto
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
 (added)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
 Wed Sep 28 21:34:34 2011
@@ -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;
+    }
+}

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContext.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java?rev=1177069&view=auto
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
 (added)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
 Wed Sep 28 21:34:34 2011
@@ -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();
+    }
+}

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java?rev=1177069&view=auto
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
 (added)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
 Wed Sep 28 21:34:34 2011
@@ -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();
+    }
+}

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalCleaner.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java?rev=1177069&view=auto
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
 (added)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
 Wed Sep 28 21:34:34 2011
@@ -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" );
+    }
+}

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocalInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml?rev=1177069&r1=1177068&r2=1177069&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
 Wed Sep 28 21:34:34 2011
@@ -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>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java?rev=1177069&r1=1177068&r2=1177069&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/SearchServiceTest.java
 Wed Sep 28 21:34:34 2011
@@ -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 );
     }
 


Reply via email to