@Override
  public boolean allowForm(Protocol protocol, ProtocolFormType protocolFormType) {
    boolean allowForm = false;

    try {
      ProtocolForm protocolForm =
          protocolFormDao.getLatestProtocolFormByProtocolIdAndProtocolFormType(
              protocol.getId(), protocolFormType);

      ProtocolFormStatus latestModProtocolFormStatus =
          protocolFormStatusDao.getLatestProtocolFormStatusByFormId(protocolForm.getId());

      if (protocolFormStatusLst.contains(latestModProtocolFormStatus.getProtocolFormStatus())) {
        allowForm = true;
      }
    } catch (Exception e) {
      allowForm = true;
    }

    return allowForm;
  }
  @Override
  public ProtocolFormXmlData creatNewProtocol(ProtocolFormType protocolFormType)
      throws XPathExpressionException, IOException, SAXException {
    Protocol p = new Protocol();
    Date created = new Date();
    p.setCreated(created);
    p.setLocked(false);

    p = protocolDao.saveOrUpdate(p);

    p.setProtocolIdentifier(Long.toString(baseProtocolIdentifier + p.getId()));

    // protocol.metadataxml always start with /protocol/
    // String protocolMetaDataXmlString = "<protocol id=\"" + p.getId() + "\" identifier=\"" +
    // p.getProtocolIdentifier() + "\" type=\""+ protocolFormType.getDescription()
    // +"\"></protocol>";
    String protocolMetaDataXmlString =
        (protocolFormType.equals(ProtocolFormType.NEW_SUBMISSION))
            ? "<protocol id=\""
                + p.getId()
                + "\" identifier=\""
                + p.getProtocolIdentifier()
                + "\"></protocol>"
            : "<protocol id=\""
                + p.getId()
                + "\" identifier=\""
                + p.getProtocolIdentifier()
                + "\" type=\""
                + protocolFormType.getDescription()
                + "\"></protocol>";
    ;

    p.setMetaDataXml(protocolMetaDataXmlString);
    p = protocolDao.saveOrUpdate(p);

    String protocolFormXmlString =
        "<"
            + protocolFormType.getBaseTag()
            + " id=\""
            + p.getId()
            + "\" identifier=\""
            + p.getProtocolIdentifier()
            + "\" type=\""
            + protocolFormType.getDescription()
            + "\"></"
            + protocolFormType.getBaseTag()
            + ">";

    ProtocolForm f = new ProtocolForm();
    f.setProtocolFormType(protocolFormType);
    f.setProtocol(p);
    f.setCreated(created);
    f.setMetaDataXml(protocolFormXmlString);
    f.setParent(f);
    f.setLocked(false);

    f = protocolFormDao.saveOrUpdate(f);

    ProtocolFormXmlData fxd = new ProtocolFormXmlData();
    fxd.setProtocolForm(f);
    fxd.setXmlData(protocolFormXmlString);
    fxd.setProtocolFormXmlDataType(protocolFormType.getDefaultProtocolFormXmlDataType());
    fxd.setParent(fxd);
    fxd.setCreated(created);

    fxd = protocolFormXmlDataDao.saveOrUpdate(fxd);

    Map<ProtocolFormXmlDataType, ProtocolFormXmlData> protocolFormXmlDatas =
        new HashMap<ProtocolFormXmlDataType, ProtocolFormXmlData>(0);
    protocolFormXmlDatas.put(protocolFormType.getDefaultProtocolFormXmlDataType(), fxd);
    f.setTypedProtocolFormXmlDatas(protocolFormXmlDatas);

    User currentUser = userService.getCurrentUser();

    protocolFormService.triggerPIAction("CREATE", f, currentUser, null);

    objectAclService.updateObjectAclByUser(Protocol.class, p.getId(), currentUser);
    return fxd;
  }