/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This 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 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jbpm.pvm.internal.model; import java.io.Serializable; import java.util.List; /** * @author Tom Baeyens */ public class ProcessModificationsImpl implements Serializable { private static final long serialVersionUID = 1L; protected long dbid; protected int version; // TODO: as an optimisation, boolean flag properties could be added // as persistent memberfields to indicate if the collections are // empty or not. That way, when a process modification object // is consulted, before accessing any of the collections it can // first check if the collections are empty, hence preventing a // database query for the empty collections. // Removed items just can be referenced in the process definition // Adding is harder. Full information of added items cannot be stored // in the process // definition database part as those tables will be cached and // marked with read-only. So the added items must be stored in // the runtime (=execution) part of the database schema. // That is why subclasses of the real process definition classes // are created. protected List addedActions; protected List removedActions; protected List addedTransitions; protected List removedTransitions; protected List addedActivities; protected List removedActivities; // TODO : convert to top level types public static class AddedAction extends EventListenerReference { private static final long serialVersionUID = 1L; EventImpl event; } public static class AddedTransition extends TransitionImpl { private static final long serialVersionUID = 1L; } public static class AddedActivity extends ActivityImpl { private static final long serialVersionUID = 1L; } // next this class would implement methods to merge the // modifications with the process definition information. // the ExecutionImpl would have to do lookups in // the process definition model conscientious through // these merging methods public TransitionImpl getOutgoingTransition(ActivityImpl activity, String transitionName) { // first check if the requested transition is in the added transition list if (addedTransitions!=null) { for (AddedTransition addedTransition : addedTransitions) { if ( activity.equals(addedTransition.getSource()) && addedTransition.getName()!=null && addedTransition.getName().equals(transitionName) ) { return addedTransition; } } } // now, check if it is in the normal transition list in the process definition TransitionImpl transition = activity.getOutgoingTransition(transitionName); if ( (transition!=null) // if the transition exists && (removedTransitions!=null) // and if there are removed transitions && (removedTransitions.contains(transition)) // and if the transition found in the process definition is present in the removedTransitions collection ) { // then pretent it wasn't there :-) return null; } return transition; } // furhermore, action, activity and transition creation methods // will have to be exposed through the user interface classes. // We have to make sure that the user is able to access and find // all the input parameters for these creation methods from the // org.jbpm.pvm classes, without ever needing org.jbpm.pvm.internal.model // classes. // for example: public void addTransition(Activity source, String name, Activity destination) { // TODO } }