Scarab commit: svn commit: r10281 - branches/release/b21/src: java/org/tigris/scarab/actions java/org/tigris/scarab/feeds java/org/tigris/scarab/screens java/org/tigris/scarab/util webapp/WEB-INF/templates/screens

[email protected]
Newsgroups gmane.comp.java.scarab.cvs
Message-ID <[email protected]>
Author: jorgeuriarte
Date: 2006-09-07 16:47:01-0700
New Revision: 10281

Added:
   branches/release/b21/src/java/org/tigris/scarab/screens/RSSIssueList.java
Modified:
   branches/release/b21/src/java/org/tigris/scarab/actions/Search.java
   branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java
   branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java
   branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java
   branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm

Log:
Fixes in the RSS export of queries. Closes SCB1265 & SCB1398:
- The RSS feed of searches is now driven by the Search action-class.
- RSSDataExport will now only dump issue data (no more query data). Previous implementation was broken, because
of a failed duplication of search-code.
- The RSS output is filtered to avoid illegal XML characters.



Modified: branches/release/b21/src/java/org/tigris/scarab/actions/Search.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/java/org/tigris/scarab/actions/Search.java?view=diff&rev=10281&p1=branches/release/b21/src/java/org/tigris/scarab/actions/Search.java&p2=branches/release/b21/src/java/org/tigris/scarab/actions/Search.java&r1=10280&r2=10281
==============================================================================
--- branches/release/b21/src/java/org/tigris/scarab/actions/Search.java	(original)
+++ branches/release/b21/src/java/org/tigris/scarab/actions/Search.java	2006-09-07 16:47:01-0700
@@ -73,7 +73,6 @@
 import org.tigris.scarab.om.IssueType;
 import org.tigris.scarab.om.IssueTypeManager;
 import org.tigris.scarab.om.MITList;
-import org.tigris.scarab.om.MITListItem;
 import org.tigris.scarab.om.MITListManager;
 import org.tigris.scarab.om.Module;
 import org.tigris.scarab.om.ModuleManager;
@@ -111,6 +110,10 @@
     private static final String ANY = "any";
     private static final String CREATED_BY = "created_by";
 
+    private static final String OUTPUT_FORMAT = "output";
+    private static final String WEB_OUTPUT = "web";
+    private static final String FEED_OUTPUT = "feed";
+    
     ScarabLocalizationTool l10n;
     ScarabRequestTool scarabR;
     Intake intake;
@@ -267,7 +270,7 @@
             {
                 String template = data.getParameters()
                     .getString(ScarabConstants.NEXT_TEMPLATE,
-                               "IssueList.vm");
+                               getIssueListTarget());
                 setTarget(data, template);
             }
         }
@@ -572,7 +575,7 @@
                                      parser.getString("searchsp"));
         }
 
-        setTarget(data, "IssueList.vm");
+        setTarget(data, getIssueListTarget());
     }
 
 
@@ -613,7 +616,7 @@
             }
             else if (go.equals("mostRecent"))
             {
-                setTarget(data, "IssueList.vm");
+                setTarget(data, getIssueListTarget());
             }
             else if (go.equals("myIssuesThisModule"))
             {
@@ -627,7 +630,7 @@
                     .append("&user_attr_").append(userId).append("=any")
                     .toString();
                 user.setMostRecentQuery(query);
-                setTarget(data, "IssueList.vm");
+                setTarget(data, getIssueListTarget());
             }
             else if (go.equals("myIssuesAllModules"))
             {
@@ -639,7 +642,7 @@
                     .append("&user_attr_").append(userId).append("=any")
                     .toString();
                 user.setMostRecentQuery(query);
-                setTarget(data, "IssueList.vm");
+                setTarget(data, getIssueListTarget());
             }
             else if (go.equals("quickSearch"))
             {
@@ -675,7 +678,7 @@
                     }
                     quickSearch(searchString, attributeMap, user, context);
                 }
-                setTarget(data, "IssueList.vm");
+                setTarget(data, getIssueListTarget());
             }
             else if (go.equals("privateQueries")
                    ||go.equals("publicQueries"))
