All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cristalise.kernel.lifecycle.instance.Join Maven / Gradle / Ivy

/**
 * This file is part of the CRISTAL-iSE kernel.
 * Copyright (c) 2001-2015 The CRISTAL Consortium. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation; either version 3 of the License, or (at
 * your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *
 * http://www.fsf.org/licensing/licenses/lgpl.html
 */
package org.cristalise.kernel.lifecycle.instance;

import java.util.Vector;

import org.cristalise.kernel.common.InvalidDataException;
import org.cristalise.kernel.graph.model.Vertex;
import org.cristalise.kernel.graph.traversal.GraphTraversal;
import org.cristalise.kernel.lookup.AgentPath;
import org.cristalise.kernel.lookup.ItemPath;

public class Join extends WfVertex {
    public Vector mErrors;

    public Join() {
        super();
        mErrors = new Vector(0, 1);
    }

    private boolean loopTested;
    public int      counter = 0;

    /**
     * 
     * @return boolean
     * @throws InvalidDataException
     */
    private boolean hasPrevActiveActs() throws InvalidDataException {
        for (Vertex v : GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, true)) {
            if (v instanceof Activity && ((Activity) v).active) return true;
        }
        return false;
    }

    @Override
    public void runNext(AgentPath agent, ItemPath item, Object locker) throws InvalidDataException {
        if (!hasPrevActiveActs()) {
            Vertex[] outVertices = getOutGraphables();
            if (outVertices.length > 0) {
                WfVertex nextAct = (WfVertex) outVertices[0];
                nextAct.run(agent, item, locker);
            }
        }
    }

    public Next addNext(String idNext) {
        return addNext((WfVertex) getParent().search(idNext));
    }

    @Override
    public Next addNext(WfVertex vertex) {
        return new Next(this, vertex);
    }

    @Override
    public void reinit(int idLoop) throws InvalidDataException {
        Vertex[] outVertices = getOutGraphables();
        if (outVertices.length == 1) {
            WfVertex nextAct = (WfVertex) outVertices[0];
            nextAct.reinit(idLoop);
        }
    }

    @Override
    public boolean verify() {
        mErrors.removeAllElements();
        int nbOutEdges = getOutEdges().length;
        int nbInEdges = getInEdges().length;
        String type = (String) getProperties().get("Type");
        if (nbInEdges < 1) {
            mErrors.add("not enough previous");
            return false;
        }
        if (type != null && type.equals("Route")) {
            if (nbInEdges > 1) {
                mErrors.add("Bad nb of previous");
                return false;
            }
        }
        if (nbOutEdges > 1) {
            mErrors.add("too many next");
            return false;
        }
        if (nbOutEdges == 0) {
            if (!((CompositeActivity) getParent()).hasGoodNumberOfActivity()) {
                mErrors.add("too many endpoints");
                return false;
            }
        }
        Vertex[] outV = getOutGraphables();
        Vertex[] anteVertices = GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false);
        boolean loop = false;
        boolean errInLoop = false;
        for (int i = 0; i < outV.length; i++) {
            for (int j = 0; j < anteVertices.length; j++)
                if (!loop && outV[i].getID() == anteVertices[j].getID()) {
                    if (outV[i] instanceof Loop) {
                        loop = true;
                        j = anteVertices.length;
                        i = outV.length;
                    }
                    else {
                        errInLoop = true;
                    }
                }
        }
        if (errInLoop && loop) {
            mErrors.add("Problem in Loop");
            return false;
        }
        return true;
    }

    /**
     * @see org.cristalise.kernel.lifecycle.instance.WfVertex#getErrors()
     */
    @Override
    public String getErrors() {
        if (mErrors.size() == 0)
            return "No error";
        else
            return mErrors.elementAt(0);
    }

    @Override
    public void run(AgentPath agent, ItemPath item, Object locker) throws InvalidDataException {
        runNext(agent, item, locker);
    }

    /**
     * @see org.cristalise.kernel.lifecycle.instance.WfVertex#loop()
     */
    @Override
    public boolean loop() {
        boolean loop2 = false;
        if (!loopTested) {
            loopTested = true;
            if (getOutGraphables().length != 0)
                loop2 = ((WfVertex) getOutGraphables()[0]).loop();
        }
        else
            loop2 = true;
        loopTested = false;
        return loop2;
    }

    @Override
    public void runFirst(AgentPath agent, ItemPath item, Object locker) throws InvalidDataException {
        runNext(agent, item, locker);
    }

    @Override
    public boolean isJoin() {
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy