Author: adamw Date: 2005-11-07 11:32:42 -0500 (Mon, 07 Nov 2005) New Revision: 1524 Added: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DateSortParameter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertySortParameter.java Modified: trunk/forge/portal-extensions/common.xml trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/blog/BlogUpdater.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/XmlInputFactory.java trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/service/ResourceWatcher.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/ShotokuDataSource.java trunk/forge/portal-extensions/shotoku/project.xml trunk/forge/portal-extensions/shotoku/shotoku-base/project.xml trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/NodeList.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DirectoryIncludeParameter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/HistoryIncludeParameter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/LimitParameter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/MultiBooleanNodeFilter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertyValueParameter.java trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/velocity/ShotokuResourceLoader.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNodeHelper.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java Log: http://jira.jboss.com/jira/browse/JBLAB-408 : Shotoku feeds Modified: trunk/forge/portal-extensions/common.xml =================================================================== --- trunk/forge/portal-extensions/common.xml 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/common.xml 2005-11-07 16:32:42 UTC (rev 1524) @@ -59,6 +59,22 @@ <version>1.0</version> <jar>shotoku-aop.jar</jar> </dependency> + + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity-dep</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity</artifactId> + <version>1.4-dev</version> + </dependency> </dependencies> <build> Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/XmlTools.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,9 @@ */ package org.jboss.forge.common; +import java.util.HashMap; +import java.util.Map; + import javax.xml.transform.TransformerException; import org.jboss.forge.common.projects.DomToXmlTransformer; @@ -64,6 +67,30 @@ return properties; } + /** + * Reads all attributes of the given node and returns them as a map. Only + * signle-value attributes are supported. + * @param root Node from which to read the attributes. + * @return A map holding all attributes of the given node. + */ + public static Map<String, String> getMapFromNodeAttributes(Node root) { + Map<String, String> properties = new HashMap<String, String>(); + NamedNodeMap nnm = root.getAttributes(); + + if (nnm != null) { + Node n; + + for (int i=0; i<nnm.getLength(); i++) { + n = nnm.item(i); + if (n.getNodeType() == Node.ATTRIBUTE_NODE) { + properties.put(n.getNodeName(), XmlTools.unmarshallText(n)); + } + } + } + + return properties; + } + /** * From the given node, gets the value of the specified attribute. * @param root Node to read the attribute from. Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/blog/BlogUpdater.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/blog/BlogUpdater.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/blog/BlogUpdater.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -157,7 +157,7 @@ String metaContent = "blog-entry-author=" + project.getName() + "\n"; metaContent += "blog-entry-metadata-timestamp=" - + entry.getLastModfication() + + entry.getLastModification() + "\n"; writeToFile(blogMetaFile, metaContent); @@ -170,7 +170,7 @@ long blogFileLastModified; if (blogFileCreated) - blogFileLastModified = entry.getLastModfication(); + blogFileLastModified = entry.getLastModification(); else blogFileLastModified = blogFile.lastModified(); @@ -178,7 +178,7 @@ // been changed (or just created). if ((blogFileCreated) || (blogFileLastModified != - entry.getLastModfication())) { + entry.getLastModification())) { // Modification found, or a new entry - putting content. try { writeToFile(blogFile, entry.getContent()); Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/XmlInputFactory.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/XmlInputFactory.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/XmlInputFactory.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -97,7 +97,7 @@ * @return Last modification time of the given resource. */ public long getLastModification(String identifier) { - return cm.getNode(identifier).getLastModfication(); + return cm.getNode(identifier).getLastModification(); } public static XmlInputFactory getContentReadingInstance(ContentManager cm) { Modified: trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/service/ResourceWatcher.java =================================================================== --- trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/service/ResourceWatcher.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-common/src/java/org/jboss/forge/common/service/ResourceWatcher.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -46,7 +46,7 @@ * @param name Name of the resouce to add. */ public void watchResource(String name) { - lastUpdates.put(name, cm.getNode(name).getLastModfication()); + lastUpdates.put(name, cm.getNode(name).getLastModification()); } /** @@ -57,7 +57,7 @@ public boolean checkResources() { boolean ret = false; for (String name : lastUpdates.keySet()) { - long lastModification = cm.getNode(name).getLastModfication(); + long lastModification = cm.getNode(name).getLastModification(); if (lastModification != lastUpdates.get(name)) { ret = true; lastUpdates.put(name, lastModification); Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/Feed.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Writer; import java.net.URL; import javax.servlet.http.HttpServletResponse; @@ -50,13 +51,24 @@ * Generates a feed getting data from the given url. * @param url Url from which to get the content. */ - public void generateFromUrl(URL url) throws IOException; + public void generate(URL url) throws IOException; /** + * Generates a feed getting data from the given input stream. + * @param is Input stream from which to get the content. + * @throws IOException + */ + public void generate(InputStream is) throws IOException; + /** + * Gets a writer to which content of this feed can be written. + * @return A writer for writing content of this feed. + */ + public Writer getWriter() throws IOException; + /** * Generates a feed using the given feeds. * @param feeds Feeds which should be aggregated into a single * feed. */ - public void generateFromFeeds(Feed[] feeds, String title, + public void generate(Feed[] feeds, String title, String description, String author, String link) throws IllegalArgumentException, IOException; /** Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedFactory.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -62,7 +62,6 @@ try { File file = File.createTempFile(FeedsDescriptor.FEEDS_FILE_PREFIX + nextInt, type); - //TODO System.out.println("Created temp file: " + file.getAbsolutePath()); return (Feed) feedClass.getConstructor(new Class[] { File.class }). newInstance(new Object[] { file }); } catch (Exception e) { Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FeedsDescriptor.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -22,8 +22,14 @@ package org.jboss.forge.feeds; import java.io.IOException; +import java.io.Writer; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.net.URL; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -31,8 +37,10 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; +import org.apache.velocity.VelocityContext; import org.apache.xerces.parsers.DOMParser; import org.jboss.forge.common.ForgeHelper; import org.jboss.forge.common.XmlTools; @@ -41,6 +49,8 @@ import org.jboss.logging.Logger; import org.jboss.portal.common.context.DelegateContext; import org.jboss.shotoku.ContentManager; +import org.jboss.shotoku.search.Search; +import org.jboss.shotoku.search.SearchParameter; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; @@ -68,6 +78,8 @@ private final static String AGG_FEED_TAG = "aggregated-feed"; private final static String SHO_FEED_TAG = "shotoku-feed"; + private final static String SHOTOKU_CONFIG = "shotoku-config.properties"; + private final static String ALL_TOKENS = "*"; private final static String TOKENS_DELIMITER = ","; @@ -151,8 +163,16 @@ // Firstly - the remote feeds. generateRemoteFeeds(portalName, remoteFeedDefs); - // TODO add shotoku feeds + // Then, shotoku feeds. + Properties props = new Properties(); + try { + props.load(cm.getNode(SHOTOKU_CONFIG).getContentInputStream()); + } catch (Exception e) { + log.warn("Error loading shotoku feeds configuration.", e); + } + generateShotokuFeeds(portalName, shotokuFeedDefs, props); + // After that, we can create the aggregated feeds. generateAggregatedFeeds(portalName, aggregatedFeedDefs); @@ -182,6 +202,111 @@ } } + private SearchParameter generateSearchParameter(Node n, Properties props, Set parametrized) + throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, + InvocationTargetException, NoSuchMethodException, ClassNotFoundException { + String paramName = n.getNodeName(); + String paramClass = props.getProperty(paramName); + + if (paramClass == null) + throw new RuntimeException("Unknown parameter name: " + paramName + "."); + + SearchParameter param; + if (parametrized.contains(paramName)) { + param = (SearchParameter) Class.forName(paramClass).getConstructor( + new Class[] { Map.class }).newInstance(new Object[] { + XmlTools.getMapFromNodeAttributes(n) }); + } else { + param = (SearchParameter) Class.forName(paramClass).newInstance(); + } + + NodeList nodeList = n.getChildNodes(); + for (int i=0; i<nodeList.getLength(); i++) { + Node child = nodeList.item(i); + + if (child.getNodeType() == Node.ELEMENT_NODE) { + SearchParameter childParam = generateSearchParameter( + child, props, parametrized); + + Method[] methods = param.getClass().getMethods(); + for (Method method : methods) { + if ("add".equals(method.getName())) { + method.invoke(param, new Object[] { childParam }); + break; + } + } + } + } + + return param; + } + + private void generateShotokuFeeds(String portalName, Map<String, Node> feedDefs, + Properties props) { + Set parametrized = new HashSet<String>( + Arrays.asList(props.getProperty("parametrized").split("[,]"))); + + for (String feedName : feedDefs.keySet()) { + Node feedNode = feedDefs.get(feedName); + String templateAttr = XmlTools.getAttributeValue(feedNode, "template"); + String prefixAttr = XmlTools.getAttributeValue(feedNode, "prefix"); + String idAttr = XmlTools.getAttributeValue(feedNode, "id"); + String typesAttr = XmlTools.getAttributeValue(feedNode, "type"); + + feedDisplayNames.put(feedName, + XmlTools.getAttributeValue(feedNode, "display-name")); + + ContentManager cm = ContentManager.getContentManager(idAttr, prefixAttr); + + // Generating the type of feeds that have been requested. + String[] types; + if (ALL_TOKENS.equals(typesAttr)) { + types = FeedFactory.getAllFeedTypes(); + } else { + types = typesAttr.split("[" + TOKENS_DELIMITER + "]"); + } + + Search search; + try { + search = (Search) generateSearchParameter(feedNode, props, + parametrized); + } catch (Exception e) { + log.warn("Error generating shotoku feed " + feedName + ".", e); + continue; + } + + org.jboss.shotoku.NodeList list = search.perform(cm); + + + VelocityContext vc = new VelocityContext(); + vc.put("title", XmlTools.getAttributeValue(feedNode, "title")); + vc.put("description", XmlTools.getAttributeValue(feedNode, "description")); + vc.put("author", XmlTools.getAttributeValue(feedNode, "author")); + vc.put("dateFormat", new SimpleDateFormat("MM/dd/yy")); + vc.put("pubDate", Calendar.getInstance().getTime()); + vc.put("linkBase", + XmlTools.getAttributeValue(feedNode, "link-base") + prefixAttr + "/"); + + for (String type : types) { + String template = templateAttr.replace(TYPE_PARAM, type); + + Feed newFeed = FeedFactory.getNewFeed(type); + try { + vc.put("link", generateFeedLink(true, feedName, type)); + + Writer w = newFeed.getWriter(); + list.mergeWithTemplate(cm, template, "nodes", vc, w); + w.flush(); + w.close(); + + addFeed(feedName, type, newFeed); + } catch (Exception e) { + log.warn("Cannot merge template " + template + " for " + feedName + ".", e); + } + } + } + } + private void generateRemoteFeeds(String portalName, Map<String, Node> feedDefs) { for (String feedName : feedDefs.keySet()) { Node feedNode = feedDefs.get(feedName); @@ -212,7 +337,7 @@ try { Feed newFeed = FeedFactory.getNewFeed(type); - newFeed.generateFromUrl(new URL(address)); + newFeed.generate(new URL(address)); addFeed(feedNameReplaced, type, newFeed); } catch (Exception e) { log.warn("Can't add feeed " + address + " : " + type @@ -306,7 +431,7 @@ Feed newFeed = FeedFactory.getNewFeed(type); try { - newFeed.generateFromFeeds(requiredFeeds.toArray(new Feed[0]), + newFeed.generate(requiredFeeds.toArray(new Feed[0]), feedParameters[0], feedParameters[1], feedParameters[2], generateFeedLink(true, feedName, type)); } catch (Exception e) { Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/FileBasedFeed.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -27,9 +27,11 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Writer; import java.net.URL; import javax.servlet.http.HttpServletResponse; @@ -50,15 +52,19 @@ os.write(buffer, 0, read); } - public void generateFromUrl(URL url) throws IOException { + public void generate(URL url) throws IOException { + InputStream is = url.openStream(); + generate(is); + is.close(); + } + + public void generate(InputStream is) throws IOException { file.createNewFile(); - InputStream is = url.openStream(); OutputStream os = new BufferedOutputStream(new FileOutputStream(file)); - + transfer(is, os); - is.close(); os.close(); } @@ -69,6 +75,10 @@ is.close(); } + public Writer getWriter() throws IOException { + return new FileWriter(file); + } + protected abstract String getContentType(); public void write(HttpServletResponse response) throws IOException { Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/InformaBasedFeed.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -25,7 +25,7 @@ protected abstract ChannelExporterIF getExporter() throws IOException; @SuppressWarnings("unchecked") - public void generateFromFeeds(Feed[] feeds, String title, String description, + public void generate(Feed[] feeds, String title, String description, String author, String link) throws IllegalArgumentException, IOException { ChannelBuilder builder = new ChannelBuilder(); Modified: trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java =================================================================== --- trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-feeds/src/java/org/jboss/forge/feeds/RomeBasedFeed.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -46,7 +46,7 @@ protected abstract void setFeedType(SyndFeed feed); @SuppressWarnings("unchecked") - public void generateFromFeeds(Feed[] feeds, String title, String description, + public void generate(Feed[] feeds, String title, String description, String author, String link) throws IllegalArgumentException, IOException { SyndFeed syndFeed = new SyndFeedImpl(); Modified: trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java =================================================================== --- trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -123,7 +123,7 @@ if (requestedRes.indexOf(DOWNLOADS_ACCESS)!=-1) { // Sending the request to the DownloadCounter to increment // counter for this link if it's one of the tracked links. - DownloadCounter.increment(requestedRes,contentManager); + //DownloadCounter.increment(requestedRes,contentManager); } Node requestedNode = contentManager.getNode(requestedRes); Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/etc/JBossWiki.properties 2005-11-07 16:32:42 UTC (rev 1524) @@ -12,7 +12,7 @@ credentialsClass=org.jboss.wiki.JBossPortalCredentials #mediaDataSourceClass class to use for mediaDataSource -mediaDataSourceClass=org.jboss.wiki.FileDataSource +mediaDataSourceClass=org.jboss.wiki.ShotokuDataSource #attachmentDataSourceClass class to use for AttachmentDataSource attachmentDataSourceClass=org.jboss.wiki.FileDataSource Modified: trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/ShotokuDataSource.java =================================================================== --- trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/ShotokuDataSource.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/jbosswiki/wiki-common/src/java/org/jboss/wiki/ShotokuDataSource.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -103,7 +103,7 @@ return new WikiPage(pageName, new SimpleCredentials("someone"), page.getContent(), page.getHistory().getRevisionsCount(), page.getHistory().getRevisionsCount(), new Date(page - .getLastModfication()), wikiEngine, true, true); + .getLastModification()), wikiEngine, true, true); } catch (ResourceDoesNotExist e) { return null; Modified: trunk/forge/portal-extensions/shotoku/project.xml =================================================================== --- trunk/forge/portal-extensions/shotoku/project.xml 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/project.xml 2005-11-07 16:32:42 UTC (rev 1524) @@ -40,5 +40,20 @@ <artifactId>log4j</artifactId> <version>1.2.9</version> </dependency> + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity-dep</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>velocity</groupId> + <artifactId>velocity</artifactId> + <version>1.4-dev</version> + </dependency> </dependencies> </project> Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/project.xml =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/project.xml 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/project.xml 2005-11-07 16:32:42 UTC (rev 1524) @@ -17,21 +17,6 @@ <description></description> <dependencies> - <dependency> - <groupId>velocity</groupId> - <artifactId>velocity</artifactId> - <version>1.4</version> - </dependency> - <dependency> - <groupId>velocity</groupId> - <artifactId>velocity-dep</artifactId> - <version>1.4</version> - </dependency> - <dependency> - <groupId>velocity</groupId> - <artifactId>velocity</artifactId> - <version>1.4-dev</version> - </dependency> </dependencies> <build> Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/ContentManager.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -31,7 +31,6 @@ import org.apache.xerces.parsers.DOMParser; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; import org.jboss.shotoku.exceptions.RepositoryException; -import org.jboss.shotoku.search.Search; import org.w3c.dom.Document; import org.xml.sax.InputSource; @@ -86,17 +85,6 @@ */ public abstract Directory getDirectory(String path) throws ResourceDoesNotExist, RepositoryException; - - /** - * Performs a search with the given parameters. - * - * @param parameters - * Parameters for the search. - * @return A list of found nodes. - * @throws RepositoryException - */ - public abstract NodeList search(Search parameters) - throws RepositoryException; /** * Gets a velocity engine, initialized with default properties, as defined @@ -175,6 +163,8 @@ protected ContentManager(String id, String prefix) { this.id = id; this.prefix = prefix; + + engines = new HashMap<String, VelocityEngine>(); } /* Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/Node.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.OutputStream; +import java.util.Date; import org.jboss.shotoku.exceptions.RepositoryException; @@ -130,7 +131,16 @@ * @return Last modification time of this node. * @throws RepositoryException */ - public long getLastModfication() throws RepositoryException; + public long getLastModification() throws RepositoryException; + + /** + * Gets the last modification time of this node, represented as a date + * object. + * + * @return Last modification time of this node, represented as a date. + * @throws RepositoryException + */ + public Date getLastModificationDate() throws RepositoryException; /** * Gets the mime type of this node. Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/NodeList.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/NodeList.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/NodeList.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,7 @@ */ package org.jboss.shotoku; +import java.io.Writer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -28,6 +29,9 @@ import java.util.Iterator; import java.util.List; +import org.apache.velocity.VelocityContext; +import org.jboss.shotoku.exceptions.RepositoryException; + /** * A class representing a list of nodes and providing the possibility to * manipulate these nodes. @@ -107,4 +111,21 @@ nodeList = nodeList.subList(0, limit); } } + + public void mergeWithTemplate(ContentManager cm, String templateName, + String nodesParameter, Writer w) + throws RepositoryException { + mergeWithTemplate(cm, templateName, nodesParameter, new VelocityContext(), w); + } + + public void mergeWithTemplate(ContentManager cm, String templateName, + String nodesParameter, VelocityContext context, Writer w) + throws RepositoryException { + context.put(nodesParameter, nodeList); + try { + cm.getVelocityEngine().mergeTemplate(templateName, context, w); + } catch (Exception e) { + throw new RepositoryException(e); + } + } } Added: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DateSortParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DateSortParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DateSortParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -0,0 +1,20 @@ +package org.jboss.shotoku.search; + +import java.util.Comparator; + +import org.jboss.shotoku.Node; + +public class DateSortParameter extends SortParameter { + public DateSortParameter() { + super (new Comparator<Node>() { + public int compare(Node o1, Node o2) { + long lastMod1 = o1.getLastModification(); + long lastMod2 = o2.getLastModification(); + + if (lastMod1 == lastMod2) return 0; + + return lastMod1 < lastMod2 ? 1 : -1; + } + }); + } +} Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DirectoryIncludeParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DirectoryIncludeParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/DirectoryIncludeParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,8 @@ */ package org.jboss.shotoku.search; +import java.util.Map; + import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.Directory; import org.jboss.shotoku.NodeList; @@ -31,13 +33,23 @@ */ public class DirectoryIncludeParameter implements SearchParameter { private Directory directory; - + private String path; + public DirectoryIncludeParameter(Directory directory) { this.directory = directory; } + + public DirectoryIncludeParameter(Map<String, String> params) { + this.path = params.get("path"); + } public NodeList transform(NodeList list, ContentManager cm) { - list.addAll(directory.getNodes()); + if (path == null) { + list.addAll(directory.getNodes()); + } else { + list.addAll(cm.getDirectory(path).getNodes()); + } + return list; } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/HistoryIncludeParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/HistoryIncludeParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/HistoryIncludeParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,8 @@ */ package org.jboss.shotoku.search; +import java.util.Map; + import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.History; import org.jboss.shotoku.Node; @@ -33,6 +35,7 @@ */ public class HistoryIncludeParameter implements SearchParameter { private History history; + private String path; public HistoryIncludeParameter(History history) { this.history = history; @@ -41,9 +44,18 @@ public HistoryIncludeParameter(Node node) { history = node.getHistory(); } + + public HistoryIncludeParameter(Map<String, String> params) { + this.path = params.get("path"); + } public NodeList transform(NodeList list, ContentManager cm) { - list.addAll(history.getAllRevisions()); + if (path == null) { + list.addAll(history.getAllRevisions()); + } else { + list.addAll(cm.getNode(path).getHistory().getAllRevisions()); + } + return list; } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/LimitParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/LimitParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/LimitParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,8 @@ */ package org.jboss.shotoku.search; +import java.util.Map; + import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.NodeList; @@ -35,6 +37,10 @@ public LimitParameter(int limit) { this.limit = limit; } + + public LimitParameter(Map<String, String> params) { + limit = Integer.valueOf(params.get("limit")); + } public NodeList transform(NodeList list, ContentManager cm) { list.limit(limit); Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/MultiBooleanNodeFilter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/MultiBooleanNodeFilter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/MultiBooleanNodeFilter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -35,7 +35,7 @@ filters = new ArrayList<BooleanNodeFilter>(); } - public void addFilter(BooleanNodeFilter filter) { + public void add(BooleanNodeFilter filter) { filters.add(filter); } } Added: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertySortParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertySortParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertySortParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -0,0 +1,32 @@ +package org.jboss.shotoku.search; + +import java.util.Comparator; +import java.util.Map; + +import org.jboss.shotoku.Node; + +public class PropertySortParameter extends SortParameter { + public PropertySortParameter(Map<String, String> params) { + this(params.get("name"), "true".equals(params.get("descending"))); + } + + public PropertySortParameter(final String propertyName, final boolean descending) { + super (new Comparator<Node>() { + public int compare(Node o1, Node o2) { + String prop1 = o1.getProperty(propertyName); + String prop2 = o2.getProperty(propertyName); + + if (prop1 == null) { + if (prop2 == null) { + return 0; + } else { + return descending ? 1 : -1; + } + } + + return descending ? + prop1.compareTo(prop2) : prop2.compareTo(prop1); + } + }); + } +} \ No newline at end of file Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertyValueParameter.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertyValueParameter.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/search/PropertyValueParameter.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -21,6 +21,8 @@ */ package org.jboss.shotoku.search; +import java.util.Map; + import org.jboss.shotoku.Node; /** @@ -30,6 +32,10 @@ private String propertyName; private String propertyValue; + public PropertyValueParameter(Map<String, String> params) { + this(params.get("name"), params.get("value")); + } + public PropertyValueParameter(String name, String value) { propertyName = name; propertyValue = value; Modified: trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/velocity/ShotokuResourceLoader.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/velocity/ShotokuResourceLoader.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-base/src/java/org/jboss/shotoku/velocity/ShotokuResourceLoader.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -36,12 +36,12 @@ @Override public boolean isSourceModified(Resource resource) { - return resource.getLastModified() != cm.getNode(resource.getName()).getLastModfication(); + return resource.getLastModified() != cm.getNode(resource.getName()).getLastModification(); } @Override public long getLastModified(Resource resource) { - return cm.getNode(resource.getName()).getLastModfication(); + return cm.getNode(resource.getName()).getLastModification(); } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnContentManager.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -26,10 +26,8 @@ import org.jboss.shotoku.ContentManager; import org.jboss.shotoku.Directory; import org.jboss.shotoku.Node; -import org.jboss.shotoku.NodeList; import org.jboss.shotoku.exceptions.RepositoryException; import org.jboss.shotoku.exceptions.ResourceDoesNotExist; -import org.jboss.shotoku.search.Search; /** * @author adamw @@ -143,9 +141,4 @@ return new SvnDirectory(id, getPrefixedPath(path), file, getNameFromPath(path), this); } - - @Override - public NodeList search(Search search) { - return search.perform(this); - } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -125,7 +125,7 @@ return file.length(); } - public long getLastModfication() { + public long getLastModification() { if (checkForChanges()) return file.lastModified(); else Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHistoricNode.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -99,7 +99,7 @@ return content.size(); } - public long getLastModfication() { + public long getLastModification() { return commitDate.getTime(); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -66,7 +66,7 @@ } @Override - public long getLastModfication() { + public long getLastModification() { return Calendar.getInstance().getTimeInMillis(); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNodeHelper.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNodeHelper.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNodeHelper.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -24,6 +24,7 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; +import java.util.Date; import org.jboss.shotoku.Directory; import org.jboss.shotoku.History; @@ -68,8 +69,8 @@ return currentNode.getHistory(); } - public long getLastModfication() throws RepositoryException { - return currentNode.getLastModfication(); + public long getLastModification() throws RepositoryException { + return currentNode.getLastModification(); } public long getLength() throws RepositoryException { @@ -119,4 +120,8 @@ public void setProperty(String name, String value) { currentNode.setProperty(name, value); } + + public Date getLastModificationDate() throws RepositoryException { + return currentNode.getLastModificationDate(); + } } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java 2005-11-07 11:06:39 UTC (rev 1523) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNode.java 2005-11-07 16:32:42 UTC (rev 1524) @@ -23,6 +23,7 @@ import java.io.File; import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.activation.MimetypesFileTypeMap; @@ -68,4 +69,8 @@ public String getMimeType() { return mimeTypes.getContentType(getName()); } + + public Date getLastModificationDate() { + return new Date(getLastModification()); + } } |