@@ -1324,5 +1327,23 @@
         params = data.getParameters();
         user = (ScarabUser)data.getUser();
     }
+    
+    /**
+     * 
+     * @param data
+     * @param outputFormat Possible values: WEB_OUTPUT | FEED_OUTPUT
+     */
+    private String getIssueListTarget()
+    {
+        String outputFormat = this.params.getString(OUTPUT_FORMAT, WEB_OUTPUT);
+        if (outputFormat.equals(FEED_OUTPUT))
+        {
+            return "RSSIssueList.vm";
+        }
+        else
+        {
+            return "IssueList.vm";
+        }
+    }
         
 }

Modified: branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java?view=diff&rev=10281&p1=branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java&p2=branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java&r1=10280&r2=10281
==============================================================================
--- branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java	(original)
+++ branches/release/b21/src/java/org/tigris/scarab/feeds/QueryFeed.java	2006-09-07 16:47:01-0700
@@ -1,32 +1,20 @@
 
 package org.tigris.scarab.feeds;
 
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.commons.collections.map.LinkedMap;
-import org.apache.fulcrum.parser.StringValueParser;
+import org.apache.fulcrum.security.util.TurbineSecurityException;
 import org.apache.torque.TorqueException;
-import org.tigris.scarab.om.AttributeValue;
 import org.tigris.scarab.om.Issue;
 import org.tigris.scarab.om.IssueManager;
-import org.tigris.scarab.om.IssueType;
-import org.tigris.scarab.om.MITList;
-import org.tigris.scarab.om.Module;
 import org.tigris.scarab.om.Query;
 import org.tigris.scarab.om.RModuleUserAttribute;
-import org.tigris.scarab.om.ScarabUser;
-import org.tigris.scarab.tools.ScarabToolManager;
 import org.tigris.scarab.util.IteratorWithSize;
 import org.tigris.scarab.util.ScarabLink;
-import org.tigris.scarab.util.word.IssueSearch;
-import org.tigris.scarab.util.word.IssueSearchFactory;
-import org.tigris.scarab.util.word.MaxConcurrentSearchException;
+import org.tigris.scarab.util.ScarabUtil;
 import org.tigris.scarab.util.word.QueryResult;
 
 import com.sun.syndication.feed.synd.SyndContent;
@@ -35,7 +23,7 @@
 import com.sun.syndication.feed.synd.SyndEntryImpl;
 import com.sun.syndication.feed.synd.SyndFeed;
 import com.sun.syndication.feed.synd.SyndFeedImpl;
