/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.applications.mydesktoptool.actions;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.infoglue.cms.applications.common.VisualFormatter;
import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction;
import org.infoglue.cms.controllers.kernel.impl.simple.WorkflowController;
import org.infoglue.cms.entities.mydesktop.WorkflowActionVO;
import org.infoglue.cms.entities.mydesktop.WorkflowVO;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.util.CmsPropertyHandler;
import webwork.action.ActionContext;
import com.opensymphony.workflow.InvalidActionException;
import com.opensymphony.workflow.WorkflowException;
/**
* This class implements the action class for the startpage in the mydesktop tool.
*
* @author Mattias Bogeblad
*/
public class WorkflowAction extends InfoGlueAbstractAction
{
private final static Logger logger = Logger.getLogger(WorkflowAction.class.getName());
private static final long serialVersionUID = 6543209932597662088L;
protected static final String INVALID_ACTION = "invalidAction";
private static final WorkflowController controller = WorkflowController.getController();
private static final VisualFormatter formatter = new VisualFormatter();
private Long workflowId;
private String workflowName;
private WorkflowVO workflow = new WorkflowVO();
private int actionId;
private String finalReturnAddress = "";
public String doExecute()
{
try
{
}
catch (Exception e)
{
logger.warn("An error occurred getting ongoing workflows: " + e.getMessage(), e);
}
return "success";
}
public String doShowWorkflowDetails() throws SystemException
{
try
{
workflow = controller.getWorkflow(workflowName, getInfoGluePrincipal());
}
catch (Exception e)
{
e.printStackTrace();
}
return "successWorkflowDetails";
}
public String doShowRunningWorkflowDetails() throws SystemException
{
try
{
workflow = controller.getCurrentWorkflow(workflowId, getInfoGluePrincipal());
}
catch (Exception e)
{
e.printStackTrace();
}
return "successRunningWorkflowDetails";
}
public String doStartWorkflow() throws SystemException
{
WorkflowVO existingWorkflow = null;
try
{
existingWorkflow = controller.getWorkflow(workflowName, getInfoGluePrincipal());
}
catch (Exception e)
{
e.printStackTrace();
}
logger.info("existingWorkflow:" + existingWorkflow.getName());
if(existingWorkflow != null)
workflow = controller.initializeWorkflow(getInfoGluePrincipal(), existingWorkflow.getName(), actionId, WorkflowController.createWorkflowParameters(ActionContext.getRequest()));
else
logger.error("No workflow with name:" + workflowName);
this.workflowId = workflow.getWorkflowId();
return redirectToView();
}
public String doInvoke() throws SystemException
{
logger.info("****************************************");
logger.info("workflowId:" + getWorkflowId());
logger.info("actionId:" + actionId);
logger.info("****************************************");
try
{
if(this.finalReturnAddress != null && !this.finalReturnAddress.equals(""))
{
logger.info("Final return address get's set to " + this.finalReturnAddress);
controller.getPropertySet(getInfoGluePrincipal(), getWorkflowId()).setString("finalReturnAddress", this.finalReturnAddress);
}
else
{
String finalReturnAddressCandidate = controller.getPropertySet(getInfoGluePrincipal(), getWorkflowId()).getString("finalReturnAddress");
logger.info("finalReturnAddressCandidate " + finalReturnAddressCandidate);
if(finalReturnAddressCandidate != null && !finalReturnAddressCandidate.equals(""))
{
this.finalReturnAddress = finalReturnAddressCandidate;
logger.info("Setting Final return address get's set to " + this.finalReturnAddress + " from properties..");
}
}
/*
String createSiteNodeInlineOperationViewCreatedPageLinkText = getLocalizedString(getLocale(), "tool.structuretool.createSiteNodeInlineOperationViewCreatedPageLinkText");
String createSiteNodeInlineOperationViewCreatedPageTitleText = getLocalizedString(getLocale(), "tool.structuretool.createSiteNodeInlineOperationViewCreatedPageTitleText");
addActionLink(userSessionKey, new LinkBean("newPageUrl", createSiteNodeInlineOperationViewCreatedPageLinkText, createSiteNodeInlineOperationViewCreatedPageTitleText, createSiteNodeInlineOperationViewCreatedPageTitleText, getDecoratedPageUrl(newSiteNodeVO.getId()), false, "", "structure", newSiteNodeVO.getName()));
*/
workflow = controller.invokeAction(getInfoGluePrincipal(), getWorkflowId(), actionId, WorkflowController.createWorkflowParameters(ActionContext.getRequest()));
return redirectToView();
}
catch (InvalidActionException e)
{
logger.error("An error occurred when invoking an action:" + e.getMessage(), e);
return INVALID_ACTION;
}
catch (WorkflowException e)
{
throw new SystemException(e);
}
}
private String redirectToView() throws SystemException
{
for (Iterator i = workflow.getAvailableActions().iterator(); i.hasNext();)
{
String url = getViewUrl((WorkflowActionVO)i.next());
if (url.length() > 0)
return redirect(url);
}
if(this.finalReturnAddress != null && !this.finalReturnAddress.equals(""))
return redirect(finalReturnAddress);
logger.info("No action view, coming back to mydesktop...");
return doExecute();
}
private String getViewUrl(WorkflowActionVO action) throws SystemException
{
if (!action.hasView())
return "";
StringBuffer buffer = new StringBuffer(action.getView());
if (containsQuestionMark(action.getView()))
buffer.append('&');
else
buffer.append('?');
return buffer.append("workflowId=").append(getWorkflowId()).append("&actionId=").append(action.getId())
.append("&returnAddress=").append(getReturnAddress()).append("&finalReturnAddress=").append(getFinalReturnAddress()).append('&')
.append(getRequest().getQueryString()).toString();
}
private static boolean containsQuestionMark(String s)
{
return s.indexOf("?") >= 0;
}
private String getReturnAddress() throws SystemException
{
try
{
String cmsFullBaseUrl = CmsPropertyHandler.getCmsFullBaseUrl();
logger.info("cmsFullBaseUrl:" + cmsFullBaseUrl);
if(cmsFullBaseUrl != null && !cmsFullBaseUrl.equals(""))
return URLEncoder.encode(cmsFullBaseUrl + "/Workflow!invoke.action", "UTF-8");
else
return URLEncoder.encode(getURLBase() + "/Workflow!invoke.action", "UTF-8");
}
catch (UnsupportedEncodingException e)
{
throw new SystemException(e);
}
}
private String redirect(String url) throws SystemException
{
try
{
logger.info("Url in doInvoke:" + url);
getResponse().sendRedirect(url);
return NONE;
}
catch (IOException e)
{
throw new SystemException(e);
}
}
private String getFinalReturnAddress() throws SystemException
{
try
{
return URLEncoder.encode(this.finalReturnAddress, "UTF-8");
}
catch (UnsupportedEncodingException e)
{
throw new SystemException(e);
}
}
public void setFinalReturnAddress(String finalReturnAddress)
{
if(finalReturnAddress != null && !finalReturnAddress.equals("null"))
{
this.finalReturnAddress = finalReturnAddress;
}
}
public void setWorkflowName(String name)
{
this.workflowName = name;
}
private String getWorkflowName()
{
return this.workflowName;
}
public void setActionId(int actionId)
{
this.actionId = actionId;
}
public void setWorkflowId(Long workflowId)
{
this.workflowId = workflowId;
}
private Long getWorkflowId()
{
return this.workflowId;
}
public WorkflowVO getWorkflow()
{
return workflow;
}
/*
public List getWorkflowVOList()
{
Collections.sort(workflowVOList, new ReflectionComparator("workflowId"));
return workflowVOList;
}
public List getAvailableWorkflowVOList()
{
return availableWorkflowVOList;
}
public List getAvailableShortcutVOList()
{
return availableShortcutVOList;
}
WorkflowVO getWorkflow()
{
return workflow;
}
public String doExecute() throws SystemException
{
populateLists();
return SUCCESS;
}
public String doTaskList() throws SystemException
{
populateActiveWorkflowVOList();
return "successTaskList";
}
private void populateLists() throws SystemException
{
availableWorkflowVOList = controller.getAvailableWorkflowVOList(getInfoGluePrincipal());
final String showAllWorkflows = CmsPropertyHandler.getShowAllWorkflows();
if(showAllWorkflows == null || showAllWorkflows.equalsIgnoreCase("true"))
{
workflowVOList = controller.getCurrentWorkflowVOList(getInfoGluePrincipal());
}
else
{
workflowVOList = controller.getMyCurrentWorkflowVOList(getInfoGluePrincipal());
}
availableShortcutVOList = shortcutController.getAvailableShortcutVOList(getInfoGluePrincipal());
}
public String doGetActiveWorkflowProperties() throws Exception
{
StringBuffer sb = new StringBuffer();
String activeWorkflowId = getRequest().getParameter("activeWorkflowId");
populateActiveWorkflowVOList();
List currentWorkflowVOList = workflowVOList;
Iterator activeWorkflowVOListIterator = currentWorkflowVOList.iterator();
while(activeWorkflowVOListIterator.hasNext())
{
WorkflowVO workflowVO = (WorkflowVO)activeWorkflowVOListIterator.next();
if(activeWorkflowId.equals(workflowVO.getId().toString()))
{
sb.append("<div id=\"activeWorkflowDetailsProperties\" class=\"propertiesDiv\" style=\"z-index:10\">");
sb.append(" <div id=\"activeWorkflowDetailsPropertiesHandle\" class=\"propertiesDivHandle\">");
sb.append(" <div id=\"propertiesDivLeftHandle\" class=\"propertiesDivLeftHandle\" style=\"width: 300px;\">" + workflowVO.getName() + " - #" + workflowVO.getId() + "</div><div id=\"propertiesDivRightHandle\" class=\"propertiesDivRightHandle\"><a href=\"javascript:hideDiv('activeWorkflowDetailsProperties');\" class=\"white\">close</a></div>");
sb.append(" </div>");
sb.append(" <div id=\"activeWorkflowDetailsPropertiesBody\" class=\"propertiesDivBody\">");
sb.append(" <table border=\"0\" cellpadding=\"4\" cellspacing=\"0\" width=\"100%\">");
Iterator stepsIterator = workflowVO.getSteps().iterator();
while(stepsIterator.hasNext())
{
WorkflowStepVO workflowStepVO = (WorkflowStepVO)stepsIterator.next();
sb.append(" <tr>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + workflowStepVO.getName() + "</td>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + (workflowStepVO.getOwner() != null ? workflowStepVO.getOwner() : "Not specified") + "</td>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + (workflowStepVO.getCaller() != null ? workflowStepVO.getCaller() : "Not specified") + "</td>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + workflowStepVO.getStatus() + "</td>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + (workflowStepVO.getStartDate() == null ? "Not started" : formatter.formatDate(workflowStepVO.getStartDate(), "yyyy-MM-dd")) + "</td>");
sb.append(" <td style=\"" + (workflowStepVO.getFinishDate() == null ? "color: black;" : "color: silver;") + "\">" + (workflowStepVO.getFinishDate() == null ? "Not completed" : formatter.formatDate(workflowStepVO.getFinishDate(), "yyyy-MM-dd")) + "</td>");
sb.append(" </tr>");
}
sb.append(" </table>");
sb.append(" </div>");
sb.append(" </div>");
break;
}
}
this.getResponse().setContentType("text/plain");
this.getResponse().getWriter().println(sb.toString());
return NONE;
}
public String doGetAvailableWorkflowProperties() throws Exception
{
StringBuffer sb = new StringBuffer();
String workflowName = getRequest().getParameter("workflowName");
try
{
List availableWorkflowVOList = controller.getAvailableWorkflowVOList(getInfoGluePrincipal());
Iterator availableWorkflowVOListIterator = availableWorkflowVOList.iterator();
while(availableWorkflowVOListIterator.hasNext())
{
WorkflowVO availableWorkflowVO = (WorkflowVO)availableWorkflowVOListIterator.next();
if(workflowName.equals(availableWorkflowVO.getName()))
{
sb.append("<div id=\"availableWorkflowDetailsProperties\" class=\"propertiesDiv\" style=\"z-index: 10;\">");
sb.append(" <div id=\"availableWorkflowDetailsPropertiesHandle\" class=\"propertiesDivHandle\">");
sb.append(" <div id=\"propertiesDivLeftHandle\" class=\"propertiesDivLeftHandle\">" + availableWorkflowVO.getName() + "</div><div id=\"propertiesDivRightHandle\" class=\"propertiesDivRightHandle\"><a href=\"javascript:hideDiv('availableWorkflowDetailsProperties');\" class=\"white\">close</a></div>");
sb.append(" </div>");
sb.append(" <div id=\"availableWorkflowDetailsPropertiesBody\" class=\"propertiesDivBody\">");
sb.append(" <table border=\"0\" cellpadding=\"4\" cellspacing=\"0\" width=\"100%\">");
Iterator workflowStepVOIterator = availableWorkflowVO.getDeclaredSteps().iterator();
while(workflowStepVOIterator.hasNext())
{
WorkflowStepVO workflowStepVO = (WorkflowStepVO)workflowStepVOIterator.next();
sb.append(" <tr style=\"background-color: white;\">");
sb.append(" <td>" + workflowStepVO.getName() + "</td>");
sb.append(" <td>" + (workflowStepVO.getOwner() != null ? workflowStepVO.getOwner() : "Not specified") + "</td>");
sb.append(" </tr>");
Iterator workflowActionVOIterator = workflowStepVO.getActions().iterator();
while(workflowActionVOIterator.hasNext())
{
WorkflowActionVO workflowActionVO = (WorkflowActionVO)workflowActionVOIterator.next();
sb.append("<tr style=\"background-color: #eeeeee;\">");
sb.append(" <td style=\"padding-left: 20px; font-size:10px;\">" + workflowActionVO.getName() + "</td>");
sb.append(" <td style=\"padding-left: 20px; font-size:10px;\"><!--" + workflowActionVO.getView() + "--></td>");
sb.append(" </tr>");
}
}
sb.append(" </table>");
sb.append(" </div>");
sb.append("</div>");
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
this.getResponse().setContentType("text/plain");
this.getResponse().getWriter().println(sb.toString());
return NONE;
}
*/
}