/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/citations/trunk/citations-tool/tool/src/java/org/sakaiproject/citation/tool/CitationHelperAction.java $
* $Id: CitationHelperAction.java 34481 2007-08-27 21:36:06Z dsobiera@indiana.edu $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 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.citation.tool;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.authz.api.SecurityAdvisor;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.cheftool.Context;
import org.sakaiproject.cheftool.JetspeedRunData;
import org.sakaiproject.cheftool.RunData;
import org.sakaiproject.cheftool.VelocityPortlet;
import org.sakaiproject.cheftool.VelocityPortletPaneledAction;
import org.sakaiproject.citation.api.ActiveSearch;
import org.sakaiproject.citation.api.Citation;
import org.sakaiproject.citation.api.CitationCollection;
import org.sakaiproject.citation.api.CitationHelper;
import org.sakaiproject.citation.api.CitationIterator;
import org.sakaiproject.citation.api.Schema;
import org.sakaiproject.citation.api.SearchCategory;
import org.sakaiproject.citation.api.SearchDatabaseHierarchy;
import org.sakaiproject.citation.api.Schema.Field;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolException;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.citation.cover.CitationService;
import org.sakaiproject.citation.cover.ConfigurationService;
import org.sakaiproject.citation.cover.SearchManager;
import org.sakaiproject.citation.util.api.SearchException;
import org.sakaiproject.citation.util.api.SearchQuery;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.content.api.ContentResourceEdit;
import org.sakaiproject.content.api.ResourceToolAction;
import org.sakaiproject.content.api.ResourceToolActionPipe;
import org.sakaiproject.content.api.ResourceType;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entity.api.ResourcePropertiesEdit;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.event.api.NotificationService;
import org.sakaiproject.event.api.SessionState;
import org.sakaiproject.exception.IdInvalidException;
import org.sakaiproject.exception.IdLengthException;
import org.sakaiproject.exception.IdUniquenessException;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.InUseException;
import org.sakaiproject.exception.OverQuotaException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.ServerOverloadException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolException;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.util.FileItem;
import org.sakaiproject.util.ParameterParser;
import org.sakaiproject.util.ResourceLoader;
import org.sakaiproject.util.Validator;
/**
* Provide support for the Citations editor integration functionality
*/
public class EditorIntegrationHelperAction extends CitationHelperAction
{
protected final static Log m_log = LogFactory.getLog(EditorIntegrationHelperAction.class);
/**
* Editor Integration Library Resources Search
*/
public void doIntegrationSearch(RunData data)
{
SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid());
m_log.debug("doIntegrationSearch()");
setCaller(state, Caller.EDITOR_INTEGRATION);
doSearchCommon(state, Mode.ERROR);
}
/**
* Access the SessionState for the current request. This is a private
* session state for this servlet/helper, scoped for the current request.
*
* @see org.sakaiproject.cheftool.ToolServlet#getState(RunData data)
*
* @param req The current portlet request.
* @return The SessionState objet for the current request.
*/
protected SessionState getState(HttpServletRequest req)
{
/*
* key the state based on the pid, if present. If not we will use the servlet's class name
*/
String key = getPid(req);
if (key == null)
{
key = this.toString() + ".";
m_log.warn("getState(): using servlet key: " + key);
}
/*
* Append our full name to form a unique session state key for this helper
*/
key += ".org.sakaiproject.citation.tool.EditorIntegrationHelperAction";
SessionState rv = org.sakaiproject.event.cover.UsageSessionService.getSessionState(key);
if (rv == null)
{
m_log.warn("getState(): no state found for key: "
+ key
+ " "
+ req.getPathInfo()
+ " "
+ req.getQueryString()
+ " "
+ req.getRequestURI());
}
return rv;
}
/**
* Add some standard references to the vm context. Details:
*<p>
* The tool name (<code>toolName</code> is used to establish the HTML page
* title (see <code>#macro (chef_start)</code> in VM_chef_library.vm).
*<p>
* We set the tool name to reflect the editor integration search window.
*
* @see org.sakaiproject.vm.VmServlet#setVmStdRef(HttpServletRequest request, HttpServletResponse response)
*
* @param request The render request.
* @param response The render response.
*/
protected void setVmStdRef(HttpServletRequest request, HttpServletResponse response)
{
/*
* Establish all of the common definitions
*/
super.setVmStdRef(request, response);
/*
* Set the tool name to reflect our window
*/
request.setAttribute("toolTitle", getPageTitle());
}
/*
* Helpers
*/
/*
* Title segment delimiter
*/
protected static String DELIMITER = " : ";
/*
* Default helper name
*/
protected static String DEFAULT_HELPER_NAME = "Search Library Resources";
/**
* Construct the page title. This looks like:
*<p>
*<code> Sakai-Instance : Site-Name : Tool-Name : Helper-Name </code>
*/
private String getPageTitle()
{
StringBuilder pageTitle = new StringBuilder();
boolean addedHelper = false;
Placement placement;
Site site;
String sakaiInstance, siteId;
/*
* Get the local brand (eg Oncourse, CTools, etc)
*/
sakaiInstance = ServerConfigurationService.getString("ui.service", "Sakai");
if (!isNull(sakaiInstance))
{
pageTitle.append(sakaiInstance);
}
/*
* Site name
*/
placement = ToolManager.getCurrentPlacement();
site = null;
try
{
site = SiteService.getSite(placement.getContext());
}
catch (Exception ignore) { }
if (site != null)
{
String siteTitle = site.getTitle();
if (!isNull(siteTitle))
{
if (pageTitle.length() > 0) pageTitle.append(DELIMITER);
pageTitle.append(siteTitle);
}
}
/*
* Tool name
*/
try
{
String toolTitle = placement.getTitle();
if (!isNull(toolTitle))
{
if (pageTitle.length() > 0) pageTitle.append(DELIMITER);
pageTitle.append(toolTitle);
}
}
catch (Exception ignore) { }
/*
* Helper
*/
try
{
String helperTitle = ToolManager.getCurrentTool().getTitle();
if (!isNull(helperTitle))
{
if (pageTitle.length() > 0) pageTitle.append(DELIMITER);
pageTitle.append(helperTitle);
addedHelper = true;
}
}
catch (Exception ignore) { }
/*
* Make sure we have something to display
*/
if (!addedHelper)
{
if (pageTitle.length() > 0) pageTitle.append(DELIMITER);
pageTitle.append(DEFAULT_HELPER_NAME);
}
return pageTitle.toString();
}
/**
* Null/empty String?
* @param string String to verify
* @return true if so
*/
private boolean isNull(String string)
{
return (string == null) || (string.trim().length() == 0);
}
}