/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.xmlui.aspect.administrative;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.cocoon.environment.Request;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.curate.Curator;
import org.dspace.app.xmlui.wing.Message;
import org.dspace.app.xmlui.wing.WingException;
import org.dspace.app.xmlui.wing.element.Select;
/**
*
* @author wbossons
*/
public class FlowCurationUtils
{
/** Language Strings */
private static final Message T_curate_success_notice =
new Message("default","xmlui.administrative.FlowCurationUtils.curate_success_notice");
private static final Message T_curate_fail_notice =
new Message("default","xmlui.administrative.FlowCurationUtils.curate_failed_notice");
private static final Message T_queue_success_notice =
new Message("default","xmlui.administrative.FlowCurationUtils.queue_success_notice");
private static final Message T_queue_fail_notice =
new Message("default","xmlui.administrative.FlowCurationUtils.queue_failed_notice");
private static final Map<String, String> map = new HashMap<String, String>();
protected static Curator getCurator(String taskName)
{
if (taskName != null && taskName.length() == 0)
{
taskName = null;
}
Curator curator = new Curator();
curator.addTask(taskName);
curator.setInvoked(Curator.Invoked.INTERACTIVE);
return curator;
}
/**
* Build a FlowResult which will provide a Notice to users, notifying them
* of whether the Curation task succeeded or failed.
* @param taskName name of Curation Task
* @param curator active Curator
* @param success whether it succeeded or failed
* @return FlowResult
*/
protected static FlowResult getRunFlowResult(String taskName, Curator curator, boolean success)
{
if (map.isEmpty())
{
String statusCodes = ConfigurationManager.getProperty("curate", "ui.statusmessages");
for (String pair : statusCodes.split(","))
{
String[] parts = pair.split("=");
map.put(parts[0].trim(), parts[1].trim());
}
}
String status = map.get(String.valueOf(curator.getStatus(taskName)));
if (status == null)
{
// invalid = use string for 'other
status = map.get("other");
}
String result = curator.getResult(taskName);
FlowResult flowResult = new FlowResult();
//set whether task succeeded or failed
flowResult.setOutcome(success);
if(result==null)
result = "Nothing to do for this DSpace object.";
//add in status message
if(success)
{
//@TODO: Ideally, all of this status information would be contained within a translatable I18N Message.
// Unfortunately, there currently is no support for displaying Parameterized Messages in Notices
// (See FlowResult.getMessage(), sitemap.xmap and NoticeTransformer)
flowResult.setHeader(new Message("default", "Task: " + getUITaskName(taskName)));
flowResult.setMessage(T_curate_success_notice);
flowResult.setCharacters("STATUS: " + status + ", RESULT: " + result);
}
else
{
flowResult.setHeader(new Message("default", "Task: " + getUITaskName(taskName)));
flowResult.setMessage(T_curate_fail_notice);
flowResult.setCharacters("STATUS: Failure, RESULT: " + result);
}
flowResult.setContinue(true);
return flowResult;
}
/**
* Build a FlowResult which will provide a Notice to users, notifying them
* of whether the Curation task was queued successfully or not
* @param taskName name of Curation Task
* @param status whether it succeeded or failed
* @param objId the DSpace object ID
* @param queueName the name of the queue
* @return FlowResult
*/
protected static FlowResult getQueueFlowResult(String taskName, boolean status,
String objId, String queueName)
{
FlowResult flowResult = new FlowResult();
flowResult.setOutcome(status);
//add in status message
if(status)
{
//@TODO: Ideally, all of this status information would be contained within a translatable I18N Message.
// Unfortunately, there currently is no support for displaying Parameterized Messages in Notices
// (See FlowResult.getMessage(), sitemap.xmap and NoticeTransformer)
flowResult.setHeader(new Message("default", "Task: " + getUITaskName(taskName)));
flowResult.setMessage(T_queue_success_notice);
flowResult.setCharacters("RESULT: Object '" + objId + "' queued in '" + queueName + "' Queue");
}
else
{
flowResult.setHeader(new Message("default", "Task: " + getUITaskName(taskName)));
flowResult.setMessage(T_queue_fail_notice);
flowResult.setCharacters("RESULT: FAILED to queue Object '" + objId + "' in '" + queueName + "' Queue");
}
flowResult.setContinue(true);
return flowResult;
}
/**
* Retrieve UI "friendly" Task Name for display to user
*
* @param taskID the short name / identifier for the task
* @return the User Friendly name for this task
*/
protected static String getUITaskName(String taskID)
{
String tasksString = ConfigurationManager.getProperty("curate", "ui.tasknames");
String[] tasks = tasksString.split(",");
for (String task : tasks)
{
//retrieve keyValuePair (format [taskID]=[UI Task Name])
String[] keyValuePair = task.split("=");
if(keyValuePair!=null && keyValuePair.length==2)
{
if(taskID.equals(keyValuePair[0].trim()))
return keyValuePair[1];
}
}
//if we are here, the UI friendly task name was not found
// So, we'll just return the TaskID, as it's better than nothing
return taskID;
}
/**
* Utility method to process curation tasks
* submitted via the DSpace Admin UI Curate Form.
*
* @param context current DSpace Context
* @param request current Cocoon request
* @return FlowResult representing the result of request
* @see org.dspace.app.xmlui.aspect.administrative.CurateForm
*/
public static FlowResult processCurateObject(Context context, Request request)
{
//get input values from Form (see org.dspace.app.xmlui.aspect.administrative.CurateForm)
String task = request.getParameter("curate_task");
String objHandle = request.getParameter("identifier");
Curator curator = FlowCurationUtils.getCurator(task);
FlowResult result = null;
try
{
// Curate this object & return result
curator.curate(context, objHandle);
result = FlowCurationUtils.getRunFlowResult(task, curator, true);
}
catch (Exception e)
{
curator.setResult(task, e.getMessage());
result = FlowCurationUtils.getRunFlowResult(task, curator, false);
}
//pass curation task name & identifier back in FlowResult (so it can be pre-populated on UI)
result.setParameter("curate_task", task);
result.setParameter("identifier", objHandle);
return result;
}
/**
* Utility method to queue curation tasks
* submitted via the DSpace Admin UI Curate Form.
*
* @param context current DSpace Context
* @param request current Cocoon request
* @return FlowResult representing the result of request
* @see org.dspace.app.xmlui.aspect.administrative.CurateForm
*/
public static FlowResult processQueueObject(Context context, Request request)
{
//get input values from Form (see org.dspace.app.xmlui.aspect.administrative.CurateForm)
String task = request.getParameter("curate_task");
String objHandle = request.getParameter("identifier");
Curator curator = FlowCurationUtils.getCurator(task);
String taskQueueName = ConfigurationManager.getProperty("curate", "ui.queuename");
boolean status = false;
if (objHandle != null)
{
try
{
//queue the task for later processing of this object
curator.queue(context, objHandle, taskQueueName);
status = true;
}
catch (IOException ioe)
{
// no-op (any error should be logged by the Curator itself)
}
}
return FlowCurationUtils.getQueueFlowResult(task, status, objHandle, taskQueueName);
}
/** Utility methods to support curation groups/tasks form fields
*
*
*/
public static final String CURATE_TASK_NAMES = "ui.tasknames";
public static final String CURATE_GROUP_NAMES = "ui.taskgroups";
public static final String CURATE_GROUP_PREFIX = "ui.taskgroup";
public static final String UNGROUPED_TASKS = "ungrouped";
public static Map<String, String> allTasks = new LinkedHashMap<String, String>();
public static Map<String, String[]> groupedTasks = new LinkedHashMap<String, String[]>();
public static Map<String, String> groups = new LinkedHashMap<String, String>();
public static void setupCurationTasks()
{
try
{
setAllTasks();
setGroupedTasks();
setGroups();
}
catch (Exception we)
{
// noop
}
}
public static void setAllTasks() throws WingException, UnsupportedEncodingException
{
String csvList = ConfigurationManager.getProperty("curate", CURATE_TASK_NAMES);
String[] properties = csvList.split(",");
for (String property : properties)
{
//System.out.println("set all tasks and property = " + property + "\n");
String[] keyValuePair = property.split("=");
allTasks.put(URLDecoder.decode(keyValuePair[0].trim(), "UTF-8"),
URLDecoder.decode(keyValuePair[1].trim(), "UTF-8"));
}
}
public static void setGroups() throws WingException, UnsupportedEncodingException
{
String csvList = ConfigurationManager.getProperty("curate", CURATE_GROUP_NAMES);
if (csvList != null)
{
String[] properties = csvList.split(",");
for (String property : properties)
{
String[] keyValuePair = property.split("=");
groups.put(URLDecoder.decode(keyValuePair[0].trim(), "UTF-8"),
URLDecoder.decode(keyValuePair[1].trim(), "UTF-8"));
}
}
}
public static void setGroupedTasks() throws WingException, UnsupportedEncodingException
{
if (groups.isEmpty())
{
setGroups();
}
if (!groups.isEmpty())
{
Iterator<String> iterator = groups.keySet().iterator();
while (iterator.hasNext())
{
String key = iterator.next();
String csvList = ConfigurationManager.getProperty("curate", CURATE_GROUP_PREFIX + "." + key);
String[] properties = csvList.split(",");
groupedTasks.put(URLDecoder.decode(key, "UTF-8"), properties);
}
}
}
public static Select getGroupSelectOptions(Select select) throws WingException
{
Iterator<String> iterator = groups.keySet().iterator();
while (iterator.hasNext())
{
String key = iterator.next();
select.addOption(key, groups.get(key));
}
return select;
}
public static Select getTaskSelectOptions(Select select, String curateGroup) throws WingException
{
String key = new String();
String[] values = null;
Iterator<String> iterator = null;
if (groupedTasks.isEmpty())
{
iterator = allTasks.keySet().iterator();
while (iterator.hasNext())
{
key = iterator.next();
select.addOption(key, allTasks.get(key));
}
return select;
}
else
{
iterator = groupedTasks.keySet().iterator();
}
while (iterator.hasNext())
{
key = iterator.next();
values = groupedTasks.get(key);
if (key.equals(curateGroup))
{
for (String value : values)
{
Iterator<String> innerIterator = allTasks.keySet().iterator();
while (innerIterator.hasNext())
{
String optionValue = innerIterator.next().trim();
String optionText = new String("");
// out.print("Value: " + value + ": OptionValue: " + optionValue + ". Does value.trim().equals(optionValue)? " + value.equals(opti$
if (optionValue.equals(value.trim()))
{
optionText = (String) allTasks.get(optionValue);
select.addOption(optionValue, optionText);
}
}
}
}
}
return select;
}
}