org.apache.hise.runtime.TaskEvaluator.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.hise.runtime.TaskEvaluator.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache 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://www.apache.org/licenses/LICENSE-2.0
 *
 * 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.apache.hise.runtime;

import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import net.sf.saxon.value.DurationValue;

import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hise.dao.GenericHumanRole;
import org.apache.hise.dao.TaskOrgEntity;
import org.apache.hise.dao.TaskOrgEntity.OrgEntityType;
import org.apache.hise.lang.xsd.htd.TDeadline;
import org.apache.hise.lang.xsd.htd.TDeadlines;
import org.apache.hise.lang.xsd.htd.TEscalation;
import org.apache.hise.lang.xsd.htd.TExpression;
import org.apache.hise.lang.xsd.htd.TFrom;
import org.apache.hise.lang.xsd.htd.TGenericHumanRole;
import org.apache.hise.lang.xsd.htd.TPeopleAssignments;
import org.apache.hise.lang.xsd.htd.TPresentationParameter;
import org.apache.hise.lang.xsd.htd.TToPart;
import org.apache.hise.lang.xsd.htd.TToParts;
import org.apache.hise.utils.DOMUtils;
import org.apache.hise.utils.XQueryEvaluator;
import org.apache.hise.utils.XmlUtils;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;

public class TaskEvaluator {

    private Log __log = LogFactory.getLog(TaskEvaluator.class);

    private Task task;

    public TaskEvaluator(Task task) {
        this.task = task;
    }

    public static class HtdFunctions {
        public static Node getInput(String part) {
            TaskEvaluator te = (TaskEvaluator) XQueryEvaluator.contextObjectTL.get();
            try {
                if (te.task.getTaskDto().getInput().get(part) != null) {
                    return DOMUtils.parse(te.task.getTaskDto().getInput().get(part).getMessage())
                            .getDocumentElement();
                } else {
                    return null;
                }
            } catch (Exception e) {
                throw new RuntimeException("", e);
            }
        }
    }

    public XQueryEvaluator buildQueryEvaluator() {
        XQueryEvaluator evaluator = new XQueryEvaluator();
        evaluator.setContextObject(this);
        evaluator.declareNamespace("htd", "http://www.example.org/WS-HT");
        evaluator.declareJavaClass("http://www.example.org/WS-HT", HtdFunctions.class);
        evaluator.bindVariable(QName.valueOf("taskId"), task.getTaskDto().getId());
        evaluator.bindVariable(QName.valueOf("currentEventDateTime"), task.getCurrentEventDateTime());
        return evaluator;
    }

    public Integer evaluatePriority() {
        return Integer.parseInt("" + evaluateExpression(task.getTaskDefinition().getPriority()));
    }

    private List evaluateExpression(TExpression expr) {
        return buildQueryEvaluator().evaluateExpression(XmlUtils.getStringContent(expr.getContent()), null);
    }

    public Date evaluateDeadline(TDeadline deadline) {
        return (Date) buildQueryEvaluator().evaluateExpression("$currentEventDateTime + xs:dayTimeDuration("
                + XmlUtils.getStringContent(deadline.getFor().getContent()) + ")", null).get(0);
    }

    public Set<TaskOrgEntity> evaluatePeopleAssignments() {
        Set<TaskOrgEntity> result = new HashSet<TaskOrgEntity>();
        TPeopleAssignments p = task.getTaskDefinition().getPeopleAssignments();

        for (JAXBElement<TGenericHumanRole> r : p.getGenericHumanRole()) {
            GenericHumanRole assignmentRole = GenericHumanRole.valueOf(r.getName().getLocalPart().toUpperCase());
            Set<TaskOrgEntity> result2 = evaluateGenericHumanRole(r.getValue(), assignmentRole);
            result.addAll(result2);
        }
        if (__log.isDebugEnabled()) {
            __log.debug("evaluated people assignments " + task.getTaskDefinition().getTaskName() + " " + result);
        }
        return result;
    }

    public Set<TaskOrgEntity> evaluateGenericHumanRole(TGenericHumanRole role, GenericHumanRole assignmentRole) {
        Set<TaskOrgEntity> result = new HashSet<TaskOrgEntity>();

        TFrom f = role.getFrom();
        if (f.getLogicalPeopleGroup() != null) {
            throw new NotImplementedException();
        } else {
            Element e = DOMUtils.findElement(QName.valueOf("{http://www.example.org/WS-HT}literal"),
                    f.getContent());
            if (e != null) {
                for (String user : (List<String>) buildQueryEvaluator().evaluateExpression(
                        "declare namespace htd='http://www.example.org/WS-HT'; for $i in htd:literal/htd:organizationalEntity/htd:users/htd:user return string($i)",
                        e)) {
                    TaskOrgEntity x = new TaskOrgEntity();
                    x.setGenericHumanRole(assignmentRole);
                    x.setName(user);
                    x.setType(OrgEntityType.USER);
                    x.setTask(task.getTaskDto());
                    result.add(x);
                }
                for (String group : (List<String>) buildQueryEvaluator().evaluateExpression(
                        "declare namespace htd='http://www.example.org/WS-HT'; for $i in htd:literal/htd:organizationalEntity/htd:groups/htd:group return string($i)",
                        e)) {
                    TaskOrgEntity x = new TaskOrgEntity();
                    x.setGenericHumanRole(assignmentRole);
                    x.setName(group);
                    x.setType(OrgEntityType.GROUP);
                    x.setTask(task.getTaskDto());
                    result.add(x);
                }
            }
        }
        return result;
    }

