]> source.dussan.org Git - archiva.git/blob
4757c2855280e727298d9114aa1ce2e3ca0eaa74
[archiva.git] /
1 package org.apache.archiva.rss.processor;
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 com.sun.syndication.feed.synd.SyndFeed;
23 import com.sun.syndication.io.FeedException;
24 import org.apache.archiva.metadata.model.ArtifactMetadata;
25 import org.apache.archiva.metadata.repository.MetadataRepository;
26 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
27 import org.apache.archiva.metadata.repository.MetadataResolutionException;
28 import org.apache.archiva.rss.RssFeedEntry;
29 import org.apache.archiva.rss.RssFeedGenerator;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32 import org.springframework.stereotype.Service;
33
34 import javax.inject.Inject;
35 import java.util.ArrayList;
36 import java.util.Collection;
37 import java.util.Date;
38 import java.util.List;
39 import java.util.Map;
40
41 /**
42  * Retrieve and process new versions of an artifact from the database and
43  * generate a rss feed. The versions will be grouped by the date when the artifact
44  * was gathered. Each group will appear as one entry in the feed.
45  *
46  * plexus.component role="org.apache.archiva.rss.processor.RssFeedProcessor" role-hint="new-versions"
47  */
48 @Service("rssFeedProcessor#new-versions")
49 public class NewVersionsOfArtifactRssFeedProcessor
50     extends AbstractArtifactsRssFeedProcessor
51 {
52     private Logger log = LoggerFactory.getLogger( NewVersionsOfArtifactRssFeedProcessor.class );
53
54     private static final String title = "New Versions of Artifact ";
55
56     private static final String desc = "These are the new versions of artifact ";
57
58     /**
59      * plexus.requirement
60      */
61     @Inject
62     private RssFeedGenerator generator;
63
64     /**
65      * Process all versions of the artifact which had a rss feed request.
66      */
67     public SyndFeed process( Map<String, String> reqParams, MetadataRepository metadataRepository )
68         throws FeedException
69     {
70         String groupId = reqParams.get( RssFeedProcessor.KEY_GROUP_ID );
71         String artifactId = reqParams.get( RssFeedProcessor.KEY_ARTIFACT_ID );
72
73         if ( groupId != null && artifactId != null )
74         {
75             return processNewVersionsOfArtifact( groupId, artifactId, metadataRepository );
76         }
77
78         return null;
79     }
80
81     private SyndFeed processNewVersionsOfArtifact( String groupId, String artifactId,
82                                                    MetadataRepository metadataRepository )
83         throws FeedException
84     {
85         List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>();
86         try
87         {
88             for ( String repoId : metadataRepository.getRepositories() )
89             {
90                 Collection<String> versions = metadataRepository.getProjectVersions( repoId, groupId, artifactId );
91                 for ( String version : versions )
92                 {
93                     artifacts.addAll( metadataRepository.getArtifacts( repoId, groupId, artifactId, version ) );
94                 }
95             }
96         }
97         catch ( MetadataRepositoryException e )
98         {
99             throw new FeedException( "Unable to construct feed, metadata could not be retrieved: " + e.getMessage(),
100                                      e );
101         }
102         catch ( MetadataResolutionException e )
103         {
104             throw new FeedException( "Unable to construct feed, metadata could not be retrieved: " + e.getMessage(),
105                                      e );
106         }
107
108         long tmp = 0;
109         RssFeedEntry entry = null;
110         List<RssFeedEntry> entries = new ArrayList<RssFeedEntry>();
111         String description = "";
112         int idx = 0;
113         for ( ArtifactMetadata artifact : artifacts )
114         {
115             long whenGathered = artifact.getWhenGathered().getTime();
116
117             if ( tmp != whenGathered )
118             {
119                 if ( entry != null )
120                 {
121                     entry.setDescription( description );
122                     entries.add( entry );
123                     entry = null;
124                 }
125
126                 entry = new RssFeedEntry(
127                     this.getTitle() + "\'" + groupId + ":" + artifactId + "\'" + " as of " + new Date( whenGathered ) );
128                 entry.setPublishedDate( artifact.getWhenGathered() );
129                 description =
130                     this.getDescription() + "\'" + groupId + ":" + artifactId + "\'" + ": \n" + artifact.getId() +
131                         " | ";
132             }
133             else
134             {
135                 description = description + artifact.getId() + " | ";
136             }
137
138             if ( idx == ( artifacts.size() - 1 ) )
139             {
140                 entry.setDescription( description );
141                 entries.add( entry );
142             }
143
144             tmp = whenGathered;
145             idx++;
146         }
147
148         String key = groupId + ":" + artifactId;
149
150         return generator.generateFeed( getTitle() + "\'" + key + "\'",
151                                        "New versions of artifact " + "\'" + key + "\' found during repository scan.",
152                                        entries );
153     }
154
155     public String getTitle()
156     {
157         return title;
158     }
159
160     public String getDescription()
161     {
162         return desc;
163     }
164
165     public RssFeedGenerator getGenerator()
166     {
167         return generator;
168     }
169
170     public void setGenerator( RssFeedGenerator generator )
171     {
172         this.generator = generator;
173     }
174 }