public void executeEscalatedDeadline(
      Task task, Deadline deadline, EntityManager em, TaskService service) {
    if (deadline == null || deadline.getEscalations() == null) {
      return;
    }

    for (Escalation escalation : deadline.getEscalations()) {
      // we won't impl constraints for now
      // escalation.getConstraints()
      String language = "es_CL";
      for (Notification notification : escalation.getNotifications()) {
        if (notification.getNotificationType() == NotificationType.Email) {
          executeEmailNotification((EmailNotification) notification, task, em);
        }
      }

      if (!escalation.getReassignments().isEmpty()) {
        // get first and ignore the rest.
        Reassignment reassignment = escalation.getReassignments().get(0);
        em.getTransaction().begin();
        task.getTaskData().setStatus(Status.Ready);
        List potentialOwners = new ArrayList(reassignment.getPotentialOwners());
        task.getPeopleAssignments().setPotentialOwners(potentialOwners);
        em.getTransaction().commit();
      }
    }
    em.getTransaction().begin();
    deadline.setEscalated(true);
    em.getTransaction().commit();
  }
  // TODO: Check if you can update a task. Can you update task by just adding a task with the same
  // ID?
  private org.jbpm.task.Task createOrUpdateTask(Task source) {

    org.jbpm.task.Task target;
    boolean newTask = false;
    if (source.getId() == null) {
      newTask = true;
      target = new org.jbpm.task.Task();
    } else {
      BlockingGetTaskResponseHandler getTaskResponseHandler = new BlockingGetTaskResponseHandler();
      taskClient.getTask(Long.valueOf(source.getId()), getTaskResponseHandler);
      target = getTaskResponseHandler.getTask();
    }
    if (target == null) {
      return null;
    }
    if (source.getAssignee() != null) {
      PeopleAssignments pa = new PeopleAssignments();
      List<OrganizationalEntity> orgEnt = new ArrayList<OrganizationalEntity>();
      org.jbpm.task.User oe = new org.jbpm.task.User();
      oe.setId(source.getAssignee());
      pa.setTaskInitiator(oe);
      orgEnt.add(oe);
      pa.setPotentialOwners(orgEnt);
      target.setPeopleAssignments(pa);
    }
    if (source.getDescription() != null) {
      List<I18NText> desc = new ArrayList<I18NText>();
      desc.add(new I18NText("en-UK", source.getDescription()));
      target.setDescriptions(desc);
    }
    if (source.getDueDate() != null) {
      Deadlines deadlines = new Deadlines();
      List<Deadline> dls = new ArrayList<Deadline>();
      Deadline dl = new Deadline();
      dl.setDate(this.convert(source.getDueDate()));
      dls.add(dl);
      deadlines.setEndDeadlines(dls);
      target.setDeadlines(deadlines);
    }
    if (source.getName() != null) {
      List<I18NText> names = new ArrayList<I18NText>();
      names.add(new I18NText("en-UK", source.getName()));
      target.setNames(names);
    }
    if (source.getPriority() != null) {
      target.setPriority(source.getPriority());
    }

    TaskData td = new TaskData();
    target.setTaskData(td);
    /*
     * if (source.getProgress() != null) {
     * target.setProgress(source.getProgress()); }
     */

    // convert variables
    /*
     * if (source.getVariables() != null &&
     * source.getVariables().getVariables().size() > 0) { Map<String,
     * Object> variables = new HashMap<String, Object>(); for (Variable
     * variable : source.getVariables().getVariables()) {
     * variables.put(variable.getName(), variable.getValue()); }
     * this.taskService.setVariables(target.getId(), variables); }
     */

    if (newTask) {
      BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler();
      taskClient.addTask(target, null, addTaskResponseHandler);
    }

    return target;
  }
  private void doCallbackOperationForTaskDeadlines(Deadlines deadlines) {
    if (deadlines != null) {
      if (deadlines.getStartDeadlines() != null) {
        List<Deadline> startDeadlines = deadlines.getStartDeadlines();
        for (Deadline startDeadline : startDeadlines) {
          List<Escalation> escalations = startDeadline.getEscalations();
          if (escalations != null) {
            for (Escalation escalation : escalations) {
              List<Notification> notifications = escalation.getNotifications();
              List<Reassignment> ressignments = escalation.getReassignments();
              if (notifications != null) {
                for (Notification notification : notifications) {
                  List<OrganizationalEntity> recipients = notification.getRecipients();
                  if (recipients != null) {
                    for (OrganizationalEntity recipient : recipients) {
                      if (recipient instanceof User) {
                        doCallbackUserOperation(recipient.getId());
                      }
                      if (recipient instanceof Group) {
                        doCallbackGroupOperation(recipient.getId());
                      }
                    }
                  }
                  List<OrganizationalEntity> administrators =
                      notification.getBusinessAdministrators();
                  if (administrators != null) {
                    for (OrganizationalEntity administrator : administrators) {
                      if (administrator instanceof User) {
                        doCallbackUserOperation(administrator.getId());
                      }
                      if (administrator instanceof Group) {
                        doCallbackGroupOperation(administrator.getId());
                      }
                    }
                  }
                }
              }
              if (ressignments != null) {
                for (Reassignment reassignment : ressignments) {
                  List<OrganizationalEntity> potentialOwners = reassignment.getPotentialOwners();
                  if (potentialOwners != null) {
                    for (OrganizationalEntity potentialOwner : potentialOwners) {
                      if (potentialOwner instanceof User) {
                        doCallbackUserOperation(potentialOwner.getId());
                      }
                      if (potentialOwner instanceof Group) {
                        doCallbackGroupOperation(potentialOwner.getId());
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }

      if (deadlines.getEndDeadlines() != null) {
        List<Deadline> endDeadlines = deadlines.getEndDeadlines();
        for (Deadline endDeadline : endDeadlines) {
          List<Escalation> escalations = endDeadline.getEscalations();
          if (escalations != null) {
            for (Escalation escalation : escalations) {
              List<Notification> notifications = escalation.getNotifications();
              List<Reassignment> ressignments = escalation.getReassignments();
              if (notifications != null) {
                for (Notification notification : notifications) {
                  List<OrganizationalEntity> recipients = notification.getRecipients();
                  if (recipients != null) {
                    for (OrganizationalEntity recipient : recipients) {
                      if (recipient instanceof User) {
                        doCallbackUserOperation(recipient.getId());
                      }
                      if (recipient instanceof Group) {
                        doCallbackGroupOperation(recipient.getId());
                      }
                    }
                  }
                  List<OrganizationalEntity> administrators =
                      notification.getBusinessAdministrators();
                  if (administrators != null) {
                    for (OrganizationalEntity administrator : administrators) {
                      if (administrator instanceof User) {
                        doCallbackUserOperation(administrator.getId());
                      }
                      if (administrator instanceof Group) {
                        doCallbackGroupOperation(administrator.getId());
                      }
                    }
                  }
                }
              }
              if (ressignments != null) {
                for (Reassignment reassignment : ressignments) {
                  List<OrganizationalEntity> potentialOwners = reassignment.getPotentialOwners();
                  if (potentialOwners != null) {
                    for (OrganizationalEntity potentialOwner : potentialOwners) {
                      if (potentialOwner instanceof User) {
                        doCallbackUserOperation(potentialOwner.getId());
                      }
                      if (potentialOwner instanceof Group) {
                        doCallbackGroupOperation(potentialOwner.getId());
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }