RssServlet.java
/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.jcr;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.Session;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.exoplatform.services.log.Log;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.RootContainer;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.log.ExoLogger;
@SuppressWarnings({"serial","unused"})
public class RssServlet extends HttpServlet {
private static final Log LOG = ExoLogger.getLogger(RssServlet.class.getName());
public void init(ServletConfig config) throws ServletException {}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Cache-Control", "private max-age=600, s-maxage=120");
String wsName = null ;
String path = null ;
String portalName = null ;
String pathInfo = request.getPathInfo() ;
portalName = pathInfo.substring(1, pathInfo.indexOf("/", 1)) ;
wsName = pathInfo.substring(portalName.length() + 2, pathInfo.indexOf("/", portalName.length() + 2)) ;
path = pathInfo.substring(pathInfo.indexOf(wsName)+ wsName.length() + 1);
PortalContainer pcontainer = RootContainer.getInstance().getPortalContainer(portalName);
PortalContainer.setInstance(pcontainer) ;
RepositoryService repositoryService =
(RepositoryService)pcontainer.getComponentInstanceOfType(RepositoryService.class);
TemplateService tservice =
(TemplateService)pcontainer.getComponentInstanceOfType(TemplateService.class);
Session session = null ;
try{
session = repositoryService.getCurrentRepository().getSystemSession(wsName) ;
String repositoryName = repositoryService.getCurrentRepository().getConfiguration().getName();
Node rootNode = session.getRootNode() ;
Node file = null ;
if(rootNode.hasNode(path))
file = rootNode.getNode(path) ;
else if(rootNode.hasNode(path.substring(0, path.lastIndexOf("/")))){
Node parentNode = rootNode.getNode(path.substring(0, path.lastIndexOf("/"))) ;
String name = path.substring(path.lastIndexOf("/") + 1) ;
if(name.indexOf(".") > -1 && parentNode.hasNode(name.substring(0, name.indexOf("."))))
file = parentNode.getNode(name.substring(0, name.indexOf("."))) ;
}
if (file == null) throw new Exception("Node " + path + " not found. ");
Node content;
if(file.isNodeType("nt:file")) {
content = file.getNode("jcr:content");
Property data = content.getProperty("jcr:data");
String mimeType = content.getProperty("jcr:mimeType").getString();
response.setContentType(mimeType) ;
InputStream is = data.getStream();
byte[] buf = new byte[is.available()];
is.read(buf);
ServletOutputStream os = response.getOutputStream();
os.write(buf);
} else if (file.isNodeType("exo:rss-enable")){
List documentNodeType = tservice.getDocumentTemplates() ;
String nodeType = file.getPrimaryNodeType().getName() ;
if(documentNodeType.contains(nodeType)){
String templateName = tservice.getTemplatePath(false, nodeType, "view1") ;
request.setAttribute("portalName", portalName) ;
request.setAttribute("wsName", wsName) ;
request.setAttribute("templateName", "jcr:"+templateName) ;
request.setAttribute("curNode", file) ;
RequestDispatcher rd = request.getRequestDispatcher("/viewcontent");
rd.forward(request, response);
}else {
throw new Exception("This node type is not document node");
}
} else throw new Exception("Invalid node type, expected nt:file or exo:rss-enable type");
}catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
throw new ServletException(e) ;
}finally{
if(session != null) {
session.logout() ;
}
}
}
}