    public Node createEprFromHeader(Node header) {
        return (Node) buildQueryEvaluator().evaluateExpression(
                "<wsa:EndpointReference xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">{ */wsa:ReplyTo/* }</wsa:EndpointReference>",
                header).get(0);
    }

    // private Set<TaskOrgEntity> evaluatePeopleGroup(String groupName) {
    // HashSet<TaskOrgEntity> s = new HashSet<TaskOrgEntity>();
    // TaskOrgEntity o = new TaskOrgEntity();
    // o.setName("user1");
    // o.setType(OrgEntityType.USER);
    // s.add(o);
    // return s;
    // }

    public Node evaluateOutcome(boolean outcome) {
        XQueryEvaluator evaluator = buildQueryEvaluator();
        evaluator.bindVariable(QName.valueOf("outcome"), outcome);
        return (Node) evaluator.evaluateExpression(task.getTaskDefinition().getOutcomeExpression(), null).get(0);
    }

    public Node evaluateApproveResponseHeader() {
        XQueryEvaluator evaluator = buildQueryEvaluator();
        return (Node) evaluator.evaluateExpression(
                "<htd:taskId xmlns:htd=\"http://www.example.org/WS-HT\">{$taskId}</htd:taskId>", null).get(0);
    }

    public static String getEscalationKey(TEscalation e, boolean isCompletion) {
        return e.getName() + ";" + (isCompletion ? "COMPLETION" : "START");
    }

    public static class EscalationResult {
        public final TEscalation escalation;
        public final boolean isCompletion;

        public EscalationResult(TEscalation escalation, boolean isCompletion) {
            super();
            this.escalation = escalation;
            this.isCompletion = isCompletion;
        }
    }

    public EscalationResult findEscalation(String name) {
        EscalationResult r = null;
        TDeadlines d = task.getTaskDefinition().getDeadlines();
        for (TDeadline u : d.getStartDeadline()) {
            for (TEscalation e : u.getEscalation()) {
                if (getEscalationKey(e, false).equals(name)) {
                    return new EscalationResult(e, false);
                }
            }
        }

        for (TDeadline u : d.getCompletionDeadline()) {
            for (TEscalation e : u.getEscalation()) {
                if (getEscalationKey(e, true).equals(name)) {
                    return new EscalationResult(e, true);
                }
            }
        }

        return null;
    }

    public Map<String, Node> evaluateToParts(TToParts toParts) {
        Map<String, Node> result = new HashMap<String, Node>();
        if (toParts != null) {
            XQueryEvaluator e = buildQueryEvaluator();
            for (TToPart toPart : toParts.getToPart()) {
                result.put(toPart.getName(),
                        (Node) e.evaluateExpression(XmlUtils.getStringContent(toPart.getContent()), null).get(0));
            }
        }
        return result;
    }

    public static Node defaultHeader() {
        return DOMUtils.parse(
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soapenv:Header xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"/>")
                .getDocumentElement();
    }

    public String getPresentationName() {
        try {
            return XmlUtils.getStringContent(
                    task.getTaskDefinition().getPresentationElements().getName().get(0).getContent());
        } catch (Throwable t) {
            return null;
        }
    }

    public XQueryEvaluator buildPresentationEvaluator() {
        XQueryEvaluator evaluator = buildQueryEvaluator();
        for (TPresentationParameter p : task.getTaskDefinition().getPresentationParameters()) {
            XQueryEvaluator evaluator2 = buildQueryEvaluator();
            List eavaluationResult = evaluator2.evaluateExpression(XmlUtils.getStringContent(p.getContent()), null);
            Object v = null;
            if (!eavaluationResult.isEmpty()) {
                v = eavaluationResult.get(0);
            } else {
                v = "ERROR";
                __log.warn("Could not evaluate presentationParameter: " + p.getName());
            }
            __log.debug("evaluated presentationParameter: " + p.getName() + " = " + v);
            evaluator.bindVariable(QName.valueOf(p.getName()), v);
        }
        return evaluator;
    }

    public static String getTemplateExpr(List<Object> expr) {
        return "xs:string(<v>" + XmlUtils.getStringContent(expr) + "</v>)";
    }

    public String evalPresentationSubject() {
        String subjectExpr;
        try {
            subjectExpr = getTemplateExpr(
                    task.getTaskDefinition().getPresentationElements().getSubject().get(0).getContent());
        } catch (Throwable t) {
            return null;
        }
        XQueryEvaluator e = buildPresentationEvaluator();
        return "" + e.evaluateExpression(subjectExpr, null).get(0);
    }

    public String evalPresentationDescription() {
        String descExpr;
        try {
            descExpr = getTemplateExpr(
                    task.getTaskDefinition().getPresentationElements().getDescription().get(0).getContent());
        } catch (Throwable t) {
            return null;
        }
        XQueryEvaluator e = buildPresentationEvaluator();
        return "" + e.evaluateExpression(descExpr, null).get(0);
    }
}