Hi Based on this JIRA report: http://jira.xwiki.org/jira/browse/XWIKI-4430 it would be necessary to create a new set of methods just to be able to pass an additional parameter to the calls. Because this makes it harder and harder to deal with Plugin I would suggest to use a Parameter Container which could contain: - Feed Type (Blog, Web, etc) - Type (Query, List or Feed ) - List or - Query, Count and Start or - Feed - Metadata - Object Class Name - Output Type (RSS, Atom etc) Then we would only need 2 major methods: - SyncdFeed getFeed( FeedParams ) - String getFeedOutput( FeedParams ) This is what I came up so far (without the Feed Type): /** * @see #getBlogFeed(String, int, int, Map) * @see #getFeedOutput(SyndFeed, String) */ public String getBlogFeedOutput( FeedParams params) { SyndFeed feed = getBlogFeed( params ); String ret = getFeedOutput( feed, params.getOutputType() ); return ret; } public SyndFeed getBlogFeed( FeedParams params) { Map<String, Object> myMetaData = Collections.emptyMap(); if( params.getMetaData() != null ) { myMetaData = params.getMetaData(); } Map<String, Object> blogMappings = null; if( params.getObjectClassName() == null ) { blogMappings = BLOG_FIELDS_MAPPING; } else { blogMappings = new HashMap<String, Object>(); blogMappings.put(SyndEntryDocumentSource.FIELD_TITLE, params.getObjectClassName() + "_title"); blogMappings.put (SyndEntryDocumentSource.FIELD_DESCRIPTION, params.getObjectClassName () + "_content"); blogMappings.put (SyndEntryDocumentSource.FIELD_CATEGORIES, params.getObjectClassName() + "_category"); blogMappings.put(SyndEntryDocumentSource.CONTENT_LENGTH, new Integer(400)); } SyndFeed blogFeed = null; if( params.getType() == FeedParams.Type.QUERY ) { String query = params.getQuery(); if (query == null) { XWikiRequest request = getXWikiContext().getRequest(); String category = request.getParameter("category"); if (category == null || category.equals("")) { query = ", BaseObject as obj where obj.name=doc.fullName and obj.className='" + BLOG_POST_CLASS_NAME + "' and obj.name<>'" + BLOG_POST_TEMPLATE_NAME + "' order by doc.creationDate desc"; } else { query = ", BaseObject as obj, DBStringListProperty as prop join prop.list list where obj.name=doc.fullName and obj.className='" + BLOG_POST_CLASS_NAME + "' and obj.name<>'" + BLOG_POST_TEMPLATE_NAME + "' and obj.id=prop.id.id and prop.id.name='category' and list = '" + category + "' order by doc.creationDate desc"; } } blogFeed = getFeed( query, params.getCount(), params.getStart(), getSyndEntrySource(SyndEntryDocumentSource.class.getName(), blogMappings), Collections.EMPTY_MAP, fillBlogFeedMetadata(myMetaData) ); } else { blogFeed = getFeed( params.getEntries(), getSyndEntrySource (SyndEntryDocumentSource.class.getName(), blogMappings), Collections.EMPTY_MAP, fillBlogFeedMetadata(myMetaData) // params.getEntries(), getSyndEntrySource (SyndEntryDocumentSource.class.getName(), blogMappings), myMetaData, fillBlogFeedMetadata(myMetaData) ); } if (blogFeed != null) { blogFeed.setImage(getDefaultFeedImage()); } return blogFeed; } public static class FeedParams { public enum Type { QUERY, LIST } private static final String DEFAULT_OUTPUT_TYPE = "rss_2.0"; private static final int DEFAULT_COUNT = 10; private static final int DEFAULT_START = 0; private Type type; private List<Object> entries; private String query; private int count = DEFAULT_COUNT; private int start = DEFAULT_START; private Map<String, Object> metaData; private String outputType = DEFAULT_OUTPUT_TYPE; private String objectClassName; public FeedParams( List<Object> entries, String objectClassName, Map<String, Object> metaData, String outputType ) { this.type = Type.LIST; this.entries = entries; this.metaData = metaData; this.outputType = outputType == null ? DEFAULT_OUTPUT_TYPE : outputType; this.objectClassName = objectClassName; } public FeedParams( String query, Integer count, Integer start, String objectClassName, Map<String, Object> metaData, String outputType ) { this.type = Type.QUERY; this.count = count == null ? DEFAULT_COUNT : count; this.start = start == null ? DEFAULT_START: start; this.metaData = metaData; this.outputType = outputType == null ? DEFAULT_OUTPUT_TYPE : outputType; this.objectClassName = objectClassName; } public Type getType() { return type; } public String getQuery() { return query; } public int getCount() { return count; } public int getStart() { return start; } public List<Object> getEntries() { return entries; } public Map<String, Object> getMetaData() { return metaData; } public String getOutputType() { return outputType; } public String getObjectClassName() { return objectClassName; } } What do you think? -Andy