]> source.dussan.org Git - archiva.git/blob
877a5c29f9d6672915d2e2587a75997b1257b481
[archiva.git] /
1 package $package;
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 java.util.ArrayList;
23 import java.util.Date;
24 import java.util.List;
25
26 import org.apache.archiva.configuration.ArchivaConfiguration;
27 import org.apache.archiva.configuration.FileTypes;
28 import org.apache.archiva.consumers.AbstractMonitoredConsumer;
29 import org.apache.archiva.consumers.ConsumerException;
30 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
31 import org.apache.archiva.metadata.repository.MetadataResolutionException;
32 import org.apache.archiva.metadata.repository.RepositorySession;
33 import org.apache.archiva.metadata.repository.RepositorySessionFactory;
34 import org.apache.archiva.model.ArtifactReference;
35 import org.apache.archiva.redback.components.registry.Registry;
36 import org.apache.archiva.redback.components.registry.RegistryListener;
37
38 import org.apache.archiva.repository.ManagedRepositoryContent;
39 import org.apache.archiva.repository.RepositoryContentFactory;
40 import org.apache.archiva.repository.RepositoryException;
41 import org.apache.archiva.repository.layout.LayoutException;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import javax.annotation.PostConstruct;
45 import javax.inject.Inject;
46 import javax.inject.Named;
47
48 import org.springframework.context.annotation.Scope;
49 import org.springframework.stereotype.Service;
50 import org.apache.archiva.admin.model.beans.ManagedRepository;
51
52 /**
53  * <code>SimpleArtifactConsumer</code>
54  * 
55  */
56 @Service("knownRepositoryContentConsumer#simple")
57 @Scope("prototype")
58 public class SimpleArtifactConsumer
59     extends AbstractMonitoredConsumer
60     implements KnownRepositoryContentConsumer, RegistryListener
61 {
62
63     private Logger log = LoggerFactory.getLogger( SimpleArtifactConsumer.class );
64
65     /**
66      * default-value="simple-artifact-consumer"
67      */
68     private String id = "simple-artifact-consumer";
69
70     private String description = "Simple consumer to illustrate how to consume the contents of a repository.";
71
72     @Inject
73     private FileTypes filetypes;
74
75     @Inject
76     private ArchivaConfiguration configuration;
77
78     private List<String> propertyNameTriggers = new ArrayList<>();
79
80     private List<String> includes = new ArrayList<>();
81
82     /** current repository being scanned */
83     private ManagedRepository repository;
84
85     @Inject
86     @Named( value = "repositoryContentFactory#default" )
87     private RepositoryContentFactory repositoryContentFactory;
88
89     @Inject
90     private RepositorySessionFactory repositorySessionFactory;
91
92     private RepositorySession repositorySession;
93
94     public void beginScan( ManagedRepository repository, Date whenGathered )
95         throws ConsumerException
96     {
97         beginScan( repository, whenGathered, true );
98     }
99
100     public void beginScan( ManagedRepository repository, Date whenGathered, boolean executeOnEntireRepo )
101         throws ConsumerException
102     {
103         this.repository = repository;
104         log.info( "Beginning scan of repository [" + this.repository.getId() + "]" );
105
106         repositorySession = repositorySessionFactory.createSession();
107     }
108
109     public void processFile( String path )
110         throws ConsumerException
111     {
112         processFile( path, true );
113     }
114
115     public void processFile( String path, boolean executeOnEntireRepo )
116         throws ConsumerException
117     {
118         log.info( "Processing entry [" + path + "] from repository [" + this.repository.getId() + "]" );
119
120         try
121         {
122             ManagedRepositoryContent repositoryContent = repositoryContentFactory.getManagedRepositoryContent( repository.getId() );
123             ArtifactReference artifact = repositoryContent.toArtifactReference( path );
124
125             repositorySession.getRepository().getArtifacts( repository.getId(), artifact.getGroupId(),
126                                                             artifact.getArtifactId(), artifact.getVersion() );
127         }
128         catch ( RepositoryException | LayoutException | MetadataResolutionException e )
129         {
130             throw new ConsumerException( e.getLocalizedMessage(), e );
131         }
132     }
133
134     public void completeScan()
135     {
136         completeScan( true );
137     }
138
139     public void completeScan( boolean executeOnEntireRepo )
140     {
141         log.info( "Finished scan of repository [" + this.repository.getId() + "]" );
142
143         repositorySession.close();
144     }
145
146
147     /**
148      * Used by archiva to determine if the consumer wishes to process all of a repository's entries or just those that
149      * have been modified since the last scan.
150      * 
151      * @return boolean true if the consumer wishes to process all entries on each scan, false for only those modified
152      *         since the last scan
153      */
154     public boolean isProcessUnmodified()
155     {
156         return super.isProcessUnmodified();
157     }
158
159     public void afterConfigurationChange( org.apache.archiva.redback.components.registry.Registry registry, String propertyName, Object propertyValue )
160     {
161         if ( propertyNameTriggers.contains( propertyName ) )
162         {
163             initIncludes();
164         }
165     }
166
167     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
168     {
169         /* do nothing */
170     }
171
172     private void initIncludes()
173     {
174         includes.clear();
175         includes.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
176     }
177
178     @PostConstruct
179     public void initialize()
180     {
181         propertyNameTriggers = new ArrayList<>();
182         propertyNameTriggers.add( "repositoryScanning" );
183         propertyNameTriggers.add( "fileTypes" );
184         propertyNameTriggers.add( "fileType" );
185         propertyNameTriggers.add( "patterns" );
186         propertyNameTriggers.add( "pattern" );
187
188         configuration.addChangeListener( this );
189
190         initIncludes();
191     }
192
193     public String getId()
194     {
195         return this.id;
196     }
197
198     public String getDescription()
199     {
200         return this.description;
201     }
202
203     public List<String> getExcludes()
204     {
205         return null;
206     }
207
208     public List<String> getIncludes()
209     {
210         return this.includes;
211     }
212
213     public boolean isPermanent()
214     {
215         return false;
216     }
217 }