-import com.sun.syndication.io.FeedException;
+import com.workingdogs.village.DataSetException;
 
 /**
  * Converts a query to an RSS feed.  The private methods are mostly ripped off
@@ -45,62 +33,44 @@
  *  
  */
 public class QueryFeed implements Feed {
-    private static final String DATE_FORMAT = "yyyy-MM-dd";
 
     private Query query;
-    private ScarabUser user;
+    private IteratorWithSize results;
     private ScarabLink scarabLink;
-	private ScarabToolManager scarabToolManager;
+    private String format;
     
 
-    public QueryFeed(Query query, ScarabUser user,ScarabToolManager scarabToolManager, ScarabLink scarabLink) {
+    /**
+     * Constructs the query feed with the search results. 
+     * @param query The searched query
+     * @param results The iterator containing the search-results
+     * @param scarabToolManager
+     * @param scarabLink
+     * @param format 
+     */
+    public QueryFeed(Query query, IteratorWithSize results, ScarabLink scarabLink, String format) {
         this.query = query;
-        this.user = user;
+        this.results = results;
         this.scarabLink = scarabLink;
-        this.scarabToolManager = scarabToolManager;
+        this.format = format;
     }
 
-    public SyndFeed getFeed() throws IOException, FeedException, TorqueException, Exception {
-        DateFormat dateParser = new SimpleDateFormat(DATE_FORMAT);
-
+    public SyndFeed getFeed() throws Exception, TorqueException, DataSetException, TurbineSecurityException
+    {
+        boolean showModuleName = !query.getMITList().isSingleModule();
+        boolean showIssueType = !query.getMITList().isSingleIssueType();
 
         SyndFeed feed = new SyndFeedImpl();
-
-        MITList mitList = query.getMITList();
-        boolean showModuleName = !mitList.isSingleModule();
-        boolean showIssueType = !mitList.isSingleIssueType();
-        String currentQueryString = query.getValue();
-        IssueSearch search = getPopulatedSearch(currentQueryString,mitList,user);
-        
-        IteratorWithSize queryResults = null;
-
-        // Do search
-
-        if (search == null) {
-            // an alert message should have been set while attempting
-            // to populate the search.
-            queryResults = IteratorWithSize.EMPTY;
-        } else {
-            queryResults = search.getQueryResults();
-
-        }
-
         feed.setTitle(query.getName());
         String link = scarabLink.setAction("Search").addPathInfo("go",query.getQueryId()).toString();
         feed.setLink(link);
         feed.setDescription(query.getDescription());
-
         List entries = new ArrayList();
-
-        for (Iterator i = queryResults; i.hasNext();) {
-            SyndEntry entry;
-            SyndContent description;
-            //MITListItem item = (MITListItem) i.next();
-            QueryResult queryResult = (QueryResult)i.next();
-
-            
-            
-            entry = new SyndEntryImpl();            
+        while (results.hasNext())
+        {
+            SyndEntry entry = new SyndEntryImpl();
+            SyndContent description = new SyndContentImpl();
+            QueryResult queryResult = (QueryResult)results.next();
             String title = queryResult.getUniqueId();
             if(showModuleName){
                 title = title + " ("+ queryResult.getModule().getRealName() + ")";
@@ -114,7 +84,7 @@
 
             link = scarabLink.getIssueIdAbsoluteLink(issue).toString();
             entry.setLink(link);
-            
+
             Date publishedDate = null;
             if(issue.getModifiedDate()!= null){
                 publishedDate = issue.getModifiedDate();
@@ -123,149 +93,26 @@
                 publishedDate = issue.getCreatedDate();
             }
             entry.setPublishedDate(publishedDate);
-            
 
             description = new SyndContentImpl();
             description.setType("text/html");
             String desc = "";
             Iterator avIteratorCSV = queryResult.getAttributeValuesAsCSV().iterator();
-            Iterator avIterator = search.getIssueListAttributeColumns().iterator();
-            for(;avIterator.hasNext();){
+            Iterator avIterator = query.getMITList().getAllRModuleUserAttributes().iterator();
+            while (avIterator.hasNext())
+            {
                 String value = (String)avIteratorCSV.next();
                 RModuleUserAttribute av = (RModuleUserAttribute)avIterator.next();
                 desc = desc + "<b>" + av.getAttribute().getName()+":</b>" + value +"<br/>";
             }
-            description.setValue(desc);
+            description.setValue(ScarabUtil.filterNonXml(desc));
 
             entry.setDescription(description);
             entries.add(entry);
-
         }
-     
-
         feed.setEntries(entries);
-        
-        search.close();
-        IssueSearchFactory.INSTANCE.notifyDone();
-
+        feed.setFeedType(format);
         return feed;
-    }
-
-    /**
-     * Get an IssueSearch object based on a query string. Copied from
-     * ScarabRequestTool
-     * 
-     * @return a <code>Issue</code> value
-     */
-    private IssueSearch getPopulatedSearch(String query, MITList mitList, ScarabUser searcher) throws Exception {
-        IssueSearch search = getNewSearch(mitList,searcher);
-        Module module = mitList.getModule();   
-        IssueType issueType = null;
-        // this sucks, but seems required...
-        if(mitList.isSingleIssueType()){
-        	issueType = mitList.getIssueType();
-        }
-        else {
-        	issueType = mitList.getFirstItem().getIssueType();
-        }
-        List listUserAttributes = scarabToolManager.getRModuleUserAttributes(user,module,issueType);
-        search.setIssueListAttributeColumns(listUserAttributes);
-
-       //Intake intake = null;
-
-        if (query == null) {
-            throw new Exception("Query was null");
-        }
-
-        // If they have entered users to search on, add them to the search
-        StringValueParser parser = new StringValueParser();
-        parser.parse(query, '&', '=', true);
-        String[] userList = parser.getStrings("user_list");
-        if (userList != null && userList.length > 0) {
-            for (int i = 0; i < userList.length; i++) {
-                String userId = userList[i];
-                String[] attrIds = parser.getStrings("user_attr_" + userId);
-                if (attrIds != null) {
-                    for (int j = 0; j < attrIds.length; j++) {
-                        search.addUserCriteria(userId, attrIds[j]);
-                    }
-                }
-            }
-        }
-
-        // Set intake properties
-        /*
-         * boolean searchSuccess = true; Group searchGroup =
-         * intake.get("SearchIssue", search.getQueryKey());
-         * 
-         * Field minDate = searchGroup.get("MinDate"); if (minDate != null &&
-         * minDate.toString().length() > 0) { searchSuccess = checkDate(search,
-         * minDate.toString()); }
-         * 
-         * Field maxDate = searchGroup.get("MaxDate"); if (maxDate != null &&
-         * maxDate.toString().length() > 0) { searchSuccess = checkDate(search,
-         * maxDate.toString()); }
-         * 
-         * Field stateChangeFromDate = searchGroup.get("StateChangeFromDate");
-         * if (stateChangeFromDate != null &&
-         * stateChangeFromDate.toString().length() > 0) { searchSuccess =
-         * checkDate(search, stateChangeFromDate.toString()); }
-         * 
-         * Field stateChangeToDate = searchGroup.get("StateChangeToDate"); if
-         * (stateChangeToDate != null && stateChangeToDate.toString().length() >
-         * 0) { searchSuccess = checkDate(search, stateChangeToDate.toString()); }
-         * 
-         * if (!searchSuccess) { setAlertMessage(l10n.format("DateFormatPrompt",
-         * L10NKeySet.ShortDateDisplay)); return null; }
-         * 
-         * try { searchGroup.setProperties(search); } catch (Exception e) {
-         * setAlertMessage(l10n.getMessage(e)); return null; }
-         * 
-         * Integer oldOptionId = search.getStateChangeFromOptionId(); if
-         * (oldOptionId != null && oldOptionId.intValue() != 0 &&
-         * oldOptionId.equals(search.getStateChangeToOptionId())) {
-         * setAlertMessage(L10NKeySet.StateChangeOldEqualNew); return null; }
-         */
-        // Set attribute values to search on
-        LinkedMap avMap = search.getCommonAttributeValuesMap();
-        Iterator i = avMap.mapIterator();
-        while (i.hasNext()) {
-            AttributeValue aval = (AttributeValue) avMap.get(i.next());
-         //   Group group = intake.get("AttributeValue", aval.getQueryKey());
-          //  if (group != null) {
-          //      group.setProperties(aval);
-          //  }
-        }
-
-        // If user is sorting on an attribute, set sort criteria
-        // Do not use intake, since intake parsed from query is not the same
-        // As intake passed from the form
-        //    String sortColumn = data.getParameters().getString("sortColumn");
-        //      if (sortColumn != null && sortColumn.length() > 0 &&
-        // StringUtils.isNumeric(sortColumn)) {
-        //      search.setSortAttributeId(new Integer(sortColumn));
-        // }
-
-        //        String sortPolarity = data.getParameters().getString("sortPolarity");
-        //      if (sortPolarity != null && sortPolarity.length() > 0) {
-        //        search.setSortPolarity(sortPolarity);
-        //  }
-
-        return search;
-    }
-
-    /**
-     * Get a new IssueSearch object. Copied from ScarabRequestTool
-     * 
-     * @return a <code>Issue</code> value
-     */
-    private IssueSearch getNewSearch(MITList mitList, ScarabUser searcher) throws Exception,
-            MaxConcurrentSearchException {
-
-        IssueSearch issueSearch = IssueSearchFactory.INSTANCE.getInstance(mitList, searcher);
-        // issueSearch.setLocale(getLocalizationTool().getPrimaryLocale());
-
-        return issueSearch;
-    }
-
+    }    
+    
 }
\ No newline at end of file

Modified: branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java?view=diff&rev=10281&p1=branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java&p2=branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java&r1=10280&r2=10281
==============================================================================
--- branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java	(original)
+++ branches/release/b21/src/java/org/tigris/scarab/screens/RSSDataExport.java	2006-09-07 16:47:01-0700
@@ -52,19 +52,13 @@
 
 import org.apache.fulcrum.parser.ParameterParser;
 import org.apache.torque.TorqueException;
-import org.apache.torque.om.NumberKey;
 import org.apache.turbine.RunData;
 import org.apache.turbine.TemplateContext;
 import org.apache.turbine.TemplateScreen;
 import org.tigris.scarab.feeds.Feed;
 import org.tigris.scarab.feeds.IssueFeed;
-import org.tigris.scarab.feeds.QueryFeed;
 import org.tigris.scarab.om.Issue;
 import org.tigris.scarab.om.IssueManager;
-import org.tigris.scarab.om.Query;
-import org.tigris.scarab.om.QueryManager;
-import org.tigris.scarab.om.ScarabUser;
-import org.tigris.scarab.om.ScarabUserManager;
 import org.tigris.scarab.tools.ScarabLocalizationTool;
 import org.tigris.scarab.tools.ScarabRequestTool;
 import org.tigris.scarab.tools.ScarabToolManager;
@@ -84,7 +78,7 @@
  * @author <a href="mailto:[email protected]">Eric Pugh </a>
  */
 public class RSSDataExport extends TemplateScreen {
-	private static final String DEFAULT_FEED_FORMAT = "atom_0.3";
+	public static final String DEFAULT_FEED_FORMAT = "atom_0.3";
 
 	private static final String MIME_TYPE = "application/xml; charset=UTF-8";
 
@@ -125,27 +119,10 @@
             String feedFormat = parser.getString(FEED_FORMAT_KEY);
 
             ScarabLink scarabLink= getScarabLinkTool(context);
-            ScarabRequestTool scarabRequestTool= getScarabRequestTool(context);
-            
-
             
             Feed feedSource = null;
             ScarabToolManager scarabToolManager = new ScarabToolManager(getLocalizationTool(context));
-            if (feedType.equals("QueryFeed")){
-                
-                long queryId = parser.getLong(QUERY_ID_KEY);            
-                long userId = parser.getLong(USER_ID_KEY);                
-                if(queryId==0){
-                    throw new IllegalArgumentException("Query ID is missing.  Should be appended like: /queryId/xxx");
-                }
-                if(userId==0){
-                    throw new IllegalArgumentException("User ID is missing.  Should be appended like: /userId/xxx");
-                }            	
-            	Query query = QueryManager.getInstance(new Long(queryId));
-                ScarabUser user1 = ScarabUserManager.getInstance(new NumberKey(userId), false);
-            	feedSource = new QueryFeed(query,user1,scarabToolManager,scarabLink);
-            }
-            else if (feedType.equals("IssueFeed")){
+            if (feedType.equals("IssueFeed")){
                 String issueId = parser.getString(ISSUE_ID_KEY);                
                 if(issueId.equals("")){
                     throw new IllegalArgumentException("Issue ID is missing.  Should be appended like: /issueId/xxx");

Added: branches/release/b21/src/java/org/tigris/scarab/screens/RSSIssueList.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/java/org/tigris/scarab/screens/RSSIssueList.java?view=auto&rev=10281
==============================================================================
--- (empty file)
+++ branches/release/b21/src/java/org/tigris/scarab/screens/RSSIssueList.java	2006-09-07 16:47:01-0700
@@ -0,0 +1,204 @@
+package org.tigris.scarab.screens;

+

+/* ================================================================

+ * Copyright (c) 2006 CollabNet.  All rights reserved.

+ * 

+ * Redistribution and use in source and binary forms, with or without

+ * modification, are permitted provided that the following conditions are

+ * met:

+ * 

+ * 1. Redistributions of source code must retain the above copyright

+ * notice, this list of conditions and the following disclaimer.

+ * 

+ * 2. Redistributions in binary form must reproduce the above copyright

+ * notice, this list of conditions and the following disclaimer in the

+ * documentation and/or other materials provided with the distribution.

+ * 

+ * 3. The end-user documentation included with the redistribution, if

+ * any, must include the following acknowlegement: "This product includes

+ * software developed by Collab.Net <http://www.Collab.Net/>."

+ * Alternately, this acknowlegement may appear in the software itself, if

+ * and wherever such third-party acknowlegements normally appear.

+ * 

+ * 4. The hosted project names must not be used to endorse or promote

+ * products derived from this software without prior written

+ * permission. For written permission, please contact [email protected].

+ * 

+ * 5. Products derived from this software may not use the "Tigris" or 

+ * "Scarab" names nor may "Tigris" or "Scarab" appear in their names without 

+ * prior written permission of Collab.Net.

+ * 

+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED

+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF

+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.

+ * IN NO EVENT SHALL COLLAB.NET OR ITS CONTRIBUTORS BE LIABLE FOR ANY

+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE

+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER

+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF

+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ *

+ * ====================================================================

+ * 

+ * This software consists of voluntary contributions made by many

+ * individuals on behalf of Collab.Net.

+ */ 

+import java.io.IOException;

+import java.io.Writer;

+import java.util.ArrayList;

+import java.util.Date;

+import java.util.Iterator;

+import java.util.List;

+

+import org.apache.fulcrum.parser.ParameterParser;

+import org.apache.fulcrum.security.util.TurbineSecurityException;

+import org.apache.torque.TorqueException;

+import org.apache.turbine.RunData;

+import org.apache.turbine.TemplateContext;

+import org.tigris.scarab.om.AttributeValue;

+import org.tigris.scarab.om.Issue;

+import org.tigris.scarab.om.IssueManager;

+import org.tigris.scarab.om.Query;

+import org.tigris.scarab.om.RModuleAttribute;

+import org.tigris.scarab.om.RModuleUserAttribute;

+import org.tigris.scarab.tools.ScarabRequestTool;

+import org.tigris.scarab.util.IteratorWithSize;

+import org.tigris.scarab.util.ScarabConstants;

+import org.tigris.scarab.util.ScarabLink;

+import org.tigris.scarab.util.ScarabUtil;

+import org.tigris.scarab.util.word.QueryResult;

+

+import com.sun.syndication.feed.synd.SyndContent;

+import com.sun.syndication.feed.synd.SyndContentImpl;

+import com.sun.syndication.feed.synd.SyndEntry;

+import com.sun.syndication.feed.synd.SyndEntryImpl;

+import com.sun.syndication.feed.synd.SyndFeed;

+import com.sun.syndication.feed.synd.SyndFeedImpl;

+import com.sun.syndication.io.FeedException;

+import com.sun.syndication.io.SyndFeedOutput;

+import com.workingdogs.village.DataSetException;

+

+/**

+ * Screen that will act just like IssueList, but will dump the results of the in-session

+ * query into a rss feed in the outputstream (no .vm template associated)

+ * 

+ * @author jorgeuriarte

+ *

+ */

+public class RSSIssueList extends Default

+{

+    private static final String DEFAULT_FEED_FORMAT = "atom_0.3";

+    

+    protected void doBuildTemplate(RunData data, TemplateContext context) throws Exception

+    {

+        ScarabRequestTool scarabR = getScarabRequestTool(context);

+        ScarabLink scarabLink = getScarabLinkTool(context);

+        ParameterParser parser = data.getParameters();

+        String feedType = parser.getString(RSSDataExport.FEED_TYPE_KEY);

+        SyndFeed feed = getQueryFeed(scarabR, scarabLink);

+        feed.setFeedType((feedType==null)?RSSDataExport.DEFAULT_FEED_FORMAT:feedType);

+        Writer writer = data.getResponse().getWriter();

+        outputFilteredXml(feed, writer);

+        data.setTarget(null);

+    }

+

+    private SyndFeed getQueryFeed(ScarabRequestTool scarabR, ScarabLink scarabLink) throws Exception, TorqueException, DataSetException, TurbineSecurityException

+    {

+        Query query = scarabR.getQuery();

+

+        boolean showModuleName = !query.getMITList().isSingleModule();

+        boolean showIssueType = !query.getMITList().isSingleIssueType();

+

+        IteratorWithSize it = scarabR.getCurrentSearchResults();

+        SyndFeed feed = new SyndFeedImpl();

+        feed.setTitle(query.getName());

+        String link = scarabLink.setAction("Search").addPathInfo("go",query.getQueryId()).toString();

+        feed.setLink(link);

+        feed.setDescription(query.getDescription());

+        List entries = new ArrayList();

+        while (it.hasNext())

+        {

+            SyndEntry entry = new SyndEntryImpl();

+            SyndContent description = new SyndContentImpl();

+            QueryResult queryResult = (QueryResult)it.next();

+            String title = queryResult.getUniqueId();

+            if(showModuleName){

+                title = title + " ("+ queryResult.getModule().getRealName() + ")";

+            }

+            if(showIssueType){

+                title = title + " ("+ queryResult.getRModuleIssueType().getDisplayName() + ")";

+            }

+            entry.setTitle(title);

+            

+            Issue issue = IssueManager.getInstance(Long.valueOf(queryResult.getIssueId()));

+

+            link = scarabLink.getIssueIdAbsoluteLink(issue).toString();

+            entry.setLink(link);

+

+            Date publishedDate = null;

+            if(issue.getModifiedDate()!= null){

+                publishedDate = issue.getModifiedDate();

+            }

+            else {

+                publishedDate = issue.getCreatedDate();

+            }

+            entry.setPublishedDate(publishedDate);

+

+            description = new SyndContentImpl();

+            description.setType("text/html");

+            String desc = "";

+            List attributeValues = queryResult.getAttributeValuesAsCSV();

+            if (null != attributeValues)

+            {

+                Iterator avIteratorCSV = attributeValues.iterator(); 

+                Iterator avIterator = query.getMITList().getAllRModuleUserAttributes().iterator();

+                while (avIterator.hasNext())

+                {

+                    String value = (String)avIteratorCSV.next();

+                    RModuleUserAttribute av = (RModuleUserAttribute)avIterator.next();

+                    desc = desc + "<b>" + av.getAttribute().getName()+":</b>" + value +"<br/>";

+                }

+            }

+            else

+            {

+                AttributeValue av = issue.getDefaultTextAttributeValue();

+                if (av != null)

+                {

+                    RModuleAttribute rma = av.getRModuleAttribute();

+                    desc = "<b>" + rma.getDisplayValue() + ":</b>" + av.getValue() + "<br/>";                    

+                }

+            }

+                

+            description.setValue(ScarabUtil.filterNonXml(desc));

+

+            entry.setDescription(description);

+            entries.add(entry);

+        }

+        feed.setEntries(entries);

+        feed.setFeedType(DEFAULT_FEED_FORMAT);

+        return feed;

+    }

+    

+    private ScarabLink getScarabLinkTool(TemplateContext context)

+    {

+        return (ScarabLink)context

+            .get(ScarabConstants.SCARAB_LINK_TOOL);

+    }

+    

+    private void outputFilteredXml(SyndFeed feed, Writer writer) throws IOException, FeedException

+    {

+        SyndFeedOutput output = new SyndFeedOutput();

+        try

+        {

+            output.output(feed, writer);

+        }

+        catch (FeedException fe)

+        {

+            // Will retry after filtering

+            feed.setDescription(ScarabUtil.filterNonXml(feed.getDescription()));

+            output.output(feed, writer);

+        }

+    }    

+}


Modified: branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java?view=diff&rev=10281&p1=branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java&p2=branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java&r1=10280&r2=10281
==============================================================================
--- branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java	(original)
+++ branches/release/b21/src/java/org/tigris/scarab/util/ScarabUtil.java	2006-09-07 16:47:01-0700
@@ -318,4 +318,39 @@
         safe['('] = true;
         safe[')'] = true;
     }
+    
+    public static String filterNonXml(String input)
+    {
+        char output[] = new char[input.length()];
+        for (int i=0; i<input.length(); i++)
+        {
+            char ch = input.charAt(i);
+            if (isXMLCharacter(ch))
+            {
+                output[i] = ch;
+            }
+            else
+            {
+                output[i] = ' ';
+            }
+        }
+        return new String(output);
+    }
+    
+    private static boolean isXMLCharacter(int c) {
+
+        if (c == '\n') return true;
+        if (c == '\r') return true;
+        if (c == '\t') return true;
+
+        if (c < 0x20) return false;
+        if (c <= 0xD7FF) return true;
+        if (c < 0xE000) return false;
+        if (c <= 0xFFFD) return true;
+        if (c < 0x10000) return false;
+        if (c <= 0x10FFFF) return true;
+
+        return false;
+    }
+
 }

Modified: branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm
Url: http://scarab.tigris.org/source/browse/scarab/branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm?view=diff&rev=10281&p1=branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm&p2=branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm&r1=10280&r2=10281
==============================================================================
--- branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm	(original)
+++ branches/release/b21/src/webapp/WEB-INF/templates/screens/IssueList.vm	2006-09-07 16:47:01-0700
@@ -1,7 +1,7 @@
 <link rel="alternate" type="application/rss+xml" title="RSS"
-href="$link.setPage('RSSDataExport.vm')/feedType/QueryFeed/queryId/$scarabR.Query.QueryId/userId/$user.UserId/type/rss_2.0">
+href="$link.setPage('Index.vm')/action/Search/go	/$scarabR.Query.QueryId/eventSubmit_doSelectquery/foo/output/feed/feedType/rss_2.0">
 <link rel="alternate" type="application/rss+xml" title="ATOM"
-href="$link.setPage('RSSDataExport.vm')/feedType/QueryFeed/queryId/$scarabR.Query.QueryId/userId/$user.UserId/type/atom_0.3">
+href="$link.setPage('Index.vm')/action/Search/go	/$scarabR.Query.QueryId/eventSubmit_doSelectquery/foo/output/feed/feedType/atom_0.3">
 #set ($mitlist = $user.CurrentMITList)
 #set ($searchType = $data.Parameters.getString('searchType', ''))
 
@@ -43,9 +43,9 @@
 #if ($scarabR.Query.QueryId)
 <td align="right">
 	<a style="align:right;" title="$l10n.SearchRSSFeed"
-	 href="$link.setPage('RSSDataExport.vm')/feedType/QueryFeed/queryId/$scarabR.Query.QueryId/userId/$user.UserId/type/rss_2.0"><img align="middle" src="$staticLink.setPath('/images/icon_rss.gif')" border="0"/></a>
+	 href="$link.setPage('Index.vm')/action/Search/go	/$scarabR.Query.QueryId/eventSubmit_doSelectquery/foo/output/feed/feedType/rss_2.0"><img align="middle" src="$staticLink.setPath('/images/icon_rss.gif')" border="0"/></a>
 	<a style="align:right;" title="$l10n.SearchATOMFeed"
-	 href="$link.setPage('RSSDataExport.vm')/feedType/QueryFeed/queryId/$scarabR.Query.QueryId/userId/$user.UserId/type/atom_0.3"><img align="middle" src="$staticLink.setPath('/images/icon_atom.gif')" border="0" /></a>
+	 href="$link.setPage('Index.vm')/action/Search/go	/$scarabR.Query.QueryId/eventSubmit_doSelectquery/foo/output/feed/feedType/atom_0.3"><img align="middle" src="$staticLink.setPath('/images/icon_atom.gif')" border="0" /></a>
 </td>
 #end
 #end
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.