1 package org.apache.archiva.rss.processor;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.rss.RssFeedEntry;
28 import org.apache.archiva.rss.RssFeedGenerator;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.stereotype.Service;
32
33 import javax.inject.Inject;
34 import java.util.ArrayList;
35 import java.util.Calendar;
36 import java.util.Date;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.TimeZone;
40
41
42
43
44
45
46
47 @Service("rssFeedProcessor#new-artifacts")
48 public class NewArtifactsRssFeedProcessor
49 extends AbstractArtifactsRssFeedProcessor
50 {
51 private int numberOfDaysBeforeNow = 30;
52
53 private static final String title = "New Artifacts in Repository ";
54
55 private static final String desc = "These are the new artifacts found in the repository ";
56
57
58
59
60 @Inject
61 private RssFeedGenerator generator;
62
63 private Logger log = LoggerFactory.getLogger( NewArtifactsRssFeedProcessor.class );
64
65 private static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" );
66
67
68
69
70
71 public SyndFeed process( Map<String, String> reqParams, MetadataRepository metadataRepository )
72 throws FeedException
73 {
74 log.debug( "Process new artifacts into rss feeds." );
75
76 String repoId = reqParams.get( RssFeedProcessor.KEY_REPO_ID );
77 if ( repoId != null )
78 {
79 return processNewArtifactsInRepo( repoId, metadataRepository );
80 }
81
82 return null;
83 }
84
85 private SyndFeed processNewArtifactsInRepo( String repoId, MetadataRepository metadataRepository )
86 throws FeedException
87 {
88 Calendar greaterThanThisDate = Calendar.getInstance( GMT_TIME_ZONE );
89 greaterThanThisDate.add( Calendar.DATE, -( getNumberOfDaysBeforeNow() ) );
90 greaterThanThisDate.clear( Calendar.MILLISECOND );
91
92 List<ArtifactMetadata> artifacts;
93 try
94 {
95 artifacts = metadataRepository.getArtifactsByDateRange( repoId, greaterThanThisDate.getTime(), null );
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
103 long tmp = 0;
104 RssFeedEntry entry = null;
105 List<RssFeedEntry> entries = new ArrayList<RssFeedEntry>();
106 String description = "";
107 int idx = 0;
108 for ( ArtifactMetadata artifact : artifacts )
109 {
110 long whenGathered = artifact.getWhenGathered().getTime();
111
112 String id = artifact.getNamespace() + "/" + artifact.getProject() + "/" + artifact.getId();
113 if ( tmp != whenGathered )
114 {
115 if ( entry != null )
116 {
117 entry.setDescription( description );
118 entries.add( entry );
119 entry = null;
120 }
121
122 String repoId1 = artifact.getRepositoryId();
123 entry = new RssFeedEntry( this.getTitle() + "\'" + repoId1 + "\'" + " as of " + new Date(
124 whenGathered ) );
125 entry.setPublishedDate( artifact.getWhenGathered() );
126 description = this.getDescription() + "\'" + repoId1 + "\'" + ": \n" + id + " | ";
127 }
128 else
129 {
130 description = description + id + " | ";
131 }
132
133 if ( idx == ( artifacts.size() - 1 ) )
134 {
135 entry.setDescription( description );
136 entries.add( entry );
137 }
138
139 tmp = whenGathered;
140 idx++;
141 }
142
143 return generator.generateFeed( getTitle() + "\'" + repoId + "\'",
144 "New artifacts found in repository " + "\'" + repoId + "\'" +
145 " during repository scan.", entries );
146 }
147
148 public String getTitle()
149 {
150 return title;
151 }
152
153 public String getDescription()
154 {
155 return desc;
156 }
157
158 public RssFeedGenerator getGenerator()
159 {
160 return generator;
161 }
162
163 public void setGenerator( RssFeedGenerator generator )
164 {
165 this.generator = generator;
166 }
167
168 public int getNumberOfDaysBeforeNow()
169 {
170 return numberOfDaysBeforeNow;
171 }
172
173 public void setNumberOfDaysBeforeNow( int numberOfDaysBeforeNow )
174 {
175 this.numberOfDaysBeforeNow = numberOfDaysBeforeNow;
176 }
177 }