EmailData.java

/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 *
 * The Apereo Foundation licenses this file to you under the Educational
 * Community License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License
 * at:
 *
 *   http://opensource.org/licenses/ecl2.txt
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 *
 */
package org.opencastproject.email.template.impl;

import org.opencastproject.job.api.Incident;
import org.opencastproject.mediapackage.MediaPackage;
import org.opencastproject.util.doc.DocData;
import org.opencastproject.workflow.api.WorkflowInstance;
import org.opencastproject.workflow.api.WorkflowOperationInstance;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Holds data to be displayed in an email message. The following data will be available: mediaPackage, workflow,
 * workflowConfig: workflow configuration as key-value pairs, catalogs: hash of catalogs whose key is the catalog flavor
 * sub-type e.g. "series", "episode", failedOperation: the last operation marked as "failOnError" that failed.
 *
 */
public class EmailData extends DocData {

  private final WorkflowInstance workflow;
  private final Map<String, String> workflowConfig;
  private final MediaPackage mediaPackage;
  // The hash map below looks like this:
  // "dublincore/episode" --> { "creator": "John Harvard", "type": "L05", "isPartOf": "20140224038"... }
  // "dublincore/series" --> { "creator": "Harvard", "identifier": "20140224038"... }
  private final HashMap<String, HashMap<String, String>> catalogs;
  private final WorkflowOperationInstance failed;
  private final List<Incident> incidents;
  private final Map<String, String> orgProperties;

  /**
   * Create the base data object for populating email fields.
   *
   * @param name
   *          a name for this object
   * @param workflow
   *          workflow instance
   * @param catalogs
   *          hash map of media package catalogs
   * @param failed
   *          workflow operation that caused the workflow to fail
   * @param incidents
   *          incidents
   * @param orgProperties
   *          organization properties
   */
  public EmailData(String name, WorkflowInstance workflow, HashMap<String, HashMap<String, String>> catalogs,
          WorkflowOperationInstance failed, List<Incident> incidents, Map<String, String> orgProperties) {
    super(name, null, null);

    this.workflow = workflow;
    this.workflowConfig = new HashMap<String, String>();
    for (String key : workflow.getConfigurationKeys()) {
      workflowConfig.put(key, workflow.getConfiguration(key));
    }
    this.mediaPackage = workflow.getMediaPackage();
    this.catalogs = catalogs;
    this.failed = failed;
    this.incidents = incidents;
    this.orgProperties = orgProperties;
  }

  /**
   * Returns a string representation of this object.
   *
   * @return a string representation of this object
   */
  @Override
  public String toString() {
    return "EmailDOC:name=" + meta.get("name") + ", notes=" + notes + ", workflow id=" + workflow.getId()
            + ", media package id=" + mediaPackage.getIdentifier();
  }

  @Override
  public Map<String, Object> toMap() throws IllegalStateException {
    LinkedHashMap<String, Object> m = new LinkedHashMap<String, Object>();
    m.put("meta", meta);
    m.put("notes", notes);
    m.put("mediaPackage", mediaPackage);
    m.put("workflow", workflow);
    m.put("workflowConfig", workflowConfig);
    m.put("catalogs", catalogs);
    m.put("failedOperation", failed); // Will be null if no errors
    m.put("incident", incidents); // Will be null if no incidents
    m.put("organization", orgProperties);
    return m;
  }

}