]> source.dussan.org Git - archiva.git/blob
0e21d5d8819a3974f7f655516cb9d904aa3a45ae
[archiva.git] /
1 package org.apache.archiva.indexer.search;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements.  See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership.  The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License.  You may obtain a copy of the License at
11 *
12 *  http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied.  See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import junit.framework.TestCase;
23 import org.apache.archiva.admin.repository.managed.DefaultManagedRepositoryAdmin;
24 import org.apache.archiva.admin.repository.proxyconnector.DefaultProxyConnectorAdmin;
25 import org.apache.archiva.common.plexusbridge.MavenIndexerUtils;
26 import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
27 import org.apache.archiva.common.utils.FileUtil;
28 import org.apache.archiva.configuration.ArchivaConfiguration;
29 import org.apache.archiva.configuration.Configuration;
30 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
31 import org.apache.commons.io.FileUtils;
32 import org.apache.commons.lang.SystemUtils;
33 import org.apache.maven.index.ArtifactContext;
34 import org.apache.maven.index.ArtifactContextProducer;
35 import org.apache.maven.index.ArtifactScanningListener;
36 import org.apache.maven.index.NexusIndexer;
37 import org.apache.maven.index.ScanningResult;
38 import org.apache.maven.index.context.IndexingContext;
39 import org.easymock.MockControl;
40 import org.junit.After;
41 import org.junit.Before;
42 import org.junit.runner.RunWith;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.springframework.test.context.ContextConfiguration;
46 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
47
48 import javax.inject.Inject;
49 import java.io.File;
50 import java.util.List;
51
52 /**
53  * @author Olivier Lamy
54  */
55 @RunWith( SpringJUnit4ClassRunner.class )
56 @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
57 public abstract class AbstractNexusRepositorySearch
58     extends TestCase
59 {
60
61     protected Logger log = LoggerFactory.getLogger( getClass() );
62
63     public static String TEST_REPO_1 = "nexus-search-test-repo";
64
65     public static String TEST_REPO_2 = "nexus-search-test-repo-2";
66
67     NexusRepositorySearch search;
68
69     ArchivaConfiguration archivaConfig;
70
71     ArtifactContextProducer artifactContextProducer;
72
73     MockControl archivaConfigControl;
74
75     Configuration config;
76
77     @Inject
78     PlexusSisuBridge plexusSisuBridge;
79
80     @Inject
81     MavenIndexerUtils mavenIndexerUtils;
82
83     NexusIndexer nexusIndexer;
84
85     @Before
86     public void setUp()
87         throws Exception
88     {
89         super.setUp();
90
91         FileUtils.deleteDirectory( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_1 + "/.indexer" ) );
92         assertFalse( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_1 + "/.indexer" ).exists() );
93
94         FileUtils.deleteDirectory( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_2 + "/.indexer" ) );
95         assertFalse( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_2 + "/.indexer" ).exists() );
96
97         archivaConfigControl = MockControl.createControl( ArchivaConfiguration.class );
98
99         archivaConfig = (ArchivaConfiguration) archivaConfigControl.getMock();
100
101         DefaultManagedRepositoryAdmin defaultManagedRepositoryAdmin = new DefaultManagedRepositoryAdmin();
102         defaultManagedRepositoryAdmin.setArchivaConfiguration( archivaConfig );
103
104         DefaultProxyConnectorAdmin defaultProxyConnectorAdmin = new DefaultProxyConnectorAdmin();
105         defaultProxyConnectorAdmin.setArchivaConfiguration( archivaConfig );
106
107         search = new NexusRepositorySearch( plexusSisuBridge, defaultManagedRepositoryAdmin, mavenIndexerUtils,
108                                             defaultProxyConnectorAdmin );
109
110         nexusIndexer = plexusSisuBridge.lookup( NexusIndexer.class );
111
112         artifactContextProducer = plexusSisuBridge.lookup( ArtifactContextProducer.class );
113
114         config = new Configuration();
115         config.addManagedRepository( createRepositoryConfig( TEST_REPO_1 ) );
116         config.addManagedRepository( createRepositoryConfig( TEST_REPO_2 ) );
117     }
118
119     @After
120     public void tearDown()
121         throws Exception
122     {
123
124         for ( IndexingContext indexingContext : nexusIndexer.getIndexingContexts().values() )
125         {
126             nexusIndexer.removeIndexingContext( indexingContext, true );
127         }
128
129         FileUtils.deleteDirectory( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_1 ) );
130         assertFalse( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_1 ).exists() );
131
132         FileUtils.deleteDirectory( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_2 ) );
133         assertFalse( new File( FileUtil.getBasedir(), "/target/repos/" + TEST_REPO_2 ).exists() );
134
135         super.tearDown();
136     }
137
138     protected ManagedRepositoryConfiguration createRepositoryConfig( String repository )
139     {
140         ManagedRepositoryConfiguration repositoryConfig = new ManagedRepositoryConfiguration();
141         repositoryConfig.setId( repository );
142         repositoryConfig.setLocation( FileUtil.getBasedir() + "/target/repos/" + repository );
143         File f = new File( repositoryConfig.getLocation() );
144         if ( !f.exists() )
145         {
146             f.mkdirs();
147         }
148         repositoryConfig.setLayout( "default" );
149         repositoryConfig.setName( repository );
150         repositoryConfig.setScanned( true );
151         repositoryConfig.setSnapshots( false );
152         repositoryConfig.setReleases( true );
153
154         return repositoryConfig;
155     }
156
157     protected void createIndex( String repository, List<File> filesToBeIndexed, boolean scan )
158         throws Exception
159     {
160
161         IndexingContext context = nexusIndexer.getIndexingContexts().get( repository );
162
163         if ( context != null )
164         {
165             nexusIndexer.removeIndexingContext( context, true );
166         }
167
168         File indexerDirectory = new File( FileUtil.getBasedir(), "/target/repos/" + repository + "/.indexer" );
169
170         if ( indexerDirectory.exists() )
171         {
172             FileUtils.deleteDirectory( indexerDirectory );
173         }
174
175         assertFalse( indexerDirectory.exists() );
176
177         File lockFile = new File( FileUtil.getBasedir(), "/target/repos/" + repository + "/.indexer/write.lock" );
178         if ( lockFile.exists() )
179         {
180             lockFile.delete();
181         }
182
183         assertFalse( lockFile.exists() );
184
185         File repo = new File( FileUtil.getBasedir(), "src/test/" + repository );
186         assertTrue( repo.exists() );
187         File indexDirectory =
188             new File( FileUtil.getBasedir(), "target/index/test-" + Long.toString( System.currentTimeMillis() ) );
189         indexDirectory.deleteOnExit();
190         FileUtils.deleteDirectory( indexDirectory );
191
192         context = nexusIndexer.addIndexingContext( repository, repository, repo, indexDirectory,
193                                                    repo.toURI().toURL().toExternalForm(),
194                                                    indexDirectory.toURI().toURL().toString(),
195                                                    search.getAllIndexCreators() );
196
197         // minimize datas in memory
198         context.getIndexWriter().setMaxBufferedDocs( -1 );
199         context.getIndexWriter().setRAMBufferSizeMB( 1 );
200         for ( File artifactFile : filesToBeIndexed )
201         {
202             assertTrue( "file not exists " + artifactFile.getPath(), artifactFile.exists() );
203             ArtifactContext ac = artifactContextProducer.getArtifactContext( context, artifactFile );
204             nexusIndexer.addArtifactToIndex( ac, context );
205             context.updateTimestamp( true );
206         }
207
208         if ( scan )
209         {
210             nexusIndexer.scan( context, new ArtifactScanListener(), false );
211         }
212         // force flushing
213         context.getIndexWriter().commit();
214         context.getIndexWriter().close( true );
215         // wait for io flush ....
216         //Thread.sleep( 2000 );
217         context.setSearchable( true );
218
219     }
220
221     static class ArtifactScanListener
222         implements ArtifactScanningListener
223     {
224         protected Logger log = LoggerFactory.getLogger( getClass() );
225
226         public void scanningStarted( IndexingContext ctx )
227         {
228
229         }
230
231         public void scanningFinished( IndexingContext ctx, ScanningResult result )
232         {
233
234         }
235
236         public void artifactError( ArtifactContext ac, Exception e )
237         {
238             log.debug( "artifactError " + ac.getArtifact().getPath(), e );
239         }
240
241         public void artifactDiscovered( ArtifactContext ac )
242         {
243             log.debug( "artifactDiscovered {}:", ac.getArtifact().getPath(), ac.getArtifactInfo() );
244         }
245     }
246
247     public String niceDisplay( SearchResults searchResults )
248         throws Exception
249     {
250         StringBuilder sb = new StringBuilder();
251         for ( SearchResultHit hit : searchResults.getHits() )
252         {
253             sb.append( hit.toString() ).append( SystemUtils.LINE_SEPARATOR );
254         }
255         return sb.toString();
256     }
257 }