This project has retired. For details please refer to its Attic page.
ValidateChecksumConsumer xref
View Javadoc
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.admin.model.beans.ManagedRepository;
23  import org.apache.archiva.common.plexusbridge.DigesterUtils;
24  import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
25  import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
26  import org.apache.archiva.consumers.AbstractMonitoredConsumer;
27  import org.apache.archiva.consumers.ConsumerException;
28  import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
29  import org.codehaus.plexus.digest.ChecksumFile;
30  import org.codehaus.plexus.digest.Digester;
31  import org.codehaus.plexus.digest.DigesterException;
32  import org.slf4j.Logger;
33  import org.slf4j.LoggerFactory;
34  import org.springframework.context.annotation.Scope;
35  import org.springframework.stereotype.Service;
36  
37  import javax.annotation.PostConstruct;
38  import javax.inject.Inject;
39  import java.io.File;
40  import java.io.FileNotFoundException;
41  import java.io.IOException;
42  import java.util.ArrayList;
43  import java.util.Date;
44  import java.util.List;
45  
46  /**
47   * ValidateChecksumConsumer - validate the provided checksum against the file it represents.
48   */
49  @Service( "knownRepositoryContentConsumer#validate-checksums" )
50  @Scope( "prototype" )
51  public class ValidateChecksumConsumer
52      extends AbstractMonitoredConsumer
53      implements KnownRepositoryContentConsumer
54  {
55      private Logger log = LoggerFactory.getLogger( ValidateChecksumConsumer.class );
56  
57      private static final String NOT_VALID_CHECKSUM = "checksum-not-valid";
58  
59      private static final String CHECKSUM_NOT_FOUND = "checksum-not-found";
60  
61      private static final String CHECKSUM_DIGESTER_FAILURE = "checksum-digester-failure";
62  
63      private static final String CHECKSUM_IO_ERROR = "checksum-io-error";
64  
65      private String id = "validate-checksums";
66  
67      private String description = "Validate checksums against file.";
68  
69      private ChecksumFile checksum;
70  
71      private List<Digester> allDigesters;
72  
73      @Inject
74      private PlexusSisuBridge plexusSisuBridge;
75  
76      @Inject
77      private DigesterUtils digesterUtils;
78  
79      private File repositoryDir;
80  
81      private List<String> includes;
82  
83      @Override
84      public String getId( )
85      {
86          return this.id;
87      }
88  
89      @Override
90      public String getDescription( )
91      {
92          return this.description;
93      }
94  
95      @Override
96      public void beginScan( ManagedRepository repository, Date whenGathered )
97          throws ConsumerException
98      {
99          this.repositoryDir = new File( repository.getLocation( ) );
100     }
101 
102     @Override
103     public void beginScan( ManagedRepository repository, Date whenGathered, boolean executeOnEntireRepo )
104         throws ConsumerException
105     {
106         beginScan( repository, whenGathered );
107     }
108 
109     @Override
110     public void completeScan( )
111     {
112         /* nothing to do */
113     }
114 
115     @Override
116     public void completeScan( boolean executeOnEntireRepo )
117     {
118         completeScan( );
119     }
120 
121     @Override
122     public List<String> getExcludes( )
123     {
124         return null;
125     }
126 
127     @Override
128     public List<String> getIncludes( )
129     {
130         return this.includes;
131     }
132 
133     @Override
134     public void processFile( String path )
135         throws ConsumerException
136     {
137         File checksumFile = new File( this.repositoryDir, path );
138         try
139         {
140             if ( !checksum.isValidChecksum( checksumFile ) )
141             {
142                 log.warn( "The checksum for {} is invalid.", checksumFile );
143                 triggerConsumerWarning( NOT_VALID_CHECKSUM, "The checksum for " + checksumFile + " is invalid." );
144             }
145         }
146         catch ( FileNotFoundException e )
147         {
148             log.error( "File not found during checksum validation: ", e );
149             triggerConsumerError( CHECKSUM_NOT_FOUND, "File not found during checksum validation: " + e.getMessage( ) );
150         }
151         catch ( DigesterException e )
152         {
153             log.error( "Digester failure during checksum validation on {}", checksumFile );
154             triggerConsumerError( CHECKSUM_DIGESTER_FAILURE,
155                 "Digester failure during checksum validation on " + checksumFile );
156         }
157         catch ( IOException e )
158         {
159             log.error( "Checksum I/O error during validation on {}", checksumFile );
160             triggerConsumerError( CHECKSUM_IO_ERROR, "Checksum I/O error during validation on " + checksumFile );
161         }
162     }
163 
164     @Override
165     public void processFile( String path, boolean executeOnEntireReDpo )
166         throws Exception
167     {
168         processFile( path );
169     }
170 
171     @PostConstruct
172     public void initialize( )
173         throws PlexusSisuBridgeException
174     {
175         checksum = plexusSisuBridge.lookup( ChecksumFile.class );
176         List<Digester> allDigesters = new ArrayList<>( digesterUtils.getAllDigesters( ) );
177         includes = new ArrayList<>( allDigesters.size( ) );
178         for ( Digester digester : allDigesters )
179         {
180             includes.add( "**/*" + digester.getFilenameExtension( ) );
181         }
182     }
183 }