]> source.dussan.org Git - archiva.git/blob
ca45bb6176785f4f8d01f28e9e2b0a8492eca2fc
[archiva.git] /
1 package org.apache.archiva.consumers.core;
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.checksum.ChecksumAlgorithm;
23 import org.apache.archiva.checksum.ChecksummedFile;
24 import org.apache.archiva.configuration.ArchivaConfiguration;
25 import org.apache.archiva.configuration.FileTypes;
26 import org.apache.archiva.consumers.AbstractMonitoredConsumer;
27 import org.apache.archiva.consumers.ConsumerException;
28 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
29 import org.apache.archiva.repository.ManagedRepository;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32 import org.springframework.context.annotation.Scope;
33 import org.springframework.stereotype.Service;
34
35 import javax.annotation.PostConstruct;
36 import javax.inject.Inject;
37 import java.io.IOException;
38 import java.nio.file.Files;
39 import java.nio.file.Path;
40 import java.nio.file.Paths;
41 import java.util.ArrayList;
42 import java.util.Date;
43 import java.util.List;
44
45 /**
46  * ArtifactMissingChecksumsConsumer - Create missing and/or fix invalid checksums for the artifact.
47  */
48 @Service( "knownRepositoryContentConsumer#create-missing-checksums" )
49 @Scope( "prototype" )
50 public class ArtifactMissingChecksumsConsumer
51     extends AbstractMonitoredConsumer
52     implements KnownRepositoryContentConsumer
53     // it's prototype bean so we assume configuration won't change during a run
54     //, RegistryListener
55 {
56
57     private Logger log = LoggerFactory.getLogger( ArtifactMissingChecksumsConsumer.class );
58
59     private String id = "create-missing-checksums";
60
61     private String description = "Create Missing and/or Fix Invalid Checksums (.sha1, .md5)";
62
63     private ArchivaConfiguration configuration;
64
65     private FileTypes filetypes;
66
67     private ChecksummedFile checksum;
68
69     private static final String TYPE_CHECKSUM_NOT_FILE = "checksum-bad-not-file";
70
71     private static final String TYPE_CHECKSUM_CANNOT_CALC = "checksum-calc-failure";
72
73     private static final String TYPE_CHECKSUM_CANNOT_CREATE = "checksum-create-failure";
74
75     private Path repositoryDir;
76
77     private List<String> includes = new ArrayList<>( 0 );
78
79     @Inject
80     public ArtifactMissingChecksumsConsumer( ArchivaConfiguration configuration, FileTypes filetypes )
81     {
82         this.configuration = configuration;
83         this.filetypes = filetypes;
84
85         //configuration.addChangeListener( this );
86
87         initIncludes( );
88     }
89
90     @Override
91     public String getId( )
92     {
93         return this.id;
94     }
95
96     @Override
97     public String getDescription( )
98     {
99         return this.description;
100     }
101
102     @Override
103     public void beginScan( ManagedRepository repo, Date whenGathered )
104         throws ConsumerException
105     {
106         this.repositoryDir = Paths.get( repo.getLocation( ) );
107     }
108
109     @Override
110     public void beginScan( ManagedRepository repo, Date whenGathered, boolean executeOnEntireRepo )
111         throws ConsumerException
112     {
113         beginScan( repo, whenGathered );
114     }
115
116     @Override
117     public void completeScan( )
118     {
119         /* do nothing */
120     }
121
122     @Override
123     public void completeScan( boolean executeOnEntireRepo )
124     {
125         completeScan( );
126     }
127
128     @Override
129     public List<String> getExcludes( )
130     {
131         return getDefaultArtifactExclusions( );
132     }
133
134     @Override
135     public List<String> getIncludes( )
136     {
137         return includes;
138     }
139
140     @Override
141     public void processFile( String path )
142         throws ConsumerException
143     {
144         createFixChecksum( path, ChecksumAlgorithm.SHA1 );
145         createFixChecksum( path, ChecksumAlgorithm.MD5 );
146     }
147
148     @Override
149     public void processFile( String path, boolean executeOnEntireRepo )
150         throws ConsumerException
151     {
152         processFile( path );
153     }
154
155     private void createFixChecksum( String path, ChecksumAlgorithm checksumAlgorithm )
156     {
157         Path artifactFile = repositoryDir.resolve(path);
158         Path checksumFile = repositoryDir.resolve(path + "." + checksumAlgorithm.getExt( ).get(0) );
159
160         if ( Files.exists(checksumFile) )
161         {
162             checksum = new ChecksummedFile( artifactFile);
163             if ( !checksum.isValidChecksum( checksumAlgorithm ) )
164             {
165                 checksum.fixChecksums( new ChecksumAlgorithm[]{checksumAlgorithm} );
166                 log.info( "Fixed checksum file {}", checksumFile.toAbsolutePath( ) );
167                 triggerConsumerInfo( "Fixed checksum file " + checksumFile.toAbsolutePath( ) );
168             }
169         }
170         else if ( !Files.exists(checksumFile) )
171         {
172             checksum = new ChecksummedFile( artifactFile);
173             try
174             {
175                 checksum.createChecksum( checksumAlgorithm );
176                 log.info( "Created missing checksum file {}", checksumFile.toAbsolutePath( ) );
177                 triggerConsumerInfo( "Created missing checksum file " + checksumFile.toAbsolutePath( ) );
178             }
179             catch ( IOException e )
180             {
181                 log.error( "Cannot create checksum for file {} :", checksumFile, e );
182                 triggerConsumerError( TYPE_CHECKSUM_CANNOT_CREATE, "Cannot create checksum for file " + checksumFile +
183                     ": " + e.getMessage( ) );
184             }
185         }
186         else
187         {
188             log.warn( "Checksum file {} is not a file. ", checksumFile.toAbsolutePath( ) );
189             triggerConsumerWarning( TYPE_CHECKSUM_NOT_FILE,
190                 "Checksum file " + checksumFile.toAbsolutePath( ) + " is not a file." );
191         }
192     }
193
194     /*
195     @Override
196     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
197     {
198         if ( ConfigurationNames.isRepositoryScanning( propertyName ) )
199         {
200             initIncludes();
201         }
202     }
203
204
205     @Override
206     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
207     {
208         // do nothing
209     }
210
211     */
212
213     private void initIncludes( )
214     {
215         includes = new ArrayList<>( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
216
217     }
218
219     @PostConstruct
220     public void initialize( )
221     {
222         //configuration.addChangeListener( this );
223
224         initIncludes( );
225     }
226 }