]> source.dussan.org Git - archiva.git/blob
12d85864838e68d5d85b1ff8abf04d4babdacfa3
[archiva.git] /
1 package org.apache.archiva.indexer.maven;
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 org.apache.archiva.common.utils.PathUtil;
23 import org.apache.archiva.configuration.ArchivaConfiguration;
24 import org.apache.archiva.indexer.ArchivaIndexManager;
25 import org.apache.archiva.indexer.ArchivaIndexingContext;
26 import org.apache.archiva.model.ArtifactReference;
27 import org.apache.archiva.repository.ManagedRepository;
28 import org.apache.archiva.repository.RemoteRepository;
29 import org.apache.archiva.repository.Repository;
30 import org.apache.archiva.repository.RepositoryType;
31 import org.apache.archiva.repository.features.RemoteIndexFeature;
32 import org.apache.maven.index.Indexer;
33 import org.apache.maven.index.context.IndexCreator;
34 import org.apache.maven.index.context.IndexingContext;
35 import org.apache.maven.index_shaded.lucene.index.IndexFormatTooOldException;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38 import org.springframework.stereotype.Service;
39
40 import javax.inject.Inject;
41 import java.io.IOException;
42 import java.net.URI;
43 import java.nio.file.Files;
44 import java.nio.file.Path;
45 import java.util.List;
46
47 /**
48  * Maven implementation of index manager
49  */
50 @Service("archivaIndexManager#maven")
51 public class MavenIndexManager implements ArchivaIndexManager {
52
53     private static final Logger log = LoggerFactory.getLogger(MavenIndexManager.class);
54
55     @Inject
56     private Indexer indexer;
57
58     @Inject
59     private List<? extends IndexCreator> indexCreators;
60
61     @Inject
62     private ArchivaConfiguration archivaConfiguration;
63
64     @Override
65     public void pack(ArchivaIndexingContext context) {
66
67     }
68
69     @Override
70     public void scan(ArchivaIndexingContext context, boolean update) {
71
72     }
73
74     @Override
75     public void update(ArchivaIndexingContext context, URI remoteUpdateUri, boolean fullUpdate) {
76
77     }
78
79     @Override
80     public void addArtifactToIndex(ArchivaIndexingContext context, ArtifactReference artifactReference) {
81
82     }
83
84     @Override
85     public void removeArtifactFromIndex(ArchivaIndexingContext context, ArtifactReference artifactReference) {
86
87     }
88
89     @Override
90     public boolean supportsRepository(RepositoryType type) {
91         return false;
92     }
93
94     @Override
95     public ArchivaIndexingContext createContext(Repository remoteRepository) throws IOException {
96         IndexingContext mvnCtx = null;
97         if (remoteRepository instanceof RemoteRepository) {
98             mvnCtx = createRemoteContext((RemoteRepository) remoteRepository);
99         } else if (remoteRepository instanceof ManagedRepository) {
100             // TODO: Implement managed repository index creation
101             mvnCtx = null;
102         }
103         MavenIndexContext context = new MavenIndexContext(remoteRepository, mvnCtx);
104         return null;
105     }
106
107     private IndexingContext createRemoteContext(RemoteRepository remoteRepository) throws IOException {
108         Path appServerBase = archivaConfiguration.getAppServerBaseDir();
109
110         String contextKey = "remote-" + remoteRepository.getId();
111
112         // create remote repository path
113         Path repoDir = appServerBase.resolve( "data").resolve( "remotes" ).resolve( remoteRepository.getId() );
114         if ( !Files.exists(repoDir) )
115         {
116             Files.createDirectories(repoDir);
117         }
118
119         Path indexDirectory = null;
120
121         // is there configured indexDirectory ?
122         if (remoteRepository.supportsFeature(RemoteIndexFeature.class)) {
123             RemoteIndexFeature rif = remoteRepository.getFeature(RemoteIndexFeature.class).get();
124             indexDirectory = PathUtil.getPathFromUri(rif.getIndexUri());
125             if (!indexDirectory.isAbsolute()) {
126                 indexDirectory = repoDir.resolve(indexDirectory);
127             }
128
129             // if not configured use a default value
130             if (indexDirectory == null) {
131                 indexDirectory = repoDir.resolve(".index");
132             }
133             if (!Files.exists(indexDirectory)) {
134                 Files.createDirectories(indexDirectory);
135             }
136
137             try {
138
139                 return indexer.createIndexingContext(contextKey, remoteRepository.getId(), repoDir.toFile(), indexDirectory.toFile(),
140                         remoteRepository.getLocation() == null ? null : remoteRepository.getLocation().toString(),
141                         calculateIndexRemoteUrl(remoteRepository.getLocation(), rif),
142                         true, false,
143                         indexCreators);
144             } catch (IndexFormatTooOldException e) {
145                 // existing index with an old lucene format so we need to delete it!!!
146                 // delete it first then recreate it.
147                 log.warn("the index of repository {} is too old we have to delete and recreate it", //
148                         remoteRepository.getId());
149                 org.apache.archiva.common.utils.FileUtils.deleteDirectory(indexDirectory);
150                 return indexer.createIndexingContext(contextKey, remoteRepository.getId(), repoDir.toFile(), indexDirectory.toFile(),
151                         remoteRepository.getLocation() == null ? null : remoteRepository.getLocation().toString(),
152                         calculateIndexRemoteUrl(remoteRepository.getLocation(), rif),
153                         true, false,
154                         indexCreators);
155
156             }
157         } else {
158             throw new IOException("No remote index defined");
159         }
160     }
161
162     private String calculateIndexRemoteUrl(URI baseUri, RemoteIndexFeature rif) {
163         if (rif.getIndexUri()==null) {
164             return baseUri.resolve(".index").toString();
165         } else {
166             return baseUri.resolve(rif.getIndexUri()).toString();
167         }
168     }
169
170
171 }