package is.idega.idegaweb.egov.bpm.servlet;
import is.idega.idegaweb.egov.bpm.business.TaskViewerHelper;
import is.idega.idegaweb.egov.bpm.business.TaskViewerHelperImp;
import java.io.IOException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import com.idega.presentation.IWContext;
import com.idega.servlet.filter.BaseFilter;
import com.idega.util.StringUtil;
import com.idega.util.expression.ELUtil;
public class TaskViewerRedirector extends BaseFilter implements Filter {
private static final Logger LOGGER = Logger.getLogger(TaskViewerRedirector.class.getName());
@Autowired
private TaskViewerHelper taskViewer;
public void init(FilterConfig arg0) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
if (!canRedirect(request)) {
chain.doFilter(srequest, sresponse);
return;
}
String newUrl = getNewRedirectURL(request, response);
if (StringUtil.isEmpty(newUrl)) {
LOGGER.warning("Couldn't create uri to redirect to task viewer");
chain.doFilter(srequest, sresponse);
return;
}
response.sendRedirect(newUrl);
}
private boolean canRedirect(HttpServletRequest request) {
Map<?, ?> map = request.getParameterMap();
return map.containsKey(TaskViewerHelperImp.TASK_VIEWER_PAGE_REQUESTED_PARAMETER) &&
map.containsKey(TaskViewerHelperImp.PROCESS_INSTANCE_ID_PARAMETER) && map.containsKey(TaskViewerHelperImp.TASK_NAME_PARAMETER);
}
private String getTaskInstanceId(String processInstanceId, String taskName) {
if (StringUtil.isEmpty(processInstanceId)) {
return null;
}
Long piId = null;
try {
piId = Long.valueOf(processInstanceId);
} catch(NumberFormatException e) {
e.printStackTrace();
}
return getTaskViewer().getTaskInstanceIdForTask(piId, taskName);
}
private String getNewRedirectURL(HttpServletRequest request, HttpServletResponse response) {
IWContext iwc = getIWContext(request, response);
String taskInstanceId = getTaskInstanceId(iwc.getParameter(TaskViewerHelperImp.PROCESS_INSTANCE_ID_PARAMETER),
iwc.getParameter(TaskViewerHelperImp.TASK_NAME_PARAMETER));
if (StringUtil.isEmpty(taskInstanceId)) {
return null;
}
String caseId = iwc.getParameter(TaskViewerHelperImp.CASE_ID_PARAMETER);
if (StringUtil.isEmpty(caseId)) {
return null;
}
String backPage = iwc.getParameter(TaskViewerHelperImp.BACK_PAGE_PARAMETER);
return getTaskViewer().getLinkToTheTask(iwc, caseId, taskInstanceId, StringUtil.isEmpty(backPage) ? null : backPage);
}
public TaskViewerHelper getTaskViewer() {
if (taskViewer == null) {
try {
ELUtil.getInstance().autowire(this);
} catch(Exception e) {
LOGGER.log(Level.SEVERE, "Error getting instance for: " + TaskViewerHelper.class, e);
}
}
return taskViewer;
}
public void setTaskViewer(TaskViewerHelper taskViewer) {
this.taskViewer = taskViewer;
}
}