/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/help/trunk/help-tool/src/java/org/sakaiproject/tool/help/ContentServlet.java $
* $Id: ContentServlet.java 132173 2013-12-03 21:01:14Z matthew@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2008 The Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.opensource.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.tool.help;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.api.app.help.HelpManager;
import org.sakaiproject.component.api.ServerConfigurationService;
import org.sakaiproject.api.app.help.Resource;
import org.sakaiproject.component.cover.ComponentManager;
import org.apache.commons.lang.StringUtils;
/**
* Content Servlet serves help documents to document frame.
* @version $Id: ContentServlet.java 132173 2013-12-03 21:01:14Z matthew@longsight.com $
*/
public class ContentServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
/** Our log (commons). */
private static Log M_log = LogFactory.getLog(ContentServlet.class);
private static final String DOC_ID = "docId";
private static final String TEXT_HTML = "text/html; charset=UTF-8";
private HelpManager helpManager;
private ServerConfigurationService serverConfigurationService;
/**
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
getHelpManager().initialize();
String docId = req.getParameter(DOC_ID);
if (docId == null) {
res.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
OutputStreamWriter writer = new OutputStreamWriter(res.getOutputStream(), "UTF-8");
try {
res.setContentType(TEXT_HTML);
URL url = null;
Resource resource = null;
resource = getHelpManager().getResourceByDocId(docId);
//Possibly a fileURL
if (resource == null && docId.indexOf('/') >= 0) {
if (M_log.isDebugEnabled())
M_log.debug("Adding new resource:"+docId);
resource = getHelpManager().createResource();
resource.setLocation("/"+docId);
resource.setDocId(docId);
url = new URL(req.getScheme(),req.getLocalName(),req.getServerPort(),req.getContextPath()+"/"+docId);
//Can't save it without a category as is null
//getHelpManager().storeResource(resource);
}
if (resource != null)
{
String sakaiHomePath = getServerConfigurationService().getSakaiHomePath();
String localHelpPath = sakaiHomePath+getServerConfigurationService().getString("help.localpath","/help/");
File localFile = new File(localHelpPath+resource.getLocation());
boolean localFileIsFile = false;
if(localFile.isFile()) {
M_log.debug("Local help file overrides: "+resource.getLocation());
localFileIsFile = true;
}
if (!getHelpManager().getRestConfiguration().getOrganization()
.equalsIgnoreCase("sakai"))
{
writer.write(RestContentProvider.getTransformedDocument(
getServletContext(), getHelpManager(), resource));
} else {
if (resource.getLocation().startsWith("/"))
{
if (!"".equals(getHelpManager().getExternalLocation()))
{
url = new URL(getHelpManager().getExternalLocation()
+ resource.getLocation());
}
else
{
if(localFileIsFile) {
url = localFile.toURI().toURL();
}
else {
//If url hasn't been set yet, look it up in the classpath
if (url == null) {
url = HelpManager.class.getResource(resource.getLocation());
}
}
}
String defaultRepo = "/library/skin/";
String skinRepo = getServerConfigurationService().getString("skin.repo",defaultRepo);
String helpHeader = getServerConfigurationService().getString("help.header",null);
String helpFooter = getServerConfigurationService().getString("help.footer",null);
String resourceName = resource.getName();
if (resourceName == null) {
resourceName = "";
}
if (url == null) {
M_log.warn("Help document " + docId + " not found at: " + resource.getLocation());
} else {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
}
catch (ConnectException e){
M_log.info("ConnectException on " + url.getPath());
res.sendRedirect(resource.getLocation());
return;
}
try {
String sbuf;
while ((sbuf = br.readLine()) != null)
{
//Replacements because help wasn't written as a template
if (!skinRepo.equals(defaultRepo)) {
if (StringUtils.contains(sbuf,defaultRepo)) {
sbuf = StringUtils.replace(sbuf, defaultRepo, skinRepo + "/");
//Reset to only do one replacement
skinRepo=defaultRepo;
}
}
if (helpHeader != null) {
//Hopefully nobody writes <BODY>
if (StringUtils.contains(sbuf,"<body>")) {
sbuf = StringUtils.replace(sbuf, "<body>", "<body>"+helpHeader);
//Reset to only do one replacement
//Replace special variables
sbuf = StringUtils.replace(sbuf, "#ResourceBean.name", resourceName);
helpHeader = null;
}
}
if (helpFooter != null) {
if (StringUtils.contains(sbuf,"</body>")) {
sbuf = StringUtils.replace(sbuf, "</body>", helpFooter+"</body>");
sbuf = StringUtils.replace(sbuf, "#ResourceBean.name", resourceName);
//Reset to only do one replacement
helpFooter = null;
}
}
writer.write( sbuf );
writer.write( System.getProperty("line.separator") );
}
} finally {
br.close();
}
}
}
else
{
res.sendRedirect(resource.getLocation());
}
}
}
} finally {
try {
writer.flush();
} catch (IOException e) {
// ignore
}
writer.close();
}
}
/**
* get the component manager through cover
* @return help manager
*/
public HelpManager getHelpManager()
{
if (helpManager == null)
{
helpManager = (HelpManager) ComponentManager.get(HelpManager.class.getName());
return helpManager;
}
return helpManager;
}
/**
* get the component manager through cover
* @return serverconfigurationservicer
*/
public ServerConfigurationService getServerConfigurationService()
{
if (serverConfigurationService == null)
{
serverConfigurationService = (ServerConfigurationService) ComponentManager.get(ServerConfigurationService.class.getName());
return serverConfigurationService;
}
return serverConfigurationService;
}
}