Package eu.planets_project.ifr.core.wee.api

Source Code of eu.planets_project.ifr.core.wee.api.WorkflowReporter

package eu.planets_project.ifr.core.wee.api;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;

import eu.planets_project.ifr.core.wee.api.ReportingLog.Level;
import eu.planets_project.ifr.core.wee.api.ReportingLog.Message;
import eu.planets_project.services.datatypes.Parameter;

/**
* Creates a workflow report. Used by the {@link ReportingLog}
* @author Fabian Steeg (fabian.steeg@uni-koeln.de)
*/
final class WorkflowReporter {
    private static final String REPORT_HTML = "wf-report.html";
    private static final String TEMPLATE = "ReportTemplate.html";
    private static final String CONTENT_MARKER = "###CONTENT###";
    private static final String LOCAL = "components/wee/src/main/resources/";
    //private static final String WEE_DATA = "/planets-ftp/gen";
    private static final String WEE_DATA = "/server/default/deploy/jboss-web.deployer/ROOT.war/wee-gen";
    private static final String JBOSS_HOME_DIR_KEY = "jboss.home.dir";
    private static final String JBOSS_HOME = System.getProperty(JBOSS_HOME_DIR_KEY);
    private static final String ENTRY =
    // A template for a workflow report message, used with String.format:
    "<fieldset><legend><b>%s</legend>" // first insert: the title
            + "<table bgcolor=%s width=100%%><tr><td>" // second insert: color
            + "%s" // third insert: the content (a template again, see below)
            + "</td></tr></table></fieldset>";
    private static final String CONTENT = "<b>%s: </b>%s<br/> ";
    private String folderID = "";
    String reportOutputFolder = initOutputFolder();
    private StringBuilder builder = new StringBuilder();

    /**
     * Create a new reporter. This sets a new ID for the report outputs to a
     * folder corresponding to that ID.
     * If no workflow ID available: generate ID by timestamp
     */
    public WorkflowReporter() {
        this.folderID = getTimeStamp();
        this.reportOutputFolder = initOutputFolder();
    }
   
    /**
     * Uses the workflow's UUID as ID to generate the output directory
     * @see WorkflowReporter#WorkflowReporter()
     * @param workflowUUID
     */
    public WorkflowReporter(String workflowUUID){
      this.folderID = workflowUUID;
        this.reportOutputFolder = initOutputFolder();
    }

    private String getTimeStamp() {
        return System.currentTimeMillis()+"";
    }

    private String initOutputFolder() {
        return (JBOSS_HOME != null ? JBOSS_HOME + WEE_DATA : LOCAL) + "/id-" + folderID;
    }

    /**
     * @param message The message
     * @param level The level
     * @param t The throwable
     */
    void reportIfStructured(final Object message, final Level level, final Throwable t) {
        if (message instanceof Message) {
            builder.append(message(level, message, t));
        }
    }

    /**
     * @return The report assembled during logging
     */
    String reportAsString() {
        String content = builder.toString();
        InputStream stream = this.getClass().getResourceAsStream(TEMPLATE);
        String template;
        try {
            template = IOUtils.toString(stream);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        String result = template.replace(CONTENT_MARKER, content);
        return result;
    }

    /**
     * @return The file the HTML report has been written to
     */
    File reportAsFile() {
        File file = new File(reportOutputFolder, REPORT_HTML);
        FileWriter writer = null;
        try {
            writer = new FileWriter(file);
            writer.write(reportAsString());
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(writer);
        }
        return file;
    }

    private String message(final Level level, final Object message, final Throwable t) {
        if (!(message instanceof Message)) {
            throw new IllegalArgumentException("Need a ReportingLog.Message instance!");
        }
        Message m = (Message) message;
        String result = String.format(ENTRY, m.title, level.color, content(m.values));
        /* If we have a throwable, add info about that: */
        if (t != null) {
            result += String.format(ENTRY, "Problems", level.color, t.getLocalizedMessage());
        }
        return result;
    }

    private String content(final Parameter[] values) {
        StringBuilder builder = new StringBuilder();
        for (Parameter parameter : values) {
            builder.append(String.format(CONTENT, parameter.getName(), parameter.getValue()));
        }
        return builder.toString();
    }
   
    /**
     * @see WorkflowReporter#getResultsId()
     */
    @Deprecated
    public String getTime(){
      return this.folderID;
    }
   
    /**
     * Identifier for the workflow reporter's output. (formerly used as getTime()
     * @return
     */
    public String getResultsId(){
      return this.folderID;
    }
   
}
TOP

Related Classes of eu.planets_project.ifr.core.wee.api.WorkflowReporter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.