gt:             if (request != null) {
context: /*
   * Copyright (c) 2004-2020 The YAWL Foundation. All rights reserved.
   * The YAWL Foundation is a collaboration of individuals and
   * organisations who are committed to improving workflow technology.
   *
   * This file is part of YAWL. YAWL is free software: you can
   * redistribute it and/or modify it under the terms of the GNU Lesser
   * General Public License as published by the Free Software Foundation.
   *
   * YAWL is distributed in the hope that it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
   * Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with YAWL. If not, see <http://www.gnu.org/licenses/>.
   */
  
  package org.yawlfoundation.yawl.resourcing.jsf;
  
  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.Logger;
  import org.jdom2.Document;
  import org.jdom2.Element;
  import org.yawlfoundation.yawl.engine.interfce.WorkItemRecord;
  import org.yawlfoundation.yawl.resourcing.DynamicForm;
  import org.yawlfoundation.yawl.resourcing.ResourceManager;
  import org.yawlfoundation.yawl.util.HttpURLValidator;
  import org.yawlfoundation.yawl.util.JDOMUtil;
  import org.yawlfoundation.yawl.util.SaxonUtil;
  import org.yawlfoundation.yawl.util.StringUtil;
  
  import javax.faces.context.ExternalContext;
  import javax.faces.context.FacesContext;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpSession;
  import java.io.IOException;
  
  /**
   * Author: Michael Adams
   * Creation Date: 1/09/2009
   */
  public class FormViewer {
  
      private SessionBean _sb;
      private ResourceManager _rm;
      private Logger _log;
  
      public FormViewer() {
          _rm = ResourceManager.getInstance();
          _log = LogManager.getLogger(this.getClass());
      }
  
      public FormViewer(SessionBean sb) {
          this();
          setSessionBean(sb); 
      }
  
      public SessionBean getSessionBean() { return _sb; }
  
      public void setSessionBean(SessionBean sb) { _sb = sb; }
  
  
      public String display(WorkItemRecord wir) {
          String result = null;
  
          // if there's a custom form for this item, use it
          if (wir.getCustomFormURL() != null) {
              result = showCustomForm(wir) ;
          }
  
          // otherwise default to a dynamic form
          if (result == null) {
              _sb.setDynFormType(ApplicationBean.DynFormType.tasklevel);
  
              DynamicForm factory = _sb.getDynFormFactoryInstance();
              String title = "YAWL " + _sb.getYawlVersion() + " - Edit Work Item";
              if (factory.makeForm(title, null, _sb.getTaskSchema(wir), wir)) {
                  result = "showDynForm" ;
              }
              else {
                  result = "<failure>Cannot view item contents - problem initialising " +
                                 "dynamic form from task specification. " +
                                 "Please see the log files for details.</failure>";
              }
          }
          return result;
      }
  
  
      public String postDisplay(WorkItemRecord wir) {
          String result = "<success/>";
          if (_sb.isWirEdit()) {
              result = postEditWIR(wir);
          }
          else if (_sb.isCustomFormPost()){
              result = postCustomForm(wir) ;
          }
          return result;
      }
  
      
      private String showCustomForm(WorkItemRecord wir) {
          String url = wir.getCustomFormURL();
          if (url != null) {
              String uriPlusParams = buildURI(wir);
  
              // check custom form exists and responds without error
              String validateMsg = HttpURLValidator.validate(uriPlusParams);
              if (validateMsg.equals("<success/>")) {
                  _sb.setCustomFormPost(true);
                  adjustSessionTimeout(wir);
                  return uriPlusParams;   // return validated custom form url incl. params
              }
              else _log.warn("Missing or invalid custom form: '{}', message: {}." +
                      " Defaulting to dynamic form.",
                      uriPlusParams.substring(0, uriPlusParams.indexOf('?')),
                      StringUtil.unwrap(validateMsg));
          }
          else _log.warn("Unspecified form URI. Defaulting to dynamic form.");
  
          return null;                   // invalid form
      }
  
  
      // @pre: wir.getCustomFormURL() != null
      private String buildURI(WorkItemRecord wir) {
          StringBuilder redir = new StringBuilder(parseCustomFormURI(wir));
          redir.append((redir.indexOf("?") == -1) ? "?" : "&")      // any static params?
               .append("workitem=")
               .append(wir.getID())
               .append("&participantid=")
               .append(_sb.getParticipant().getID())
               .append("&handle=")
               .append(_sb.getSessionhandle())
               .append("&source=")
               .append(getSourceURI());
  
          return redir.toString();
      }
  
  
      private void adjustSessionTimeout(WorkItemRecord wir) {
  
          // get new timeout value (if any)
          String rawValue = null;
          Element data = wir.getDataList();
          if (data != null) {
              rawValue = data.getChildText("ySessionTimeout");
          }
  
          // convert to int, remember current timeout, set new timeout (as secs)
          if (rawValue != null) {
              try {
                  int minutes = new Integer(rawValue);
                  HttpSession session = _sb.getExternalSession();
                  _sb.setDefaultSessionTimeoutValue(session.getMaxInactiveInterval()) ;
                  session.setMaxInactiveInterval(minutes * 60);
                  _sb.setSessionTimeoutValueChanged(true);
              }
              catch (NumberFormatException nfe) {
                  // bad timeout value supplied - nothing further to do
              }
          }
      }
  
  
      private String parseCustomFormURI(WorkItemRecord wir) {
          String formURI = wir.getCustomFormURL();
          if (! formURI.contains("{")) return formURI;
          try {
              String dataStr = _rm.getClients().getCaseData(wir.getRootCaseID());
              if (dataStr != null) {
                  Document dataDoc = JDOMUtil.stringToDocument(dataStr);
                  String[] parts = formURI.split("(?=\\{)|(?<=\\})");
                  for (int i=0; i < parts.length; i++) {
                      String part = parts[i];
                      if (part.startsWith("{")) {
                          parts[i] = evaluateXQuery(
                                  part.substring(1, part.lastIndexOf('}')), dataDoc);
                      }
                  }
                  StringBuilder joined = new StringBuilder();
                  for (String part : parts) {
                      joined.append(part);
                  }
                  return joined.toString();
              }
          }
          catch (IOException ioe) {
              // fall through to default return value below
          }
          return formURI;
      }
  
  
      private String getSourceURI() {
          String result = "";
          ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
          if (context != null) {
              HttpServletRequest request = (HttpServletRequest) context.getRequest();
  