diff options
author | Maria Odea B. Ching <oching@apache.org> | 2008-04-07 15:50:57 +0000 |
---|---|---|
committer | Maria Odea B. Ching <oching@apache.org> | 2008-04-07 15:50:57 +0000 |
commit | d346a91845de094c333c60cda17592038c44729d (patch) | |
tree | dd852e8605190c68e75a567f3e62bd40d03d3fef /archiva-modules | |
parent | 5e407428a1f64899fbac16608356485cf8b02759 (diff) | |
download | archiva-d346a91845de094c333c60cda17592038c44729d.tar.gz archiva-d346a91845de094c333c60cda17592038c44729d.zip |
[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
Diffstat (limited to 'archiva-modules')
9 files changed, 133 insertions, 46 deletions
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 @@ -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> 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<ArchivaArtifact> newArtifacts = getNewArtifacts( scannerInstance.getNewFiles(), repository.getId() ); + rssFeedProcessor.process( newArtifacts ); + return stats; } @@ -138,4 +159,40 @@ public class DefaultRepositoryScanner } 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; + } } 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<File> newFiles = new ArrayList<File>(); public RepositoryScannerInstance( ManagedRepositoryConfiguration repository, List<KnownRepositoryContentConsumer> 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<File> 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 <a href="mailto:oching@apache.org">Maria Odea Ching</a> * @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<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 @@ 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<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 @@ 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<ArchivaArtifact> 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<ArchivaArtifact> data ) @@ -100,21 +106,19 @@ public class NewArtifactsRssFeedProcessor 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 @@ 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 </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"> 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 @@ <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> 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 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/rss/rss.xml |