Author: oching
Date: Mon Apr 7 08:50:57 2008
New Revision: 645576
URL: http://svn.apache.org/viewvc?rev=645576&view=rev
Log:
[MRM-123]
-generate/update rss feeds after repository scan
-add rss feed icon in repositories (for new artifacts in repo feed) and in
browse artifact (for new versions of artifact feed)
Added:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp
archiva/trunk/pom.xml
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/pom.xml?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
(original)
+++ archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/pom.xml
Mon Apr 7 08:50:57 2008
@@ -49,6 +49,14 @@
<artifactId>archiva-configuration</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-rss</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-xml-tools</artifactId>
+ </dependency>
+ <dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<scope>test</scope>
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java
(original)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java
Mon Apr 7 08:50:57 2008
@@ -23,13 +23,20 @@
import java.util.ArrayList;
import java.util.List;
+import org.apache.archiva.rss.processor.RssFeedProcessor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.maven.archiva.configuration.FileTypes;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.consumers.InvalidRepositoryContentConsumer;
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer;
import org.apache.maven.archiva.consumers.RepositoryContentConsumer;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.repository.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryException;
+import org.apache.maven.archiva.repository.RepositoryNotFoundException;
+import org.apache.maven.archiva.repository.layout.LayoutException;
import org.codehaus.plexus.util.DirectoryWalker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -55,6 +62,16 @@
* @plexus.requirement
*/
private RepositoryContentConsumers consumerUtil;
+
+ /**
+ * @plexus.requirement
+ */
+ private RepositoryContentFactory repositoryFactory;
+
+ /**
+ * @plexus.requirement role-hint="new-artifacts"
+ */
+ private RssFeedProcessor rssFeedProcessor;
public RepositoryScanStatistics scan( ManagedRepositoryConfiguration
repository, long changesSince )
throws RepositoryException
@@ -126,6 +143,10 @@
stats.setKnownConsumers( gatherIds( knownContentConsumers ) );
stats.setInvalidConsumers( gatherIds( invalidContentConsumers ) );
+ // generate RSS feeds
+ List<ArchivaArtifact> newArtifacts = getNewArtifacts(
scannerInstance.getNewFiles(), repository.getId() );
+ rssFeedProcessor.process( newArtifacts );
+
return stats;
}
@@ -137,5 +158,41 @@
ids.add( consumer.getId() );
}
return ids;
+ }
+
+ private List<ArchivaArtifact> getNewArtifacts( List<File> files, String
repoId )
+ {
+ List<ArchivaArtifact> newArtifacts = new ArrayList<ArchivaArtifact>();
+
+ // TODO: filter the file types of artifacts that will be included in
the rss feeds
+ try
+ {
+ ManagedRepositoryContent repository =
repositoryFactory.getManagedRepositoryContent( repoId );
+ for( File file : files )
+ {
+ try
+ {
+ ArtifactReference ref = repository.toArtifactReference(
file.getAbsolutePath() );
+ ArchivaArtifact artifact = new ArchivaArtifact(
ref.getGroupId(),ref.getArtifactId(), ref.getVersion(),
+
ref.getClassifier(), ref.getType() );
+ artifact.getModel().setRepositoryId( repoId );
+ newArtifacts.add( artifact );
+ }
+ catch ( LayoutException le )
+ {
+
+ }
+ }
+ }
+ catch ( RepositoryNotFoundException re )
+ {
+ log.error( re.getMessage() );
+ }
+ catch ( RepositoryException e )
+ {
+ log.error( e.getMessage() );
+ }
+
+ return newArtifacts;
}
}
Modified:
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java
(original)
+++
archiva/trunk/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java
Mon Apr 7 08:50:57 2008
@@ -20,6 +20,7 @@
*/
import java.io.File;
+import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.Closure;
@@ -66,6 +67,8 @@
private ConsumerProcessFileClosure consumerProcessFile;
private ConsumerWantsFilePredicate consumerWantsFile;
+
+ private List<File> newFiles = new ArrayList<File>();
public RepositoryScannerInstance( ManagedRepositoryConfiguration
repository,
List<KnownRepositoryContentConsumer>
knownConsumerList,
@@ -120,14 +123,15 @@
stats.increaseFileCount();
+ // consume files regardless - the predicate will check the timestamp
+ BaseFile basefile = new BaseFile( repository.getLocation(), file );
+
// Timestamp finished points to the last successful scan, not this
current one.
if ( file.lastModified() >= changesSince )
{
stats.increaseNewFileCount();
+ newFiles.add( basefile );
}
-
- // consume files regardless - the predicate will check the timestamp
- BaseFile basefile = new BaseFile( repository.getLocation(), file );
consumerProcessFile.setBasefile( basefile );
consumerWantsFile.setBasefile( basefile );
@@ -154,5 +158,10 @@
public void debug( String message )
{
log.debug( "Repository Scanner: " + message );
+ }
+
+ public List<File> getNewFiles()
+ {
+ return newFiles;
}
}
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java
Mon Apr 7 08:50:57 2008
@@ -44,7 +44,8 @@
/**
* Generates RSS feeds.
*
- * @plexus.component role="org.apache.archiva.rss.RssFeedGenerator"
+ * @plexus.component role="org.apache.archiva.rss.RssFeedGenerator"
+ * instantiation-strategy="per-lookup"
*
* @author <a href="mailto:[EMAIL PROTECTED]">Maria Odea Ching</a>
* @version
@@ -57,21 +58,21 @@
public static String DEFAULT_FEEDTYPE = "rss_2.0";
public static String DEFAULT_LANGUAGE = "en-us";
-
+
/**
- * @plexus.configuration default-value="${appserver.base}/data/rss"
+ * @plexus.configuration default-value="./apps/archiva/rss/"
*/
private String rssDirectory;
public void generateFeed( String title, String link, String description,
List<RssFeedEntry> dataEntries,
String outputFilename )
- {
- File outputFile = new File( rssDirectory, outputFilename );
+ {
+ File outputFile = new File( rssDirectory, outputFilename );
SyndFeed feed = null;
List<SyndEntry> existingEntries = null;
-
- if( outputFile.exists() )
- {
+
+ if ( outputFile.exists() )
+ {
try
{
SyndFeedInput input = new SyndFeedInput();
@@ -88,25 +89,27 @@
}
}
else
- {
- feed = new SyndFeedImpl();
-
+ {
+ feed = new SyndFeedImpl();
+
feed.setTitle( title );
feed.setLink( link );
feed.setDescription( description );
- feed.setLanguage( DEFAULT_LANGUAGE );
+ feed.setLanguage( DEFAULT_LANGUAGE );
+ feed.setPublishedDate( Calendar.getInstance().getTime() );
}
- feed.setFeedType( DEFAULT_FEEDTYPE );
- feed.setPublishedDate( Calendar.getInstance().getTime() );
+ feed.setFeedType( DEFAULT_FEEDTYPE );
feed.setEntries( getEntries( dataEntries, existingEntries ) );
-
+
try
- {
+ {
Writer writer = new FileWriter( outputFile );
SyndFeedOutput output = new SyndFeedOutput();
output.output( feed, writer );
writer.close();
+
+ log.debug( "Finished writing feed to " +
outputFile.getAbsolutePath() );
}
catch ( IOException ie )
{
@@ -119,13 +122,13 @@
}
private List<SyndEntry> getEntries( List<RssFeedEntry> dataEntries,
List<SyndEntry> existingEntries )
- {
- List<SyndEntry> entries = existingEntries;
- if( entries == null )
+ {
+ List<SyndEntry> entries = existingEntries;
+ if ( entries == null )
{
entries = new ArrayList<SyndEntry>();
}
-
+
SyndEntry entry;
SyndContent description;
@@ -151,4 +154,5 @@
{
this.rssDirectory = rssDirectory;
}
+
}
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
Mon Apr 7 08:50:57 2008
@@ -30,6 +30,8 @@
import org.apache.archiva.rss.RssFeedGenerator;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Process new artifacts in the repository and generate RSS feeds.
@@ -50,12 +52,16 @@
*/
private RssFeedGenerator generator;
+ private Logger log = LoggerFactory.getLogger(
NewArtifactsRssFeedProcessor.class );
+
/**
* Process the newly discovered artifacts in the repository. Generate
feeds for new artifacts in the repository and
* new versions of artifact.
*/
public void process( List<ArchivaArtifact> data )
{
+ log.debug( "Process new artifacts into rss feeds." );
+
processNewArtifactsInRepo( data );
processNewVersionsOfArtifact( data );
}
@@ -67,19 +73,19 @@
RssFeedEntry entry =
new RssFeedEntry( NEW_ARTIFACTS_IN_REPO + "\'" + repoId + "\'" + "
as of " +
- Calendar.getInstance().getTime(),
"http://localhost:8080/archiva/repository/" + repoId );
+ Calendar.getInstance().getTime(),
"http://localhost:8080/archiva/rss/new_artifacts_" + repoId + ".xml" );
String description = "These are the new artifacts found in repository
" + "\'" + repoId + "\'" + ": \n";
for ( ArchivaArtifact artifact : data )
{
- description = description + artifact.toString() + "\n";
+ description = description + artifact.toString() + " | ";
}
entry.setDescription( description );
entries.add( entry );
generateFeed( "new_artifacts_" + repoId + ".xml",
NEW_ARTIFACTS_IN_REPO + "\'" + repoId + "\'",
- "http://localhost:8080/archiva/repository/" + repoId,
"New artifacts found in repository " +
- "\'" + repoId + "\'" + " during repository scan.",
entries );
+
"http://localhost:8080/archiva/repository/rss/new_artifacts_" + repoId + ".xml",
+ "New artifacts found in repository " + "\'" + repoId +
"\'" + " during repository scan.", entries );
}
private void processNewVersionsOfArtifact( List<ArchivaArtifact> data )
@@ -100,21 +106,19 @@
for ( String key : artifactsMap.keySet() )
{
List<RssFeedEntry> entries = new ArrayList<RssFeedEntry>();
- String artifactPath = getArtifactPath( key );
RssFeedEntry entry =
new RssFeedEntry( NEW_VERSIONS_OF_ARTIFACT + "\'" + key + "\'"
+ " as of " +
- Calendar.getInstance().getTime(),
"http://localhost:8080/archiva/repository/" + repoId + "/" +
- artifactPath );
+ Calendar.getInstance().getTime(),
"http://localhost:8080/archiva/rss/new_versions_" + key + ".xml" );
String description =
"These are the new versions of artifact " + "\'" + key + "\'"
+ " in the repository: \n" +
- StringUtils.replace( ( (String) artifactsMap.get( key ) ),
"|", "\n" );
+ ( (String) artifactsMap.get( key ) );
entry.setDescription( description );
entries.add( entry );
- generateFeed( "new_versions_" + repoId + "_" + key + ".xml",
NEW_VERSIONS_OF_ARTIFACT + "\'" + key + "\'",
- "http://localhost:8080/archiva/repository/" + repoId
+ "/" + artifactPath,
+ generateFeed( "new_versions_" + key + ".xml",
NEW_VERSIONS_OF_ARTIFACT + "\'" + key + "\'",
+ "http://localhost:8080/archiva/rss/new_versions_" +
key + ".xml",
"New versions of artifact " + "\'" + key + "\' found
in repository " + "\'" + repoId + "\'" +
" during repository scan.", entries );
}
@@ -148,7 +152,7 @@
String value = (String) artifactsMap.get( key );
if ( value != null )
{
- value = value + "|" + id;
+ value = value + " | " + id;
}
else
{
@@ -160,16 +164,11 @@
return artifactsMap;
}
- private String getArtifactPath( String key )
- {
- return StringUtils.replace( StringUtils.replace( key, ".", "/" ), ":",
"/" );
- }
-
public RssFeedGenerator getGenerator()
{
return generator;
}
-
+
public void setGenerator( RssFeedGenerator generator )
{
this.generator = generator;
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java
Mon Apr 7 08:50:57 2008
@@ -93,16 +93,16 @@
File outputFile = new File( rssDirectory,
"new_artifacts_test-repo.xml" );
assertTrue( outputFile.exists() );
- outputFile = new File( rssDirectory,
"new_versions_test-repo_org.apache.archiva:artifact-one.xml" );
+ outputFile = new File( rssDirectory,
"new_versions_org.apache.archiva:artifact-one.xml" );
assertTrue( outputFile.exists() );
- outputFile = new File( rssDirectory,
"new_versions_test-repo_org.apache.archiva:artifact-two.xml" );
+ outputFile = new File( rssDirectory,
"new_versions_org.apache.archiva:artifact-two.xml" );
assertTrue( outputFile.exists() );
- outputFile = new File( rssDirectory,
"new_versions_test-repo_org.apache.archiva:artifact-three.xml" );
+ outputFile = new File( rssDirectory,
"new_versions_org.apache.archiva:artifact-three.xml" );
assertTrue( outputFile.exists() );
- outputFile = new File( rssDirectory,
"new_versions_test-repo_org.apache.archiva:artifact-four.xml" );
+ outputFile = new File( rssDirectory,
"new_versions_org.apache.archiva:artifact-four.xml" );
assertTrue( outputFile.exists() );
}
}
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp
Mon Apr 7 08:50:57 2008
@@ -87,6 +87,10 @@
Delete
</ww:a>
</redback:ifAnyAuthorized>
+ <c:url var="rssFeedIconUrl" value="/images/icons/rss-feed.png"/>
+ <a href="/archiva/rss/new_artifacts_${repository.id}.xml">
+ <img src="${rssFeedIconUrl}" />
+ </a>
</div>
<div style="float: left">
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
---
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp
(original)
+++
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp
Mon Apr 7 08:50:57 2008
@@ -62,14 +62,20 @@
<div id="nameColumn">
<h2>Artifacts</h2>
<ul>
+ <c:url var="rssFeedIconUrl" value="/images/icons/rss-feed.png"/>
<c:forEach items="${results.artifacts}" var="artifactId">
<c:set var="url">
<ww:url action="browseArtifact" namespace="/">
<ww:param name="groupId"
value="%{'${results.selectedGroupId}'}"/>
<ww:param name="artifactId" value="%{'${artifactId}'}"/>
</ww:url>
- </c:set>
- <li><a href="${url}">${artifactId}/</a></li>
+ </c:set>
+ <li>
+ <a href="${url}">${artifactId}/</a>
+ <a href="/archiva/rss/new_versions_${groupId}:${artifactId}.xml">
+ <img src="${rssFeedIconUrl}" />
+ </a>
+ </li>
</c:forEach>
</ul>
</div>
Added:
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml?rev=645576&view=auto
==============================================================================
(empty)
Modified: archiva/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/archiva/trunk/pom.xml?rev=645576&r1=645575&r2=645576&view=diff
==============================================================================
--- archiva/trunk/pom.xml (original)
+++ archiva/trunk/pom.xml Mon Apr 7 08:50:57 2008
@@ -342,6 +342,11 @@
<version>1.1-SNAPSHOT</version>
</dependency>
<dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-rss</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-spring</artifactId>
<version>1.0-SNAPSHOT</version>