/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/citations/trunk/citations-tool/tool/src/java/org/sakaiproject/citation/tool/CitationHelperAction.java $ * $Id: CitationHelperAction.java 124219 2013-05-17 21:10:51Z a.fish@lancaster.ac.uk $ *********************************************************************************** * * Copyright (c) 2006, 2007, 2008, 2009 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.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import org.apache.commons.io.input.BOMInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.antivirus.api.VirusFoundException; import org.sakaiproject.authz.api.SecurityAdvisor; 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.CitationService; import org.sakaiproject.citation.api.ConfigurationService; import org.sakaiproject.citation.api.Schema; import org.sakaiproject.citation.api.Schema.Field; import org.sakaiproject.citation.api.SearchCategory; import org.sakaiproject.citation.api.SearchDatabaseHierarchy; import org.sakaiproject.citation.api.SearchManager; import org.sakaiproject.citation.util.api.SearchCancelException; import org.sakaiproject.citation.util.api.SearchException; import org.sakaiproject.citation.util.api.SearchQuery; import org.sakaiproject.component.api.ServerConfigurationService; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.content.api.ContentCollection; import org.sakaiproject.content.api.ContentEntity; import org.sakaiproject.content.api.ContentHostingService; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.content.api.ContentResourceEdit; import org.sakaiproject.content.api.GroupAwareEntity.AccessMode; import org.sakaiproject.content.api.ResourceToolAction; import org.sakaiproject.content.api.ResourceToolActionPipe; import org.sakaiproject.content.api.ResourceType; import org.sakaiproject.entity.api.EntityManager; import org.sakaiproject.entity.api.Reference; import org.sakaiproject.entity.api.ResourceProperties; import org.sakaiproject.entity.api.ResourcePropertiesEdit; 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.InconsistentException; import org.sakaiproject.exception.OverQuotaException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.exception.ServerOverloadException; import org.sakaiproject.exception.TypeException; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.time.api.Time; import org.sakaiproject.time.cover.TimeService; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.api.Tool; import org.sakaiproject.tool.api.ToolException; import org.sakaiproject.tool.api.ToolManager; import org.sakaiproject.tool.api.ToolSession; import org.sakaiproject.user.api.User; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.util.FileItem; import org.sakaiproject.util.ParameterParser; import org.sakaiproject.util.Resource; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.util.Validator; import org.sakaiproject.util.api.FormattedText; /** * */ public class CitationHelperAction extends VelocityPortletPaneledAction { /** * This class contains constants and utility methods to maintain state of * the advanced search form UI and process submitted data * * @author gbhatnag */ protected static class AdvancedSearchHelper { /* ids for fields */ public static final String KEYWORD_ID = "keyword"; public static final String AUTHOR_ID = "author"; public static final String TITLE_ID = "title"; public static final String SUBJECT_ID = "subject"; public static final String YEAR_ID = "year"; /* keys to hold state information */ public static final String STATE_FIELD1 = CitationHelper.CITATION_PREFIX + "advField1"; public static final String STATE_FIELD2 = CitationHelper.CITATION_PREFIX + "advField2"; public static final String STATE_FIELD3 = CitationHelper.CITATION_PREFIX + "advField3"; public static final String STATE_FIELD4 = CitationHelper.CITATION_PREFIX + "advField4"; public static final String STATE_FIELD5 = CitationHelper.CITATION_PREFIX + "advField5"; public static final String STATE_CRITERIA1 = CitationHelper.CITATION_PREFIX + "advCriteria1"; public static final String STATE_CRITERIA2 = CitationHelper.CITATION_PREFIX + "advCriteria2"; public static final String STATE_CRITERIA3 = CitationHelper.CITATION_PREFIX + "advCriteria3"; public static final String STATE_CRITERIA4 = CitationHelper.CITATION_PREFIX + "advCriteria4"; public static final String STATE_CRITERIA5 = CitationHelper.CITATION_PREFIX + "advCriteria5"; /** * Puts field selections stored in session state (using setFieldSelections()) * into the given context * * @param context context to put field selections into * @param state SessionState to pull field selections from */ public static void putFieldSelections( Context context, SessionState state ) { /* context.put( "advField1", ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD1 ) ); context.put( "advField2", ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD2 ) ); context.put( "advField3", ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD3 ) ); context.put( "advField4", ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD4 ) ); context.put( "advField5", ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD5 ) ); */ String advField1 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD1 ); String advField2 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD2 ); String advField3 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD3 ); String advField4 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD4 ); String advField5 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD5 ); if( advField1 != null && !advField1.trim().equals("") ) { context.put( "advField1", advField1 ); } else { context.put( "advField1", KEYWORD_ID ); } if( advField2 != null && !advField2.trim().equals("") ) { context.put( "advField2", advField2 ); } else { context.put( "advField2", AUTHOR_ID ); } if( advField3 != null && !advField3.trim().equals("") ) { context.put( "advField3", advField3 ); } else { context.put( "advField3", TITLE_ID ); } if( advField4 != null && !advField4.trim().equals("") ) { context.put( "advField4", advField4 ); } else { context.put( "advField4", SUBJECT_ID ); } if( advField5 != null && !advField5.trim().equals("") ) { context.put( "advField5", advField5 ); } else { context.put( "advField5", YEAR_ID ); } } /** * Puts field criteria stored in session state (using setFieldCriteria()) * into the given context * * @param context context to put field criteria into * @param state SessionState to pull field criteria from */ public static void putFieldCriteria( Context context, SessionState state ) { context.put( "advCriteria1", ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA1 ) ); context.put( "advCriteria2", ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA2 ) ); context.put( "advCriteria3", ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA3 ) ); context.put( "advCriteria4", ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA4 ) ); context.put( "advCriteria5", ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA5 ) ); } /** * Sets user-selected fields in session state from request parameters * * @param params request parameters from doBeginSearch * @param state SessionState to store field selections */ public static void setFieldSelections( ParameterParser params, SessionState state ) { String advField1 = params.getString( "advField1" ); if( advField1 != null && !advField1.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_FIELD1, advField1 ); } String advField2 = params.getString( "advField2" ); if( advField2 != null && !advField2.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_FIELD2, advField2 ); } String advField3 = params.getString( "advField3" ); if( advField3 != null && !advField3.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_FIELD3, advField3 ); } String advField4 = params.getString( "advField4" ); if( advField4 != null && !advField4.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_FIELD4, advField4 ); } String advField5 = params.getString( "advField5" ); if( advField5 != null && !advField5.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_FIELD5, advField5 ); } } /** * Sets user-entered search field criteria in session state * from request parameters * * @param params request parameters from doBeginSearch * @param state SessionState to store field criteria */ public static void setFieldCriteria( ParameterParser params, SessionState state ) { String advCriteria1 = params.getString( "advCriteria1" ); if( advCriteria1 != null && !advCriteria1.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_CRITERIA1, advCriteria1 ); } String advCriteria2 = params.getString( "advCriteria2" ); if( advCriteria2 != null && !advCriteria2.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_CRITERIA2, advCriteria2 ); } String advCriteria3 = params.getString( "advCriteria3" ); if( advCriteria3 != null && !advCriteria3.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_CRITERIA3, advCriteria3 ); } String advCriteria4 = params.getString( "advCriteria4" ); if( advCriteria4 != null && !advCriteria4.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_CRITERIA4, advCriteria4 ); } String advCriteria5 = params.getString( "advCriteria5" ); if( advCriteria5 != null && !advCriteria5.trim().equals("") ) { state.setAttribute( AdvancedSearchHelper.STATE_CRITERIA5, advCriteria5 ); } } public static SearchQuery getAdvancedCriteria( SessionState state ) { String advField1 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD1 ); String advField2 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD2 ); String advField3 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD3 ); String advField4 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD4 ); String advField5 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_FIELD5 ); String advCriteria1 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA1 ); String advCriteria2 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA2 ); String advCriteria3 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA3 ); String advCriteria4 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA4 ); String advCriteria5 = ( String )state.getAttribute( AdvancedSearchHelper.STATE_CRITERIA5 ); SearchQuery searchQuery = new org.sakaiproject.citation.util.impl.SearchQuery(); /* * put fielded, non-null criteria into the searchQuery */ if( advField1 != null && advCriteria1 != null ) { if( advField1.equalsIgnoreCase( KEYWORD_ID ) ) { searchQuery.addKeywords( advCriteria1 ); } else if( advField1.equalsIgnoreCase( AUTHOR_ID ) ) { searchQuery.addAuthor( advCriteria1 ); } else if( advField1.equalsIgnoreCase( TITLE_ID ) ) { searchQuery.addTitle( advCriteria1 ); } else if( advField1.equalsIgnoreCase( SUBJECT_ID ) ) { searchQuery.addSubject( advCriteria1 ); } else if( advField1.equalsIgnoreCase( YEAR_ID ) ) { searchQuery.addYear( advCriteria1 ); } } if( advField2 != null && advCriteria2 != null ) { if( advField2.equalsIgnoreCase( KEYWORD_ID ) ) { searchQuery.addKeywords( advCriteria2 ); } else if( advField2.equalsIgnoreCase( AUTHOR_ID ) ) { searchQuery.addAuthor( advCriteria2 ); } else if( advField2.equalsIgnoreCase( TITLE_ID ) ) { searchQuery.addTitle( advCriteria2 ); } else if( advField2.equalsIgnoreCase( SUBJECT_ID ) ) { searchQuery.addSubject( advCriteria2 ); } else if( advField2.equalsIgnoreCase( YEAR_ID ) ) { searchQuery.addYear( advCriteria2 ); } } if( advField3 != null && advCriteria3 != null ) { if( advField3.equalsIgnoreCase( KEYWORD_ID ) ) { searchQuery.addKeywords( advCriteria3 ); } else if( advField3.equalsIgnoreCase( AUTHOR_ID ) ) { searchQuery.addAuthor( advCriteria3 ); } else if( advField3.equalsIgnoreCase( TITLE_ID ) ) { searchQuery.addTitle( advCriteria3 ); } else if( advField3.equalsIgnoreCase( SUBJECT_ID ) ) { searchQuery.addSubject( advCriteria3 ); } else if( advField3.equalsIgnoreCase( YEAR_ID ) ) { searchQuery.addYear( advCriteria3 ); } } if( advField4 != null && advCriteria4 != null ) { if( advField4.equalsIgnoreCase( KEYWORD_ID ) ) { searchQuery.addKeywords( advCriteria4 ); } else if( advField4.equalsIgnoreCase( AUTHOR_ID ) ) { searchQuery.addAuthor( advCriteria4 ); } else if( advField4.equalsIgnoreCase( TITLE_ID ) ) { searchQuery.addTitle( advCriteria4 ); } else if( advField4.equalsIgnoreCase( SUBJECT_ID ) ) { searchQuery.addSubject( advCriteria4 ); } else if( advField4.equalsIgnoreCase( YEAR_ID ) ) { searchQuery.addYear( advCriteria4 ); } } if( advField5 != null && advCriteria5 != null ) { if( advField5.equalsIgnoreCase( KEYWORD_ID ) ) { searchQuery.addKeywords( advCriteria5 ); } else if( advField5.equalsIgnoreCase( AUTHOR_ID ) ) { searchQuery.addAuthor( advCriteria5 ); } else if( advField5.equalsIgnoreCase( TITLE_ID ) ) { searchQuery.addTitle( advCriteria5 ); } else if( advField5.equalsIgnoreCase( SUBJECT_ID ) ) { searchQuery.addSubject( advCriteria5 ); } else if( advField5.equalsIgnoreCase( YEAR_ID ) ) { searchQuery.addYear( advCriteria5 ); } } return searchQuery; } public static void clearAdvancedFormState( SessionState state ) { state.removeAttribute( AdvancedSearchHelper.STATE_FIELD1 ); state.removeAttribute( AdvancedSearchHelper.STATE_FIELD2 ); state.removeAttribute( AdvancedSearchHelper.STATE_FIELD3 ); state.removeAttribute( AdvancedSearchHelper.STATE_FIELD4 ); state.removeAttribute( AdvancedSearchHelper.STATE_FIELD5 ); state.removeAttribute( AdvancedSearchHelper.STATE_CRITERIA1 ); state.removeAttribute( AdvancedSearchHelper.STATE_CRITERIA2 ); state.removeAttribute( AdvancedSearchHelper.STATE_CRITERIA3 ); state.removeAttribute( AdvancedSearchHelper.STATE_CRITERIA4 ); state.removeAttribute( AdvancedSearchHelper.STATE_CRITERIA5 ); } } protected final static Log logger = LogFactory.getLog(CitationHelperAction.class); public static ResourceLoader rb = new ResourceLoader("citations"); /** Shared messages */ private static final String DEFAULT_RESOURCECLASS = "org.sakaiproject.sharedI18n.SharedProperties"; private static final String DEFAULT_RESOURCEBUNDLE = "org.sakaiproject.sharedI18n.bundle.shared"; private static final String RESOURCECLASS = "resource.class.shared"; private static final String RESOURCEBUNDLE = "resource.bundle.shared"; private ResourceLoader srb; protected CitationService citationService; protected ConfigurationService configurationService; protected SearchManager searchManager; protected ContentHostingService contentService; protected EntityManager entityManager; protected SessionManager sessionManager; protected static FormattedText formattedText; protected static ToolManager toolManager; public static final Integer DEFAULT_RESULTS_PAGE_SIZE = new Integer(10); public static final Integer DEFAULT_LIST_PAGE_SIZE = new Integer(50); public static Integer defaultListPageSize = DEFAULT_LIST_PAGE_SIZE; protected static final String ELEMENT_ID_CREATE_FORM = "createForm"; protected static final String ELEMENT_ID_EDIT_FORM = "editForm"; protected static final String ELEMENT_ID_LIST_FORM = "listForm"; protected static final String ELEMENT_ID_SEARCH_FORM = "searchForm"; protected static final String ELEMENT_ID_RESULTS_FORM = "resultsForm"; protected static final String ELEMENT_ID_VIEW_FORM = "viewForm"; /** * The calling application reflects the nature of our caller */ public final static String CITATIONS_HELPER_CALLER = "citations_helper_caller"; public enum Caller { RESOURCE_TOOL, EDITOR_INTEGRATION; } /** * Mode defines a complete set of values describing the user's navigation intentions */ public enum Mode { NEW_RESOURCE, DATABASE, CREATE, EDIT, ERROR, ERROR_FATAL, LIST, REORDER, ADD_CITATIONS, IMPORT_CITATIONS, MESSAGE, SEARCH, RESULTS, VIEW; } /* * define a set of "fake" Modes (asynchronous calls) to maintain proper * back-button stack state */ protected static Set<Mode> ignoreModes = new java.util.HashSet<Mode>(); static { ignoreModes.add( Mode.DATABASE ); ignoreModes.add( Mode.MESSAGE ); } protected static final String PARAM_FORM_NAME = "FORM_NAME"; protected static final String STATE_RESOURCES_ADD = CitationHelper.CITATION_PREFIX + "resources_add"; protected static final String STATE_CURRENT_DATABASES = CitationHelper.CITATION_PREFIX + "current_databases"; protected static final String STATE_CANCEL_PAGE = CitationHelper.CITATION_PREFIX + "cancel_page"; protected static final String STATE_CITATION_COLLECTION_ID = CitationHelper.CITATION_PREFIX + "citation_collection_id"; protected static final String STATE_CITATION_COLLECTION = CitationHelper.CITATION_PREFIX + "citation_collection"; protected static final String STATE_CITATION_ID = CitationHelper.CITATION_PREFIX + "citation_id"; protected static final String STATE_COLLECTION_TITLE = CitationHelper.CITATION_PREFIX + "collection_name"; protected static final String STATE_CURRENT_REPOSITORY = CitationHelper.CITATION_PREFIX + "current_repository"; protected static final String STATE_CURRENT_RESULTS = CitationHelper.CITATION_PREFIX + "current_results"; protected static final String STATE_LIST_ITERATOR = CitationHelper.CITATION_PREFIX + "list_iterator"; protected static final String STATE_LIST_PAGE = CitationHelper.CITATION_PREFIX + "list_page"; protected static final String STATE_LIST_PAGE_SIZE = CitationHelper.CITATION_PREFIX + "list_page_size"; protected static final String STATE_LIST_NO_SCROLL = CitationHelper.CITATION_PREFIX + "list_no_scroll"; protected static final String STATE_NO_KEYWORDS = CitationHelper.CITATION_PREFIX + "no_search_criteria"; protected static final String STATE_NO_DATABASES = CitationHelper.CITATION_PREFIX + "no_databases"; protected static final String STATE_NO_RESULTS = CitationHelper.CITATION_PREFIX + "no_results"; protected static final String STATE_SEARCH_HIERARCHY = CitationHelper.CITATION_PREFIX + "search_hierarchy"; protected static final String STATE_SELECTED_CATEGORY = CitationHelper.CITATION_PREFIX + "selected_category"; protected static final String STATE_DEFAULT_CATEGORY = CitationHelper.CITATION_PREFIX + "default_category"; protected static final String STATE_UNAUTHORIZED_DB = CitationHelper.CITATION_PREFIX + "unauthorized_database"; protected static final String STATE_REPOSITORY_MAP = CitationHelper.CITATION_PREFIX + "repository_map"; protected static final String STATE_RESULTS_PAGE_SIZE = CitationHelper.CITATION_PREFIX + "results_page_size"; protected static final String STATE_KEYWORDS = CitationHelper.CITATION_PREFIX + "search_criteria"; protected static final String STATE_SEARCH_INFO = CitationHelper.CITATION_PREFIX + "search_info"; protected static final String STATE_BASIC_SEARCH = CitationHelper.CITATION_PREFIX + "basic_search"; protected static final String STATE_SEARCH_RESULTS = CitationHelper.CITATION_PREFIX + "search_results"; protected static final String STATE_RESOURCE_ENTITY_PROPERTIES = CitationHelper.CITATION_PREFIX + "citationList_properties"; protected static final String STATE_SORT = CitationHelper.CITATION_PREFIX + "sort"; protected static final String TEMPLATE_NEW_RESOURCE = "citation/new_resource"; protected static final String TEMPLATE_CREATE = "citation/create"; protected static final String TEMPLATE_EDIT = "citation/edit"; protected static final String TEMPLATE_ERROR = "citation/error"; protected static final String TEMPLATE_ERROR_FATAL = "citation/error_fatal"; protected static final String TEMPLATE_LIST = "citation/list"; protected static final String TEMPLATE_REORDER = "citation/reorder"; protected static final String TEMPLATE_ADD_CITATIONS = "citation/add_citations"; protected static final String TEMPLATE_IMPORT_CITATIONS = "citation/import_citations"; protected static final String TEMPLATE_MESSAGE = "citation/_message"; protected static final String TEMPLATE_SEARCH = "citation/search"; protected static final String TEMPLATE_RESULTS = "citation/results"; protected static final String TEMPLATE_VIEW = "citation/view"; protected static final String TEMPLATE_DATABASE = "citation/_databases"; protected static final String PROP_ACCESS_MODE = "accessMode"; protected static final String PROP_IS_COLLECTION = "isCollection"; protected static final String PROP_IS_DROPBOX = "isDropbox"; protected static final String PROP_IS_GROUP_INHERITED = "isGroupInherited"; protected static final String PROP_IS_GROUP_POSSIBLE = "isGroupPossible"; protected static final String PROP_IS_HIDDEN = "isHidden"; protected static final String PROP_IS_PUBVIEW = "isPubview"; protected static final String PROP_IS_PUBVIEW_INHERITED = "isPubviewInherited"; protected static final String PROP_IS_PUBVIEW_POSSIBLE = "isPubviewPossible"; protected static final String PROP_IS_SINGLE_GROUP_INHERITED = "isSingleGroupInherited"; protected static final String PROP_IS_SITE_COLLECTION = "isSiteCollection"; protected static final String PROP_IS_SITE_ONLY = "isSiteOnly"; protected static final String PROP_IS_USER_SITE = "isUserSite"; protected static final String PROP_POSSIBLE_GROUPS = "possibleGroups"; protected static final String PROP_RELEASE_DATE = "releaseDate"; protected static final String PROP_RELEASE_DATE_STR = "releaseDateStr"; protected static final String PROP_RETRACT_DATE = "retractDate"; protected static final String PROP_RETRACT_DATE_STR = "retractDateStr"; protected static final String PROP_USE_RELEASE_DATE = "useReleaseDate"; protected static final String PROP_USE_RETRACT_DATE = "useRetractDate"; public static final String CITATION_ACTION = "citation_action"; public static final String UPDATE_RESOURCE = "update_resource"; public static final String CREATE_RESOURCE = "create_resource"; public static final String IMPORT_CITATIONS = "import_citations"; public static final String UPDATE_SAVED_SORT = "update_saved_sort"; public static final String CHECK_FOR_UPDATES = "check_for_updates"; public static final String MIMETYPE_JSON = "application/json"; public static final String MIMETYPE_HTML = "text/html"; public static final String REQUESTED_MIMETYPE = "requested_mimetype"; public static final String CHARSET_UTF8 = "UTF-8"; /** A long representing the number of milliseconds in one week. Used for date calculations */ public static final long ONE_DAY = 24L * 60L * 60L * 1000L; /** A long representing the number of milliseconds in one week. Used for date calculations */ public static final long ONE_WEEK = 7L * ONE_DAY; public void init() throws ServletException { ServerConfigurationService scs = (ServerConfigurationService) ComponentManager.get(ServerConfigurationService.class); String resourceClass = scs.getString(RESOURCECLASS, DEFAULT_RESOURCECLASS); String resourceBundle = scs.getString(RESOURCEBUNDLE, DEFAULT_RESOURCEBUNDLE); srb = new Resource().getLoader(resourceClass, resourceBundle); if(scs != null) { defaultListPageSize = scs.getInt("citations.default.list.page.size", DEFAULT_LIST_PAGE_SIZE); } else { logger.warn("Failed to get default list page size as ServerConfigurationService is null. Defaulting to " + DEFAULT_LIST_PAGE_SIZE); defaultListPageSize = DEFAULT_LIST_PAGE_SIZE; } } /** * Check for the helper-done case locally and handle it before letting the VPPA.toolModeDispatch() handle the actual dispatch. * @see org.sakaiproject.cheftool.VelocityPortletPaneledAction#toolModeDispatch(java.lang.String, java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected void toolModeDispatch(String methodBase, String methodExt, HttpServletRequest req, HttpServletResponse res) throws ToolException { logger.debug("toolModeDispatch()"); //SessionState sstate = getState(req); ToolSession toolSession = getSessionManager().getCurrentToolSession(); //String mode = (String) sstate.getAttribute(ResourceToolAction.STATE_MODE); //Object started = toolSession.getAttribute(ResourceToolAction.STARTED); Object done = toolSession.getAttribute(ResourceToolAction.DONE); // if we're done or not properly initialized, redirect to Resources if ( done != null || !initHelper( getState(req) ) ) { toolSession.removeAttribute(ResourceToolAction.STARTED); Tool tool = getToolManager().getCurrentTool(); String url = (String) toolSession.getAttribute(tool.getId() + Tool.HELPER_DONE_URL); toolSession.removeAttribute(tool.getId() + Tool.HELPER_DONE_URL); try { res.sendRedirect(url); // TODO } catch (IOException e) { logger.warn("IOException", e); // Log.warn("chef", this + " : ", e); } return; } super.toolModeDispatch(methodBase, methodExt, req, res); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException { logger.debug("doGet()"); String isAjaxRequest = req.getParameter("ajaxRequest"); if(isAjaxRequest != null && isAjaxRequest.trim().equalsIgnoreCase(Boolean.toString(true))) { ParameterParser params = (ParameterParser) req.getAttribute(ATTR_PARAMS); if(params == null) { params = new ParameterParser(req); } SessionState state = getState(req); // Check whether this is an AJAX request expecting a JSON response and if it is // dispatch the request to the buildJsonResponse() method, avoiding VPPA's // html rendering. Other options might be HTML-fragment, XML, etc. //String requestedMimetype = (String) toolSession.getAttribute(REQUESTED_MIMETYPE); String requestedMimetype = params.getString(REQUESTED_MIMETYPE); if(logger.isDebugEnabled()) { logger.debug("doGet() requestedMimetype == " + requestedMimetype); } if(requestedMimetype != null && requestedMimetype.equals(MIMETYPE_JSON)) { doGetJsonResponse(params, state, req, res); } else if(requestedMimetype != null && requestedMimetype.equals(MIMETYPE_HTML)) { doGetHtmlFragmentResponse(params, state, req, res); } else { // throw something } return; } super.doGet(req, res); } protected void doGetHtmlFragmentResponse(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { } protected void doGetJsonResponse(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { res.setCharacterEncoding(CHARSET_UTF8); res.setContentType(MIMETYPE_JSON); Map<String,Object> jsonMap = new HashMap<String,Object>(); String sakai_csrf_token = params.getString("sakai_csrf_token"); if(sakai_csrf_token != null && ! sakai_csrf_token.trim().equals("")) { jsonMap.put("sakai_csrf_token", sakai_csrf_token); } jsonMap.put("timestamp", Long.toString(System.currentTimeMillis())); String citation_action = params.getString("citation_action"); if(citation_action != null && citation_action.trim().equals(CHECK_FOR_UPDATES)) { Map<String,Object> result = this.checkForUpdates(params, state, req, res); jsonMap.putAll(result); } jsonMap.put("secondsBetweenSaveciteRefreshes", new Integer(this.configurationService.getSecondsBetweenSaveciteRefreshes())); // convert to json string String jsonString = JSONObject.fromObject(jsonMap).toString(); try { PrintWriter writer = res.getWriter(); writer.print(jsonString); writer.flush(); } catch (IOException e) { logger.warn("IOException in doGetJsonResponse() " + e); } } protected Map<String, Object> checkForUpdates(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> result = new HashMap<String, Object>(); boolean changed = false; long lastcheckLong = 0L; String lastcheck = params.getString("lastcheck"); if(lastcheck == null || lastcheck.trim().equals("")) { // do nothing } else { try { lastcheckLong = Long.parseLong(lastcheck); } catch(Exception e) { logger.warn("Error parsing long from string: " + lastcheck, e); } } if(lastcheckLong > 0L) { String citationCollectionId = params.getString("citationCollectionId"); if(citationCollectionId != null && !citationCollectionId.trim().equals("")) { try { CitationCollection citationCollection = this.citationService.getCollection(citationCollectionId); if(citationCollection.getLastModifiedDate().getTime() > lastcheckLong) { changed = true; result.put("html", "<div>something goes here</div>"); } } catch (IdUnusedException e) { logger.warn("IdUnusedException in checkForUpdates() " + e); } } } result.put("changed", Boolean.toString(changed)); return result; } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException { logger.debug("doPost()"); // handle AJAX requests here and send other requests on to the VPPA dispatcher String isAjaxRequest = req.getParameter("ajaxRequest"); if(isAjaxRequest != null && isAjaxRequest.trim().equalsIgnoreCase(Boolean.toString(true))) { ParameterParser params = (ParameterParser) req.getAttribute(ATTR_PARAMS); if(params == null) { params = new ParameterParser(req); } SessionState state = getState(req); // Check whether this is an AJAX request expecting a JSON response and if it is // dispatch the request to the buildJsonResponse() method, avoiding VPPA's // html rendering. Other options might be HTML-fragment, XML, etc. //String requestedMimetype = (String) toolSession.getAttribute(REQUESTED_MIMETYPE); String requestedMimetype = params.getString(REQUESTED_MIMETYPE); if(logger.isDebugEnabled()) { logger.debug("doPost() requestedMimetype == " + requestedMimetype); } if(requestedMimetype != null && requestedMimetype.equals(MIMETYPE_JSON)) { doPostJsonResponse(params, state, req, res); } else if(requestedMimetype != null && requestedMimetype.equals(MIMETYPE_HTML)) { doPostHtmlFragmentResponse(params, state, req, res); } return; } super.doPost(req, res); } protected void doPostHtmlFragmentResponse(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> result = this.ensureCitationListExists(params, state, req, res); res.setCharacterEncoding(CHARSET_UTF8); res.setContentType(MIMETYPE_HTML); String sakai_csrf_token = params.getString("sakai_csrf_token"); if(sakai_csrf_token != null && ! sakai_csrf_token.trim().equals("")) { setVmReference("sakai_csrf_token", sakai_csrf_token, req); } for(Map.Entry<String,Object> entry : result.entrySet()) { setVmReference(entry.getKey(), entry.getValue(), req); } } protected void doPostJsonResponse(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { res.setCharacterEncoding(CHARSET_UTF8); res.setContentType(MIMETYPE_JSON); Map<String,Object> jsonMap = new HashMap<String,Object>(); String sakai_csrf_token = params.getString("sakai_csrf_token"); if(sakai_csrf_token != null && ! sakai_csrf_token.trim().equals("")) { jsonMap.put("sakai_csrf_token", sakai_csrf_token); } jsonMap.put("timestamp", Long.toString(System.currentTimeMillis())); String citation_action = params.getString("citation_action"); if(citation_action != null && citation_action.trim().equals(UPDATE_RESOURCE)) { Map<String,Object> result = this.updateCitationList(params, state, req, res); jsonMap.putAll(result); } else if(citation_action != null && citation_action.trim().equals(UPDATE_SAVED_SORT)) { Map<String,Object> result = this.updateSavedSort(params, state, req, res); jsonMap.putAll(result); } else { Map<String,Object> result = this.createCitationList(params, state, req, res); jsonMap.putAll(result); } jsonMap.put("secondsBetweenSaveciteRefreshes", this.configurationService.getSecondsBetweenSaveciteRefreshes()); // convert to json string String jsonString = JSONObject.fromObject(jsonMap).toString(); try { PrintWriter writer = res.getWriter(); writer.print(jsonString); writer.flush(); } catch (IOException e) { logger.warn("IOException in doPostJsonResponse() ", e); // what goes back? } } protected Map<String, Object> updateSavedSort(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> results = new HashMap<String, Object>(); String message = null; String citationCollectionId = params.getString("citationCollectionId"); String new_sort = params.getString("new_sort"); if(citationCollectionId == null || citationCollectionId.trim().equals("")) { // need to report error results.put("message", rb.getString("sort.save.error")); } else { if(new_sort == null || new_sort.trim().equals("")) { new_sort = "default"; } try { CitationCollection citationCollection = this.citationService.getCollection(citationCollectionId); citationCollection.setSort(new_sort, true); this.citationService.save(citationCollection); results.put("message", rb.getString("sort.save.success")); } catch (IdUnusedException e) { // need to report error results.put("message", rb.getString("sort.save.error")); } } return results; } protected Map<String, Object> createCitationList(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> results = new HashMap<String, Object>(); results.putAll(this.ensureCitationListExists(params, state, req, res)); return results; } protected Map<String, Object> updateCitationList(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> results = new HashMap<String, Object>(); String resourceUuid = params.getString("resourceUuid"); String message = null; if(resourceUuid == null) { results.putAll(this.ensureCitationListExists(params, state, req, res)); } else { try { int priority = this.capturePriority(params); String resourceId = this.getContentService().resolveUuid(resourceUuid); ContentResourceEdit edit = getContentService().editResource(resourceId); this.captureDisplayName(params, state, edit, results); this.captureDescription(params, state, edit, results); this.captureAccess(params, state, edit, results); this.captureAvailability(params, edit, results); getContentService().commitResource(edit, priority); message = "Resource updated"; } catch (IdUnusedException e) { message = e.getMessage(); logger.warn("IdUnusedException in updateCitationList() " + e); } catch (TypeException e) { message = e.getMessage(); logger.warn("TypeException in updateCitationList() " + e); } catch (InUseException e) { message = e.getMessage(); logger.warn("InUseException in updateCitationList() " + e); } catch (PermissionException e) { message = e.getMessage(); logger.warn("PermissionException in updateCitationList() " + e); } catch (OverQuotaException e) { message = e.getMessage(); logger.warn("OverQuotaException in updateCitationList() " + e); } catch (ServerOverloadException e) { message = e.getMessage(); logger.warn("ServerOverloadException in updateCitationList() " + e); } catch (VirusFoundException e) { message = e.getMessage(); logger.warn("VirusFoundException in updateCitationList() " + e); } if(message != null && ! message.trim().equals("")) { results.put("message", message); } } return results; } private int capturePriority(ParameterParser params) { int priority = NotificationService.NOTI_NONE; if(params != null) { String notify = params.getString("notify"); if("r".equals(notify)) { priority = NotificationService.NOTI_REQUIRED; } else if("o".equals(notify)) { priority = NotificationService.NOTI_OPTIONAL; } } return priority; } /** * Check whether we are editing an existing resource or working on a new citation list. * If it exists, we'll update any attributes that have changed. If it's new, we will * create it and return the resourceUuid, along with other attributes, in a map. * @param params * @param state * @param req * @param res * @return */ protected Map<String,Object> ensureCitationListExists(ParameterParser params, SessionState state, HttpServletRequest req, HttpServletResponse res) { Map<String, Object> results = new HashMap<String,Object>(); String message = null; String displayName = params.getString("displayName"); if(displayName == null) { // error ?? } CitationCollection cCollection = this.getCitationCollection(state, true); if(cCollection == null) { // error } else { String citationCollectionId = cCollection.getId(); String contentCollectionId = params.getString("contentCollectionId"); if(contentCollectionId == null || contentCollectionId.trim().equals("")) { ToolSession toolSession = getSessionManager().getCurrentToolSession(); ResourceToolActionPipe pipe = (ResourceToolActionPipe) toolSession.getAttribute(ResourceToolAction.ACTION_PIPE); contentCollectionId = pipe.getContentEntity().getId(); } ContentResource resource = null; String resourceUuid = params.getString("resourceUuid"); String resourceId = null; if(resourceUuid == null || resourceUuid.trim().equals("")) { // create resource if(contentCollectionId == null) { // error? message = rb.getString("resource.null_collectionId.error"); } else { int priority = this.capturePriority(params); // create resource try { ContentResourceEdit edit = getContentService().addResource(contentCollectionId, displayName, null, ContentHostingService.MAXIMUM_ATTEMPTS_FOR_UNIQUENESS); edit.setResourceType(CitationService.CITATION_LIST_ID); byte[] bytes = citationCollectionId.getBytes(); edit.setContent(bytes ); captureDescription(params, state, edit, results); captureAccess(params, state, edit, results); captureAvailability(params, edit, results); ResourceProperties properties = edit.getPropertiesEdit(); properties.addProperty(ResourceProperties.PROP_DISPLAY_NAME, displayName); properties.addProperty(ContentHostingService.PROP_ALTERNATE_REFERENCE, CitationService.REFERENCE_ROOT); properties.addProperty(ResourceProperties.PROP_CONTENT_TYPE, ResourceType.MIME_TYPE_HTML); getContentService().commitResource(edit, priority); resourceId = edit.getId(); message = rb.getFormattedMessage("resource.new.success", new String[]{ displayName }); } catch (IdUniquenessException e) { message = e.getMessage(); logger.warn("IdUniquenessException in ensureCitationListExists() " + e); } catch (IdLengthException e) { message = e.getMessage(); logger.warn("IdLengthException in ensureCitationListExists() " + e); } catch (IdInvalidException e) { message = e.getMessage(); logger.warn("IdInvalidException in ensureCitationListExists() " + e); } catch (OverQuotaException e) { message = e.getMessage(); logger.warn("OverQuotaException in ensureCitationListExists() " + e); } catch (ServerOverloadException e) { message = e.getMessage(); logger.warn("ServerOverloadException in ensureCitationListExists() " + e); } catch (PermissionException e) { message = e.getMessage(); logger.warn("PermissionException in ensureCitationListExists() " + e); } catch (IdUnusedException e) { message = e.getMessage(); logger.warn("IdUnusedException in ensureCitationListExists() " + e); } } } else { // get resource resourceId = this.getContentService().resolveUuid(resourceUuid); if(citationCollectionId == null) { try { resource = this.contentService.getResource(resourceId); citationCollectionId = new String(resource.getContent()); } catch (IdUnusedException e) { message = e.getMessage(); logger.warn("IdUnusedException in getting resource in ensureCitationListExists() " + e); } catch (TypeException e) { message = e.getMessage(); logger.warn("TypeException in getting resource in ensureCitationListExists() " + e); } catch (PermissionException e) { message = e.getMessage(); logger.warn("PermissionException in getting resource in ensureCitationListExists() " + e); } catch (ServerOverloadException e) { message = e.getMessage(); logger.warn("ServerOverloadException in getting citationCollectionId in ensureCitationListExists() " + e); } } // possibly revise displayName, other properties // commit changes // report success/failure } results.put("citationCollectionId", citationCollectionId); //results.put("resourceId", resourceId); resourceUuid = this.getContentService().getUuid(resourceId); if(logger.isDebugEnabled()) { logger.debug("ensureCitationListExists() created new resource with resourceUuid == " + resourceUuid + " and resourceId == " + resourceId); } results.put("resourceUuid", resourceUuid ); String clientId = params.getString("saveciteClientId"); if(clientId != null && ! clientId.trim().equals("")) { Locale locale = rb.getLocale(); List<Map<String,String>> saveciteClients = getConfigurationService().getSaveciteClientsForLocale(locale); if(saveciteClients != null) { for(Map<String,String> client : saveciteClients) { if(client != null && client.get("id") != null && client.get("id").equalsIgnoreCase(clientId)) { String saveciteUrl = getSearchManager().getSaveciteUrl(resourceUuid,clientId); try { saveciteUrl = java.net.URLEncoder.encode(saveciteUrl,"UTF-8"); } catch (UnsupportedEncodingException e) { logger.warn("Error encoding savecite URL",e); } // ${client.searchurl_base}?linkurl_base=${client.saveciteUrl}#if(${client.linkurl_id})&linkurl_id=${client.linkurl_id} StringBuilder buf = new StringBuilder(); buf.append(client.get("searchurl_base")); buf.append("?linkurl_base="); buf.append(saveciteUrl); if(client.get("linkurl_id") != null && ! client.get("linkurl_id").trim().equals("")) { buf.append("&linkurl_id="); buf.append(client.get("linkurl_id")); } buf.append('&'); results.put("saveciteUrl", buf.toString()); break; } } } } results.put("contentCollectionId", contentCollectionId); } results.put("message", message); return results; } private void captureDescription(ParameterParser params, SessionState state, ContentResourceEdit edit, Map<String, Object> results) { String description = params.get("description"); String oldDescription = edit.getProperties().getProperty(ResourceProperties.PROP_DESCRIPTION); if(description == null || description.trim().equals("")) { if(oldDescription != null) { edit.getPropertiesEdit().removeProperty(ResourceProperties.PROP_DESCRIPTION); results.put("description", ""); } } else { if(oldDescription == null || ! oldDescription.equals(description)) { edit.getPropertiesEdit().removeProperty(ResourceProperties.PROP_DESCRIPTION); edit.getPropertiesEdit().addProperty(ResourceProperties.PROP_DESCRIPTION, description); results.put("description", description); } } } protected void captureDisplayName(ParameterParser params, SessionState state, ContentResourceEdit edit, Map<String, Object> results) { String displayName = params.getString("displayName"); if(displayName == null || displayName.trim().equals("")) { throw new RuntimeException("invalid name for resource: " + displayName); } String oldDisplayName = edit.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME); if(oldDisplayName == null || ! oldDisplayName.equals(displayName)) { ResourcePropertiesEdit props = edit.getPropertiesEdit(); props.removeProperty(ResourceProperties.PROP_DISPLAY_NAME); props.addProperty(ResourceProperties.PROP_DISPLAY_NAME, displayName); results.put("displayName", displayName); } } /** * @param params * @param edit * @param results TODO */ protected void captureAvailability(ParameterParser params, ContentResourceEdit edit, Map<String, Object> results) { boolean hidden = params.getBoolean("hidden"); boolean useReleaseDate = params.getBoolean("use_start_date"); DateFormat df = DateFormat.getDateTimeInstance(); Time releaseDate = null; if(useReleaseDate) { String releaseDateStr = params.getString(PROP_RELEASE_DATE); if(releaseDateStr != null) { try { releaseDate = TimeService.newTime(df.parse(releaseDateStr).getTime()); } catch (ParseException e) { logger.warn("ParseException in captureAvailability() " + e); } } } Time retractDate = null; boolean useRetractDate = params.getBoolean("use_end_date"); if(useRetractDate) { String retractDateStr = params.getString(PROP_RETRACT_DATE); if(retractDateStr != null) { try { retractDate = TimeService.newTime(df.parse(retractDateStr).getTime()); } catch (ParseException e) { logger.warn("ParseException in captureAvailability() " + e); } } } boolean oldHidden = edit.isHidden(); Time oldReleaseDate = edit.getReleaseDate(); Time oldRetractDate = edit.getRetractDate(); boolean changesFound = false; if(oldHidden != hidden) { results.put(PROP_IS_HIDDEN, Boolean.toString(hidden)); changesFound = true; } if(oldReleaseDate == null && releaseDate == null) { // no change here } else if((oldReleaseDate == null) || ! oldReleaseDate.equals(releaseDate)) { if(releaseDate == null) { results.put(PROP_RELEASE_DATE_STR, df.format(new Date())); } else { results.put(PROP_RELEASE_DATE_STR, df.format(new Date(releaseDate.getTime()))); } results.put(PROP_RELEASE_DATE, releaseDate); results.put(PROP_USE_RELEASE_DATE, useReleaseDate); changesFound = true; } if(oldRetractDate == null && retractDate == null) { // no change here } else if (oldRetractDate == null || ! oldRetractDate.equals(retractDate)) { if(retractDate == null) { results.put(PROP_RETRACT_DATE_STR, df.format(new Date(System.currentTimeMillis() + ONE_WEEK))); } else { results.put(PROP_RETRACT_DATE_STR, df.format(new Date(retractDate.getTime() ))); } results.put(PROP_RETRACT_DATE, retractDate); changesFound = true; } if(changesFound) { edit.setAvailability(hidden, releaseDate, retractDate); } } protected void captureAccess(ParameterParser params, SessionState state, ContentResourceEdit edit, Map<String, Object> results) { Map<String,Object> entityProperties = (Map<String, Object>) state.getAttribute(STATE_RESOURCE_ENTITY_PROPERTIES); boolean changesFound = false; String access_mode = params.getString("access_mode"); if(access_mode == null) { access_mode = AccessMode.INHERITED.toString(); } String oldAccessMode = entityProperties.get(PROP_ACCESS_MODE).toString(); if(oldAccessMode == null) { oldAccessMode = AccessMode.INHERITED.toString(); } if(! access_mode.equals(oldAccessMode)) { results.put(PROP_ACCESS_MODE, AccessMode.fromString(access_mode)); changesFound = true; } if(AccessMode.GROUPED.toString().equals(access_mode)) { // we inherit more than one group and must check whether group access changes at this item String[] access_groups = params.getStrings("access_groups"); SortedSet<String> new_groups = new TreeSet<String>(); if(access_groups != null) { new_groups.addAll(Arrays.asList(access_groups)); } List<Map<String,String>> possibleGroups = (List<Map<String, String>>) entityProperties.get(PROP_POSSIBLE_GROUPS); if(possibleGroups == null) { possibleGroups = new ArrayList<Map<String,String>>(); } Map<String, String> possibleGroupMap = mapGroupRefs(possibleGroups); SortedSet<String> new_group_refs = convertToRefs(new_groups, possibleGroupMap ); boolean groups_are_inherited = (new_groups.size() == possibleGroupMap.size()) && possibleGroupMap.keySet().containsAll(new_groups); try { if(groups_are_inherited) { edit.clearGroupAccess(); edit.setGroupAccess(new_group_refs); } else { edit.setGroupAccess(new_group_refs); } edit.clearPublicAccess(); } catch (InconsistentException e) { logger.warn("InconsistentException in captureAccess() " + e); } catch (PermissionException e) { logger.warn("PermissionException in captureAccess() " + e); } } else if("public".equals(access_mode)) { Boolean isPubviewInherited = (Boolean) entityProperties.get(PROP_IS_PUBVIEW_INHERITED); if(isPubviewInherited == null || ! isPubviewInherited) { try { edit.setPublicAccess(); } catch (InconsistentException e) { logger.warn("InconsistentException in captureAccess() " + e); } catch (PermissionException e) { logger.warn("PermissionException in captureAccess() " + e); } } } else if(AccessMode.INHERITED.toString().equals(access_mode)) { try { if(edit.getAccess() == AccessMode.GROUPED) { edit.clearGroupAccess(); } edit.clearPublicAccess(); } catch (InconsistentException e) { logger.warn("InconsistentException in captureAccess() " + e); } catch (PermissionException e) { logger.warn("PermissionException in captureAccess() " + e); } } // isPubview results.put(PROP_IS_PUBVIEW, getContentService().isPubView(edit.getId())); // isPubviewInherited results.put(PROP_IS_PUBVIEW_INHERITED, new Boolean(getContentService().isInheritingPubView(edit.getId()))); // isPubviewPossible Boolean preventPublicDisplay = (Boolean) state.getAttribute("resources.request.prevent_public_display"); if(preventPublicDisplay == null) { preventPublicDisplay = Boolean.FALSE; } results.put(PROP_IS_PUBVIEW_POSSIBLE, new Boolean(! preventPublicDisplay.booleanValue())); // accessMode results.put(PROP_ACCESS_MODE, edit.getAccess()); // isGroupInherited results.put(PROP_IS_GROUP_INHERITED, AccessMode.GROUPED == edit.getInheritedAccess()); // possibleGroups Collection<Group> inheritedGroupObjs = edit.getInheritedGroupObjects(); Map<String,Map<String,String>> groups = new HashMap<String,Map<String,String>>(); if(inheritedGroupObjs != null) { for(Group group : inheritedGroupObjs) { Map<String, String> grp = new HashMap<String, String>(); grp.put("groupId", group.getId()); grp.put("title", group.getTitle()); grp.put("description", group.getDescription()); grp.put("entityRef", group.getReference()); groups.put(grp.get("groupId"), grp); } } results.put(PROP_POSSIBLE_GROUPS, groups); // isGroupPossible results.put(PROP_IS_GROUP_POSSIBLE, new Boolean(groups != null && groups.size() > 0)); // isSingleGroupInherited results.put(PROP_IS_SINGLE_GROUP_INHERITED, new Boolean(groups != null && groups.size() == 1)); // isSiteOnly = ! isPubviewPossible && ! isGroupPossible results.put(PROP_IS_SITE_ONLY, new Boolean(preventPublicDisplay.booleanValue() && (groups == null || groups.size() < 1))); // isUserSite SiteService siteService = (SiteService) ComponentManager.get(SiteService.class); Reference ref = getEntityManager().newReference(edit.getReference()); results.put(PROP_IS_USER_SITE, siteService.isUserSite(ref.getContext())); } private Map<String, String> mapGroupRefs( List<Map<String, String>> possibleGroups) { Map<String, String> groupRefMap = new HashMap<String, String>(); for(Map<String, String> groupInfo : possibleGroups) { if(groupInfo.get("groupId") != null && groupInfo.get("entityRef") != null) { groupRefMap.put(groupInfo.get("groupId"), groupInfo.get("entityRef")); } } return groupRefMap ; } public SortedSet<String> convertToRefs(Collection<String> groupIds, Map<String, String> possibleGroupMap) { SortedSet<String> groupRefs = new TreeSet<String>(); for(String groupId : groupIds) { String groupRef = possibleGroupMap.get(groupId); if(groupRef != null) { groupRefs.add(groupRef); } } return groupRefs; } protected void preserveEntityIds(ParameterParser params, SessionState state) { String resourceId = params.getString("resourceId"); String resourceUuid = params.getString("resourceUuid"); String citationCollectionId = params.getString("citationCollectionId"); if(resourceId == null || resourceId.trim().equals("")) { // do nothing } else { state.setAttribute(CitationHelper.RESOURCE_ID, resourceId); } if(resourceUuid == null || resourceUuid.trim().equals("")) { // do nothing } else { state.setAttribute(CitationHelper.RESOURCE_UUID, resourceUuid); } if(citationCollectionId == null || citationCollectionId.trim().equals("")) { // do nothing } else { state.setAttribute(CitationHelper.CITATION_COLLECTION_ID, citationCollectionId); } } protected void putCitationCollectionDetails( Context context, SessionState state ) { // get the citation list title String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); String refStr = getContentService().getReference(resourceId); Reference ref = getEntityManager().newReference(refStr); String collectionTitle = null; if( ref != null ) { collectionTitle = ref.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME); } if(collectionTitle == null) { collectionTitle = (String)state.getAttribute( STATE_COLLECTION_TITLE ); } if( collectionTitle != null && !collectionTitle.trim().equals("") ) { context.put( "collectionTitle", getFormattedText().escapeHtml(collectionTitle)); } // get the collection we're now working on String citationCollectionId = (String)state.getAttribute(STATE_CITATION_COLLECTION_ID); context.put( "citationCollectionId", citationCollectionId ); CitationCollection collection = getCitationCollection(state, false); int collectionSize = 0; if (collection == null) { logger.warn( "buildAddCitationsPanelContext unable to access citationCollection " + citationCollectionId ); return; } else { // get the size of the list collectionSize = collection.size(); } context.put( "collectionSize", new Integer( collectionSize ) ); } public String buildImportCitationsPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { context.put("state", state); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); context.put("FORM_NAME", "importForm"); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_IMPORT_CITATIONS; } // buildImportPanelContext /** * * @param portlet * @param context * @param rundata * @param state * @return */ public String buildAddCitationsPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { context.put("state", state); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // body onload handler context.put("sakai_onload", "setMainFrameHeight( window.name )"); // get the citation list title String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); String refStr = getContentService().getReference(resourceId); Reference ref = getEntityManager().newReference(refStr); String collectionTitle = null; if( ref != null ) { collectionTitle = ref.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME); } if(collectionTitle == null) { collectionTitle = (String)state.getAttribute( STATE_COLLECTION_TITLE ); } if( collectionTitle != null && !collectionTitle.trim().equals("") ) { context.put( "collectionTitle", getFormattedText().escapeHtml(collectionTitle)); } // get the collection we're now working on String citationCollectionId = (String)state.getAttribute(STATE_CITATION_COLLECTION_ID); context.put( "citationCollectionId", citationCollectionId ); CitationCollection citationCollection = getCitationCollection(state, false); int collectionSize = 0; if(citationCollection == null) { logger.warn( "buildAddCitationsPanelContext unable to access citationCollection " + citationCollectionId ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_ERROR; } else { // get the size of the list collectionSize = citationCollection.size(); } context.put( "collectionSize", new Integer( collectionSize ) ); Locale locale = rb.getLocale(); List<Map<String,String>> saveciteClients = getConfigurationService().getSaveciteClientsForLocale(locale); if(saveciteClients != null) { for(Map<String,String> client : saveciteClients) { String saveciteUrl = getSearchManager().getSaveciteUrl(getContentService().getUuid(resourceId),client.get("id")); try { client.put("saveciteUrl", java.net.URLEncoder.encode(saveciteUrl,"UTF-8")); } catch (UnsupportedEncodingException e) { logger.warn("Error encoding savecite URL",e); } } context.put("saveciteClients",saveciteClients); } // determine which features to display if( getConfigurationService().isGoogleScholarEnabled() ) { String googleUrl = getSearchManager().getGoogleScholarUrl(getContentService().getUuid(resourceId)); context.put( "googleUrl", googleUrl ); // object array for formatted messages Object[] googleArgs = { rb.getString( "linkLabel.google" ) }; context.put( "googleArgs", googleArgs ); } if( getConfigurationService().librarySearchEnabled() ) { context.put( "searchLibrary", Boolean.TRUE ); } // form name context.put(PARAM_FORM_NAME, ELEMENT_ID_CREATE_FORM); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_ADD_CITATIONS; } // buildAddCitationsPanelContext /** * build the context. * * @return The name of the template to use. */ public String buildCreatePanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { context.put("state", state); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); //context.put("sakai_onload", "setPopupHeight('create');checkinWithOpener('create');"); //context.put("sakai_onunload", "window.opener.parent.popups['create']=null;"); //context.put("mainFrameId", CitationHelper.CITATION_FRAME_ID); //context.put("citationToolId", CitationHelper.CITATION_ID); //context.put("specialHelperFlag", CitationHelper.SPECIAL_HELPER_ID); context.put(PARAM_FORM_NAME, ELEMENT_ID_CREATE_FORM); List schemas = getCitationService().getSchemas(); context.put("TEMPLATES", schemas); Schema defaultSchema = getCitationService().getDefaultSchema(); context.put("DEFAULT_TEMPLATE", defaultSchema); // Object array for instruction message Object[] instrArgs = { rb.getString( "submit.create" ) }; context.put( "instrArgs", instrArgs ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_CREATE; } // buildCreatePanelContext /** * @param portlet * @param context * @param rundata * @param state * @return */ public String buildDatabasePanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // get hierarchy SearchDatabaseHierarchy hierarchy = ( SearchDatabaseHierarchy ) state.getAttribute(STATE_SEARCH_HIERARCHY); // get selected category SearchCategory category = ( SearchCategory ) state.getAttribute( STATE_SELECTED_CATEGORY ); if( category == null ) { // bad... logger.warn( "buildDatabasePanelContext getting null selected " + "category from state." ); } // put selected category into context context.put( "category", category ); // maxDbNum Integer maxDbNum = new Integer(hierarchy.getNumMaxSearchableDb()); context.put( "maxDbNum", maxDbNum ); // object array for formatted messages Object[] maxDbArgs = { maxDbNum }; context.put( "maxDbArgs", maxDbArgs ); // validator context.put("xilator", new Validator()); // change mode back to SEARCH (DATABASE not needed anymore) setMode( state, Mode.SEARCH ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_DATABASE; } // buildDatabasePanelContext /** * @param portlet * @param context * @param rundata * @param state * @return */ public String buildEditPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); context.put("sakai_onload", "setMainFrameHeight( window.name ); heavyResize();"); //context.put("sakai_onunload", "window.opener.parent.popups['edit']=null;"); //context.put("mainFrameId", CitationHelper.CITATION_FRAME_ID); //context.put("citationToolId", CitationHelper.CITATION_ID); //context.put("specialHelperFlag", CitationHelper.SPECIAL_HELPER_ID); context.put(PARAM_FORM_NAME, ELEMENT_ID_CREATE_FORM); Citation citation = (Citation) state.getAttribute(CitationHelper.CITATION_EDIT_ITEM); if(citation == null) { doEdit(rundata); citation = (Citation) state.getAttribute(CitationHelper.CITATION_EDIT_ITEM); } context.put("citation", citation); String citationId = (String) state.getAttribute(CitationHelper.CITATION_EDIT_ID); String citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); context.put("citationId", citationId); context.put("citationCollectionId", citationCollectionId); List schemas = getCitationService().getSchemas(); context.put("TEMPLATES", schemas); context.put("DEFAULT_TEMPLATE", citation.getSchema()); // Object array for formatted instruction Object[] instrArgs = { rb.getString( "submit.edit" ) }; context.put( "instrArgs", instrArgs ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_EDIT; } /** * @param portlet * @param context * @param rundata * @param state * @return */ private String buildErrorPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { //context.put("sakai_onload", "setPopupHeight('error');"); //context.put("sakai_onunload", "window.opener.parent.popups['error']=null;"); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_ERROR; } private String buildErrorFatalPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { //context.put("sakai_onload", "setPopupHeight('error');"); //context.put("sakai_onunload", "window.opener.parent.popups['error']=null;"); return TEMPLATE_ERROR_FATAL; } /** * build the context. * * @return The name of the template to use. */ public String buildListPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { // state.setAttribute("fromListPage", true); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); if( state.removeAttribute( STATE_LIST_NO_SCROLL ) == null ) { context.put("sakai_onload", "setMainFrameHeight( window.name )"); } else { context.put("sakai_onload", "resizeFrame()"); } //context.put("mainFrameId", CitationHelper.CITATION_FRAME_ID); //context.put("citationToolId", CitationHelper.CITATION_ID); //context.put("specialHelperFlag", CitationHelper.SPECIAL_HELPER_ID); // get the citation list title String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); try { ContentResource resource = this.getContentService().getResource(resourceId); String description = resource.getProperties().getProperty(ResourceProperties.PROP_DESCRIPTION); context.put("description", description); } catch (Exception e) { // TODO: Fix this. What exception is this dealing with? logger.warn(e.getMessage(), e); } String refStr = getContentService().getReference(resourceId); Reference ref = getEntityManager().newReference(refStr); String collectionTitle = null; if( ref != null ) { collectionTitle = ref.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME); } if(collectionTitle == null) { collectionTitle = (String)state.getAttribute( STATE_COLLECTION_TITLE ); } if( collectionTitle != null && !collectionTitle.trim().equals("") ) { context.put( "collectionTitle", getFormattedText().escapeHtml(collectionTitle)); } context.put("openUrlLabel", getConfigurationService().getSiteConfigOpenUrlLabel()); context.put(PARAM_FORM_NAME, ELEMENT_ID_LIST_FORM); CitationCollection collection = getCitationCollection(state, true); // collection size context.put( "collectionSize", new Integer( collection.size() ) ); // export URLs String exportUrlSel = collection.getUrl(CitationService.REF_TYPE_EXPORT_RIS_SEL); String exportUrlAll = collection.getUrl(CitationService.REF_TYPE_EXPORT_RIS_ALL); context.put("exportUrlSel", exportUrlSel); context.put("exportUrlAll", exportUrlAll); Integer listPageSize = (Integer) state.getAttribute(STATE_LIST_PAGE_SIZE); if(listPageSize == null) { listPageSize = defaultListPageSize; state.setAttribute(STATE_LIST_PAGE_SIZE, listPageSize); } context.put("listPageSize", listPageSize); CitationIterator newIterator = collection.iterator(); CitationIterator oldIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(oldIterator != null) { newIterator.setPageSize(listPageSize.intValue()); newIterator.setStart(oldIterator.getStart()); // newIterator.setPage(oldIterator.getPage()); } context.put("citations", newIterator); context.put("citationCollectionId", collection.getId()); context.put("resourceId", resourceId); if(! collection.isEmpty()) { context.put("show_citations", Boolean.TRUE); // int page = newIterator.getPage(); // int pageSize = newIterator.getPageSize(); int totalSize = collection.size(); int start = newIterator.getStart(); int end = newIterator.getEnd(); // int start = page * pageSize + 1; // int end = Math.min((page + 1) * pageSize, totalSize); Integer[] position = { new Integer(start+1) , new Integer(end), new Integer(totalSize)}; String showing = (String) rb.getFormattedMessage("showing.results", position); context.put("showing", showing); } state.setAttribute(STATE_LIST_ITERATOR, newIterator); // back to search results button control context.put("searchResults", state.getAttribute(STATE_SEARCH_RESULTS) ); // constant schema identifier context.put( "titleProperty", Schema.TITLE ); /* * Object arrays for formatted messages */ Object[] instrMainArgs = { getConfigurationService().getSiteConfigOpenUrlLabel() }; context.put( "instrMainArgs", instrMainArgs ); Object[] instrSubArgs = { rb.getString( "label.finish" ) }; context.put( "instrSubArgs", instrSubArgs ); Object[] emptyListArgs = { rb.getString( "label.menu" ) }; context.put( "emptyListArgs", emptyListArgs ); String sort = (String) state.getAttribute(STATE_SORT); if (sort == null || sort.trim().length() == 0) sort = collection.getSort(); context.put("sort", sort); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_LIST; } // buildListPanelContext public String buildReorderPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); if( state.removeAttribute( STATE_LIST_NO_SCROLL ) == null ) { context.put("sakai_onload", "setMainFrameHeight( window.name )"); } else { context.put("sakai_onload", "resizeFrame()"); } // get the citation list title String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); String refStr = getContentService().getReference(resourceId); Reference ref = getEntityManager().newReference(refStr); String collectionTitle = null; if( ref != null ) { collectionTitle = ref.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME); } if(collectionTitle == null) { collectionTitle = (String)state.getAttribute( STATE_COLLECTION_TITLE ); } else if( !collectionTitle.trim().equals("") ) { context.put( "collectionTitle", Validator.escapeHtml(collectionTitle)); } CitationCollection collection = getCitationCollection(state, true); collection.setSort(CitationCollection.SORT_BY_POSITION,true); CitationIterator newIterator = collection.iterator(); newIterator.setPageSize(collection.size()); context.put("citations", newIterator); context.put("citationCollectionId", collection.getId()); state.setAttribute(STATE_LIST_ITERATOR, newIterator); return TEMPLATE_REORDER; } /** * This method retrieves the CitationCollection for the current session. * If the CitationCollection is already in session-state and has not been * updated in the persistent storage since it was last accessed, the copy * in session-state will be returned. If it has been updated in storage, * the copy in session-state will be updated and returned. If the * CitationCollection has not yet been created in storage and the second * parameter is true, this method will create the collection and return it. * In that case, values will be added to session-state for attributes named * STATE_CITATION_COLLECTION and STATE_CITATION_COLLECTION_ID. If the CitationCollection has * not yet been created in storage and the second parameter is false, the * method will return null. * @param state The SessionState object for the current session. * @param create A flag indicating whether the collection should be created * if it does not already exist. * @return The CitationCollection for the current session, or null. */ protected CitationCollection getCitationCollection(SessionState state, boolean create) { CitationCollection citationCollection = (CitationCollection) state.getAttribute(STATE_CITATION_COLLECTION); if(citationCollection == null) { String citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); if(citationCollectionId == null && create) { citationCollection = getCitationService().addCollection(); getCitationService().save(citationCollection); } else { try { citationCollection = getCitationService().getCollection(citationCollectionId); } catch (IdUnusedException e) { logger.warn("IdUnusedException: CitationHelperAction.getCitationCollection() unable to access citationCollection " + citationCollectionId); } if(citationCollection == null && create) { citationCollection = getCitationService().addCollection(); getCitationService().save(citationCollection); } } if(citationCollection != null) { state.setAttribute(STATE_CITATION_COLLECTION, citationCollection); state.setAttribute(STATE_CITATION_COLLECTION_ID, citationCollection.getId()); } } return citationCollection; } /** * build the context. * * @return The name of the template to use. */ public String buildMainPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { logger.debug("buildMainPanelContext()"); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); //context.put("mainFrameId", CitationHelper.CITATION_FRAME_ID); //context.put("citationToolId", CitationHelper.CITATION_ID); //context.put("specialHelperFlag", CitationHelper.SPECIAL_HELPER_ID); // always put whether this is a Resources Add or Revise operation if( state.getAttribute( STATE_RESOURCES_ADD ) != null ) { context.put( "resourcesAddAction", Boolean.TRUE ); } // make sure observers are disabled VelocityPortletPaneledAction.disableObservers(state); String template = ""; Mode mode = (Mode) state.getAttribute(CitationHelper.STATE_HELPER_MODE); if(mode == null) { // mode really shouldn't be null here logger.warn( "buildMainPanelContext() getting null Mode from state" ); mode = Mode.NEW_RESOURCE; //mode = Mode.ADD_CITATIONS; setMode(state, mode); } // add mode to the template context.put( "citationsHelperMode", mode ); switch(mode) { case NEW_RESOURCE: template = buildNewResourcePanelContext(portlet, context, rundata, state); break; case IMPORT_CITATIONS: template = buildImportCitationsPanelContext(portlet, context, rundata, state); break; case ADD_CITATIONS: template = buildAddCitationsPanelContext(portlet, context, rundata, state); break; case CREATE: template = buildCreatePanelContext(portlet, context, rundata, state); break; case DATABASE: template = buildDatabasePanelContext(portlet, context, rundata, state); break; case EDIT: template = buildEditPanelContext(portlet, context, rundata, state); break; case ERROR: template = buildErrorPanelContext(portlet, context, rundata, state); break; case ERROR_FATAL: template = buildErrorFatalPanelContext(portlet, context, rundata, state); break; case LIST: template = buildListPanelContext(portlet, context, rundata, state); break; case REORDER: template = buildReorderPanelContext(portlet, context, rundata, state); break; case MESSAGE: template = buildMessagePanelContext(portlet, context, rundata, state); break; case SEARCH: template = buildSearchPanelContext(portlet, context, rundata, state); break; case RESULTS: template = buildResultsPanelContext(portlet, context, rundata, state); break; case VIEW: template = buildViewPanelContext(portlet, context, rundata, state); break; } return template; } // buildMainPanelContext public String buildNewResourcePanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { logger.debug("buildNewResourcePanelContext()"); context.put("MIMETYPE_JSON", MIMETYPE_JSON); context.put("REQUESTED_MIMETYPE", REQUESTED_MIMETYPE); context.put("xilator", new Validator()); context.put("availability_is_enabled", Boolean.TRUE); context.put("GROUP_ACCESS", AccessMode.GROUPED); context.put("INHERITED_ACCESS", AccessMode.INHERITED); Boolean resourceAdd = (Boolean) state.getAttribute(STATE_RESOURCES_ADD); if(resourceAdd != null && resourceAdd.equals(true)) { context.put("resourceAdd", Boolean.TRUE); context.put(CITATION_ACTION, CREATE_RESOURCE); } else { context.put(CITATION_ACTION, UPDATE_RESOURCE); } // resource-related String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); String resourceUuid = (String) state.getAttribute(CitationHelper.RESOURCE_UUID); if(resourceId == null || resourceId.trim().equals("")) { if(resourceUuid == null || resourceUuid.trim().equals("")) { // Will be dealt with later by creating new resource when needed } else if(resourceUuid.startsWith("/")) { // UUID and ID may be switched resourceId = resourceUuid; resourceUuid = this.getContentService().getUuid(resourceId); if(resourceUuid != null) { state.setAttribute(CitationHelper.RESOURCE_ID, resourceId); state.setAttribute(CitationHelper.RESOURCE_UUID, resourceUuid); } } else { // see if we can get the resourceId from the UUID resourceId = this.getContentService().resolveUuid(resourceUuid); if(resourceId != null) { state.setAttribute(CitationHelper.RESOURCE_ID, resourceId); } } } else if(resourceUuid == null || resourceUuid.trim().equals("")) { resourceUuid = this.getContentService().getUuid(resourceId); if(resourceUuid != null) { state.setAttribute(CitationHelper.RESOURCE_UUID, resourceUuid); } } if(logger.isDebugEnabled()) { logger.debug("buildNewResourcePanelContext() resourceUuid == " + resourceUuid + " resourceId == " + resourceId); } String citationCollectionId = null; ContentResource resource = null; Map<String,Object> contentProperties = null; if(resourceId == null) { } else { try { resource = getContentService().getResource(resourceId); } catch (IdUnusedException e) { logger.warn("IdUnusedException geting resource in buildNewResourcePanelContext() " + e); } catch (TypeException e) { logger.warn("TypeException geting resource in buildNewResourcePanelContext() " + e); } catch (PermissionException e) { logger.warn("PermissionException geting resource in buildNewResourcePanelContext() " + e); } // String guid = getContentService().getUuid(resourceId); // context.put("RESOURCE_ID", guid); } if(resource == null) { context.put(CITATION_ACTION, CREATE_RESOURCE); ToolSession toolSession = getSessionManager().getCurrentToolSession(); ResourceToolActionPipe pipe = (ResourceToolActionPipe) toolSession.getAttribute(ResourceToolAction.ACTION_PIPE); String contentCollectionId = pipe.getContentEntity().getId(); context.put("contentCollectionId", contentCollectionId); ContentCollection collection; try { collection = getContentService().getCollection(contentCollectionId); contentProperties = this.getProperties(collection, state); } catch (IdUnusedException e) { logger.warn("IdUnusedException geting collection in buildNewResourcePanelContext() " + e); } catch (TypeException e) { logger.warn("TypeException geting collection in buildNewResourcePanelContext() " + e); } catch (PermissionException e) { logger.warn("PermissionException geting collection in buildNewResourcePanelContext() " + e); } } else { ResourceProperties props = resource.getProperties(); contentProperties = this.getProperties(resource, state); context.put("resourceTitle", props.getProperty(ResourceProperties.PROP_DISPLAY_NAME)); context.put("resourceDescription", props.getProperty(ResourceProperties.PROP_DESCRIPTION)); //resourceUuid = this.getContentService().getUuid(resourceId); context.put("resourceUuid", resourceUuid ); context.put("contentCollectionId", resource.getContainingCollection().getId()); try { citationCollectionId = new String(resource.getContent()); if(citationCollectionId != null) { state.setAttribute(STATE_CITATION_COLLECTION_ID, citationCollectionId); } } catch (ServerOverloadException e) { logger.warn("ServerOverloadException geting props in buildNewResourcePanelContext() " + e); } context.put(CITATION_ACTION, UPDATE_RESOURCE); } if(contentProperties == null) { contentProperties = new HashMap<String,Object>(); } context.put("contentProperties", contentProperties); int collectionSize = 0; CitationCollection citationCollection = getCitationCollection(state, true); if(citationCollection == null) { logger.warn( "buildAddCitationsPanelContext unable to access citationCollection " + citationCollectionId ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_ERROR; } else { // get the size of the list collectionSize = citationCollection.size(); citationCollectionId = citationCollection.getId(); } context.put("citationCollectionId", citationCollectionId); context.put( "collectionSize", new Integer( collectionSize ) ); Locale locale = rb.getLocale(); List<Map<String,String>> saveciteClients = getConfigurationService().getSaveciteClientsForLocale(locale); if(saveciteClients != null) { if(resource != null && resourceId != null) { for(Map<String,String> client : saveciteClients) { String saveciteUrl = getSearchManager().getSaveciteUrl(resourceUuid,client.get("id")); try { client.put("saveciteUrl", java.net.URLEncoder.encode(saveciteUrl,"UTF-8")); } catch (UnsupportedEncodingException e) { logger.warn("Error encoding savecite URL",e); } } } context.put("saveciteClients",saveciteClients); } // determine which features to display if( getConfigurationService().isGoogleScholarEnabled() ) { String googleUrl = getSearchManager().getGoogleScholarUrl(getContentService().getUuid(resourceId)); context.put( "googleUrl", googleUrl ); // object array for formatted messages Object[] googleArgs = { rb.getString( "linkLabel.google" ) }; context.put( "googleArgs", googleArgs ); } if( getConfigurationService().librarySearchEnabled() ) { context.put( "searchLibrary", Boolean.TRUE ); } if(citationCollection == null || citationCollection.size() <= 0) { } else { context.put("openUrlLabel", getConfigurationService().getSiteConfigOpenUrlLabel()); String currentSort = (String) state.getAttribute(STATE_SORT); if (currentSort == null || currentSort.trim().length() == 0) currentSort = citationCollection.getSort(); if(currentSort == null || currentSort.trim().length() == 0) { currentSort = CitationCollection.SORT_BY_TITLE; } context.put("currentSort", currentSort); String savedSort = citationCollection.getSort(); if(savedSort == null || savedSort.trim().equals("")) { savedSort = CitationCollection.SORT_BY_TITLE; } if(savedSort != currentSort) { citationCollection.setSort(currentSort, true); } //context.put(PARAM_FORM_NAME, ELEMENT_ID_LIST_FORM); // collection size context.put( "collectionSize", new Integer( citationCollection.size() ) ); // export URLs String exportUrlSel = citationCollection.getUrl(CitationService.REF_TYPE_EXPORT_RIS_SEL); String exportUrlAll = citationCollection.getUrl(CitationService.REF_TYPE_EXPORT_RIS_ALL); context.put("exportUrlSel", exportUrlSel); context.put("exportUrlAll", exportUrlAll); Integer listPageSize = (Integer) state.getAttribute(STATE_LIST_PAGE_SIZE); if(listPageSize == null) { listPageSize = defaultListPageSize; state.setAttribute(STATE_LIST_PAGE_SIZE, listPageSize); } context.put("listPageSize", listPageSize); CitationIterator newIterator = citationCollection.iterator(); CitationIterator oldIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(oldIterator == null) { newIterator.setPageSize(listPageSize.intValue()); newIterator.setStart(0); } else { newIterator.setPageSize(listPageSize.intValue()); newIterator.setStart(oldIterator.getStart()); // newIterator.setPage(oldIterator.getPage()); } context.put("citations", newIterator); context.put("citationCollectionId", citationCollection.getId()); if(! citationCollection.isEmpty()) { context.put("show_citations", Boolean.TRUE); // int page = newIterator.getPage(); // int pageSize = newIterator.getPageSize(); int totalSize = citationCollection.size(); int start = newIterator.getStart(); int end = newIterator.getEnd(); // int start = page * pageSize + 1; // int end = Math.min((page + 1) * pageSize, totalSize); Integer[] position = { new Integer(start+1) , new Integer(end), new Integer(totalSize)}; String showing = (String) rb.getFormattedMessage("showing.results", position); context.put("showing", showing); } state.setAttribute(STATE_LIST_ITERATOR, newIterator); // constant schema identifier context.put( "titleProperty", Schema.TITLE ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); } return TEMPLATE_NEW_RESOURCE; } /** * @param portlet * @param context * @param rundata * @param state * @return */ public String buildMessagePanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { context.put("sakai_onload", ""); //context.put("FORM_NAME", "messageForm"); context.put( "citationId", state.getAttribute( STATE_CITATION_ID ) ); // get the collection we're now working on String citationCollectionId = (String)state.getAttribute(STATE_CITATION_COLLECTION_ID); context.put( "citationCollectionId", citationCollectionId ); int size = 0; CitationCollection collection = getCitationCollection(state, false); if(collection == null) { logger.warn( "buildMessagePanelContext unable to access citationCollection " + citationCollectionId ); } else { size = collection.size(); } // get the size of the list context.put( "citationCount", new Integer( size ) ); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_MESSAGE; } /** * * @param portlet * @param context * @param rundata * @param state * @return */ public String buildResultsPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { Caller caller = getCaller(state); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validators context.put("TextValidator", new QuotedTextValidator()); context.put("xilator", new Validator()); // Set: // * the javascript to run on page load // * the page execution context (resources tool or editor integration) switch (caller) { case EDITOR_INTEGRATION: context.put("sakai_onload", "SRC_initializePageInfo('" + ELEMENT_ID_RESULTS_FORM + "','" + rb.getString("add.results") + "'); SRC_verifyWindowOpener();"); context.put("editorIntegration", Boolean.TRUE); context.put("resourcesTool", Boolean.FALSE); break; case RESOURCE_TOOL: default: context.put("sakai_onload", "setMainFrameHeight( window.name ); highlightButtonSelections( '" + rb.getString("remove.results") + "' )"); context.put("editorIntegration", Boolean.FALSE); context.put("resourcesTool", Boolean.TRUE); // put the citation list title and size putCitationCollectionDetails(context, state); break; } // signal basic/advanced search Object basicSearch = state.getAttribute( STATE_BASIC_SEARCH ); context.put( "basicSearch", basicSearch ); if( basicSearch != null ) { context.put( "searchType", ActiveSearch.BASIC_SEARCH_TYPE ); } else { context.put( "searchType", ActiveSearch.ADVANCED_SEARCH_TYPE ); } /* * SEARCH RESULTS */ ActiveSearch searchResults = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); if(searchResults != null) { context.put("searchResults", searchResults); List currentResults = (List) state.getAttribute(STATE_CURRENT_RESULTS); context.put("currentResults", currentResults); Integer[] position = { new Integer(searchResults.getFirstRecordIndex() + 1) , new Integer(searchResults.getLastRecordIndex()), searchResults.getNumRecordsFound()}; String showing = (String) rb.getFormattedMessage("showing.results", position); context.put("showing", showing); } // selected databases String[] databaseIds = (String[])state.getAttribute( STATE_CURRENT_DATABASES ); context.put( "selectedDatabases", databaseIds ); // load basic/advanced search form state loadSearchFormState( context, state ); /* * OTHER CONTEXT PARAMS */ // searchInfo ActiveSearch searchInfo = (ActiveSearch) state.getAttribute(STATE_SEARCH_INFO); context.put("searchInfo", searchInfo); // form name context.put(PARAM_FORM_NAME, ELEMENT_ID_RESULTS_FORM); // OpenURL Label context.put( "openUrlLabel", getConfigurationService().getSiteConfigOpenUrlLabel() ); // object arrays for formatted messages Object[] instrMainArgs = { rb.getString( "add.results" ) }; context.put( "instrMainArgs", instrMainArgs ); Object[] instrSubArgs = { rb.getString( "label.new.search" ) }; context.put( "instrSubArgs", instrSubArgs ); /* * ERROR CHECKING */ String alertMessages = (String) state.removeAttribute(STATE_MESSAGE); if(alertMessages != null) { context.put("alertMessages", alertMessages); } Object noResults = state.removeAttribute( STATE_NO_RESULTS ); if( noResults != null ) { context.put( "noResults", noResults ); } Object noSearch = state.removeAttribute(STATE_NO_KEYWORDS); if(noSearch != null) { context.put("noSearch", noSearch); } Object noDatabases = state.removeAttribute( STATE_NO_DATABASES ); if( noDatabases != null ) { context.put( "noDatabases", noDatabases ); } int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_RESULTS; } // buildResultsPanelContext /** * @param portlet * @param context * @param rundata * @param state * @return */ public String buildSearchPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { Caller caller = getCaller(state); // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validators context.put("TextValidator", new QuotedTextValidator()); context.put("xilator", new Validator()); // Set: // * the javascript to run on page load // * the page execution context (resources tool or editor integration) switch (caller) { case EDITOR_INTEGRATION: context.put("sakai_onload", "SRC_verifyWindowOpener(); showTopCategory();"); context.put("editorIntegration", Boolean.TRUE); context.put("resourcesTool", Boolean.FALSE); break; case RESOURCE_TOOL: default: context.put("sakai_onload", "setMainFrameHeight( window.name ); showTopCategory();"); context.put("editorIntegration", Boolean.FALSE); context.put("resourcesTool", Boolean.TRUE); // put citation list title/size putCitationCollectionDetails(context, state); break; } // resource-related String resourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); String guid = getContentService().getUuid(resourceId); context.put("RESOURCE_ID", guid); // category information from hierarchy SearchDatabaseHierarchy hierarchy = (SearchDatabaseHierarchy) state.getAttribute(STATE_SEARCH_HIERARCHY); context.put( "defaultCategory", hierarchy.getDefaultCategory() ); context.put( "categoryListing", hierarchy.getCategoryListing() ); // load basic/advanced search form state loadSearchFormState( context, state ); /* * MISCELLANEOUS CONTEXT PARAMS */ // default to basicSearch context.put( "basicSearch", state.getAttribute( STATE_BASIC_SEARCH ) ); // searchInfo ActiveSearch searchInfo = (ActiveSearch) state.getAttribute(STATE_SEARCH_INFO); context.put("searchInfo", searchInfo); // max number of searchable databases Integer maxDbNum = new Integer(hierarchy.getNumMaxSearchableDb()); context.put( "maxDbNum", maxDbNum ); // form name context.put(PARAM_FORM_NAME, ELEMENT_ID_SEARCH_FORM); // OpenURL Label context.put( "openUrlLabel", getConfigurationService().getSiteConfigOpenUrlLabel() ); // object arrays for formatted messages Object[] instrArgs = { rb.getString( "submit.search" ) }; context.put( "instrArgs", instrArgs ); String searchType = null; if (searchInfo != null) { searchType = searchInfo.getSearchType(); } if (searchType == null) searchType = ActiveSearch.BASIC_SEARCH_TYPE; context.put("searchType", searchType); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_SEARCH; } // buildSearchPanelContext /** * @param portlet * @param context * @param rundata * @param state * @return */ public String buildViewPanelContext(VelocityPortlet portlet, Context context, RunData rundata, SessionState state) { // always put appropriate bundle in velocity context context.put("tlang", rb); context.put("stlang", srb); // validator context.put("xilator", new Validator()); //context.put("sakai_onload", "setMainFrameHeight('" + CitationHelper.CITATION_FRAME_ID + "');"); //context.put("mainFrameId", CitationHelper.CITATION_FRAME_ID); //context.put("citationToolId", CitationHelper.CITATION_ID); //context.put("specialHelperFlag", CitationHelper.SPECIAL_HELPER_ID); context.put(PARAM_FORM_NAME, ELEMENT_ID_VIEW_FORM); Citation citation = (Citation) state.getAttribute(CitationHelper.CITATION_VIEW_ITEM); if(citation == null) { doEdit(rundata); citation = (Citation) state.getAttribute(CitationHelper.CITATION_VIEW_ITEM); } context.put("citation", citation); String citationId = (String) state.getAttribute(CitationHelper.CITATION_VIEW_ID); String citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); context.put("citationId", citationId); context.put("citationCollectionId", citationCollectionId); List schemas = getCitationService().getSchemas(); context.put("TEMPLATES", schemas); context.put("DEFAULT_TEMPLATE", citation.getSchema()); int requestStateId = preserveRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}); context.put("requestStateId", requestStateId); return TEMPLATE_VIEW; } // buildViewPanelContext /** * * @param context * @param state */ protected void loadSearchFormState( Context context, SessionState state ) { // remember data previously entered if( state.getAttribute( STATE_BASIC_SEARCH ) != null ) { /* basic search */ context.put( "keywords", ( String )state.getAttribute( STATE_KEYWORDS ) ); // default advanced search selections context.put( "advField1", AdvancedSearchHelper.KEYWORD_ID ); context.put( "advField2", AdvancedSearchHelper.AUTHOR_ID ); context.put( "advField3", AdvancedSearchHelper.TITLE_ID ); context.put( "advField4", AdvancedSearchHelper.SUBJECT_ID ); context.put( "advField5", AdvancedSearchHelper.YEAR_ID ); } else { /* advanced search */ // field selections AdvancedSearchHelper.putFieldSelections( context, state ); // field criteria AdvancedSearchHelper.putFieldCriteria( context, state ); } // basic/advanced search types context.put( "basicSearchType", ActiveSearch.BASIC_SEARCH_TYPE ); context.put( "advancedSearchType", ActiveSearch.ADVANCED_SEARCH_TYPE ); } /** * */ public void doFinish ( RunData data) { SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ToolSession toolSession = getSessionManager().getCurrentToolSession(); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ResourceToolActionPipe pipe = (ResourceToolActionPipe) toolSession.getAttribute(ResourceToolAction.ACTION_PIPE); if (pipe == null) { logger.warn( "doFinish() pipe = null"); setMode(state, Mode.ERROR_FATAL); return; } int citationCount = 0; // if(pipe.getAction().getActionType() == ResourceToolAction.ActionType.CREATE_BY_HELPER) // { // /* PIPE remove */ //// SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); // // SecurityService securityService = (SecurityService) ComponentManager.get(SecurityService.class); // // delete the temporary resource // String temporaryResourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); // ContentResource tempResource = null; // try // { // // get the temp resource // tempResource = getContentService().getResource(temporaryResourceId); // // // use the temp resource to 'create' the real resource // pipe.setRevisedContent(tempResource.getContent()); // // // remove the temp resource // if( getCitationService().allowRemoveCitationList( temporaryResourceId ) ) // { // // setup a SecurityAdvisor // CitationListSecurityAdviser advisor = new CitationListSecurityAdviser( // getSessionManager().getCurrentSessionUserId(), // ContentHostingService.AUTH_RESOURCE_REMOVE_ANY, // tempResource.getReference() ); // // try { // securityService.pushAdvisor(advisor); // // // remove temp resource // getContentService().removeResource(temporaryResourceId); // } catch(Exception e) { // logger.warn("Exception removing temporary resource for a citation list: " + temporaryResourceId + " --> " + e); // } finally { // // pop advisor // securityService.popAdvisor(advisor); // } // // tempResource = null; // } // } // catch (PermissionException e) // { // // logger.warn("PermissionException ", e); // } // catch (IdUnusedException e) // { // // logger.warn("IdUnusedException ", e); // } // catch (TypeException e) // { // // logger.warn("TypeException ", e); // } //// catch (InUseException e) //// { //// //// logger.warn("InUseException ", e); //// } // catch (ServerOverloadException e) // { // // logger.warn("ServerOverloadException ", e); // } // catch (Exception e) // { // // logger.warn("Exception ", e); // } // } // // set content (mime) type // pipe.setRevisedMimeType(ResourceType.MIME_TYPE_HTML); // pipe.setRevisedResourceProperty(ResourceProperties.PROP_CONTENT_TYPE, ResourceType.MIME_TYPE_HTML); // // // set the alternative_reference to point to reference_root for CitationService // pipe.setRevisedResourceProperty(ContentHostingService.PROP_ALTERNATE_REFERENCE, CitationService.REFERENCE_ROOT); /* PIPE remove */ // SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); // get the collection we're now working on CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { String citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); String[] args = new String[]{ Integer.toString(collection.size()) }; String size_str = rb.getFormattedMessage("citation.count", args); pipe.setRevisedResourceProperty(ResourceProperties.PROP_CONTENT_LENGTH, size_str); // leave helper mode pipe.setActionCanceled(false); pipe.setErrorEncountered(false); pipe.setActionCompleted(true); toolSession.setAttribute(ResourceToolAction.DONE, Boolean.TRUE); toolSession.removeAttribute(CitationHelper.CITATION_HELPER_INITIALIZED); cleanup(toolSession, CitationHelper.CITATION_PREFIX, state); // Remove session sort state.removeAttribute(STATE_SORT); // Remove session collection state.removeAttribute(STATE_CITATION_COLLECTION_ID); state.removeAttribute(STATE_CITATION_COLLECTION); state.removeAttribute("fromListPage"); } } // doFinish /** * Cancel the action for which the helper was launched. */ public void doCancel(RunData data) { SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ToolSession toolSession = getSessionManager().getCurrentToolSession(); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ResourceToolActionPipe pipe = (ResourceToolActionPipe) toolSession.getAttribute(ResourceToolAction.ACTION_PIPE); if (pipe == null) { logger.warn( "doCancel() pipe = null"); setMode(state, Mode.ERROR_FATAL); return; } if(pipe.getAction().getActionType() == ResourceToolAction.ActionType.CREATE_BY_HELPER) { // TODO: delete the citation collection and all citations // TODO: delete the temporary resource // String temporaryResourceId = (String) state.getAttribute(CitationHelper.RESOURCE_ID); // ContentResourceEdit edit = null; // try // { // edit = getContentService().editResource(temporaryResourceId); // getContentService().removeResource(edit); // edit = null; // } // catch (PermissionException e) // { // // logger.warn("PermissionException ", e); // } // catch (IdUnusedException e) // { // // logger.warn("IdUnusedException ", e); // } // catch (TypeException e) // { // // logger.warn("TypeException ", e); // } // catch (InUseException e) // { // // logger.warn("InUseException ", e); // } // // if(edit != null) // { // getContentService().cancelResource(edit); // } } // leave helper mode pipe.setActionCanceled(false); pipe.setErrorEncountered(false); pipe.setActionCompleted(true); toolSession.setAttribute(ResourceToolAction.DONE, Boolean.TRUE); toolSession.removeAttribute(CitationHelper.CITATION_HELPER_INITIALIZED); state.removeAttribute("fromListPage"); cleanup(toolSession, CitationHelper.CITATION_PREFIX, state); } /** * Adds a citation to the current citation collection. Called from the search-results popup. */ public void doAddCitation ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // get the citation from search results, add it to the citation collection, and rebuild the context String[] citationIds = params.getStrings("citationId"); String citationCollectionId = params.getString("citationCollectionId"); Integer page = (Integer) state.getAttribute(STATE_LIST_PAGE); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); CitationCollection tempCollection = search.getSearchResults(); Map index = search.getIndex(); if(index == null) { index = new Hashtable(); search.setIndex(index); } CitationCollection permCollection = getCitationCollection(state, true); if(permCollection == null) { // error } else { for(int i = 0; i < citationIds.length; i++) { try { Citation citation = tempCollection.getCitation(citationIds[i]); citation.setAdded(true); permCollection.add(citation); } catch(IdUnusedException ex) { logger.warn("doAdd: unable to add citation " + citationIds[i] + " to collection " + citationCollectionId); } } getCitationService().save(permCollection); } // setMode(state, Mode.LIST); } /** * Removes a citation from the current citation collection. Called from the search-results popup. */ public void doRemove ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // get the citation number from search results, remove it from the citation collection, and rebuild the context // get the citation from search results, add it to the citation collection, and rebuild the context String[] citationIds = params.getStrings("citationId"); String citationCollectionId = params.getString("citationCollectionId"); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); CitationCollection tempCollection = search.getSearchResults(); Map index = search.getIndex(); if(index == null) { index = new Hashtable(); search.setIndex(index); } CitationCollection permCollection = getCitationCollection(state, true); if(permCollection == null) { // error } else { for(int i = 0; i < citationIds.length; i++) { try { Citation citation = tempCollection.getCitation(citationIds[i]); citation.setAdded(false); permCollection.remove(citation); } catch(IdUnusedException ex) { logger.warn("doAdd: unable to add citation " + citationIds[i] + " to collection " + citationCollectionId); } } getCitationService().save(permCollection); } //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } public void doDatabasePopulate( RunData data ) { SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // get category id String categoryId = params.get( "categoryId" ); if(logger.isDebugEnabled()) { logger.debug( "doDatabasePopulate() categoryId from URL: " + categoryId ); } if( categoryId == null ) { // should not be null setMode( state, Mode.ERROR ); return; } else { /* TODO can probably do this in build-method (don't need category in state)*/ // get selected category, put it in state SearchDatabaseHierarchy hierarchy = ( SearchDatabaseHierarchy ) state.getAttribute( STATE_SEARCH_HIERARCHY ); SearchCategory category = hierarchy.getCategory( categoryId ); state.setAttribute( STATE_SELECTED_CATEGORY, category ); setMode(state, Mode.DATABASE); } } /** * * @param data */ public void doImportPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); this.preserveEntityIds(params, state); setMode(state, Mode.IMPORT_CITATIONS); } // doImportPage /** * * @param data */ public void doImport ( RunData data) { logger.debug( "doImport called."); // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); Iterator iter = params.getNames(); String param = null; while (iter.hasNext()) { param = (String) iter.next(); if(logger.isDebugEnabled()) { logger.debug( "param = " + param); logger.debug( param + " value = " + params.get(param)); } } String citationCollectionId = params.getString("citationCollectionId"); if(citationCollectionId == null) { citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); } CitationCollection collection = null; collection = getCitationCollection(state, false); String ristext = params.get("ristext"); // We're going to read the RIS file from the submitted form's textarea first. If that's // empty we'll read it from the uploaded file. We'll crate a BufferedReader in either // circumstance so that the parsing code need not know where the ris text came from. java.io.BufferedReader bread = null; if (ristext.trim().length() > 0) // form has text in the risimport textarea { java.io.StringReader risStringReader = new java.io.StringReader(ristext); bread = new java.io.BufferedReader(risStringReader); logger.debug( "String buffered reader ready"); } // end RIS text is in the textarea else // textarea empty, set the read of the import from the file { String upload = params.get("risupload"); if(logger.isDebugEnabled()) { logger.debug( "Upload String = " + upload); } FileItem risImport = params.getFileItem("risupload"); if (risImport == null) { logger.debug( "risImport is null."); return; } if(logger.isDebugEnabled()) { logger.debug("Filename = " + risImport.getFileName()); } InputStream risImportStream = risImport.getInputStream(); // Attempt to detect the encoding of the file. BOMInputStream irs = new BOMInputStream(risImportStream); // below is needed if UTF-8 above is commented out Reader isr = null; String bomCharsetName = null; try { bomCharsetName = irs.getBOMCharsetName(); if (bomCharsetName != null) { isr = new InputStreamReader(risImportStream, bomCharsetName); } } catch (UnsupportedEncodingException uee) { // Something strange as the JRE should support all the formats. if(logger.isInfoEnabled()) { logger.info("Problem using character set when importing RIS: "+ bomCharsetName); } } catch (IOException ioe) { // Probably won't get any further, but may as well try. if(logger.isDebugEnabled()) { logger.debug("Problem reading the character set from RIS import: "+ ioe.getMessage()); } } // Fallback to platform default if (isr == null) { isr = new InputStreamReader(irs); } bread = new java.io.BufferedReader(isr); } // end set the read of the import from the uploaded file. // The below code is a major work in progress. // This code is for demonstration purposes only. No gambling or production use! StringBuilder fileString = new StringBuilder(); String importLine = null; java.util.List importList = new java.util.ArrayList(); // Read the BufferedReader and populate the importList. Each entry in the list // is a line in the RIS import "file". try { while ((importLine = bread.readLine()) != null) { importLine = importLine.trim(); if (importLine != null && importLine.length() > 2) { importList.add(importLine); if(logger.isDebugEnabled()) { fileString.append("\n"); fileString.append(importLine); } } } // end while } // end try catch(Exception e) { logger.debug("ISR error = " + e); } // end catch finally { if (bread != null) { try { bread.close(); } catch (IOException e) { // tried } } } if(logger.isDebugEnabled()) { logger.debug("fileString = \n" + fileString.toString()); } // tempList holds the entries read in to make a citation up to and // including the ER entry from importList List tempList = new java.util.ArrayList(); Citation importCitation = getCitationService().getTemporaryCitation(); CitationCollection importCollection = getCitationService().getTemporaryCollection(); int sucessfullyReadCitations = 0; int totalNumberCitations = 0; // Read each entry in the RIS List and build a citation for(int i=0; i< importList.size(); i++) { String importEntryString = (String) importList.get(i); // logger.debug("Import line (#1) = " + importEntryString); // logger.debug("Substring is = " + importEntryString.substring(0, 2)); tempList.add(importEntryString); // make sure importEntryString can be tested for "ER" existence. It could // be a dinky invalid line less than 2 characters. if (importEntryString != null && importEntryString.length() > 1 && importEntryString.substring(0, 2).equalsIgnoreCase("ER")) { // end of citation (signaled by ER). totalNumberCitations++; if(logger.isDebugEnabled()) { logger.debug("------> Trying to add citation " + totalNumberCitations); } if (importCitation.importFromRisList(tempList)) // import went well { importCollection.add(importCitation); sucessfullyReadCitations++; } tempList.clear(); importCitation = getCitationService().getTemporaryCitation(); } } // end for if(logger.isDebugEnabled()) { logger.debug("Done reading in " + sucessfullyReadCitations + " / " + totalNumberCitations + " citations."); } collection.addAll(importCollection); getCitationService().save(collection); // remove collection from state state.removeAttribute(STATE_CITATION_COLLECTION); //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // end doImport() public void doCreateResource(RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); setMode(state, Mode.NEW_RESOURCE); //state.setAttribute(CitationHelper.SPECIAL_HELPER_ID, CitationHelper.CITATION_ID); } /** * */ public void doCreate ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); setMode(state, Mode.CREATE); //state.setAttribute(CitationHelper.SPECIAL_HELPER_ID, CitationHelper.CITATION_ID); } // doCreate /** * Fetch the calling application * @param state The session state * @return The calling application (default to Resources if nothing is set) */ protected Caller getCaller(SessionState state) { Caller caller = (Caller) state.getAttribute(CITATIONS_HELPER_CALLER); return (caller == null) ? Caller.RESOURCE_TOOL : Caller.EDITOR_INTEGRATION; } /** * Set the calling applcation * @param state The session state * @param caller The calling application */ protected void setCaller(SessionState state, Caller caller) { state.setAttribute(CITATIONS_HELPER_CALLER, caller); } /** * @param state * @param new_mode */ protected void setMode(SessionState state, Mode new_mode) { // set state attributes state.setAttribute( CitationHelper.STATE_HELPER_MODE, new_mode ); } /** * */ public void doCreateCitation ( RunData data) { // get the state object and the parameter parser SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); Set validPropertyNames = getCitationService().getValidPropertyNames(); String mediatype = params.getString("type"); CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { // create a citation Citation citation = getCitationService().addCitation(mediatype); updateCitationFromParams(citation, params); // add citation to current collection collection.add(citation); getCitationService().save(collection); } // call buildListPanelContext to show updated list //state.setAttribute(CitationHelper.SPECIAL_HELPER_ID, CitationHelper.CITATION_ID); //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doCreateCitation /** * @param citation * @param params */ protected void updateCitationFromParams(Citation citation, ParameterParser params) { Schema schema = citation.getSchema(); List fields = schema.getFields(); Iterator fieldIt = fields.iterator(); while(fieldIt.hasNext()) { Field field = (Field) fieldIt.next(); String name = field.getIdentifier(); if(field.isMultivalued()) { List values = new Vector(); String count = params.getString(name + "_count"); int num = 10; try { num = Integer.parseInt(count); for(int i = 0; i < num; i++) { String value = params.getString(name + i); if(value != null && !values.contains(value)) { values.add(value); } } citation.updateCitationProperty(name, values); } catch(NumberFormatException e) { } } else { String value = params.getString(name); citation.setCitationProperty(name, value); if(name.equals(Schema.TITLE)) { citation.setDisplayName(value); } } } int urlCount = 0; try { urlCount = params.getInt("url_count"); } catch(Exception e) { logger.debug("doCreateCitation: unable to parse int for urlCount"); } // clear preferredUrl - if there is one, we will find it after looping // through all customUrls below citation.setPreferredUrl( null ); String id = null; for(int i = 0; i < urlCount; i++) { String label = params.getString("label_" + i); String url = params.getString("url_" + i); String urlid = params.getString("urlid_" + i); String preferred = params.getString( "pref_" + i ); String addPrefix = params.getString( "addprefix_" + i ); if(url == null) { if(logger.isDebugEnabled()) { logger.debug("doCreateCitation: url null? " + url); } } else { try { url = validateURL(url); } catch (MalformedURLException e) { if(logger.isDebugEnabled()) { logger.debug("doCreateCitation: unable to validate URL: " + url); } continue; } } if(label == null || url == null) { if(logger.isDebugEnabled()) { logger.debug("doCreateCitation: label null? " + label + " url null? " + url); } continue; } else if(urlid == null || urlid.trim().equals("")) { id = citation.addCustomUrl(label, url, addPrefix); if( preferred != null && !preferred.trim().equals( "" ) ) { // this customUrl is the new preferredUrl citation.setPreferredUrl( id ); } } else { // update an existing customUrl citation.updateCustomUrl(urlid, label, url, addPrefix); if( preferred != null && !preferred.trim().equals( "" ) ) { // this customUrl is the new preferredUrl citation.setPreferredUrl( urlid ); } } } } /** * */ public void doEdit ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationId = params.getString("citationId"); String citationCollectionId = params.getString("citationCollectionId"); CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { Citation citation = null; try { citation = collection.getCitation(citationId); } catch (IdUnusedException e) { // add an alert (below) } if(citation == null) { addAlert(state, rb.getString("alert.access")); } else { state.setAttribute(CitationHelper.CITATION_EDIT_ID, citationId); state.setAttribute(CitationHelper.CITATION_EDIT_ITEM, citation); setMode(state, Mode.EDIT); } } } // doEdit /** * */ public void doList ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doList public void doResults( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); setMode(state, Mode.RESULTS); } /** * */ public void doAddCitations ( RunData data) { logger.debug("doAddCitations()"); // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); preserveEntityIds(params, state); //setMode(state, Mode.ADD_CITATIONS); setMode(state, Mode.NEW_RESOURCE); logger.debug("doAddCitations()"); } // doAddCitations public void doMessageFrame(RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // get params String citationId = params.getString("citationId"); String citationCollectionId = params.getString("citationCollectionId"); String operation = params.getString("operation"); // check params if( operation == null ) { logger.warn( "doMessageFrame() 'operation' null argument" ); setMode(state, Mode.ERROR); return; } if( operation.trim().equalsIgnoreCase( "refreshCount" ) ) { // do not need to do anything, let buildMessagePanelContext update // count for citations setMode( state, Mode.MESSAGE ); return; } if( operation == null || citationId == null || citationCollectionId == null ) { logger.warn( "doMessageFrame() null argument - operation: " + operation + ", citationId: " + citationId + ", " + "citationCollectionId: " + citationCollectionId ); setMode(state, Mode.ERROR); return; } // get Citation using citationId List<Citation> currentResults = (List<Citation>) state.getAttribute(STATE_CURRENT_RESULTS); Citation citation = null; for( Citation c : currentResults ) { if( c.getId().equals( citationId ) ) { citation = c; break; } } if( citation == null ) { logger.warn( "doMessageFrame() bad citationId: " + citationId ); setMode(state, Mode.ERROR); return; } // get CitationCollection using citationCollectionId CitationCollection collection = getCitationCollection(state, false); if(collection == null) { logger.warn( "doMessageFrame() unable to access citationCollection " + citationCollectionId ); } else { // do operation if(operation.equalsIgnoreCase("add")) { if(logger.isDebugEnabled()) { logger.debug("adding citation " + citationId + " to " + citationCollectionId); } citation.setAdded( true ); collection.add( citation ); getCitationService().save(collection); } else if(operation.equalsIgnoreCase("remove")) { if(logger.isDebugEnabled()) { logger.debug("removing citation " + citationId + " from " + citationCollectionId); } collection.remove( citation ); citation.setAdded( false ); getCitationService().save(collection); } else { // do nothing if(logger.isDebugEnabled()) { logger.debug("null operation: " + operation); } } // store the citation's new id to send back to UI state.setAttribute( STATE_CITATION_ID, citation.getId() ); } setMode(state, Mode.MESSAGE); } public void doRemoveAllCitations( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationCollectionId = params.getString("citationCollectionId"); CitationCollection collection = getCitationCollection(state, false); if(collection == null) { // TODO add alert and log error logger.warn("CitationHelperAction.doRemoveCitation collection null: " + citationCollectionId); } else { // remove all citations List<Citation> citations = collection.getCitations(); if( citations != null && citations.size() > 0 ) { for( Citation citation : citations ) { collection.remove( citation ); } getCitationService().save(collection); } } //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doRemoveAllCitations public void doImportCitationFromResourceUrl( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); String resourceUrl = params.getString("resourceUrl"); CitationCollection collection = getCitationCollection(state, false); if(resourceUrl != null) { if(logger.isDebugEnabled()) logger.debug("RESOURCE URL: " + resourceUrl); String resourceId = resourceUrl.substring(resourceUrl.indexOf("/group")); if(logger.isDebugEnabled()) logger.debug("RESOURCE ID: " + resourceId); ContentHostingService contentService = (ContentHostingService) ComponentManager.get("org.sakaiproject.content.api.ContentHostingService"); try { ContentResource resource = contentService.getResource(resourceId); ResourceProperties props = resource.getProperties(); String displayName = props.getProperty(ResourceProperties.PROP_DISPLAY_NAME); Citation citation = citationService.addCitation("unknown"); citation.setDisplayName(displayName); citation.setCitationProperty("resourceId", resourceId); //User user = UserDirectoryService.getUser(props.getProperty(ResourceProperties.PROP_CREATOR)); //citation.setCitationProperty(Schema.CREATOR,user.getLastName() + ", " + user.getFirstName()); String urlId = citation.addCustomUrl(resourceUrl, resourceUrl); citation.setPreferredUrl(urlId); collection.add(citation); citationService.save(collection); } catch (Exception e) { e.printStackTrace(); } } state.setAttribute("sort", CitationCollection.SORT_BY_TITLE); setMode(state, Mode.LIST); } // doImportCitationsFromResourceUrl public void doShowReorderCitations( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); setMode(state, Mode.REORDER); } // doShowReorderCitations public void doReorderCitations( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); String orderedCitationIds = params.getString("orderedCitationIds"); CitationCollection collection = getCitationCollection(state, false); String[] splitIds = orderedCitationIds.split(","); try { for(int i = 1;i <= splitIds.length;i++) { collection.getCitation(splitIds[i - 1]).setPosition(i); } getCitationService().save(collection); } catch(IdUnusedException iue) { logger.error("One of the supplied citation ids was invalid. The new order was not saved."); } // Had to do this to force a reload from storage in buildListPanelContext state.removeAttribute(STATE_CITATION_COLLECTION); state.setAttribute(STATE_SORT, CitationCollection.SORT_BY_POSITION); setMode(state, Mode.NEW_RESOURCE); } // doReorderCitations public void doRemoveSelectedCitations( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationCollectionId = params.getString("citationCollectionId"); CitationCollection collection = getCitationCollection(state, false); if(collection == null) { // TODO add alert and log error logger.warn("doRemoveSelectedCitation() collection null: " + citationCollectionId); } else { // remove selected citations String[] paramCitationIds = params.getStrings("citationId"); if( paramCitationIds != null && paramCitationIds.length > 0 ) { List<String> citationIds = new java.util.ArrayList<String>(); citationIds.addAll(Arrays.asList(paramCitationIds)); try { for( String citationId : citationIds ) { Citation citation = collection.getCitation(citationId); collection.remove(citation); } getCitationService().save(collection); } catch( IdUnusedException e ) { logger.warn("doRemoveSelectedCitation() unable to get and remove citation", e ); } } } state.setAttribute( STATE_LIST_NO_SCROLL, Boolean.TRUE ); //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doRemoveSelectedCitations /** * */ public void doReviseCitation (RunData data) { // get the state object and the parameter parser SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // Set validPropertyNames = getCitationService().getValidPropertyNames(); // String mediatype = params.getString("type"); CitationCollection collection = getCitationCollection(state, false); if(collection == null) { // TODO add alert and log error } else { String citationId = (String) state.getAttribute(CitationHelper.CITATION_EDIT_ID); if(citationId != null) { try { Citation citation = collection.getCitation(citationId); String schemaId = params.getString("type"); Schema schema = getCitationService().getSchema(schemaId); citation.setSchema(schema); updateCitationFromParams(citation, params); // add citation to current collection collection.saveCitation(citation); } catch (IdUnusedException e) { // TODO add alert and log error } getCitationService().save(collection); } } //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doReviseCitation /** * * @param data */ public void doCancelSearch( RunData data ) { // get state and params SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // cancel the running search ActiveSearch search = ( ActiveSearch )state.getAttribute( STATE_SEARCH_INFO ); if( search != null ) { Thread searchThread = search.getSearchThread(); if( searchThread != null ) { try { searchThread.interrupt(); } catch( SecurityException se ) { // not able to interrupt search logger.warn( "doSearch() [in ThreadGroup " + Thread.currentThread().getThreadGroup().getName() + "] unable to interrupt search Thread [name=" + searchThread.getName() + ", id=" + searchThread.getId() + ", group=" + searchThread.getThreadGroup().getName() + "]"); } } } } // doCancelSearch /** * Resources Tool/Citation Helper search * @param data Runtime data */ public void doSearch ( RunData data) { SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); logger.debug("doSearch()"); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); //doSearchCommon(state, Mode.ADD_CITATIONS); doSearchCommon(state, Mode.NEW_RESOURCE); } /** * Common "doSearch()" support * @param state Session state * @param errorMode Next mode to set if we have database hierarchy problems */ protected void doSearchCommon(SessionState state, Mode errorMode) { // remove attributes from an old search session, if any state.removeAttribute( STATE_SEARCH_RESULTS ); state.removeAttribute( STATE_CURRENT_RESULTS ); state.removeAttribute( STATE_KEYWORDS ); // indicate a basic search state.setAttribute( STATE_BASIC_SEARCH, new Object() ); try { SearchDatabaseHierarchy hierarchy = getSearchManager().getSearchHierarchy(); if (hierarchy == null) { addAlert(state, rb.getString("search.problem")); setMode(state, errorMode); return; } state.setAttribute(STATE_SEARCH_HIERARCHY, hierarchy); setMode(state, Mode.SEARCH); } catch (SearchException exception) { String error = exception.getMessage(); if ((error == null) || (error.length() == 0)) { error = rb.getString("search.problem"); } addAlert(state, error); setMode(state, Mode.ERROR); } } /** * */ public void doBeginSearch ( RunData data) { // get state and params SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); // get search object from state ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_INFO); if(search == null) { logger.debug( "doBeginSearch() got null ActiveSearch from state." ); search = getSearchManager().newSearch(); } // get databases selected String[] databaseIds = params.getStrings( "databasesSelected" ); // check the databases to make sure they are indeed searchable by this user if( databaseIds != null ) { if(logger.isDebugEnabled()) { logger.debug( "Databases selected:" ); for( String databaseId : databaseIds ) { logger.debug( " " + databaseId ); } } SearchDatabaseHierarchy hierarchy = (SearchDatabaseHierarchy)state.getAttribute(STATE_SEARCH_HIERARCHY); for( int i = 0; i < databaseIds.length; i++ ) { if( !hierarchy.isSearchableDatabase( databaseIds[ i ] ) ) { // TODO collect a list of the databases which are // not searchable and pass them to the UI // do not search if databases selected // are not searchable by this user state.setAttribute( STATE_UNAUTHORIZED_DB, Boolean.TRUE ); logger.warn( "doBeginSearch() unauthorized database: " + databaseIds[i] ); setMode(state, Mode.RESULTS); return; } } /* * Specify which databases should be searched */ search.setDatabaseIds(databaseIds); state.setAttribute( STATE_CURRENT_DATABASES, databaseIds ); } else { // no databases selected, cannot continue state.setAttribute( STATE_NO_DATABASES, Boolean.TRUE ); setMode(state, Mode.RESULTS); return; } /* * do basic/advanced search-specific processing */ // determine which type of search has been issued String searchType = params.getString( "searchType" ); if( searchType != null && searchType.equalsIgnoreCase( ActiveSearch.ADVANCED_SEARCH_TYPE ) ) { doAdvancedSearch( params, state, search ); } else { doBasicSearch( params, state, search ); } // check for a cancel String cancel = params.getString( "cancelOp" ); if( cancel != null && !cancel.trim().equals("") ) { if( cancel.equalsIgnoreCase( ELEMENT_ID_RESULTS_FORM ) ) { state.setAttribute( STATE_CANCEL_PAGE, Mode.RESULTS ); } else { state.setAttribute( STATE_CANCEL_PAGE, Mode.SEARCH ); } } /* * BEGIN SEARCH */ try { // set search thread to the current thread search.setSearchThread( Thread.currentThread() ); state.setAttribute( STATE_SEARCH_INFO, search ); // initiate the search List latestResults = search.viewPage(); String msg = search.getStatusMessage(); if(msg != null) { addAlert(state, msg); search.setStatusMessage(); } if( latestResults != null ) { state.setAttribute(STATE_SEARCH_RESULTS, search); state.setAttribute(STATE_CURRENT_RESULTS, latestResults); setMode(state, Mode.RESULTS); } } catch(SearchException se) { // either page indices are off or there has been a metasearch error // do some logging & find the proper alert message StringBuilder alertMsg = new StringBuilder( se.getMessage() ); logger.warn("doBeginSearch() SearchException: " + alertMsg ); if( search.getStatusMessage() != null && !search.getStatusMessage().trim().equals("") ) { logger.warn( " |-- nested metasearch error: " + search.getStatusMessage() ); alertMsg.append( " (" + search.getStatusMessage() + ")" ); } // add an alert and set the next mode addAlert( state, alertMsg.toString() ); state.setAttribute( STATE_NO_RESULTS, Boolean.TRUE ); setMode(state, Mode.RESULTS); return; } catch( SearchCancelException sce ) { logger.debug( "doBeginSearch() SearchCancelException: user cancelled search" ); setMode( state, (Mode)state.getAttribute(STATE_CANCEL_PAGE) ); } ActiveSearch newSearch = getSearchManager().newSearch(); state.setAttribute( STATE_SEARCH_INFO, newSearch ); } // doBeginSearch /** * Sets up a basic search. * * @param params request parameters from doBeginSearch * @param state session state * @param search current search */ protected void doBasicSearch( ParameterParser params, SessionState state, ActiveSearch search ) { // signal a basic search state.setAttribute( STATE_BASIC_SEARCH, new Object() ); search.setSearchType( ActiveSearch.BASIC_SEARCH_TYPE ); // get keywords String keywords = params.getString("keywords"); if(keywords == null || keywords.trim().equals("")) { logger.warn( "doBasicSearch() getting null/empty keywords" ); } // set up search query SearchQuery basicQuery = new org.sakaiproject.citation.util.impl.SearchQuery(); basicQuery.addKeywords( keywords ); // set query for this search search.setBasicQuery( basicQuery ); // save state state.setAttribute( STATE_KEYWORDS, keywords ); } // doBasicSearch /** * Sets up an advanced search. * * @param params request parameters from doBeginSearch * @param state session state * @param search current search */ protected void doAdvancedSearch( ParameterParser params, SessionState state, ActiveSearch search ) { // signal an advanced search state.removeAttribute( STATE_BASIC_SEARCH ); search.setSearchType( ActiveSearch.ADVANCED_SEARCH_TYPE ); // clear old state AdvancedSearchHelper.clearAdvancedFormState( state ); // set selected fields AdvancedSearchHelper.setFieldSelections( params, state ); // set entered criteria AdvancedSearchHelper.setFieldCriteria( params, state ); // get a Map of advancedCritera for the search search.setAdvancedQuery( AdvancedSearchHelper.getAdvancedCriteria( state ) ); } /** * */ public void doNextListPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); CitationIterator listIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(listIterator == null) { CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { listIterator = collection.iterator(); state.setAttribute(STATE_LIST_ITERATOR, listIterator); } } if(listIterator != null && listIterator.hasNextPage()) { listIterator.nextPage(); } } // doNextListPage /** * */ public void doPrevListPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); CitationIterator listIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(listIterator == null) { CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { listIterator = collection.iterator(); state.setAttribute(STATE_LIST_ITERATOR, listIterator); } } if(listIterator != null && listIterator.hasPreviousPage()) { listIterator.previousPage(); } } // doSearch /** * */ public void doLastListPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { CitationIterator listIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(listIterator == null) { listIterator = collection.iterator(); state.setAttribute(STATE_LIST_ITERATOR, listIterator); } else { int pageSize = listIterator.getPageSize(); int totalSize = collection.size(); int lastPage = 0; listIterator.setStart(totalSize - pageSize); } } } // doSearch /** * */ public void doFirstListPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); if(state.getAttribute(CitationHelper.RESOURCE_ID) == null) { String resourceId = params.get("resourceId"); if(resourceId == null || resourceId.trim().equals("")) { String resourceUuid = (String) state.getAttribute(CitationHelper.RESOURCE_UUID); if(resourceUuid == null || resourceUuid.trim().equals("")) { resourceUuid = params.get("resourceUuid"); } if(resourceUuid == null || resourceUuid.trim().equals("")) { // Error? We can't identify resource } else { resourceId = this.getContentService().resolveUuid(resourceUuid); state.setAttribute(CitationHelper.RESOURCE_ID, resourceId); state.setAttribute(CitationHelper.RESOURCE_UUID, resourceUuid); } } else { state.setAttribute(CitationHelper.RESOURCE_ID, resourceId); } } CitationIterator listIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(listIterator == null) { CitationCollection collection = getCitationCollection(state, true); if(collection == null) { // error } else { listIterator = collection.iterator(); state.setAttribute(STATE_LIST_ITERATOR, listIterator); } } if(listIterator != null) { listIterator.setStart(0); } } // doSearch /** * */ public void doNextSearchPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); if(search == null) { search = getSearchManager().newSearch(); } // search.prepareForNextPage(); try { List latestResults = search.viewPage(search.getViewPageNumber() + 1); String msg = search.getStatusMessage(); if(msg != null) { addAlert(state, msg); search.setStatusMessage(); } state.setAttribute(STATE_CURRENT_RESULTS, latestResults); setMode(state, Mode.RESULTS); } catch (SearchException e) { logger.warn("doNextSearchPage: " + e.getMessage()); addAlert(state, rb.getString( "error.search" ) ); setMode(state, Mode.RESULTS); } catch(Exception e) { logger.warn("doNextSearchPage: " + e.getMessage()); } } // doSearch /** * */ public void doPrevSearchPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); if(search == null) { search = getSearchManager().newSearch(); } // search.prepareForNextPage(); try { List latestResults = search.viewPage(search.getViewPageNumber() - 1); String msg = search.getStatusMessage(); if(msg != null) { addAlert(state, msg); search.setStatusMessage(); } state.setAttribute(STATE_CURRENT_RESULTS, latestResults); setMode(state, Mode.RESULTS); } catch (SearchException e) { logger.warn("doPrevSearchPage: " + e.getMessage()); addAlert(state, rb.getString( "error.search" ) ); setMode(state, Mode.RESULTS); } catch(Exception e) { logger.warn("doPrevSearchPage: " + e.getMessage()); } } // doSearch /** * */ public void doFirstSearchPage ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); if(search == null) { search = getSearchManager().newSearch(); } // search.prepareForNextPage(); try { List latestResults = search.viewPage(0); String msg = search.getStatusMessage(); if(msg != null) { addAlert(state, msg); search.setStatusMessage(); } state.setAttribute(STATE_CURRENT_RESULTS, latestResults); setMode(state, Mode.RESULTS); } catch (SearchException e) { logger.warn("doFirstSearchPage: " + e.getMessage()); addAlert(state, rb.getString( "error.search" ) ); setMode(state, Mode.RESULTS); } catch(Exception e) { logger.warn("doFirstSearchPage: " + e.getMessage()); } } // doSearch /** * */ public void doChangeSearchPageSize ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); ActiveSearch search = (ActiveSearch) state.getAttribute(STATE_SEARCH_RESULTS); if(search == null) { search = getSearchManager().newSearch(); state.setAttribute(STATE_SEARCH_RESULTS, search); } // search.prepareForNextPage(); // check for top or bottom page selector String pageSelector = params.get( "pageSelector" ); int pageSize; if( pageSelector.equals( "top" ) ) { pageSize = params.getInt( "pageSizeTop" ); } else { pageSize = params.getInt("pageSizeBottom"); } if(pageSize > 0) { // use the new value } else { // use the old value pageSize = search.getViewPageSize(); } state.setAttribute(STATE_RESULTS_PAGE_SIZE, new Integer(pageSize)); try { int last = search.getLastRecordIndex(); int page = (last - 1)/pageSize; search.setViewPageSize(pageSize); List latestResults = search.viewPage(page); String msg = search.getStatusMessage(); if(msg != null) { addAlert(state, msg); search.setStatusMessage(); } state.setAttribute(STATE_CURRENT_RESULTS, latestResults); setMode(state, Mode.RESULTS); } catch (SearchException e) { logger.warn("doChangeSearchPageSize: " + e.getMessage()); addAlert(state, rb.getString( "error.search" ) ); setMode(state, Mode.RESULTS); } catch(Exception e) { logger.warn("doChangeSearchPageSize: " + e.getMessage()); } } // doChangeSearchPageSize /** * */ public void doChangeListPageSize ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); int pageSize = params.getInt( "newPageSize" ); if(pageSize < 1) { // check for top or bottom page selector String pageSelector = params.get( "pageSelector" ); if( pageSelector.equals( "top" ) ) { pageSize = params.getInt( "pageSizeTop" ); } else { pageSize = params.getInt("pageSizeBottom"); } } if(pageSize > 0) { state.setAttribute(STATE_LIST_PAGE_SIZE, new Integer(pageSize)); CitationIterator tempIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); tempIterator.setPageSize(pageSize); state.removeAttribute(STATE_LIST_ITERATOR); state.setAttribute(STATE_LIST_ITERATOR, tempIterator); } } // doSearch /** * */ public void doView ( RunData data) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationId = params.getString("citationId"); String citationCollectionId = params.getString("citationCollectionId"); CitationCollection collection = getCitationCollection(state, false); if(collection == null) { addAlert(state, rb.getString("alert.access")); } else { Citation citation = null; try { citation = collection.getCitation(citationId); } catch (IdUnusedException e) { // add an alert (below) } if(citation == null) { addAlert(state, rb.getString("alert.access")); } else { state.setAttribute(CitationHelper.CITATION_VIEW_ID, citationId); state.setAttribute(CitationHelper.CITATION_VIEW_ITEM, citation); setMode(state, Mode.VIEW); } } } // doView /** * This method is used to ensure the Citations Helper is not invoked by * the Resources tool in a state other than ADD_CITATIONS or LIST. It uses * a simple state machine to accomplish this * * @return the Mode that the Citations Helper should be in */ protected Mode validateState() { return null; } /** * This method is called upon each Citations Helper request to properly * initialize the Citations Helper in case of a null Mode. Returns true if * succeeded, false otherwise * * @param state */ protected boolean initHelper(SessionState state) { logger.debug("initHelper()"); Mode mode; /* * Editor Integration support */ if (getCaller(state) == Caller.EDITOR_INTEGRATION) { mode = (Mode) state.getAttribute(CitationHelper.STATE_HELPER_MODE); if (mode == null) { if(logger.isDebugEnabled()) { logger.debug("initHelper(): mode is undefined, using " + Mode.NEW_RESOURCE); } setMode(state, Mode.NEW_RESOURCE); } if (state.getAttribute(STATE_RESULTS_PAGE_SIZE) == null) { if(logger.isDebugEnabled()) { logger.debug("initHelper(): result page size is undefined, using " + DEFAULT_RESULTS_PAGE_SIZE); } state.setAttribute(STATE_RESULTS_PAGE_SIZE, DEFAULT_RESULTS_PAGE_SIZE); } return true; } /* * Resources Tool support */ ToolSession toolSession = getSessionManager().getCurrentToolSession(); ResourceToolActionPipe pipe = (ResourceToolActionPipe) toolSession.getAttribute(ResourceToolAction.ACTION_PIPE); // TODO: if not entering as a helper, will we need to create pipe??? if (pipe == null) { logger.warn( "initHelper() pipe = null"); setMode(state, Mode.ERROR_FATAL); return true; } if(pipe.isActionCompleted()) { return true; } /* * Resources Tool/Citation Helper support */ if( toolSession.getAttribute(CitationHelper.CITATION_HELPER_INITIALIZED) == null ) { // we're starting afresh: an action has been clicked in Resources // set the Mode according to our action switch(pipe.getAction().getActionType()) { //case CREATE: case CREATE_BY_HELPER: // ContentResource tempResource = createTemporaryResource(pipe); // // // tempResource could be null if exception encountered // if( tempResource == null ) // { // // leave helper // pipe.setActionCompleted( true ); // toolSession.setAttribute(ResourceToolAction.DONE, Boolean.TRUE); // toolSession.removeAttribute(CitationHelper.CITATION_HELPER_INITIALIZED); // cleanup( toolSession, CitationHelper.CITATION_PREFIX, state); // // return false; // } // state.setAttribute(CitationHelper.RESOURCE_ID, tempResource.getId()); // // String displayName = tempResource.getProperties().getProperty( org.sakaiproject.entity.api.ResourceProperties.PROP_DISPLAY_NAME ); // state.setAttribute( STATE_COLLECTION_TITLE , displayName ); // // try // { // state.setAttribute(STATE_COLLECTION_ID, new String(tempResource.getContent())); // } // catch (ServerOverloadException e) // { // logger.warn("ServerOverloadException ", e); // } state.setAttribute( STATE_RESOURCES_ADD, Boolean.TRUE ); //setMode(state, Mode.ADD_CITATIONS); setMode(state, Mode.NEW_RESOURCE); break; case REVISE_CONTENT: state.setAttribute(CitationHelper.RESOURCE_ID, pipe.getContentEntity().getId()); try { state.setAttribute(STATE_CITATION_COLLECTION_ID, new String(((ContentResource) pipe.getContentEntity()).getContent())); } catch (ServerOverloadException e) { logger.warn("ServerOverloadException ", e); } state.removeAttribute( STATE_RESOURCES_ADD ); setMode(state, Mode.NEW_RESOURCE); break; default: break; } // set Citations Helper to "initialized" //pipe.setInitializationId( "initialized" ); toolSession.setAttribute(CitationHelper.CITATION_HELPER_INITIALIZED, Boolean.toString(true)); } else { // we're in the middle of a Citations Helper workflow: // Citations Helper has been "initialized" // (pipe.initializationId != null) // make sure we have a Mode to display mode = (Mode) state.getAttribute(CitationHelper.STATE_HELPER_MODE); if( mode == null ) { // default to ADD_CITATIONS //setMode( state, Mode.ADD_CITATIONS ); setMode( state, Mode.NEW_RESOURCE ); } } if(state.getAttribute(STATE_RESULTS_PAGE_SIZE) == null) { state.setAttribute(STATE_RESULTS_PAGE_SIZE, DEFAULT_RESULTS_PAGE_SIZE); } if(state.getAttribute(STATE_LIST_PAGE_SIZE) == null) { state.setAttribute(STATE_LIST_PAGE_SIZE, defaultListPageSize); } return true; } // initHelper /** * * @param pipe * @return */ protected ContentResource createTemporaryResource(ResourceToolActionPipe pipe) { try { ContentResourceEdit newItem = getContentService().addResource(pipe.getContentEntity().getId(), rb.getString("new.citations.list"), null, ContentHostingService.MAXIMUM_ATTEMPTS_FOR_UNIQUENESS); newItem.setResourceType(getCitationService().CITATION_LIST_ID); newItem.setContentType( ResourceType.MIME_TYPE_HTML ); //newItem.setHidden(); ResourcePropertiesEdit props = newItem.getPropertiesEdit(); // set the alternative_reference to point to reference_root for CitationService props.addProperty(getContentService().PROP_ALTERNATE_REFERENCE, CitationService.REFERENCE_ROOT); props.addProperty(ResourceProperties.PROP_CONTENT_TYPE, ResourceType.MIME_TYPE_HTML); props.addProperty(getCitationService().PROP_TEMPORARY_CITATION_LIST, Boolean.TRUE.toString()); CitationCollection collection = getCitationService().addCollection(); newItem.setContent(collection.getId().getBytes()); newItem.setContentType(ResourceType.MIME_TYPE_HTML); getContentService().commitResource(newItem, NotificationService.NOTI_NONE); return newItem; } catch (PermissionException e) { logger.warn("PermissionException ", e); } catch (IdUniquenessException e) { logger.warn("IdUniquenessException ", e); } catch (IdLengthException e) { logger.warn("IdLengthException ", e); } catch (IdInvalidException e) { logger.warn("IdInvalidException ", e); } catch (IdUnusedException e) { logger.warn("IdUnusedException ", e); } catch (OverQuotaException e) { logger.warn( e.getMessage() ); // send an error back to Resources pipe.setErrorEncountered( true ); pipe.setErrorMessage( rb.getString( "action.create.quota" ) ); } catch (ServerOverloadException e) { logger.warn("ServerOverloadException ", e); } return null; } protected String validateURL(String url) throws MalformedURLException { if (url == null || url.trim().equals ("")) { throw new MalformedURLException(); } url = url.trim(); // does this URL start with a transport? if (url.indexOf ("://") == -1) { // if it's missing the transport, add http:// url = "http://" + url; } // valid protocol? try { // test to see if the input validates as a URL. // Checks string for format only. URL u = new URL(url); } catch (MalformedURLException e1) { try { Pattern pattern = Pattern.compile("\\s*([a-zA-Z0-9]+)://([^\\n]+)"); Matcher matcher = pattern.matcher(url); if(matcher.matches()) { // if URL has "unknown" protocol, check remaider with // "http" protocol and accept input it that validates. URL test = new URL("http://" + matcher.group(2)); } else { throw e1; } } catch (MalformedURLException e2) { throw e1; } } return url; } public static class QuotedTextValidator { /** * Return a string for insertion in a quote in an HTML tag (as the value of an element's attribute. * * @param string * The string to escape. * @return the escaped string. */ public static String escapeQuotedString(String string) { if (string == null) return ""; string = string.trim(); try { // convert the string to bytes in UTF-8 byte[] bytes = string.getBytes("UTF-8"); StringBuilder buf = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { byte b = bytes[i]; if (b == '"') { buf.append("\\\""); } else if(b == '\\') { buf.append("\\\\"); } else { buf.append((char) b); } } String rv = buf.toString(); return rv; } catch (Exception e) { return string; } } // escapeQuotedString /** * Return a string that is safe to place into a JavaScript value wrapped * in single quotes. In addition, all double quotes (") are replaced by * the entity <i>"</i>. * * @param string The original string * @return The [possibly] escaped string */ public static String escapeHtmlAndJsQuoted(String string) { String escapedText = getFormattedText().escapeJsQuoted(string); return escapedText.replaceAll("\"", """); } } /** * Cleans up tool state used internally. Useful before leaving helper mode. * * @param toolSession * @param prefix */ protected void cleanup(ToolSession toolSession, String prefix, SessionState sessionState ) { // cleanup everything dealing with citations Enumeration attributeNames = toolSession.getAttributeNames(); while(attributeNames.hasMoreElements()) { String aName = (String) attributeNames.nextElement(); if(aName.startsWith(prefix)) { toolSession.removeAttribute(aName); } } // re-enable observers VelocityPortletPaneledAction.enableObservers(sessionState); } public void doSortCollection( RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationCollectionId = params.getString("citationCollectionId"); String sort = params.getString("currentSort"); if(sort == null || sort.trim().equals("")) { sort = CitationCollection.SORT_BY_TITLE; } CitationCollection collection = null; if(citationCollectionId == null) { citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); } if(logger.isDebugEnabled()) { logger.debug("doSortCollection sort type = " + sort); } collection = getCitationCollection(state, false); if(collection == null) { // TODO add alert and log error logger.warn("doSortCollection() collection null: " + citationCollectionId); } else { // sort the citation list logger.debug("doSortCollection() ready to sort"); if (sort.equalsIgnoreCase(CitationCollection.SORT_BY_TITLE)) collection.setSort(CitationCollection.SORT_BY_TITLE, true); else if (sort.equalsIgnoreCase(CitationCollection.SORT_BY_AUTHOR)) collection.setSort(CitationCollection.SORT_BY_AUTHOR, true); else if (sort.equalsIgnoreCase(CitationCollection.SORT_BY_YEAR)) collection.setSort(CitationCollection.SORT_BY_YEAR , true); else if (sort.equalsIgnoreCase(CitationCollection.SORT_BY_POSITION)) collection.setSort(CitationCollection.SORT_BY_POSITION , true); state.setAttribute(STATE_SORT, sort); Iterator iter = collection.iterator(); while (iter.hasNext()) { Citation tempCit = (Citation) iter.next(); if(logger.isDebugEnabled()) { logger.debug("doSortCollection() tempcit 1 -------------"); logger.debug("doSortCollection() tempcit 1 (author) = " + tempCit.getFirstAuthor()); logger.debug("doSortCollection() tempcit 1 (year) = " + tempCit.getYear()); logger.debug("doSortCollection() tempcit 1 = " + tempCit.getDisplayName()); } } // end while // set the list iterator to the start of the list after a change in sort CitationIterator listIterator = (CitationIterator) state.getAttribute(STATE_LIST_ITERATOR); if(listIterator != null) { listIterator.setStart(0); } } // end else //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } // doSortCollection public void doSaveCollection(RunData data ) { // get the state object SessionState state = ((JetspeedRunData)data).getPortletSessionState (((JetspeedRunData)data).getJs_peid ()); ParameterParser params = data.getParameters(); int requestStateId = params.getInt("requestStateId", 0); restoreRequestState(state, new String[]{CitationHelper.RESOURCES_REQUEST_PREFIX, CitationHelper.CITATION_PREFIX}, requestStateId); String citationCollectionId = params.getString("citationCollectionId"); CitationCollection collection = null; if(citationCollectionId == null) { citationCollectionId = (String) state.getAttribute(STATE_CITATION_COLLECTION_ID); } collection = getCitationCollection(state, false); if(collection == null) { // TODO add alert and log error logger.warn("doSaveCollection() collection null: " + citationCollectionId); return; } else { // save the collection (this will persist the sort order to the db) getCitationService().save(collection); String sort = collection.getSort(); if (sort != null) state.setAttribute(STATE_SORT, sort); //setMode(state, Mode.LIST); setMode(state, Mode.NEW_RESOURCE); } } // end doSaveCollection public class CitationListSecurityAdviser implements SecurityAdvisor { String userId; String function; String reference; public CitationListSecurityAdviser(String userId, String function, String reference) { super(); this.userId = userId; this.function = function; this.reference = reference; } public SecurityAdvice isAllowed(String userId, String function, String reference) { SecurityAdvice advice = SecurityAdvice.PASS; if((this.userId == null || this.userId.equals(userId)) && (this.function == null || this.function.equals(function)) || (this.reference == null || this.reference.equals(reference))) { advice = SecurityAdvice.ALLOWED; } return advice; } } // temporary -- replace with a method in content-util public static int preserveRequestState(SessionState state, String[] prefixes) { Map requestState = new HashMap(); int requestStateId = 0; while(requestStateId == 0) { requestStateId = (int) (Math.random() * Integer.MAX_VALUE); } List<String> attrNames = state.getAttributeNames(); for(String attrName : attrNames) { for(String prefix : prefixes) { if(attrName.startsWith(prefix)) { requestState.put(attrName,state.getAttribute(attrName)); break; } } } Object pipe = state.getAttribute(ResourceToolAction.ACTION_PIPE); if(pipe != null) { requestState.put(ResourceToolAction.ACTION_PIPE, pipe); } Tool tool = getToolManager().getCurrentTool(); Object url = state.getAttribute(tool.getId() + Tool.HELPER_DONE_URL); if( url != null) { requestState.put(tool.getId() + Tool.HELPER_DONE_URL, url); } state.setAttribute(CitationHelper.RESOURCES_SYS_PREFIX + requestStateId, requestState); logger.debug("preserveRequestState() requestStateId == " + requestStateId + "\n" + requestState); return requestStateId; } // temporary -- replace with a value in content-util or content-api public static void restoreRequestState(SessionState state, String[] prefixes, int requestStateId) { Map<String, String> requestState = (Map<String, String>) state.removeAttribute(CitationHelper.RESOURCES_SYS_PREFIX + requestStateId); logger.debug("restoreRequestState() requestStateId == " + requestStateId + "\n" + requestState); if(requestState != null) { List<String> attrNames = state.getAttributeNames(); for(String attrName : attrNames) { for(String prefix : prefixes) { if(attrName.startsWith(prefix)) { state.removeAttribute(attrName); break; } } } for(Map.Entry<String, String> entry : requestState.entrySet()) { state.setAttribute(entry.getKey(), entry.getValue()); } } } protected Map<String,Object> getProperties(ContentEntity entity, SessionState state) { Map<String,Object> props = new HashMap<String,Object>(); ResourceProperties properties = entity.getProperties(); Reference ref = getEntityManager().newReference(entity.getReference()); DateFormat df = DateFormat.getDateTimeInstance(); // isHidden props.put(PROP_IS_HIDDEN, new Boolean(entity.isHidden())); // releaseDate, useReleaseDate Date releaseDate = null; if(entity.getReleaseDate() == null) { releaseDate = new Date(System.currentTimeMillis()); props.put(PROP_USE_RELEASE_DATE, Boolean.FALSE); } else { releaseDate = new Date(entity.getReleaseDate().getTime()); props.put(PROP_USE_RELEASE_DATE, Boolean.TRUE); } props.put(PROP_RELEASE_DATE_STR, df.format(releaseDate)); props.put(PROP_RELEASE_DATE, releaseDate); // retractDate, useRetractDate Date retractDate = null; if(entity.getRetractDate() == null) { retractDate = new Date(System.currentTimeMillis() + ONE_WEEK); props.put(PROP_USE_RETRACT_DATE, Boolean.FALSE); } else { retractDate = new Date(entity.getRetractDate().getTime()); props.put(PROP_USE_RETRACT_DATE, Boolean.TRUE); } props.put(PROP_RETRACT_DATE_STR, df.format(retractDate)); props.put(PROP_RETRACT_DATE, retractDate); // isCollection props.put(PROP_IS_COLLECTION, entity.isCollection()); // isDropbox props.put(PROP_IS_DROPBOX, new Boolean(getContentService().isInDropbox(entity.getId()))); // isSiteCollection props.put(PROP_IS_SITE_COLLECTION, new Boolean(ref.getContext() != null && ref.getContext().equals(entity.getId()))); // isPubview props.put(PROP_IS_PUBVIEW, getContentService().isPubView(entity.getId())); // isPubviewInherited props.put(PROP_IS_PUBVIEW_INHERITED, new Boolean(getContentService().isInheritingPubView(entity.getId()))); // isPubviewPossible Boolean preventPublicDisplay = (Boolean) state.getAttribute("resources.request.prevent_public_display"); if(preventPublicDisplay == null) { preventPublicDisplay = Boolean.FALSE; } props.put(PROP_IS_PUBVIEW_POSSIBLE, new Boolean(! preventPublicDisplay.booleanValue())); // accessMode AccessMode accessMode = entity.getAccess(); props.put(PROP_ACCESS_MODE, accessMode); // isGroupInherited props.put(PROP_IS_GROUP_INHERITED, AccessMode.GROUPED == entity.getInheritedAccess()); SiteService siteService = (SiteService) ComponentManager.get(SiteService.class); Set<String> currentGroups = new TreeSet<String>(); if(AccessMode.GROUPED == accessMode) { for(Group gr : (Collection<Group>) entity.getGroupObjects()) { currentGroups.add(gr.getId()); } } // possibleGroups Collection<Group> inheritedGroupObjs = null; if(entity.getInheritedAccess() == AccessMode.GROUPED) { inheritedGroupObjs = entity.getInheritedGroupObjects(); } else { try { Site site = siteService.getSite(ref.getContext()); inheritedGroupObjs = site.getGroups(); } catch (IdUnusedException e) { logger.warn("IdUnusedException in getProperties() " + e); } } List<Map<String,String>> groups = new ArrayList<Map<String,String>>(); if(inheritedGroupObjs != null) { Collection<Group> groupsWithRemovePermission = null; if(AccessMode.GROUPED == accessMode) { groupsWithRemovePermission = contentService.getGroupsWithRemovePermission(entity.getId()); String container = ref.getContainer(); if(container != null) { Collection<Group> more = contentService.getGroupsWithRemovePermission(container); if(more != null && ! more.isEmpty()) { groupsWithRemovePermission.addAll(more); } } } else if(AccessMode.GROUPED == entity.getInheritedAccess()) { groupsWithRemovePermission = contentService.getGroupsWithRemovePermission(ref.getContainer()); } else if(ref.getContext() != null && contentService.getSiteCollection(ref.getContext()) != null) { groupsWithRemovePermission = contentService.getGroupsWithRemovePermission(contentService.getSiteCollection(ref.getContext())); } Set<String> idsOfGroupsWithRemovePermission = new TreeSet<String>(); if(groupsWithRemovePermission != null) { for(Group gr : groupsWithRemovePermission) { idsOfGroupsWithRemovePermission.add(gr.getId()); } } for(Group group : inheritedGroupObjs) { Map<String, String> grp = new HashMap<String, String>(); grp.put("groupId", group.getId()); grp.put("title", group.getTitle()); grp.put("description", group.getDescription()); grp.put("entityRef", group.getReference()); if(currentGroups.contains(group.getId())) { grp.put("isLocal", Boolean.toString(true)); } if(idsOfGroupsWithRemovePermission.contains(group.getId())) { grp.put("allowedRemove", Boolean.toString(true)); } groups.add(grp); } } props.put(PROP_POSSIBLE_GROUPS, groups); // isGroupPossible props.put(PROP_IS_GROUP_POSSIBLE, new Boolean(groups != null && groups.size() > 0)); // isSingleGroupInherited props.put(PROP_IS_SINGLE_GROUP_INHERITED, new Boolean(groups != null && groups.size() == 1)); // isSiteOnly = ! isPubviewPossible && ! isGroupPossible props.put(PROP_IS_SITE_ONLY, new Boolean(preventPublicDisplay.booleanValue() && (groups == null || groups.size() < 1))); // isUserSite props.put(PROP_IS_USER_SITE, siteService.isUserSite(ref.getContext())); // getSelectedConditionKey // getSubmittedResourceFilter // isUseConditionalRelease state.setAttribute(STATE_RESOURCE_ENTITY_PROPERTIES, props); return props; } protected CitationService getCitationService() { if(this.citationService == null) { this.citationService = (CitationService) ComponentManager.get(CitationService.class); } return this.citationService; } protected ConfigurationService getConfigurationService() { if(this.configurationService == null) { this.configurationService = (ConfigurationService) ComponentManager.get(ConfigurationService.class); } return this.configurationService; } protected SearchManager getSearchManager() { if(this.searchManager == null) { this.searchManager = (SearchManager) ComponentManager.get(SearchManager.class); } return this.searchManager; } protected ContentHostingService getContentService() { if(this.contentService == null) { this.contentService = (ContentHostingService) ComponentManager.get("org.sakaiproject.content.api.ContentHostingService"); } return this.contentService; } protected EntityManager getEntityManager() { if(this.entityManager == null) { this.entityManager = (EntityManager) ComponentManager.get(EntityManager.class); } return this.entityManager; } protected SessionManager getSessionManager() { if(this.sessionManager == null) { this.sessionManager = (SessionManager) ComponentManager.get(SessionManager.class); } return this.sessionManager; } protected static ToolManager getToolManager() { if(toolManager == null) { toolManager = (ToolManager) ComponentManager.get(ToolManager.class); } return toolManager; } protected static FormattedText getFormattedText() { if(formattedText == null) { formattedText = (FormattedText) ComponentManager.get(FormattedText.class); } return formattedText; } } // class CitationHelperAction