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

org.cristalise.kernel.lifecycle.AndSplitDef 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;

import java.util.Vector;

import org.cristalise.kernel.common.InvalidDataException;
import org.cristalise.kernel.common.ObjectNotFoundException;
import org.cristalise.kernel.graph.model.Vertex;
import org.cristalise.kernel.graph.traversal.GraphTraversal;
import org.cristalise.kernel.lifecycle.instance.AndSplit;
import org.cristalise.kernel.lifecycle.instance.WfVertex;
import org.cristalise.kernel.scripting.Script;
import org.cristalise.kernel.utils.LocalObjectLoader;

/**
 * @version $Revision: 1.19 $ $Date: 2005/09/29 10:18:31 $
 * @author  $Author: abranson $
 */

public class AndSplitDef extends WfVertexDef
{
	/**
	 * @see java.lang.Object#Object()
	 */
	public AndSplitDef()
	{
		mErrors = new Vector(0, 1);
        getProperties().put("RoutingScriptName", "");
        getProperties().put("RoutingScriptVersion", "");
        getProperties().put("RoutingExpr", "");
	}

	/**
	 * @see org.cristalise.kernel.lifecycle.WfVertexDef#verify()
	 */
	@Override
	public boolean verify()
	{
		mErrors.removeAllElements();
		boolean err = true;
		int nbInEdges = getInEdges().length;
		if (nbInEdges == 0 && this.getID() != getParent().getChildrenGraphModel().getStartVertexId())
		{
			mErrors.add("Unreachable");
			err = false;
		}
		else if (nbInEdges > 1)
		{
			mErrors.add("Bad nb of previous");
			err = false;
		}
		else
		{
			if (getOutEdges().length <= 1)
			{
				mErrors.add("not enough next");
				err = false;
			}
			else if (!(this instanceof LoopDef))
			{
				Vertex[] outV = getOutGraphables();
				Vertex[] anteVertices =
					GraphTraversal.getTraversal(getParent().getChildrenGraphModel(), this, GraphTraversal.kUp, false);
				boolean loop = false;
				boolean errInLoop = true;
				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 LoopDef)
							{
								loop = true;
								j = anteVertices.length;
								i = outV.length;
							}
							else
							{
								errInLoop = false;
							}
						}
				}
				if (errInLoop && loop)
				{
					mErrors.add("Problem in Loop");
					err = false;
				}
			}
		}
		return err;
	}

    @Override
	public boolean loop()
    {
        boolean loop2 = false;
        if (!loopTested)
        {
            loopTested = true;
            if (getOutGraphables().length != 0)
            {
                Vertex[] outVertices = getOutGraphables();
                for (int i = 0; i < outVertices.length; i++)
                {
                    WfVertexDef tmp = (WfVertexDef) getOutGraphables()[i];
                    loop2 = loop2 || tmp.loop();
                }
            }
        }
        loopTested = false;
        return loop2;
    }

	@Override
	public WfVertex instantiate() throws InvalidDataException, ObjectNotFoundException {
		AndSplit newSplit = new AndSplit();
		configureInstance(newSplit);
		return newSplit;
	}
	
	public Script getRoutingScript() throws ObjectNotFoundException, InvalidDataException {
		String scriptName = (String) getProperties().get("RoutingScriptName");
		Integer scriptVersion;
		try {
			String scriptVerStr = (String) getProperties().get("RoutingScriptVersion");
			if (scriptVerStr!=null && !scriptVerStr.isEmpty()) 
				scriptVersion = Integer.valueOf(scriptVerStr.toString());
			else throw new ObjectNotFoundException();
		} catch (NumberFormatException e) { throw new InvalidDataException(); }
		return LocalObjectLoader.getScript(scriptName, scriptVersion);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy