]> source.dussan.org Git - archiva.git/blob
3ece4b0a0347b61208b5a60a187bf3775e4ba4a9
[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.filelock.DefaultFileLockManager;
23 import org.apache.archiva.indexer.ArchivaIndexingContext;
24 import org.apache.archiva.repository.Repository;
25 import org.apache.archiva.repository.storage.fs.FilesystemStorage;
26 import org.apache.archiva.repository.storage.StorageAsset;
27 import org.apache.maven.index.context.IndexingContext;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 import java.io.IOException;
32 import java.nio.file.Files;
33 import java.nio.file.NoSuchFileException;
34 import java.nio.file.Path;
35 import java.sql.Date;
36 import java.time.ZonedDateTime;
37 import java.util.Set;
38 import java.util.concurrent.atomic.AtomicBoolean;
39
40 /**
41  * Maven implementation of index context
42  */
43 public class MavenIndexContext implements ArchivaIndexingContext {
44
45     private static final Logger log = LoggerFactory.getLogger(ArchivaIndexingContext.class);
46
47
48     private AtomicBoolean openStatus = new AtomicBoolean(false);
49     private IndexingContext delegate;
50     private Repository repository;
51     private StorageAsset dir = null;
52
53     protected MavenIndexContext(Repository repository, IndexingContext delegate) {
54         this.delegate = delegate;
55         this.repository = repository;
56         this.openStatus.set(true);
57
58     }
59
60     @Override
61     public String getId() {
62         return delegate.getId();
63     }
64
65     @Override
66     public Repository getRepository() {
67         return repository;
68     }
69
70     @Override
71     public StorageAsset getPath() {
72         if (dir==null) {
73             StorageAsset repositoryDirAsset = repository.getAsset("");
74             Path repositoryDir = repositoryDirAsset.getFilePath().toAbsolutePath();
75             Path indexDir = delegate.getIndexDirectoryFile().toPath();
76             if (indexDir.startsWith(repositoryDir)) {
77                 dir = repository.getAsset(repositoryDir.relativize(indexDir).toString());
78             } else {
79                 try {
80                     FilesystemStorage storage = new FilesystemStorage(indexDir, new DefaultFileLockManager());
81                     dir = storage.getAsset("");
82                 } catch (IOException e) {
83                     log.error("Error occured while creating storage for index dir");
84                 }
85             }
86         }
87         return dir;
88     }
89
90     @Override
91     public boolean isEmpty() throws IOException {
92         return Files.list(delegate.getIndexDirectoryFile().toPath()).count()==0;
93     }
94
95     @Override
96     public void commit() throws IOException {
97         delegate.commit();
98     }
99
100     @Override
101     public void rollback() throws IOException {
102         delegate.rollback();
103     }
104
105     @Override
106     public void optimize() throws IOException {
107         delegate.optimize();
108     }
109
110     @Override
111     public void close(boolean deleteFiles) throws IOException {
112         if (openStatus.compareAndSet(true,false)) {
113             try {
114                 delegate.close(deleteFiles);
115             } catch (NoSuchFileException e) {
116                 // Ignore missing directory
117             }
118         }
119     }
120
121     @Override
122     public void close() throws IOException {
123         if (openStatus.compareAndSet(true,false)) {
124             try {
125                 delegate.close(false);
126             } catch (NoSuchFileException e) {
127                 // Ignore missing directory
128             }
129         }
130     }
131
132     @Override
133     public boolean isOpen() {
134         return openStatus.get();
135     }
136
137     @Override
138     public void purge() throws IOException {
139         delegate.purge();
140     }
141
142     @Override
143     public boolean supports(Class<?> clazz) {
144         return IndexingContext.class.equals(clazz);
145     }
146
147     @SuppressWarnings( "unchecked" )
148     @Override
149     public <T> T getBaseContext(Class<T> clazz) throws UnsupportedOperationException {
150         if (IndexingContext.class.equals(clazz)) {
151             return (T) delegate;
152         } else {
153             throw new UnsupportedOperationException("The class "+clazz+" is not supported by the maven indexer");
154         }
155     }
156
157     @Override
158     public Set<String> getGroups() throws IOException {
159         return delegate.getAllGroups();
160     }
161
162     @Override
163     public void updateTimestamp(boolean save) throws IOException {
164         delegate.updateTimestamp(save);
165     }
166
167     @Override
168     public void updateTimestamp(boolean save, ZonedDateTime time) throws IOException {
169         delegate.updateTimestamp(save, Date.from(time.toInstant()));
170     }
171
172
173 }