]> source.dussan.org Git - archiva.git/blob
940a4e0c90bbe16839c742c94daebf80c3d4c8bb
[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     /**
71      *
72      */
73     private String description = "Simple consumer to illustrate how to consume the contents of a repository.";
74
75     /**
76      *
77      */
78     @Inject
79     private FileTypes filetypes;
80
81     /**
82      *
83      */
84     @Inject
85     private ArchivaConfiguration configuration;
86
87     private List<String> propertyNameTriggers = new ArrayList<>();
88
89     private List<String> includes = new ArrayList<>();
90
91     /** current repository being scanned */
92     private ManagedRepository repository;
93
94     @Inject
95     @Named( value = "repositoryContentFactory#default" )
96     private RepositoryContentFactory repositoryContentFactory;
97
98     @Inject
99     private RepositorySessionFactory repositorySessionFactory;
100
101     private RepositorySession repositorySession;
102
103     public void beginScan( ManagedRepository repository, Date whenGathered )
104         throws ConsumerException
105     {
106         beginScan( repository, whenGathered, true );
107     }
108
109     public void beginScan( ManagedRepository repository, Date whenGathered, boolean executeOnEntireRepo )
110         throws ConsumerException
111     {
112         this.repository = repository;
113         log.info( "Beginning scan of repository [" + this.repository.getId() + "]" );
114
115         repositorySession = repositorySessionFactory.createSession();
116     }
117
118     public void processFile( String path )
119         throws ConsumerException
120     {
121         processFile( path, true );
122     }
123
124     public void processFile( String path, boolean executeOnEntireRepo )
125         throws ConsumerException
126     {
127         log.info( "Processing entry [" + path + "] from repository [" + this.repository.getId() + "]" );
128
129         try
130         {
131             ManagedRepositoryContent repositoryContent = repositoryContentFactory.getManagedRepositoryContent( repository.getId() );
132             ArtifactReference artifact = repositoryContent.toArtifactReference( path );
133
134             repositorySession.getRepository().getArtifacts( repository.getId(), artifact.getGroupId(),
135                                                             artifact.getArtifactId(), artifact.getVersion() );
136         }
137         catch ( RepositoryException | LayoutException | MetadataResolutionException e )
138         {
139             throw new ConsumerException( e.getLocalizedMessage(), e );
140         }
141     }
142
143     public void completeScan()
144     {
145         completeScan( true );
146     }
147
148     public void completeScan( boolean executeOnEntireRepo )
149     {
150         log.info( "Finished scan of repository [" + this.repository.getId() + "]" );
151
152         repositorySession.close();
153     }
154
155
156     /**
157      * Used by archiva to determine if the consumer wishes to process all of a repository's entries or just those that
158      * have been modified since the last scan.
159      * 
160      * @return boolean true if the consumer wishes to process all entries on each scan, false for only those modified
161      *         since the last scan
162      */
163     public boolean isProcessUnmodified()
164     {
165         return super.isProcessUnmodified();
166     }
167
168     public void afterConfigurationChange( org.apache.archiva.redback.components.registry.Registry registry, String propertyName, Object propertyValue )
169     {
170         if ( propertyNameTriggers.contains( propertyName ) )
171         {
172             initIncludes();
173         }
174     }
175
176     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
177     {
178         /* do nothing */
179     }
180
181     private void initIncludes()
182     {
183         includes.clear();
184         includes.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) );
185     }
186
187     @PostConstruct
188     public void initialize()
189     {
190         propertyNameTriggers = new ArrayList<>();
191         propertyNameTriggers.add( "repositoryScanning" );
192         propertyNameTriggers.add( "fileTypes" );
193         propertyNameTriggers.add( "fileType" );
194         propertyNameTriggers.add( "patterns" );
195         propertyNameTriggers.add( "pattern" );
196
197         configuration.addChangeListener( this );
198
199         initIncludes();
200     }
201
202     public String getId()
203     {
204         return this.id;
205     }
206
207     public String getDescription()
208     {
209         return this.description;
210     }
211
212     public List<String> getExcludes()
213     {
214         return null;
215     }
216
217     public List<String> getIncludes()
218     {
219         return this.includes;
220     }
221
222     public boolean isPermanent()
223     {
224         return false;
225     }
226 }