package com.idega.content.business; import java.io.IOException; import java.rmi.RemoteException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; import javax.servlet.ServletException; import org.apache.commons.httpclient.HttpException; import org.apache.webdav.lib.WebdavResources; import com.idega.block.rss.business.RSSAbstractProducer; import com.idega.block.rss.business.RSSBusiness; import com.idega.block.rss.business.RSSProducer; import com.idega.block.rss.data.RSSRequest; import com.idega.business.IBOLookup; import com.idega.business.IBOLookupException; import com.idega.content.themes.helpers.business.ThemesHelper; import com.idega.core.search.business.SearchResult; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.IWContext; import com.idega.slide.business.IWContentEvent; import com.idega.slide.business.IWSlideChangeListener; import com.idega.slide.business.IWSlideService; import com.idega.slide.util.WebdavExtendedResource; import com.idega.util.CoreConstants; import com.idega.util.CoreUtil; import com.idega.util.FileUtil; import com.idega.util.expression.ELUtil; 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; public class ContentItemRssProducer extends RSSAbstractProducer implements RSSProducer, IWSlideChangeListener { protected static final String ARTICLE_SEARCH_KEY = "*.xml*"; public static final String RSS_FOLDER_NAME = "rss"; public static final String RSS_FILE_NAME = "feed.xml"; public static final String PATH = CoreConstants.WEBDAV_SERVLET_URI + ContentUtil.getContentBaseFolderPath() + "/article/"; private static Logger LOGGER = Logger.getLogger(ContentItemRssProducer.class.getName()); public ContentItemRssProducer() { super(); } @Override public void handleRSSRequest(RSSRequest rssRequest) throws IOException { String uri = fixURI(rssRequest); if(this.isAFolderInSlide(uri,rssRequest)){ try { dispatch(rssRequest.getURI(), rssRequest); } catch (ServletException e) { e.printStackTrace(); } } else{ //create a file and dispatch the request to it searchForArticles(); try { dispatch(rssRequest.getURI(), rssRequest); } catch (ServletException e) { e.printStackTrace(); } } } public void searchForArticles() { IWContext iwc = CoreUtil.getIWContext(); if (iwc == null) { LOGGER.warning("Unable to search for articles, IWContext is null"); return; } ContentSearch search = new ContentSearch(IWMainApplication.getDefaultIWMainApplication()); Collection<SearchResult> results = search.doSimpleDASLSearch(ARTICLE_SEARCH_KEY, PATH); if (results == null) { LOGGER.warning("ContentSearch.doSimpleDASLSearch returned results Collection, which is null: " + results); return; } List<String> urisToArticles = new ArrayList<String>(); String uri = null; for (SearchResult result: results) { uri = result.getSearchResultURI(); urisToArticles.add(uri); } RSSBusiness rss = null; SyndFeed articleFeed = null; Date now = new Date(); long time = now.getTime(); try { rss = IBOLookup.getServiceInstance(IWMainApplication.getDefaultIWApplicationContext(), RSSBusiness.class); } catch (IBOLookupException e1) { e1.printStackTrace(); } SyndFeed allArticles = rss.createNewFeed("title", getThemesHelper().getWebRootWithoutContent(), "description", "atom_1.0", "language", new Timestamp(time)); List<SyndEntry> allEntries = new ArrayList<SyndEntry>(); for (int i = 0; i < urisToArticles.size(); i++) { articleFeed = rss.getFeed(getThemesHelper().getWebRootWithoutContent() + urisToArticles.get(i)); for (Iterator iter = articleFeed.getEntries().iterator(); iter.hasNext();) { SyndEntry element = (SyndEntry) iter.next(); allEntries.add(element); } } allArticles.setEntries(allEntries); String allArticlesContent = null; try { allArticlesContent = rss.convertFeedToAtomXMLString(allArticles); } catch (RemoteException e) { e.printStackTrace(); } try { IWSlideService service = IBOLookup.getServiceInstance(iwc, IWSlideService.class); service.uploadFileAndCreateFoldersFromStringAsRoot("/files/cms/rss/all_articles/", "feed.xml", allArticlesContent, "text/xml", true); } catch (Exception e) { e.printStackTrace(); } } public void onSlideChange(IWContentEvent contentEvent) { } /** * @param rssRequest * @return */ protected String fixURI(RSSRequest rssRequest) { String uri = "/"+rssRequest.getExtraUri(); if(!uri.endsWith("/")){ uri+="/"; } if(!uri.startsWith(CoreConstants.PATH_FILES_ROOT)){ uri = CoreConstants.PATH_FILES_ROOT+uri; } return uri; } /** * @param rssRequest * @param uri * @throws HttpException * @throws IOException * @throws RemoteException */ protected synchronized void createRSSFile(RSSRequest rssRequest, String uri) throws HttpException, IOException, RemoteException { WebdavExtendedResource folder = this.getIWSlideSession(rssRequest).getWebdavResource(uri); WebdavResources resources = folder.listWithDeltaV(); Enumeration children = resources.getResources(); SyndFeed feed = new SyndFeedImpl(); feed.setTitle(uri+" : Generated by IdegaWeb ePlatform"); feed.setLink(this.getServerURLWithURI(rssRequest.getRequestWrapped().getServletPath()+"/"+rssRequest.getIdentifier()+uri,rssRequest)); feed.setDescription("File feed generated by IdegaWeb ePlatform, <a href'http://www.idega.com'/>. This feed lists the latest documents from the folder: "+uri); feed.setPublishedDate(new Date()); feed.setEncoding(CoreConstants.ENCODING_UTF8); feed.setCopyright("Idega Software"); List<SyndEntry> entries = new ArrayList<SyndEntry>(); SyndEntry entry; SyndContent description; while (children.hasMoreElements()) { WebdavExtendedResource resource = (WebdavExtendedResource) children.nextElement(); String fileName = resource.getDisplayName(); if(! this.getIWSlideService(rssRequest).isHiddenFile(fileName)){ boolean isFolder = resource.isCollection(); entry = new SyndEntryImpl(); entry.setTitle(fileName); if(isFolder){ entry.setLink(this.getServerURLWithURI("/rss"+resource.getPath(),rssRequest)); } else{ entry.setLink(this.getServerURLWithURI(resource.getPath(),rssRequest)); } long creationDate = resource.getCreationDate(); long modifiedDate = resource.getGetLastModified(); if(creationDate==0){ creationDate = modifiedDate; } entry.setPublishedDate(new Date(creationDate)); entry.setUpdatedDate(new Date(modifiedDate)); description = new SyndContentImpl(); description.setType("text/html"); if(!isFolder){ if(resource.getGetContentType().indexOf("image")>-1){ description.setValue("<img src='"+this.getServerURLWithURI(resource.getPath(),rssRequest)+"'/><br/>Size : "+FileUtil.getHumanReadableSize(resource.getGetContentLength())+"<br/>Content type: "+resource.getGetContentType()); } else{ description.setValue("Size : "+FileUtil.getHumanReadableSize(resource.getGetContentLength())+"</br>Content type: "+resource.getGetContentType()); } } else{ description.setValue("Folder"); } entry.setDescription(description); entries.add(entry); } } feed.setEntries(entries); String feedXML = this.getRSSBusiness().convertFeedToRSS2XMLString(feed); //deletes the previous version this.getIWSlideService(rssRequest).uploadFileAndCreateFoldersFromStringAsRoot(uri+RSS_FOLDER_NAME+"/", RSS_FILE_NAME, feedXML,this.getRSSContentType(),true); } public ThemesHelper getThemesHelper() { return ELUtil.getInstance().getBean(ThemesHelper.class); } }