From d346a91845de094c333c60cda17592038c44729d Mon Sep 17 00:00:00 2001 From: "Maria Odea B. Ching" Date: Mon, 7 Apr 2008 15:50:57 +0000 Subject: [PATCH] [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) git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@645576 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva-repository-layer/pom.xml | 8 +++ .../scanner/DefaultRepositoryScanner.java | 57 +++++++++++++++++++ .../scanner/RepositoryScannerInstance.java | 15 ++++- .../apache/archiva/rss/RssFeedGenerator.java | 44 +++++++------- .../NewArtifactsRssFeedProcessor.java | 33 ++++++----- .../NewArtifactsRssFeedProcessorTest.java | 8 +-- .../webapp/WEB-INF/jsp/admin/repositories.jsp | 4 ++ .../src/main/webapp/WEB-INF/jsp/browse.jsp | 10 +++- .../src/main/webapp/rss/rss.xml | 0 pom.xml | 5 ++ 10 files changed, 138 insertions(+), 46 deletions(-) create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml diff --git a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml index 02744b179..f23658bfe 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/pom.xml +++ b/archiva-modules/archiva-base/archiva-repository-layer/pom.xml @@ -48,6 +48,14 @@ org.apache.archiva archiva-configuration + + org.apache.archiva + archiva-rss + + + org.apache.archiva + archiva-xml-tools + xmlunit xmlunit diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java index a78ee10ac..0ad94eb27 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/DefaultRepositoryScanner.java @@ -23,13 +23,20 @@ import java.io.File; 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 @@ public class DefaultRepositoryScanner * @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 @@ public class DefaultRepositoryScanner stats.setKnownConsumers( gatherIds( knownContentConsumers ) ); stats.setInvalidConsumers( gatherIds( invalidContentConsumers ) ); + // generate RSS feeds + List newArtifacts = getNewArtifacts( scannerInstance.getNewFiles(), repository.getId() ); + rssFeedProcessor.process( newArtifacts ); + return stats; } @@ -138,4 +159,40 @@ public class DefaultRepositoryScanner } return ids; } + + private List getNewArtifacts( List files, String repoId ) + { + List newArtifacts = new ArrayList(); + + // 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; + } } diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java index 9c0f38680..d3d4b28f3 100644 --- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java +++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/scanner/RepositoryScannerInstance.java @@ -20,6 +20,7 @@ package org.apache.maven.archiva.repository.scanner; */ import java.io.File; +import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.Closure; @@ -66,6 +67,8 @@ public class RepositoryScannerInstance private ConsumerProcessFileClosure consumerProcessFile; private ConsumerWantsFilePredicate consumerWantsFile; + + private List newFiles = new ArrayList(); public RepositoryScannerInstance( ManagedRepositoryConfiguration repository, List knownConsumerList, @@ -120,14 +123,15 @@ public class RepositoryScannerInstance 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 ); @@ -155,4 +159,9 @@ public class RepositoryScannerInstance { log.debug( "Repository Scanner: " + message ); } + + public List getNewFiles() + { + return newFiles; + } } diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java index 8357436aa..36634af96 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/RssFeedGenerator.java @@ -44,7 +44,8 @@ import com.sun.syndication.io.XmlReader; /** * Generates RSS feeds. * - * @plexus.component role="org.apache.archiva.rss.RssFeedGenerator" + * @plexus.component role="org.apache.archiva.rss.RssFeedGenerator" + * instantiation-strategy="per-lookup" * * @author Maria Odea Ching * @version @@ -57,21 +58,21 @@ public class RssFeedGenerator 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 dataEntries, String outputFilename ) - { - File outputFile = new File( rssDirectory, outputFilename ); + { + File outputFile = new File( rssDirectory, outputFilename ); SyndFeed feed = null; List existingEntries = null; - - if( outputFile.exists() ) - { + + if ( outputFile.exists() ) + { try { SyndFeedInput input = new SyndFeedInput(); @@ -88,25 +89,27 @@ public class RssFeedGenerator } } 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 @@ public class RssFeedGenerator } private List getEntries( List dataEntries, List existingEntries ) - { - List entries = existingEntries; - if( entries == null ) + { + List entries = existingEntries; + if ( entries == null ) { entries = new ArrayList(); } - + SyndEntry entry; SyndContent description; @@ -151,4 +154,5 @@ public class RssFeedGenerator { this.rssDirectory = rssDirectory; } + } diff --git a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java index a05eb0929..7b556f07a 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java +++ b/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java @@ -30,6 +30,8 @@ import org.apache.archiva.rss.RssFeedEntry; 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 @@ public class NewArtifactsRssFeedProcessor */ 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 data ) { + log.debug( "Process new artifacts into rss feeds." ); + processNewArtifactsInRepo( data ); processNewVersionsOfArtifact( data ); } @@ -67,19 +73,19 @@ public class NewArtifactsRssFeedProcessor 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 data ) @@ -100,21 +106,19 @@ public class NewArtifactsRssFeedProcessor for ( String key : artifactsMap.keySet() ) { List entries = new ArrayList(); - 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 @@ public class NewArtifactsRssFeedProcessor String value = (String) artifactsMap.get( key ); if ( value != null ) { - value = value + "|" + id; + value = value + " | " + id; } else { @@ -160,16 +164,11 @@ public class NewArtifactsRssFeedProcessor 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; diff --git a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java index b638c6dc6..c25432666 100644 --- a/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java +++ b/archiva-modules/archiva-web/archiva-rss/src/test/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessorTest.java @@ -93,16 +93,16 @@ public class NewArtifactsRssFeedProcessorTest 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() ); } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp index 3fc9bbf36..fcd72989a 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp @@ -87,6 +87,10 @@ Delete + + + +
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp index a41557403..bf7acb265 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/browse.jsp @@ -62,14 +62,20 @@

Artifacts

diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml new file mode 100644 index 000000000..e69de29bb diff --git a/pom.xml b/pom.xml index b50255131..dc002f5b7 100644 --- a/pom.xml +++ b/pom.xml @@ -341,6 +341,11 @@ archiva-webdav 1.1-SNAPSHOT + + org.apache.archiva + archiva-rss + 1.1-SNAPSHOT + org.codehaus.plexus plexus-spring -- 2.39.5