From: <bsc...@us...> - 2009-04-06 15:49:43
|
Revision: 4446 http://unicore.svn.sourceforge.net/unicore/?rev=4446&view=rev Author: bschuller Date: 2009-04-06 15:49:32 +0000 (Mon, 06 Apr 2009) Log Message: ----------- Begin work on the "version 2" of the Chemomentum workflow engine Added Paths: ----------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/ workflow/trunk/workflowservice/src/main/ workflow/trunk/workflowservice/src/main/java/ workflow/trunk/workflowservice/src/main/java/eu/ workflow/trunk/workflowservice/src/main/java/eu/unicore/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/CallbackProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityStatus.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/DeclareVariableActivity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModifyVariableActivity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Transition.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/util/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/util/VariableUtil.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Filter.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/IterationTracker.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullECM.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ProcessVariables.java workflow/trunk/workflowservice/src/main/resources/ workflow/trunk/workflowservice/src/main/resources/log4j.properties workflow/trunk/workflowservice/src/test/ workflow/trunk/workflowservice/src/test/java/ workflow/trunk/workflowservice/src/test/java/eu/ workflow/trunk/workflowservice/src/test/java/eu/unicore/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/TestXNJSSetup.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/TestBase.java workflow/trunk/workflowservice/src/test/resources/ workflow/trunk/workflowservice/src/test/resources/xnjs.xml workflow/trunk/workflowservice/testng-unittests.xml Added: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml (rev 0) +++ workflow/trunk/workflowservice/pom.xml 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,243 @@ +<?xml version="1.0"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>eu.unicore</groupId> + <artifactId>unicorex</artifactId> + <packaging>jar</packaging> + <description>UNICORE Workflow engine</description> + <inceptionYear>2009</inceptionYear> + <organization> + <name>UNICORE</name> + <url>http://www.unicore.eu</url> + </organization> + <url>http://www.unicore.eu</url> + <version>2.0.0-SNAPSHOT</version> + <name>Workflow engine</name> + <scm> + <connection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk</connection> + <developerConnection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk</developerConnection> + </scm> + <mailingLists> + <mailingList> + <name>Development</name> + <subscribe>https://lists.sourceforge.net/lists/listinfo/unicore-devel</subscribe> + <unsubscribe>https://lists.sourceforge.net/lists/listinfo/unicore-devel</unsubscribe> + <archive>http://sourceforge.net/mailarchive/forum.php?forum_name=unicore-devel</archive> + </mailingList> + <mailingList> + <name>Support</name> + <subscribe>https://lists.sourceforge.net/lists/listinfo/unicore-support</subscribe> + <unsubscribe>https://lists.sourceforge.net/lists/listinfo/unicore-support</unsubscribe> + <archive>http://sourceforge.net/mailarchive/forum.php?forum_name=unicore-support</archive> + </mailingList> + </mailingLists> + <prerequisites> + <maven>2.0.9</maven> + </prerequisites> + <properties> + <compiler.fork>false</compiler.fork> + </properties> + <dependencies> + <dependency> + <groupId>eu.unicore</groupId> + <artifactId>uas-core</artifactId> + <version>1.2.0</version> + </dependency> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <version>5.8</version> + <scope>test</scope> + <classifier>jdk15</classifier> + </dependency> + <dependency> + <groupId>org.codehaus.groovy</groupId> + <artifactId>groovy-all-minimal</artifactId> + <version>1.5.7</version> + </dependency> + <dependency> + <groupId>de.fzj.unicore</groupId> + <artifactId>xnjs-module-core</artifactId> + <version>1.2.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>bsh</groupId> + <artifactId>bsh</artifactId> + <version>1.3.0</version> + </dependency> + <!-- CHEMOMENTUM GENERAL --> + <dependency> + <groupId>org.chemomentum</groupId> + <artifactId>tracer</artifactId> + <version>1.5.2</version> + </dependency> + <dependency> + <groupId>org.chemomentum</groupId> + <artifactId>common</artifactId> + <version>1.5.9</version> + <exclusions> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon</artifactId> + </exclusion> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon-dom</artifactId> + </exclusion> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon-xpath</artifactId> + </exclusion> + </exclusions> + </dependency> + +<!-- CHEMOMENTUM DATAMANAGEMENT --> + <dependency> + <groupId>org.chemomentum</groupId> + <artifactId>DMClientAPI</artifactId> + <version>2.3.2</version> + <exclusions> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon</artifactId> + </exclusion> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon-dom</artifactId> + </exclusion> + <exclusion> + <groupId>net.sf.saxon</groupId> + <artifactId>saxon-xpath</artifactId> + </exclusion> + <exclusion> + <groupId>pl.edu.icm.unicore</groupId> + <artifactId>uas-vo</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + <repositories> + <repository> + <id>vsgc-public</id> + <name>VSGC repository</name> + <url>http://zam904.zam.kfa-juelich.de/maven</url> + </repository> + </repositories> + <distributionManagement> + <repository> + <id>vsgc-public</id> + <name>VSGC repository</name> + <url>dav:http://zam904.zam.kfa-juelich.de/maven</url> + </repository> + <snapshotRepository> + <id>vsgc-public-snapshot</id> + <name>VSGC SNAPSHOT Repository</name> + <url>dav:http://zam904.zam.kfa-juelich.de/maven</url> + </snapshotRepository> + <site> + <id>unicore.eu</id> + <url>scp:http://www.fz-juelich.de/var/local/www/unicore/documentation/manuals/unicore6/workflow</url> + </site> + </distributionManagement> + <build> + <defaultGoal>install</defaultGoal> + <pluginManagement> + <plugins> + <plugin> + <artifactId>maven-release-plugin</artifactId> + <version>2.0-beta-4</version> + <configuration> + <tagBase>https://unicore.svn.sourceforge.net/svnroot/unicore/unicorex/tags</tagBase> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.4.3</version> + <configuration> + <!--skip>true</skip--> + <forkMode>pertest</forkMode> + <useSystemClassloader>true</useSystemClassloader> + <suiteXmlFiles> + <suiteXmlFile>testng-unittests.xml</suiteXmlFile> + </suiteXmlFiles> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>2.0.2</version> + <configuration> + <source>1.5</source> + <target>1.5</target> + <maxmem>256M</maxmem> + <fork>${compiler.fork}</fork> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.2</version> + <configuration> + <archive> + <manifestEntries> + <Specification-Title>${name}</Specification-Title> + <Specification-Vendor>UNICORE</Specification-Vendor> + <Specification-Version>${version}</Specification-Version> + <Implementation-Title>${name}</Implementation-Title> + <Implementation-Vendor-Id>unicore.eu</Implementation-Vendor-Id> + <Implementation-Vendor>UNICORE</Implementation-Vendor> + <Implementation-Version>${version}</Implementation-Version> + </manifestEntries> + </archive> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <inherited>true</inherited> + <executions> + <execution> + <id>generate-sources</id> + <phase>verify</phase> +<!-- makes sure the source jar is build before install or compile --> + <goals> + <goal>jar</goal> + </goals> + <inherited>true</inherited> + </execution> + </executions> + <configuration> + <attach>true</attach> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <configuration> + <useProjectReferences>false</useProjectReferences> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + <reporting> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-project-info-reports-plugin</artifactId> + <reportSets> + <reportSet> + <reports> + <report>mailing-list</report> + </reports> + </reportSet> + </reportSets> + </plugin> + </plugins> + </reporting> +</project> Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/CallbackProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/CallbackProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/CallbackProcessor.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,28 @@ +package eu.unicore.workflow.pe; + +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +/** + * Callback methods related to workassignment results + */ +public interface CallbackProcessor { + + /** + * process a "submitted job" message + */ + public abstract void submitted(String workAssignmentID, EndpointReferenceType jobEPR) + throws Exception; + + /** + * process a finished workassignment message + */ + public abstract void finished(String workAssignmentID, EndpointReferenceType jobEPR) + throws Exception; + + /** + * process a failed workassignment message + */ + public abstract void failed(String workAssignmentID, String errorCode, String errorDescription, EndpointReferenceType jobEPR) + throws Exception; + +} \ No newline at end of file Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,109 @@ +package eu.unicore.workflow.pe; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; + +import javax.security.auth.x500.X500Principal; + +import org.chemomentum.common.util.Config; +import org.chemomentum.common.ws.IServiceOrchestrator; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.persist.Persist; +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.uas.client.UASClientFactory; +import de.fzj.unicore.uas.security.IUASSecurityProperties; +import de.fzj.unicore.uas.util.AddressingUtil; +import eu.unicore.workflow.pe.persistence.Attributes; + +/** + * local configuration of the process engine + * + * TODO many things need to go to a properties file + * + * @author schuller + */ +public class PEConfig implements PropertyChangeListener{ + + private PEConfig(){} + + private static PEConfig instance; + + private boolean traceEnabled=true; + + private Persist<Attributes>store; + + public static PEConfig getInstance(){ + if(instance==null){ + instance=new PEConfig(); + } + return instance; + } + + private static IServiceOrchestrator so; + + private static CallbackProcessor cp; + + private static String callbackURL; + + public void propertyChange(PropertyChangeEvent evt) { + try{ + List<EndpointReferenceType>eprs=Config.getSOEprs(); + if(eprs.size()>0){ + EndpointReferenceType epr=eprs.get(0); + IUASSecurityProperties sp=UAS.getSecurityProperties(); + String dn=AddressingUtil.extractServerIDFromEPR(epr); + if(dn!=null){ + X500Principal receiver=new X500Principal(AddressingUtil.extractServerIDFromEPR(epr)); + sp.setReceiver(receiver); + } + so=new UASClientFactory(sp).createPlainWSProxy(IServiceOrchestrator.class, epr.getAddress().getStringValue(), sp); + } + }catch(Exception e){ + //TODO + } + } + + + public Persist<Attributes> getPersistence(){ + return store; + } + + public void setPersistence(Persist<Attributes>store){ + this.store=store; + } + + public IServiceOrchestrator getServiceOrchestrator(){ + return so; + } + + public void setServiceOrchestrator(IServiceOrchestrator serviceOrchestrator){ + so=serviceOrchestrator; + } + + public synchronized CallbackProcessor getCallbackProcessor(){ + return cp; + } + + public synchronized void setCallbackProcessor(CallbackProcessor cpImpl){ + cp=cpImpl; + } + + public String getCallbackURL(){ + return callbackURL; + } + + public void setCallbackURL(String url){ + callbackURL=url; + } + + public void setTraceEnabled(boolean traceEnabled){ + this.traceEnabled=traceEnabled; + } + + public boolean getTraceEnabled(){ + return traceEnabled; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,60 @@ +package eu.unicore.workflow.pe.model; + + +/** + * Information about a workflow activity + * + * @author schuller + */ +public abstract class Activity extends ModelBase{ + + private static final long serialVersionUID=1; + + protected ActivityStatus status; + + protected SplitType splitType=SplitType.AND; + + public Activity(String id, String workflowID){ + super(id,workflowID); + status=ActivityStatus.CREATED; + } + + public ActivityStatus getStatus() { + return status; + } + + public void setStatus(ActivityStatus status) { + this.status = status; + } + + public abstract String getType(); + + public SplitType getSplitType(){ + return splitType; + } + + public void setSplitType(SplitType splitType){ + this.splitType=splitType; + } + + public String toString(){ + StringBuilder sb=new StringBuilder(); + sb.append(id).append(" [type=").append(getType()).append(" status=").append(status).append(" wfID=").append(workflowID).append("]"); + return sb.toString(); + } + + /** + * define semantics of multiple outgoing transitions + */ + public static enum SplitType{ + /** + * first matching transition is followed + */ + XOR, + /** + * all matching transition are followed + */ + AND + }; + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,131 @@ +package eu.unicore.workflow.pe.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A group of activitiesActivity.java + * + * @author schuller + */ +public class ActivityGroup extends Activity{ + + private static final long serialVersionUID=1; + + public static final String ACTION_TYPE="UNICORE_WORKFLOW"; + + private Map<String,Activity>activities=new HashMap<String, Activity>(); + + private List<Transition>transitions=new ArrayList<Transition>(); + + public ActivityGroup(String id,String workflowID) { + super(id,workflowID); + } + + /** + * get all activities that can be submitted + * + * @return array of Activity objects in state READY + */ + public List<Activity> getDueActivities(){ + List<Activity>result=new ArrayList<Activity>(); + for(Activity a: activities.values()){ + if(ActivityStatus.READY==a.getStatus())result.add(a); + } + return result; + } + + public Collection<Activity> getActivities() { + return activities.values(); + } + + public Activity getActivity(String id) { + return activities.get(id); + } + + public void setActivities(List<Activity> activities) { + for(Activity a: activities){ + this.activities.put(a.getID(), a); + } + } + + public void setActivities(Activity... activities) { + setActivities(Arrays.asList(activities)); + } + + public List<Transition> getTransitions() { + return transitions; + } + + public void setTransitions(List<Transition> transitions) { + this.transitions = transitions; + } + public void setTransitions(Transition... transitions) { + this.transitions = Arrays.asList(transitions); + } + + + /** + * update this group: put activities that can be submitted + * into "READY" state + */ + public void init(){ + for(Activity a: activities.values()){ + if(ActivityStatus.CREATED==a.status){ + if(isStartActivity(a)){ + a.status=ActivityStatus.READY; + } + } + } + } + + /** + * put follow-on activities into "READY" state + */ + public void activityDone(Activity a){ + //find outgoing transitions + List<Transition>out=findOutgoingTransitions(a); + boolean followFirst=SplitType.XOR.equals(a.splitType); + outer: + for(Transition t: out){ + //now find activity and set to READY + Activity target=activities.get(t.to); + if(target==null)throw new IllegalStateException("Target activity <"+t.to+"> does not exist."); + if(t.isConditional()){ + //TODO: setup condition with current context + if(!t.getCondition().evaluate()){ + continue outer; + } + } + target.status=ActivityStatus.READY; + if(followFirst)break; + }//end of outer + } + + public String getType(){ + return ACTION_TYPE; + } + + public boolean isStartActivity(Activity a){ + String id=a.id; + for(Transition t: transitions){ + if(id.equals(t.to))return false; + } + return true; + } + + + public List<Transition>findOutgoingTransitions(Activity a){ + List<Transition>result=new ArrayList<Transition>(); + String id=a.id; + for(Transition t: transitions){ + if(id.equals(t.from))result.add(t); + } + return result; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityStatus.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityStatus.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityStatus.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,7 @@ +package eu.unicore.workflow.pe.model; + +public enum ActivityStatus { + + CREATED, READY, RUNNING, SUCCESS, FAILED; + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,18 @@ +package eu.unicore.workflow.pe.model; + +/** + * + * TODO + * + * @author schuller + */ +public abstract class Condition extends ModelBase{ + + + public Condition(String id, String workflowID) { + super(id, workflowID); + } + + public abstract boolean evaluate(); + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/DeclareVariableActivity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/DeclareVariableActivity.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/DeclareVariableActivity.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,53 @@ +package eu.unicore.workflow.pe.model; + + +/** + * Information about a workflow activity + * + * @author schuller + */ +public class DeclareVariableActivity extends Activity{ + + private static final long serialVersionUID=1; + + public static final String ACTION_TYPE="UNICORE_WORKFLOW_DECLARE_VARIABLE_ACTIVITY"; + + private final String variableName; + private final String initialValue; + private final String variableType; + + /** + * create a new DeclareVariableActivity + * + * @param id - the activity ID + * @param workflowID - the workflowID + * @param variableName + * @param type + * @param initialValue + */ + public DeclareVariableActivity(String id, String workflowID, String variableName, String variableType, String initialValue){ + super(id,workflowID); + status=ActivityStatus.CREATED; + this.initialValue=initialValue; + this.variableName=variableName; + this.variableType=variableType; + } + + @Override + public String getType() { + return ACTION_TYPE; + } + + public String getVariableName() { + return variableName; + } + + public String getVariableType() { + return variableType; + } + + public String getInitialValue() { + return initialValue; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,44 @@ +package eu.unicore.workflow.pe.model; + +import java.io.Serializable; + +/** + * deal with iteration values + * + * @author schuller + */ +public class Iteration implements Serializable{ + + private static final long serialVersionUID = 1L; + + public static final String SEPARATOR=":::"; + + private String value; + + private String base=""; + + public Iteration(){ + value="1"; + } + /** + * trigger the next iteration + */ + public void next(){} + + public String getCurrentValue(){ + StringBuilder sb=new StringBuilder(); + if(base!=null){ + sb.append(base); + sb.append(SEPARATOR); + } + sb.append(value); + return sb.toString(); + } + public String getBase() { + return base; + } + public void setBase(String base) { + this.base = base; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,38 @@ +package eu.unicore.workflow.pe.model; + +import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; + +/** + * Information about an workflow execution activity + * <ul> + * <li>Job definition (JSDL)</li> + * <li>Blacklist/whitelist</li> + * <li>etc</li> + * </ul> + * + * @author schuller + */ +public class JSDLExecutionActivity extends Activity{ + + private static final long serialVersionUID=1; + + public static final String ACTION_TYPE="UNICORE_WORKFLOW_JSDL_ACTIVITY"; + + private JobDefinitionDocument jobDefinition; + + public JSDLExecutionActivity(String id, String workflowID){ + super(id, workflowID); + } + + public JobDefinitionDocument getJobDefinition() { + return jobDefinition; + } + + public void setJobDefinition(JobDefinitionDocument jobDefinition) { + this.jobDefinition = jobDefinition; + } + + public String getType(){ + return ACTION_TYPE; + } +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,44 @@ +package eu.unicore.workflow.pe.model; + +import java.io.Serializable; + +/** + * Base class for workflow elements, having an identifier, a parent workflow ID, + * and an {@link Iteration} that tracks repeated execution of this workflow element + * + * @author schuller + */ +public class ModelBase implements Serializable { + + private static final long serialVersionUID=1; + + protected final String id; + + protected final String workflowID; + + protected final Iteration iteration; + + /** + * construct a new model object + * @param id + * @param workflowID + */ + public ModelBase(String id, String workflowID){ + this.id=id; + this.workflowID=workflowID; + this.iteration=new Iteration(); + } + + public String getID(){ + return id; + } + + public Iteration getIteration(){ + return iteration; + } + + public String getWorkflowID(){ + return workflowID; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModifyVariableActivity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModifyVariableActivity.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModifyVariableActivity.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,46 @@ +package eu.unicore.workflow.pe.model; + + +/** + * Information about a workflow activity + * + * @author schuller + */ +public class ModifyVariableActivity extends Activity{ + + private static final long serialVersionUID=1; + + public static final String ACTION_TYPE="UNICORE_WORKFLOW_MODIFY_VARIABLE_ACTIVITY"; + + private final String variableName; + private final String script; + + /** + * create a new ModifyVariableActivity + * + * @param id - the activity ID + * @param workflowID - the workflowID + * @param variableName + * @param script - the expression to execute + */ + public ModifyVariableActivity(String id, String workflowID, String variableName, String script){ + super(id,workflowID); + status=ActivityStatus.CREATED; + this.script=script; + this.variableName=variableName; + } + + @Override + public String getType() { + return ACTION_TYPE; + } + + public String getVariableName() { + return variableName; + } + + public String getScript() { + return script; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Transition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Transition.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Transition.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,76 @@ +package eu.unicore.workflow.pe.model; + +/** + * A transition links parts of the workflow. It can + * be <em>conditional</em> or <em>unconditional</em>. + * + * @author schuller + */ +public class Transition extends ModelBase { + + private static final long serialVersionUID=1; + + final Condition condition; + + final String from,to; + + /** + * create a new conditional transition + * + * @param id - the id of this transition + * @param workflowID - the id of the parent workflow + * @param from - the start activity + * @param to - the end activity + * @param condition - the condition (may be null) + */ + public Transition(String id, String workflowID, String from, String to, Condition condition) { + super(id,workflowID); + this.condition=condition; + this.to=to; + this.from=from; + } + + /** + * create a new unconditional transition + * + * @param id - the id of this transition + * @param workflowID - the id of the parent workflow + * @param from - the start activity + * @param to - the end activity + */ + public Transition(String id, String workflowID, String from, String to) { + this(id,workflowID,from,to,null); + } + + /** + * checks whether this is an unconditional transition + */ + public boolean isConditional(){ + return condition!=null; + } + + /** + * return a user friendly representation + */ + public String toString(){ + StringBuilder sb=new StringBuilder(); + sb.append(from).append("->").append(to); + if(isConditional()){ + sb.append(" when ").append(String.valueOf(condition)); + } + sb.append("[").append(id).append(" in ").append(workflowID).append("]"); + return sb.toString(); + } + + public Condition getCondition() { + return condition; + } + + public String getFrom() { + return from; + } + + public String getTo() { + return to; + } +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,52 @@ +package eu.unicore.workflow.pe.model; + +import java.util.Map; + +import de.fzj.unicore.persist.annotations.ID; +import de.fzj.unicore.persist.annotations.Table; + +/** + * persistent information about a workflow + * + * @author schuller + */ +@Table(name="eu.unicore.workflow.pe.workflow") +public class WorkflowContainer extends ActivityGroup{ + + private static final long serialVersionUID=1; + + private String dialect; + + private Map<String,Object> securityContext; + + + public WorkflowContainer(String id, String workflowID) { + super(id,workflowID); + } + + @Override + @ID + public String getID(){ + return super.getID(); + } + + /** + * get the security context used when the workflow was submitted + */ + public Map<String, Object> getSecurityContext() { + return securityContext; + } + + public void setSecurityContext(Map<String, Object> securityContext) { + this.securityContext = securityContext; + } + + public String getDialect() { + return dialect; + } + + public void setDialect(String dialect) { + this.dialect = dialect; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/util/VariableUtil.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/util/VariableUtil.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/util/VariableUtil.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,30 @@ +package eu.unicore.workflow.pe.model.util; + +public class VariableUtil { + + private VariableUtil(){} + + /** + * creates a new variable of the given type and initial value + * @param type + * @param initialValue + * @return + */ + public static Object create(String type, String initialValue){ + if("BOOLEAN".equalsIgnoreCase(type)){ + return Boolean.parseBoolean(initialValue); + } + if("STRING".equalsIgnoreCase(type)){ + return initialValue; + } + if("INTEGER".equalsIgnoreCase(type)){ + try{ + return Integer.parseInt(initialValue); + }catch(Exception ex){ + throw new IllegalArgumentException("Illegal value <"+initialValue+"> for INTEGER variable"); + } + } + + throw new IllegalArgumentException("Can't create variable of type <"+type+">"); + } +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,257 @@ +package eu.unicore.workflow.pe.persistence; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import de.fzj.unicore.persist.annotations.ID; +import eu.unicore.workflow.pe.model.Activity; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.Transition; + +/** + * During runtime of the workflow the {@link Attributes} class is used to store + * global information about the workflow. + * + * @author schuller + */ +public class Attributes implements Serializable{ + + private static final long serialVersionUID = 1L; + + /** + * the ID of the workflow + */ + @ID + private String workflowID; + + private String dialect; + + private final Map<String,List<PEStatus>> activityStati=new HashMap<String,List<PEStatus>>(); + + private final Map<String,List<PEStatus>> transitionStati=new HashMap<String,List<PEStatus>>(); + + private final Map<String,List<PEStatus>> subFlowStati=new HashMap<String,List<PEStatus>>(); + + private List<String> outputFiles=new ArrayList<String>(); + + //in case this is a subflow, this is the subflow ID + private String id; + + //attributes for subflows + private List<Attributes> subFlowAttributes=new ArrayList<Attributes>(); + + private boolean isLoop=false; + + private List<String> parentIteratorNames=new ArrayList<String>(); + + private String iteratorName; + + private String parentLoopID; + + private boolean isSplit=false; + + private String globalFatalError=null; + + public Attributes(){} + + public String getDialect(){ + return dialect; + } + + public void setDialect(String dialect){ + this.dialect=dialect; + } + + public String getWorkflowID(){ + return workflowID; + } + + public void setWorkflowID(String id){ + workflowID=id; + } + + public List<String> getOutputFiles(){ + return outputFiles; + } + + public void setOutputFiles(List<String>files){ + outputFiles=files; + } + + public List<Attributes> getSubFlowAttributes() { + return subFlowAttributes; + } + + public void setSubFlowAttributes(List<Attributes> subFlowAttributes) { + this.subFlowAttributes = subFlowAttributes; + } + + /** + * recursively find the attributes belonging to a given subflow + */ + public Attributes findSubFlowAttributes(String subflowID){ + if(subflowID.equals(getId()))return this; + else{ + for(Attributes attr: subFlowAttributes){ + Attributes res=attr.findSubFlowAttributes(subflowID); + if(res!=null)return res; + } + } + return null; + } + + /** + * recursively find the attributes containing a certain activity, or null if + * activity is not found + */ + public Attributes findSubFlowContainingActivity(String activityID){ + if(activityStati.containsKey(activityID))return this; + else{ + for(Attributes subAttributes: subFlowAttributes){ + Attributes res=subAttributes.findSubFlowContainingActivity(activityID); + if(res!=null)return res; + } + } + return null; + } + + public Collection<String> getActivities() { + return activityStati.keySet(); + } + + public List<PEStatus> getTransitionStatus(String transitionID) { + return transitionStati.get(transitionID); + } + + /** + * gets persistent information about the given activity. If no info exists, an empty + * list is created + * + * @param activityID + * @return a list of PEStatus entries + */ + public List<PEStatus> getActivityStatus(String activityID) { + List<PEStatus>res=activityStati.get(activityID); + return res; + } + + public PEStatus getActivityStatus(String activityID, String iterationValue) { + List<PEStatus>res=activityStati.get(activityID); + for(PEStatus p: res){ + if(p.getIteration().equals(iterationValue))return p; + } + throw new IllegalArgumentException("No such iteration <"+iterationValue+"> for activity <"+activityID+">"); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + /** + * returns <code>true</code> if these Attributes belong to a loop + */ + public boolean isLoop(){ + return isLoop; + } + + public void setIsLoop(boolean isLoop){ + this.isLoop=isLoop; + } + + /** + * returns the ID of the parent loop, or <code>null</code> if no parent loop exists + * @return + */ + public String getParentLoopID(){ + return parentLoopID; + } + + public void setParentLoopID(String parentLoopID){ + this.parentLoopID=parentLoopID; + } + + /** + * returns the iterator variable name or <code>null</code> if this is not a loop + */ + public String getIteratorName(){ + return iteratorName; + } + + /** + * sets the iterator name for this ActivityGroup + * + * @param iteratorName + */ + public void setIteratorName(String iteratorName) { + this.iteratorName = iteratorName; + } + + public List<String> getParentIteratorNames() { + return parentIteratorNames; + } + + public void setParentIteratorNames(List<String> parentIteratorNames) { + this.parentIteratorNames = parentIteratorNames; + } + + public void setupParentIteratorNames(List<String>parents){ + parentIteratorNames.addAll(parents); + for(Attributes a: subFlowAttributes){ + String iter=getIteratorName(); + List<String>sub=new ArrayList<String>(); + sub.addAll(parents); + if(isLoop && iter!=null)sub.add(iter); + a.setupParentIteratorNames(sub); + } + + } + + public boolean isSplit() { + return isSplit; + } + + public void setSplit(boolean isSplit) { + this.isSplit = isSplit; + } + + public String getGlobalFatalError() { + return globalFatalError; + } + + public void setGlobalFatalError(String globalFatalError) { + this.globalFatalError = globalFatalError; + } + + /** + * parse the given ActivityGroup and setup this Attributes instance + * + * @param activityGroup + */ + public void build(ActivityGroup activityGroup){ + workflowID=activityGroup.getWorkflowID(); + id=activityGroup.getID(); + for(Activity act: activityGroup.getActivities()){ + if(act instanceof ActivityGroup){ + Attributes subAttributes=new Attributes(); + subAttributes.build((ActivityGroup)act); + subFlowAttributes.add(subAttributes); + } + else{ + activityStati.put(act.getID(),new ArrayList<PEStatus>()); + } + } + for(Transition tr: activityGroup.getTransitions()){ + transitionStati.put(tr.getID(), new ArrayList<PEStatus>()); + } + } + + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Filter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Filter.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Filter.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,7 @@ +package eu.unicore.workflow.pe.persistence; + +public interface Filter { + + public boolean accept(String value); + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/IterationTracker.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/IterationTracker.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/IterationTracker.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,62 @@ +package eu.unicore.workflow.pe.persistence; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * store results by iteration value<br/> + * + * @author schuller + */ +public class IterationTracker implements Serializable{ + + private final static long serialVersionUID=1L; + + private final Map<String,PEStatus> values=new HashMap<String, PEStatus>(); + + /** + * + * @param value + */ + public void addValue(String iteration, PEStatus value){ + values.put(iteration,value); + } + + /** + * returns an immutable copy of all the values of this iterator + * + * @return immutable list of values + */ + public Collection<String>getValues(){ + return Collections.unmodifiableSet(values.keySet()); + } + + /** + * Return a particular result + * + * @param iteration - the iteration to check + * @return an {@link PEStatus} + */ + public PEStatus getResult(String iteration){ + return values.get(iteration); + } + + /** + * get a filtered list of values + * @param filter + * @return + */ + public List<String>getValues(Filter filter){ + List<String>result=new ArrayList<String>(); + for(String e: values.keySet()){ + if(filter.accept(e))result.add(e); + } + return result; + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,70 @@ +package eu.unicore.workflow.pe.persistence; + +import java.io.Serializable; + +import eu.unicore.workflow.pe.model.ActivityStatus; + +/** + * stores status information for a workflow element (activities and transitions) + * for one iteration + * + * @author schuller + */ +public class PEStatus implements Serializable{ + + private static final long serialVersionUID = 1L; + + private String errorDescription; + + private String errorCode; + + private String iteration; + + private ActivityStatus activityStatus; + + public String getErrorDescription() { + return errorDescription; + } + + public void setErrorDescription(String errorDescription) { + this.errorDescription = errorDescription; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public ActivityStatus getActivityStatus() { + return activityStatus; + } + + public void setActivityStatus(ActivityStatus activityStatus) { + this.activityStatus = activityStatus; + } + + public String getIteration() { + return iteration; + } + + public void setIteration(String iteration) { + this.iteration = iteration; + } + + public String toString(){ + StringBuilder sb=new StringBuilder(); + sb.append("[iteration=").append(iteration).append(" status=").append(activityStatus); + if(errorCode!=null){ + sb.append(" errorCode=").append(errorCode); + } + if(errorDescription!=null){ + sb.append(" errorDescription=").append(errorDescription); + } + sb.append("]"); + return sb.toString(); + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,112 @@ +package eu.unicore.workflow.pe.persistence; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import de.fzj.unicore.persist.annotations.ID; +import de.fzj.unicore.persist.annotations.Table; + +/** + * persistent information about a workflow + * + * @author schuller + */ +@Table(name="org.chemomentum.pe.workflow") +public class WorkflowContainer implements Serializable{ + + private static final long serialVersionUID = 1L; + + @ID + private String id; + + private String dialect; + + private Map<String,Object> securityContext; + + private Attributes attributes; + + public WorkflowContainer(String id){ + this.id=id; + } + + /** + * get the workflow ID + */ + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + /** + * get the security context used when the workflow was submitted + */ + public Map<String, Object> getSecurityContext() { + return securityContext; + } + + public void setSecurityContext(Map<String, Object> securityContext) { + this.securityContext = securityContext; + } + + public String getDialect() { + return dialect; + } + + public void setDialect(String dialect) { + this.dialect = dialect; + } + + public Attributes getAttributes() { + return attributes; + } + + public void setAttributes(Attributes attributes) { + this.attributes = attributes; + } + + /** + * recursively find attributes belonging to the given subflow + * @param subflowID + * @return + */ + public Attributes findSubflowAttributes(String subflowID){ + return attributes.findSubFlowAttributes(subflowID); + } + + /** + * returns the iterator variables for the given activity, or null if the activity + * is not within a loop body + * + * @param activityID + * @return an ordered array of loop variable names, outermost one is first + */ + public String[] getIteratorVariables(String activityID){ + List<String>res=new ArrayList<String>(); + //find path of loops that lead to the subflow containing the activity + Attributes subflow=attributes.findSubFlowContainingActivity(activityID); + if(subflow==null)return null; + + String var=subflow.getIteratorName(); + + while(var!=null){ + res.add(var); + //find next outer one... + String parentLoopID=subflow.getParentLoopID(); + if(parentLoopID==null)break; + subflow=findSubflowAttributes(parentLoopID); + if(subflow==null)break; + var=subflow.getIteratorName(); + } + if(res.size()==0)return null; + + Collections.reverse(res); + return res.toArray(new String[res.size()]); + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,207 @@ +package eu.unicore.workflow.pe.xnjs; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeoutException; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.persist.PersistenceException; +import de.fzj.unicore.xnjs.Configuration; +import de.fzj.unicore.xnjs.ems.Action; +import de.fzj.unicore.xnjs.ems.ActionResult; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ExecutionException; +import de.fzj.unicore.xnjs.ems.InternalAction; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; +import de.fzj.unicore.xnjs.util.LogUtil; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.model.Activity; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.ActivityStatus; +import eu.unicore.workflow.pe.persistence.Attributes; +import eu.unicore.workflow.pe.persistence.PEStatus; + +/** + * processes activity groups, i.e. both toplevel workflows and sub-workflows + * + * @author schuller + */ +public class ActivityGroupProcessor extends DefaultProcessor { + + private static final Logger logger=LogUtil.getLogger("unicore.workflow",ActivityGroupProcessor.class); + + public ActivityGroupProcessor(Configuration configuration) { + super(configuration); + } + + /** + * will look at the activities in the action's ActitivyGroup, and spawn + * subactions for dealing with those + */ + @Override + protected void handleCreated() throws ProcessingException { + action.setStatus(ActionStatus.RUNNING); + action.addLogTrace("Status set to RUNNING."); + ActivityGroup ag=(ActivityGroup)action.getAjd(); + if(ag.getIteration()!=null)ag.getIteration().next(); + + if(action.getProcessingContext().get(ProcessVariables.class)==null){ + action.getProcessingContext().put(ProcessVariables.class,new ProcessVariables()); + } + List<String>subTasks=new ArrayList<String>(); + action.getProcessingContext().put(List.class, subTasks); + submitAllEligibleActivities(); + } + + @SuppressWarnings("unchecked") + protected void submitAllEligibleActivities()throws ProcessingException{ + List<String>subTasks=action.getProcessingContext().get(List.class); + ActivityGroup ag=(ActivityGroup)action.getAjd(); + + List<Activity>activities=ag.getDueActivities(); + if(activities==null||activities.size()==0){ + action.addLogTrace("No more transitions left to follow."); + logger.info("ActivityGroup "+action.getUUID()+": No more transitions left to follow."); + setToDoneSuccessfully(); + } + else{ + try{ + Attributes workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + Attributes attr=workflowInfo.findSubFlowAttributes(ag.getID()); + if(attr==null)throw new PersistenceException("Persistent information about <"+ag.getID()+"> is missing"); + try{ + for(Activity a: activities){ + String id=submit(a,attr); + subTasks.add(id); + } + }catch(Exception ex){ + setToDoneAndFailed(); + throw new ProcessingException(ex); + } + finally{ + if(attr!=null){ + PEConfig.getInstance().getPersistence().write(attr); + } + } + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + } + + protected String submit(Activity a, Attributes attr)throws ExecutionException{ + InternalAction subAction=new InternalAction(); + String type=a.getType(); + subAction.setType(type); + subAction.setAjd(a); + subAction.setUUID(a.getWorkflowID()+"_"+a.getID()); + subAction.setClient(action.getClient()); + ProcessVariables vars=new ProcessVariables(); + vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + subAction.getProcessingContext().put(ProcessVariables.class,vars); + a.setStatus(ActivityStatus.RUNNING); + PEStatus activityStatus=new PEStatus(); + activityStatus.setActivityStatus(ActivityStatus.RUNNING); + activityStatus.setIteration(a.getIteration().getCurrentValue()); + attr.getActivityStatus(a.getID()).add(activityStatus); + manager.addInternalAction(subAction); + action.setDirty(); + return subAction.getUUID(); + } + + @Override + @SuppressWarnings("unchecked") + protected void handleRunning() throws ProcessingException { + logger.info("Handle running for "+action.getUUID()); + ActivityGroup ag=(ActivityGroup)action.getAjd(); + + //check substates ... + List<String>subTasks=action.getProcessingContext().get(List.class); + if(subTasks==null){ + throw new ProcessingException("Could not find list of sub-tasks."); + } + boolean stillRunning=false; + Attributes attr; + try{ + Attributes workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + attr=workflowInfo.findSubFlowAttributes(ag.getID()); + } + catch(Exception ex){ + throw new ProcessingException(ex); + } + try{ + subActionLoop: for(String subActionID: subTasks){ + Action sub=manager.getAction(subActionID); + if(sub==null){ + String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; + action.addLogTrace(msg); + throw new ExecutionException(msg); + } + else{ + int status=sub.getStatus(); + if(ActionStatus.RUNNING==status){ + stillRunning=true; + continue subActionLoop; + } + + //check status + if(ActionStatus.DONE==status){ + //check result + if(!sub.getResult().isSuccessful()){ + //TODO rule engine callout + setToDoneAndFailed(); + return; + } + else{ + //copy results + ProcessVariables pv=sub.getProcessingContext().get(ProcessVariables.class); + if(pv!=null){ + //TODO what about overwrite of existing values ... + action.getProcessingContext().get(ProcessVariables.class).putAll(pv); + } + String subActivityID=((Activity)sub.getAjd()).getID(); + Activity subActivity=ag.getActivity(subActivityID); + subActivity.setStatus(ActivityStatus.SUCCESS); + ag.activityDone(subActivity); + PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); + stat.setActivityStatus(ActivityStatus.SUCCESS); + } + } + } + } + }catch(ExecutionException ex){ + setToDoneAndFailed(); + throw new ProcessingException(ex); + } + finally{ + if(attr!=null){ + try{ + PEConfig.getInstance().getPersistence().write(attr); + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + } + + if(!stillRunning){ + submitAllEligibleActivities(); + } + } + + private void setToDoneSuccessfully(){ + action.setStatus(ActionStatus.DONE); + action.addLogTrace("Status set to DONE."); + action.setResult(new ActionResult(ActionResult.SUCCESSFUL,"Success.",0)); + action.addLogTrace("Result: Success."); + logger.info("ActivityGroup "+action.getUUID()+ " SUCCESSFUL."); + } + + private void setToDoneAndFailed(){ + action.fail(); + logger.info("Workflow "+action.getUUID()+ " FAILED."); + } + + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java 2009-04-06 15:49:32 UTC (rev 4446) @@ -0,0 +1,65 @@ +package eu.unicore.workflow.pe.xnjs; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.xnjs.Configuration; +import de.fzj.unicore.xnjs.ems.ActionResult; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; +import de.fzj.unicore.xnjs.util.LogUtil; +import eu.unicore.workflow.pe.model.DeclareVariableActivity; +import eu.unicore.workflow.pe.model.util.VariableUtil; + +/** + * Processes a single workflow activity<br/> + * It will submit workassignments until it succeeded or failed (subject to + * business rules) + * + * @author schuller + */ +public class DeclarationActivityProcessor extends DefaultProcessor { + + private static final Logger logger=LogUtil.getLogger("unicore.workflow",DeclarationActivityProcessor.class); + + public DeclarationActivityProcessor(Configuration configuration) { + super(configuration); + } + + @Override + protected void handleCreated() throws ProcessingException { + action.setStatus(ActionStatus.RUNNING); + action.addLogTrace("Status set to RUNNING."); + DeclareVariableActivity activity=(DeclareVariableActivity)action.getAjd(); + logger.info("Start processing activity <"+activity.getID()+"> in iteration <"+activity.getIteration().getCurrentValue()+">"); + ProcessVa... [truncated message content] |
From: <bsc...@us...> - 2009-04-07 15:34:17
|
Revision: 4457 http://unicore.svn.sourceforge.net/unicore/?rev=4457&view=rev Author: bschuller Date: 2009-04-07 15:34:06 +0000 (Tue, 07 Apr 2009) Log Message: ----------- evaluate conditions; simpler workflow setup in XNJS; further work on the persistence layer Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/TestBase.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/Evaluator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/EvaluationException.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/model/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/model/TestScriptCondition.java Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/Evaluator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/Evaluator.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/Evaluator.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,242 @@ +package eu.unicore.workflow.pe; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeoutException; + +import org.apache.log4j.Logger; +import org.chemomentum.common.util.Config; +import org.unigrids.services.atomic.types.GridFileType; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.persist.PersistenceException; +import de.fzj.unicore.uas.client.JobClient; +import de.fzj.unicore.uas.client.StorageClient; +import de.fzj.unicore.uas.security.SecurityManager; +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.security.UASSecurityProperties; +import de.fzj.unicore.uas.util.LogUtil; +import eu.unicore.workflow.pe.model.WorkflowContainer; +import eu.unicore.workflow.pe.persistence.Attributes; +import eu.unicore.workflow.pe.persistence.PEStatus; + +/** + * evaluate conditions + * + * @author schuller + */ +public class Evaluator { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,Evaluator.class); + + private String workflowID; + + public Evaluator(String workflowID){ + this.workflowID=workflowID; + } + + public boolean eval(boolean expr){ + return expr; + } + + public boolean exitCodeEquals(String activityID, int compareTo){ + try{ + JobClient jc=getJobClient(activityID); + Integer exitCode=jc.getExitCode(); + if(exitCode!=null){ + logger.debug("Comparing exitCode="+exitCode+" to "+compareTo); + return exitCode==compareTo; + } + else { + if(logger.isDebugEnabled()){ + logger.debug("Exit code is null for "+jc.getEPR().getAddress().getStringValue()); + } + } + }catch(Exception e){ + logger.error("Error evaluating.",e); + reportError(activityID, "Evaluation error", e); + } + + return false; + } + + public boolean exitCodeNotEquals(String activityID, int compareTo){ + try{ + JobClient jc=getJobClient(activityID); + Integer exitCode=jc.getExitCode(); + if(exitCode!=null){ + logger.debug("Comparing exitCode="+exitCode+" to "+compareTo); + return exitCode!=compareTo; + } + else { + if(logger.isDebugEnabled()){ + logger.debug("Exit code is null for "+jc.getEPR().getAddress().getStringValue()); + } + } + }catch(Exception e){ + logger.error("Error evaluating.",e); + } + return false; + } + + /** + * check if a file exists. This can also be a Chemomentum global file, if the path starts + * with {@link Config#LOGICAL_FILENAME_PREFIX} (i.e. "c9m:") + * + * @param workflowID + * @param activityID + * @param path - the file path + * @return + */ + public boolean fileExists(String activityID, String path){ + if(path.startsWith(Config.LOGICAL_FILENAME_PREFIX)){ + return logicalFileExists(path); + } + return uspaceFileExists(activityID, path); + } + + + /** + * check if the length of a file is greater than zero. + * This can also refer to a Chemomentum global file, if the path starts + * with {@link Config#LOGICAL_FILENAME_PREFIX} (i.e. "c9m:") + * + * @param workflowID + * @param activityID + * @param path - the file path + * @return + */ + public boolean fileLengthGreaterThanZero(String activityID, String path){ + if(path.startsWith(Config.LOGICAL_FILENAME_PREFIX)){ + return logicalFileLengthGreaterThanZero(activityID, path); + } + return uspaceFileLengthGreaterZero(activityID, path); + } + + /** + * check if a file exists in the working directory belonging to an activity + * + * @param workflowID - the workflow id + * @param activityID - the activity id + * @param path - the file path + */ + public boolean uspaceFileExists(String activityID, String path){ + try{ + GridFileType gft=getFileProperties(activityID, path); + return gft!=null && gft.isSetSize(); + }catch(Exception e){ + logger.error("Error evaluating.",e); + reportError(activityID, "Evaluation error", e); + } + return false; + } + + + public boolean uspaceFileLengthGreaterZero(String activityID, String path){ + try{ + GridFileType gft=getFileProperties(activityID, path); + if(gft==null)return false; + return gft.getSize()>0; + }catch(Exception e){ + reportError(activityID, "Can't access uspace", e); + } + return false; + } + + //TODO + public boolean logicalFileExists(String path){ + return true; + } + + //TODO + public boolean logicalFileLengthGreaterThanZero(String activityID, String path){ + return true; + } + + protected JobClient getJobClient(String activityID)throws Exception{ + EndpointReferenceType epr=findJobReference(activityID); + SecurityTokens st=getSecurityTokens(); + UASSecurityProperties sp=SecurityManager.getIssueTrustDelegationProperties(st, epr); + JobClient jc=new JobClient(epr.getAddress().getStringValue(),epr,sp); + return jc; + } + + protected EndpointReferenceType findJobReference(String activityID)throws TimeoutException,PersistenceException{ + PEStatus wa=findLatestStatus(activityID); + return wa.getJobEPR(); + } + + protected PEStatus findLatestStatus(String activityID)throws TimeoutException,PersistenceException{ + Attributes ac=PEConfig.getInstance().getPersistence().read(workflowID); + List<PEStatus> activityStatus=ac.getActivityStatus(activityID); + if(activityStatus.size()>0){ + PEStatus res=activityStatus.get(activityStatus.size()-1); + if(logger.isDebugEnabled()){ + logger.debug("Found latest status for activity <"+activityID+">: "+res); + } + return res; + } + + return null; + } + + protected SecurityTokens getSecurityTokens()throws PersistenceException, TimeoutException{ + WorkflowContainer attr=PEConfig.getInstance().getPersistence().read(workflowID); + Map<String,Object>securityContext=attr.getSecurityContext(); + + SecurityTokens tokens=securityContext!=null? + (SecurityTokens)securityContext.get(SecurityTokens.KEY):null; + return tokens; + } + + protected GridFileType getFileProperties(String activityID, String path){ + try{ + JobClient jc=getJobClient(activityID); + StorageClient sms=jc.getUspaceClient(); + try{ + GridFileType gft=sms.listProperties(path); + return gft; + } + catch(Exception e){ + //path does not exist... + } + return null; + }catch(Exception e){ + reportError(activityID, "Can't access uspace", e); + } + return null; + } + + protected void reportError(String activityID, String message, Throwable cause){ + if(logger.isDebugEnabled()){ + logger.debug("For workflow "+workflowID+", activity "+activityID+": error occurred "+message); + } + } + + /** + * will be called when a condition on a transition is evaluated + * + * @param workflowID - the workflow instance ID + * @param transitionID - the ID of the transition + * @param result - the result of evaluation + */ + public static void reportEvaluationResult(String workflowID, String transitionID, boolean result){ + try{ + if(logger.isDebugEnabled()){ + logger.debug("For workflow "+workflowID+": Condition '"+transitionID+"' evaluated to '"+result+"'"); + } + WorkflowContainer wfc=PEConfig.getInstance().getPersistence().getForUpdate(workflowID); + try { +// ConditionInfoContainer ci=wfc.getAttributes().findConditionInfo(transitionID); +// ci.addEvaluationResult(result, false, null); + } + finally{ + PEConfig.getInstance().getPersistence().write(wfc); + } + } + catch(Exception e){ + logger.error("Can't report result for workflowID="+workflowID+" transitionID="+transitionID,e); + } + } + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/PEConfig.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -15,7 +15,7 @@ import de.fzj.unicore.uas.client.UASClientFactory; import de.fzj.unicore.uas.security.IUASSecurityProperties; import de.fzj.unicore.uas.util.AddressingUtil; -import eu.unicore.workflow.pe.persistence.Attributes; +import eu.unicore.workflow.pe.model.WorkflowContainer; /** * local configuration of the process engine @@ -32,11 +32,14 @@ private boolean traceEnabled=true; - private Persist<Attributes>store; + private Persist<WorkflowContainer>store; + private ProcessEngine pe; + public static PEConfig getInstance(){ if(instance==null){ instance=new PEConfig(); + //instance.pe=new XNJSProcessEngine(); } return instance; } @@ -65,15 +68,22 @@ } } + public ProcessEngine getProcessEngine(){ + return pe; + } - public Persist<Attributes> getPersistence(){ + public Persist<WorkflowContainer> getPersistence(){ return store; } - public void setPersistence(Persist<Attributes>store){ + public void setPersistence(Persist<WorkflowContainer>store){ this.store=store; } + public void setProcessEngine(ProcessEngine pe){ + this.pe=pe; + } + public IServiceOrchestrator getServiceOrchestrator(){ return so; } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,22 @@ +package eu.unicore.workflow.pe; + +import java.util.Map; + +import eu.unicore.workflow.pe.model.ActivityGroup; + +/** + * Main frontend for the process engine + * + * @author schuller + */ +public interface ProcessEngine { + + /** + * process the supplied {@link ActivityGroup} + * + * @param workflow - the workflow to process + * @param securityContext - the ws layer security context + */ + public void process(ActivityGroup workflow, Map<String,Object>securityContext) throws Exception; + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -7,8 +7,10 @@ import java.util.List; import java.util.Map; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + /** - * A group of activitiesActivity.java + * A group of activities * * @author schuller */ @@ -86,7 +88,7 @@ /** * put follow-on activities into "READY" state */ - public void activityDone(Activity a){ + public void activityDone(Activity a, ProcessVariables vars)throws EvaluationException{ //find outgoing transitions List<Transition>out=findOutgoingTransitions(a); boolean followFirst=SplitType.XOR.equals(a.splitType); @@ -96,8 +98,9 @@ Activity target=activities.get(t.to); if(target==null)throw new IllegalStateException("Target activity <"+t.to+"> does not exist."); if(t.isConditional()){ - //TODO: setup condition with current context - if(!t.getCondition().evaluate()){ + Condition cond=t.getCondition(); + cond.setProcessVariables(vars); + if(!cond.evaluate()){ continue outer; } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Condition.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -1,18 +1,28 @@ package eu.unicore.workflow.pe.model; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + /** + * basic condition class * - * TODO - * * @author schuller */ public abstract class Condition extends ModelBase{ - + protected transient ProcessVariables processVariables; + public Condition(String id, String workflowID) { super(id, workflowID); } - public abstract boolean evaluate(); + public abstract boolean evaluate() throws EvaluationException; + + public ProcessVariables getProcessVariables() { + return processVariables; + } + + public void setProcessVariables(ProcessVariables vars) { + this.processVariables = vars; + } } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/EvaluationException.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/EvaluationException.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/EvaluationException.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,22 @@ +package eu.unicore.workflow.pe.model; + +public class EvaluationException extends Exception { + + private static final long serialVersionUID = 1L; + + public EvaluationException() { + } + + public EvaluationException(String message) { + super(message); + } + + public EvaluationException(Throwable cause) { + super(cause); + } + + public EvaluationException(String message, Throwable cause) { + super(message, cause); + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,68 @@ +package eu.unicore.workflow.pe.model; + +import java.io.Reader; +import java.io.StringReader; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; + +import bsh.EvalError; +import bsh.Interpreter; +import de.fzj.unicore.uas.util.LogUtil; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * Evaluate a condition that is based on a Beanshell script + * + * @author schuller + */ +public class ScriptCondition extends Condition{ + + private static final long serialVersionUID = 1L; + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ScriptCondition.class); + + private final String script; + + public ScriptCondition(String id, String workflowID, String script) { + super(id, workflowID); + this.script=script; + } + + public synchronized boolean evaluate()throws EvaluationException{ + try{ + if(processVariables==null){ + throw new EvaluationException("No process variables were defined"); + } + Interpreter interpreter = new Interpreter(); + prepareInterpreter(interpreter, processVariables); + Reader sr = new StringReader(script); + logger.debug("Evaluating expression: "+script); + Object o=interpreter.eval(sr); + if(o instanceof Boolean){ + return ((Boolean)o).booleanValue(); + } + else throw new IllegalArgumentException("Conditional expression in condition <"+id+">does not evaluate to a boolean!"); + + } + catch(EvalError ee){ + throw new EvaluationException(ee); + } + catch(IllegalArgumentException iae){ + throw new EvaluationException(iae); + } + + } + + private void prepareInterpreter(Interpreter interpreter, ProcessVariables vars)throws EvalError{ + logger.debug("Context has "+vars.entrySet().size()+" entries"); + for(Entry<String,Object> entry: vars.entrySet()){ + String key=entry.getKey(); + Object val=entry.getValue(); + logger.debug("Context: "+key+"="+String.valueOf(val)); + interpreter.set(key, val); + } + } + + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -4,6 +4,7 @@ import de.fzj.unicore.persist.annotations.ID; import de.fzj.unicore.persist.annotations.Table; +import eu.unicore.workflow.pe.persistence.Attributes; /** * persistent information about a workflow @@ -11,23 +12,15 @@ * @author schuller */ @Table(name="eu.unicore.workflow.pe.workflow") -public class WorkflowContainer extends ActivityGroup{ +public class WorkflowContainer extends Attributes{ private static final long serialVersionUID=1; - private String dialect; - private Map<String,Object> securityContext; - - public WorkflowContainer(String id, String workflowID) { - super(id,workflowID); - } - - @Override @ID - public String getID(){ - return super.getID(); + public String getWorkflowID(){ + return super.getWorkflowID(); } /** @@ -41,12 +34,4 @@ this.securityContext = securityContext; } - public String getDialect() { - return dialect; - } - - public void setDialect(String dialect) { - this.dialect = dialect; - } - } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/Attributes.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -7,14 +7,13 @@ import java.util.List; import java.util.Map; -import de.fzj.unicore.persist.annotations.ID; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Transition; /** * During runtime of the workflow the {@link Attributes} class is used to store - * global information about the workflow. + * information about the workflow. * * @author schuller */ @@ -22,14 +21,10 @@ private static final long serialVersionUID = 1L; - /** - * the ID of the workflow - */ - @ID - private String workflowID; - private String dialect; + private String workflowID; + private final Map<String,List<PEStatus>> activityStati=new HashMap<String,List<PEStatus>>(); private final Map<String,List<PEStatus>> transitionStati=new HashMap<String,List<PEStatus>>(); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/PEStatus.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -2,6 +2,8 @@ import java.io.Serializable; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + import eu.unicore.workflow.pe.model.ActivityStatus; /** @@ -20,6 +22,8 @@ private String iteration; + private EndpointReferenceType jobEPR; + private ActivityStatus activityStatus; public String getErrorDescription() { @@ -66,5 +70,13 @@ sb.append("]"); return sb.toString(); } + + public EndpointReferenceType getJobEPR() { + return jobEPR; + } + + public void setJobEPR(EndpointReferenceType jobEPR) { + this.jobEPR = jobEPR; + } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeoutException; import org.apache.log4j.Logger; @@ -20,6 +19,8 @@ import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.ActivityStatus; +import eu.unicore.workflow.pe.model.EvaluationException; +import eu.unicore.workflow.pe.model.WorkflowContainer; import eu.unicore.workflow.pe.persistence.Attributes; import eu.unicore.workflow.pe.persistence.PEStatus; @@ -68,7 +69,7 @@ } else{ try{ - Attributes workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + WorkflowContainer workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); Attributes attr=workflowInfo.findSubFlowAttributes(ag.getID()); if(attr==null)throw new PersistenceException("Persistent information about <"+ag.getID()+"> is missing"); try{ @@ -82,7 +83,7 @@ } finally{ if(attr!=null){ - PEConfig.getInstance().getPersistence().write(attr); + PEConfig.getInstance().getPersistence().write(workflowInfo); } } }catch(Exception ex){ @@ -123,9 +124,10 @@ throw new ProcessingException("Could not find list of sub-tasks."); } boolean stillRunning=false; + WorkflowContainer workflowInfo; Attributes attr; try{ - Attributes workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); attr=workflowInfo.findSubFlowAttributes(ag.getID()); } catch(Exception ex){ @@ -164,13 +166,17 @@ String subActivityID=((Activity)sub.getAjd()).getID(); Activity subActivity=ag.getActivity(subActivityID); subActivity.setStatus(ActivityStatus.SUCCESS); - ag.activityDone(subActivity); + ag.activityDone(subActivity, pv); PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); stat.setActivityStatus(ActivityStatus.SUCCESS); } } } } + }catch(EvaluationException ee){ + setToDoneAndFailed(); + //TODO report which evaluation failed + throw new ProcessingException(ee); }catch(ExecutionException ex){ setToDoneAndFailed(); throw new ProcessingException(ex); @@ -178,7 +184,7 @@ finally{ if(attr!=null){ try{ - PEConfig.getInstance().getPersistence().write(attr); + PEConfig.getInstance().getPersistence().write(workflowInfo); }catch(Exception ex){ throw new ProcessingException(ex); } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -8,12 +8,12 @@ import bsh.EvalError; import bsh.Interpreter; +import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.Configuration; import de.fzj.unicore.xnjs.ems.ActionResult; import de.fzj.unicore.xnjs.ems.ActionStatus; import de.fzj.unicore.xnjs.ems.ProcessingException; import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; -import de.fzj.unicore.xnjs.util.LogUtil; import eu.unicore.workflow.pe.model.ModifyVariableActivity; /** @@ -25,7 +25,7 @@ */ public class ModificationActivityProcessor extends DefaultProcessor { - private static final Logger logger=LogUtil.getLogger("unicore.workflow",ModificationActivityProcessor.class); + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ModificationActivityProcessor.class); public ModificationActivityProcessor(Configuration configuration) { super(configuration); Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,48 @@ +package eu.unicore.workflow.pe.xnjs; + +import java.util.Map; + +import de.fzj.unicore.xnjs.XNJS; +import de.fzj.unicore.xnjs.ems.Action; + +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.ProcessEngine; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.WorkflowContainer; + +/** + * XNJS based process engine implementation + * + * @author schuller + */ +public class XNJSProcessEngine implements ProcessEngine { + + private final XNJS xnjs; + + public XNJSProcessEngine(){ + //TODO : init XNJS + xnjs=null; + throw new NullPointerException("TODO!!!"); + } + + public XNJSProcessEngine(XNJS xnjs){ + this.xnjs=xnjs; + } + + /** + * start processing a workflow. This will add the required entry to the persisted data + */ + public void process(ActivityGroup workflow, Map<String, Object> securityContext) throws Exception { + Action action=new Action(); + action.setUUID(workflow.getWorkflowID()); + action.setAjd(workflow); + action.setType(ActivityGroup.ACTION_TYPE); + ProcessVariables vars=new ProcessVariables(); + action.getProcessingContext().put(ProcessVariables.class, vars); + WorkflowContainer attr=new WorkflowContainer(); + attr.build(workflow); + PEConfig.getInstance().getPersistence().write(attr); + xnjs.getConfig().getEMSManager().add(action, null); + } + +} Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,15 @@ +package eu.unicore.workflow.pe; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.xnjs.TestBase; + +public class TestSimpleLoopProcessing extends TestBase { + + @Test + public void test1()throws Exception{ + + //TODO + } + +} \ No newline at end of file Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -13,6 +13,7 @@ import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Transition; +import eu.unicore.workflow.pe.model.WorkflowContainer; import eu.unicore.workflow.pe.persistence.Attributes; import eu.unicore.workflow.pe.persistence.PEStatus; import eu.unicore.workflow.pe.xnjs.TestActivity; @@ -47,22 +48,12 @@ } @Test - public void testStoreAttributes()throws ExecutionException, InterruptedException,PersistenceException{ - InMemory<Attributes>persist=new InMemory<Attributes>(); - persist.setDaoClass(Attributes.class); - PEConfig.getInstance().setPersistence(persist); - Attributes attr=new Attributes(); + public void testStoreAttributes()throws Exception{ String wfID="5678"; ActivityGroup job=buildJob(wfID); - attr.build(job); - PEConfig.getInstance().getPersistence().write(attr); - //now run the workflow - - Action action=new Action(); - action.setUUID(job.getWorkflowID()); - action.setAjd(job); - action.setType(ActivityGroup.ACTION_TYPE); - xnjs.getConfig().getEMSManager().add(action, null); + + PEConfig.getInstance().getProcessEngine().process(job, null); + while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); System.out.println("Status: "+ActionStatus.toString(s)); @@ -72,7 +63,7 @@ else break; } - Attributes results=persist.read(wfID); + Attributes results=PEConfig.getInstance().getPersistence().read(wfID); assert(results!=null); List<PEStatus> a1Status=results.getActivityStatus("a1"); assert(a1Status!=null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -7,29 +7,25 @@ import de.fzj.unicore.xnjs.ems.Action; import de.fzj.unicore.xnjs.ems.ActionStatus; -import de.fzj.unicore.xnjs.ems.ExecutionException; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.DeclareVariableActivity; import eu.unicore.workflow.pe.model.ModifyVariableActivity; +import eu.unicore.workflow.pe.model.WorkflowContainer; import eu.unicore.workflow.pe.xnjs.ProcessVariables; import eu.unicore.workflow.xnjs.TestBase; public class TestVariablesActivities extends TestBase { @Test - public void test1()throws ExecutionException, InterruptedException{ + public void test1()throws Exception{ ActivityGroup job=new ActivityGroup("1234","5678"); List<Activity>as=new ArrayList<Activity>(); as.add(new DeclareVariableActivity("a1",job.getWorkflowID(),"test1","INTEGER","1")); as.add(new DeclareVariableActivity("a2",job.getWorkflowID(),"test2","INTEGER","1")); job.setActivities(as); job.init(); - Action action=new Action(); - action.setUUID(job.getWorkflowID()); - action.setAjd(job); - action.setType(ActivityGroup.ACTION_TYPE); - xnjs.getConfig().getEMSManager().add(action, null); + PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); System.out.println("Status: "+ActionStatus.toString(s)); @@ -41,21 +37,14 @@ } @Test - public void testDeclareVariable()throws ExecutionException, InterruptedException{ + public void testDeclareVariable()throws Exception{ ActivityGroup job=new ActivityGroup("1234","5678"); int initialValue=1; List<Activity>as=new ArrayList<Activity>(); as.add(new DeclareVariableActivity("a1",job.getWorkflowID(),"test1","INTEGER",String.valueOf(initialValue))); job.setActivities(as); job.init(); - Action action=new Action(); - assert(action.getProcessingContext()!=null); - action.setUUID(job.getWorkflowID()); - action.setAjd(job); - action.setType(ActivityGroup.ACTION_TYPE); - ProcessVariables vars=new ProcessVariables(); - action.getProcessingContext().put(ProcessVariables.class, vars); - xnjs.getConfig().getEMSManager().add(action, null); + PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); System.out.println("Status: "+ActionStatus.toString(s)); @@ -65,7 +54,7 @@ else break; } //check that we have a variable in the PC with the requested value - action=xnjs.getConfig().getInternalManager().getAction(job.getWorkflowID()); + Action action=xnjs.getConfig().getInternalManager().getAction(job.getWorkflowID()); assert(action!=null); ProcessVariables pv=action.getProcessingContext().get(ProcessVariables.class); assert(pv!=null); @@ -75,13 +64,17 @@ } @Test - public void testModifyVariable()throws ExecutionException, InterruptedException{ + public void testModifyVariable()throws Exception{ ActivityGroup job=new ActivityGroup("1234","5678"); int targetValue=2; List<Activity>as=new ArrayList<Activity>(); as.add(new ModifyVariableActivity("a1",job.getWorkflowID(),"test1","test1++;")); job.setActivities(as); job.init(); + + WorkflowContainer attr=new WorkflowContainer(); + attr.build(job); + PEConfig.getInstance().getPersistence().write(attr); Action action=new Action(); action.setUUID(job.getWorkflowID()); action.setAjd(job); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -5,9 +5,7 @@ import org.testng.annotations.Test; -import de.fzj.unicore.xnjs.ems.Action; import de.fzj.unicore.xnjs.ems.ActionStatus; -import de.fzj.unicore.xnjs.ems.ExecutionException; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Transition; @@ -18,7 +16,7 @@ public class TestWorkflowProcessing extends TestBase { @Test - public void test1()throws ExecutionException, InterruptedException{ + public void test1()throws Exception{ ActivityGroup job=new ActivityGroup("1234","5678"); List<Activity>as=new ArrayList<Activity>(); as.add(new TestActivity("a1",job.getWorkflowID())); @@ -27,12 +25,7 @@ job.setActivities(as); job.setTransitions(t); job.init(); - - Action action=new Action(); - action.setUUID(job.getWorkflowID()); - action.setAjd(job); - action.setType(ActivityGroup.ACTION_TYPE); - xnjs.getConfig().getEMSManager().add(action, null); + PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); System.out.println("Status: "+ActionStatus.toString(s)); Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/model/TestScriptCondition.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/model/TestScriptCondition.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/model/TestScriptCondition.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -0,0 +1,28 @@ +package eu.unicore.workflow.pe.model; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class TestScriptCondition { + + @Test + public void testSimpleEval()throws EvaluationException{ + String script="true;"; + ProcessVariables pv=new ProcessVariables(); + ScriptCondition cond=new ScriptCondition("1","1234",script); + cond.setProcessVariables(pv); + assert(cond.evaluate()); + } + + @Test + public void testVarEval1()throws EvaluationException{ + ProcessVariables pv=new ProcessVariables(); + pv.put("X", Integer.valueOf(1)); + String script="X==1;"; + ScriptCondition cond=new ScriptCondition("1","1234",script); + cond.setProcessVariables(pv); + assert(cond.evaluate()); + } + +} Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/TestBase.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/TestBase.java 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/xnjs/TestBase.java 2009-04-07 15:34:06 UTC (rev 4457) @@ -3,7 +3,11 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; +import de.fzj.unicore.persist.impl.InMemory; import de.fzj.unicore.xnjs.XNJS; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.model.WorkflowContainer; +import eu.unicore.workflow.pe.xnjs.XNJSProcessEngine; public class TestBase { @@ -13,6 +17,11 @@ protected void startUp()throws Exception{ xnjs=new XNJS("src/test/resources/xnjs.xml"); xnjs.start(); + //set default persistence + InMemory<WorkflowContainer>persist=new InMemory<WorkflowContainer>(); + persist.setDaoClass(WorkflowContainer.class); + PEConfig.getInstance().setPersistence(persist); + PEConfig.getInstance().setProcessEngine(new XNJSProcessEngine(xnjs)); } @AfterClass Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-04-07 15:21:08 UTC (rev 4456) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-04-07 15:34:06 UTC (rev 4457) @@ -20,4 +20,14 @@ <class name="eu.unicore.workflow.pe.TestStatusReporting"/> </classes> </test> + <test verbose="2" name="Script condition evaluation" annotations="JDK"> + <classes> + <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> + </classes> + </test> + <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> + <classes> + <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> + </classes> + </test> </suite> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-04-07 21:01:55
|
Revision: 4458 http://unicore.svn.sourceforge.net/unicore/?rev=4458&view=rev Author: bschuller Date: 2009-04-07 21:01:48 +0000 (Tue, 07 Apr 2009) Log Message: ----------- handle variables in iteration counters; add loop tests Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -1,7 +1,11 @@ package eu.unicore.workflow.pe.model; import java.io.Serializable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + /** * deal with iteration values * @@ -13,32 +17,64 @@ public static final String SEPARATOR=":::"; - private String value; + private Integer value; - private String base=""; + private String base=null; + private String resolvedBase=null; + public Iteration(){ - value="1"; + value=Integer.valueOf(0); } + /** * trigger the next iteration + * + * @parem vars - the process variables */ - public void next(){} + public void next(ProcessVariables vars){ + if(base!=null)resolveBase(vars); + value++; + } public String getCurrentValue(){ StringBuilder sb=new StringBuilder(); if(base!=null){ - sb.append(base); + if(resolvedBase==null){ + //progammer error + throw new IllegalStateException("Need to call next() before retrieving value!"); + } + sb.append(resolvedBase); sb.append(SEPARATOR); } - sb.append(value); + sb.append(String.valueOf(value)); return sb.toString(); } + public String getBase() { return base; } + public void setBase(String base) { this.base = base; } + /* + * resolves variables in the "base" iteration value + */ + private static Pattern p=Pattern.compile("\\$\\{\\w*\\}"); + protected void resolveBase(ProcessVariables vars){ + Matcher m=p.matcher(base); + resolvedBase=base; + while(m.find()){ + String key=m.group().substring(2, m.group().length()-1); + Object val=vars.get(key); + String value=val!=null?String.valueOf(vars.get(key)):""; + resolvedBase=resolvedBase.replace(m.group(), value); + } + } + + public String getResolvedBase() { + return resolvedBase; + } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -1,6 +1,7 @@ package eu.unicore.workflow.pe.xnjs; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; @@ -46,11 +47,16 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); ActivityGroup ag=(ActivityGroup)action.getAjd(); - if(ag.getIteration()!=null)ag.getIteration().next(); - if(action.getProcessingContext().get(ProcessVariables.class)==null){ - action.getProcessingContext().put(ProcessVariables.class,new ProcessVariables()); + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + + if(vars==null){ + vars=new ProcessVariables(); + action.getProcessingContext().put(ProcessVariables.class,vars); } + + if(ag.getIteration()!=null)ag.getIteration().next(vars); + List<String>subTasks=new ArrayList<String>(); action.getProcessingContext().put(List.class, subTasks); submitAllEligibleActivities(); @@ -93,15 +99,21 @@ } protected String submit(Activity a, Attributes attr)throws ExecutionException{ + ProcessVariables vars=new ProcessVariables(); + vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + + //compute next iteration value + a.getIteration().next(vars); + + //setup XNJS action InternalAction subAction=new InternalAction(); String type=a.getType(); subAction.setType(type); subAction.setAjd(a); - subAction.setUUID(a.getWorkflowID()+"_"+a.getID()); subAction.setClient(action.getClient()); - ProcessVariables vars=new ProcessVariables(); - vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + subAction.setUUID(a.getWorkflowID()+"_"+a.getID()+"_"+a.getIteration().getCurrentValue()); subAction.getProcessingContext().put(ProcessVariables.class,vars); + a.setStatus(ActivityStatus.RUNNING); PEStatus activityStatus=new PEStatus(); activityStatus.setActivityStatus(ActivityStatus.RUNNING); @@ -126,15 +138,19 @@ boolean stillRunning=false; WorkflowContainer workflowInfo; Attributes attr; + try{ workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); - attr=workflowInfo.findSubFlowAttributes(ag.getID()); } catch(Exception ex){ throw new ProcessingException(ex); } + try{ - subActionLoop: for(String subActionID: subTasks){ + attr=workflowInfo.findSubFlowAttributes(ag.getID()); + Iterator<String>iterator=subTasks.iterator(); + subActionLoop: while(iterator.hasNext()){ + String subActionID=iterator.next(); Action sub=manager.getAction(subActionID); if(sub==null){ String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; @@ -166,9 +182,17 @@ String subActivityID=((Activity)sub.getAjd()).getID(); Activity subActivity=ag.getActivity(subActivityID); subActivity.setStatus(ActivityStatus.SUCCESS); + + //clean up the sub-action + configuration.getEMSManager().destroy(subActionID, action.getClient()); + iterator.remove(); + action.setDirty(); + + //submit follow on activities ag.activityDone(subActivity, pv); PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); stat.setActivityStatus(ActivityStatus.SUCCESS); + } } } @@ -182,7 +206,7 @@ throw new ProcessingException(ex); } finally{ - if(attr!=null){ + if(workflowInfo!=null){ try{ PEConfig.getInstance().getPersistence().write(workflowInfo); }catch(Exception ex){ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -33,6 +33,7 @@ * start processing a workflow. This will add the required entry to the persisted data */ public void process(ActivityGroup workflow, Map<String, Object> securityContext) throws Exception { + workflow.init(); Action action=new Action(); action.setUUID(workflow.getWorkflowID()); action.setAjd(workflow); Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -0,0 +1,51 @@ +package eu.unicore.workflow.pe; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.model.Iteration; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class TestIteration { + + @Test + public void test1Variable(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + Iteration i=new Iteration(); + i.setBase("${TEST}"); + i.next(vars); + assert("123".equals(i.getResolvedBase())); + } + + @Test + public void test2Variables(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + vars.put("FOO", "456"); + Iteration i=new Iteration(); + i.setBase("${TEST}:::${FOO}"); + i.next(vars); + assert("123:::456".equals(i.getResolvedBase())); + } + + @Test + public void testMixedContent(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + vars.put("FOO", "456"); + Iteration i=new Iteration(); + i.setBase("abc${TEST}:::SomeOtherFOOContent:::${FOO}abc"); + i.next(vars); + assert("abc123:::SomeOtherFOOContent:::456abc".equals(i.getResolvedBase())); + } + + @Test(expectedExceptions=IllegalStateException.class) + public void testForIllegalState(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + Iteration i=new Iteration(); + i.setBase("foo"); + i.getCurrentValue(); + } + +} Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -2,14 +2,85 @@ import org.testng.annotations.Test; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.Condition; +import eu.unicore.workflow.pe.model.DeclareVariableActivity; +import eu.unicore.workflow.pe.model.ModifyVariableActivity; +import eu.unicore.workflow.pe.model.ScriptCondition; +import eu.unicore.workflow.pe.model.Transition; +import eu.unicore.workflow.pe.xnjs.TestActivity; +import eu.unicore.workflow.pe.xnjs.Validate; import eu.unicore.workflow.xnjs.TestBase; public class TestSimpleLoopProcessing extends TestBase { @Test public void test1()throws Exception{ + Validate.clear(); + String wfID="1"; + int N=5; + DeclareVariableActivity d1=new DeclareVariableActivity("d1",wfID,"C","Integer","0"); + TestActivity a1=new TestActivity("a1",wfID); + ModifyVariableActivity m1=new ModifyVariableActivity("m1",wfID,"C","C++;"); + ActivityGroup wf=new ActivityGroup("wf",wfID); + wf.setActivities(d1,m1,a1); + Transition t1=new Transition("d1->a1",wfID,"d1","a1"); + Transition t2=new Transition("a1->m1",wfID,"a1","m1"); + Condition cond=new ScriptCondition("cond1",wfID,"C<"+String.valueOf(N)+";"); + Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); + wf.setTransitions(t1,t2,t3); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + System.out.println("Status: "+ActionStatus.toString(s)); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(1000); + } + else break; + } + assert(Validate.wasInvoked("a1")); + Integer i=Validate.getInvocations("a1"); + assert(N==i.intValue()); + } + - //TODO + @Test + public void testVarInIterationBase()throws Exception{ + Validate.clear(); + String wfID="1"; + int N=5; + DeclareVariableActivity d1=new DeclareVariableActivity("d1",wfID,"C","Integer","0"); + TestActivity a1=new TestActivity("a1",wfID); + + + ModifyVariableActivity m1=new ModifyVariableActivity("m1",wfID,"C","C++;"); + ActivityGroup wf=new ActivityGroup("wf",wfID); + + //use the counter variable as iteration base value + a1.getIteration().setBase("${C}"); + m1.getIteration().setBase("${C}"); + d1.getIteration().setBase("${C}"); + + wf.setActivities(d1,m1,a1); + Transition t1=new Transition("d1->a1",wfID,"d1","a1"); + Transition t2=new Transition("a1->m1",wfID,"a1","m1"); + Condition cond=new ScriptCondition("cond1",wfID,"C<"+String.valueOf(N)+";"); + Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); + wf.setTransitions(t1,t2,t3); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + System.out.println("Status: "+ActionStatus.toString(s)); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(1000); + } + else break; + } + assert(Validate.wasInvoked("a1")); + Integer i=Validate.getInvocations("a1"); + assert(N==i.intValue()); } - } \ No newline at end of file Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -5,15 +5,11 @@ import org.testng.annotations.Test; -import de.fzj.unicore.persist.PersistenceException; -import de.fzj.unicore.persist.impl.InMemory; -import de.fzj.unicore.xnjs.ems.Action; import de.fzj.unicore.xnjs.ems.ActionStatus; import de.fzj.unicore.xnjs.ems.ExecutionException; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Transition; -import eu.unicore.workflow.pe.model.WorkflowContainer; import eu.unicore.workflow.pe.persistence.Attributes; import eu.unicore.workflow.pe.persistence.PEStatus; import eu.unicore.workflow.pe.xnjs.TestActivity; Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -17,6 +17,7 @@ @Test public void test1()throws Exception{ + Validate.clear(); ActivityGroup job=new ActivityGroup("1234","5678"); List<Activity>as=new ArrayList<Activity>(); as.add(new TestActivity("a1",job.getWorkflowID())); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -11,9 +11,7 @@ import eu.unicore.workflow.pe.model.Activity; /** - * Processes a single workflow activity<br/> - * It will submit workassignments until it succeeded or failed (subject to - * business rules) + * Testing only: processes a single workflow activity<br/> * * @author schuller */ @@ -30,7 +28,7 @@ @Override protected void handleCreated() throws ProcessingException { Activity activity=(Activity)action.getAjd(); - logger.info("Processing "+activity); + logger.info("processing activity <"+activity.getID()+"> in iteration <"+activity.getIteration().getCurrentValue()+">"); Validate.invoked(activity.getID()); setToDoneSuccessfully(); } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java 2009-04-07 21:01:48 UTC (rev 4458) @@ -1,7 +1,9 @@ package eu.unicore.workflow.pe.xnjs; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * helper class for checking workflow execution in unit tests @@ -10,28 +12,44 @@ */ public class Validate { - private static final List<String>invokedIDs=new ArrayList<String>(); + private static final List<String>invoked=new ArrayList<String>(); + private static final Map<String,Integer>invocations=new HashMap<String,Integer>(); private Validate(){} + public static void clear(){ + invoked.clear(); + invocations.clear(); + } + public static void invoked(String id){ - invokedIDs.add(id); + Integer i=invocations.get(id); + if(i==null)i=Integer.valueOf(0); + i++; + invocations.put(id, i); + invoked.add(id); } /** * check that the activity with the given ID was invoked */ public static boolean wasInvoked(String id){ - return invokedIDs.contains(id); + return invocations.keySet().contains(id); } + /** + * check that the activity with the given ID was invoked + */ + public static Integer getInvocations(String id){ + return invocations.get(id); + } /** * check that the activity "id1" was invoked before "id2" */ public static boolean before(String id1, String id2){ - int i1=invokedIDs.indexOf(id1); - int i2=invokedIDs.indexOf(id2); + int i1=invoked.indexOf(id1); + int i2=invoked.indexOf(id2); return i1<i2; } } Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-04-07 15:34:06 UTC (rev 4457) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-04-07 21:01:48 UTC (rev 4458) @@ -20,6 +20,11 @@ <class name="eu.unicore.workflow.pe.TestStatusReporting"/> </classes> </test> + <test verbose="2" name="Iteration value handling" annotations="JDK"> + <classes> + <class name="eu.unicore.workflow.pe.TestIteration"/> + </classes> + </test> <test verbose="2" name="Script condition evaluation" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-04-09 11:14:59
|
Revision: 4467 http://unicore.svn.sourceforge.net/unicore/?rev=4467&view=rev Author: bschuller Date: 2009-04-09 11:14:48 +0000 (Thu, 09 Apr 2009) Log Message: ----------- add the frontend Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java workflow/trunk/workflowservice/src/main/resources/log4j.properties workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/Validate.java Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessState.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java workflow/trunk/workflowservice/src/main/java/org/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/DSLDelegate.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryHomeImpl.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowHome.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/groovy/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/groovy/GroovyDelegate.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/ApplicationsResourceProperty.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/DetailedStatusResourceProperty.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/DialectsResourceProperty.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/EndpointReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/FilteredWorkflowReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/JobReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/OutputFilesResourceProperty.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/StatusResourceProperty.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/WorkflowReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/LocationMapper.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/LocationMapperException.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/SetupWorkflowService.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/ workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/CallbackImpl.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/JSDLUtils.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/StartsWithFilter.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/WABuilder.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/WAConstants.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java workflow/trunk/workflowservice/src/test/java/org/ workflow/trunk/workflowservice/src/test/java/org/chemomentum/ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/MockDelegate.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestAppWrapper.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java workflow/trunk/workflowservice/src/test/resources/log4j.properties workflow/trunk/workflowservice/src/test/resources/uas.config Removed Paths: ------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/pom.xml 2009-04-09 11:14:48 UTC (rev 4467) @@ -2,7 +2,7 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>eu.unicore</groupId> - <artifactId>unicorex</artifactId> + <artifactId>workflowservice</artifactId> <packaging>jar</packaging> <description>UNICORE Workflow engine</description> <inceptionYear>2009</inceptionYear> @@ -14,8 +14,8 @@ <version>2.0.0-SNAPSHOT</version> <name>Workflow engine</name> <scm> - <connection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk</connection> - <developerConnection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk</developerConnection> + <connection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk/workflowservice</connection> + <developerConnection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk/workflowservice</developerConnection> </scm> <mailingLists> <mailingList> @@ -69,12 +69,12 @@ <dependency> <groupId>org.chemomentum</groupId> <artifactId>tracer</artifactId> - <version>1.5.2</version> + <version>1.5.3</version> </dependency> <dependency> <groupId>org.chemomentum</groupId> <artifactId>common</artifactId> - <version>1.5.9</version> + <version>1.5.10</version> <exclusions> <exclusion> <groupId>net.sf.saxon</groupId> @@ -141,13 +141,12 @@ </distributionManagement> <build> <defaultGoal>install</defaultGoal> - <pluginManagement> <plugins> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-4</version> <configuration> - <tagBase>https://unicore.svn.sourceforge.net/svnroot/unicore/unicorex/tags</tagBase> + <tagBase>https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/tags</tagBase> </configuration> </plugin> <plugin> @@ -218,8 +217,18 @@ <useProjectReferences>false</useProjectReferences> </configuration> </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>groovy-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>compile</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> - </pluginManagement> </build> <reporting> <plugins> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -19,4 +19,20 @@ */ public void process(ActivityGroup workflow, Map<String,Object>securityContext) throws Exception; + /** + * process the supplied {@link ActivityGroup} + * + * @param workflowID - the ID of the workflow + * @param securityContext - the ws layer security context + */ + public ProcessState getProcessState(String workflowID, Map<String,Object>securityContext) throws Exception; + + /** + * abort a workflow + * + * @param workflowID - the ID of the workflow to abort + * @param securityContext - the ws layer security context + */ + public void abort(String workflowID, Map<String,Object>securityContext) throws Exception; + } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessState.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessState.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessState.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,16 @@ +package eu.unicore.workflow.pe; + +public enum ProcessState { + + UNDEFINED, + + RUNNING, + + COMPLETED, + + ABORTED, + + FAILED, + + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -73,7 +73,7 @@ /** * update this group: put activities that can be submitted - * into "READY" state + * into "READY" state. */ public void init(){ for(Activity a: activities.values()){ @@ -94,9 +94,12 @@ boolean followFirst=SplitType.XOR.equals(a.splitType); outer: for(Transition t: out){ - //now find activity and set to READY + //now find activity and set to READY *IF* all the incoming + //transitions are from finished activities Activity target=activities.get(t.to); if(target==null)throw new IllegalStateException("Target activity <"+t.to+"> does not exist."); + if(!checkDependencies(target))return; + if(t.isConditional()){ Condition cond=t.getCondition(); cond.setProcessVariables(vars); @@ -131,4 +134,35 @@ return result; } + /** + * get all incoming transitions + * + * @param a - the activity to check + * @return + */ + public List<Transition>findIncomingTransitions(Activity a){ + List<Transition>result=new ArrayList<Transition>(); + String id=a.id; + for(Transition t: transitions){ + if(id.equals(t.to))result.add(t); + } + return result; + } + + /** + * check that all activities that have a transition to the given activity + * have status SUCCESS + * + * @param a - the Activity to check + * @return true if all dependencies (i.e. "incoming" activities) are successful + */ + public boolean checkDependencies(Activity a){ + for(Transition t: findIncomingTransitions(a)){ + if(ActivityStatus.SUCCESS!=getActivity(t.from).status){ + return false; + } + } + return true; + } + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/WorkflowContainer.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -2,6 +2,8 @@ import java.util.Map; +import org.chemomentum.dsws.ConversionResult; + import de.fzj.unicore.persist.annotations.ID; import de.fzj.unicore.persist.annotations.Table; import eu.unicore.workflow.pe.persistence.Attributes; @@ -11,13 +13,15 @@ * * @author schuller */ -@Table(name="eu.unicore.workflow.pe.workflow") +@Table(name="WORKFLOWS") public class WorkflowContainer extends Attributes{ private static final long serialVersionUID=1; private Map<String,Object> securityContext; + private ConversionResult conversionResult; + @ID public String getWorkflowID(){ return super.getWorkflowID(); @@ -34,4 +38,12 @@ this.securityContext = securityContext; } + public ConversionResult getConversionResult() { + return conversionResult; + } + + public void setConversionResult(ConversionResult conversionResult) { + this.conversionResult = conversionResult; + } + } Deleted: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -1,112 +0,0 @@ -package eu.unicore.workflow.pe.persistence; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import de.fzj.unicore.persist.annotations.ID; -import de.fzj.unicore.persist.annotations.Table; - -/** - * persistent information about a workflow - * - * @author schuller - */ -@Table(name="org.chemomentum.pe.workflow") -public class WorkflowContainer implements Serializable{ - - private static final long serialVersionUID = 1L; - - @ID - private String id; - - private String dialect; - - private Map<String,Object> securityContext; - - private Attributes attributes; - - public WorkflowContainer(String id){ - this.id=id; - } - - /** - * get the workflow ID - */ - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - /** - * get the security context used when the workflow was submitted - */ - public Map<String, Object> getSecurityContext() { - return securityContext; - } - - public void setSecurityContext(Map<String, Object> securityContext) { - this.securityContext = securityContext; - } - - public String getDialect() { - return dialect; - } - - public void setDialect(String dialect) { - this.dialect = dialect; - } - - public Attributes getAttributes() { - return attributes; - } - - public void setAttributes(Attributes attributes) { - this.attributes = attributes; - } - - /** - * recursively find attributes belonging to the given subflow - * @param subflowID - * @return - */ - public Attributes findSubflowAttributes(String subflowID){ - return attributes.findSubFlowAttributes(subflowID); - } - - /** - * returns the iterator variables for the given activity, or null if the activity - * is not within a loop body - * - * @param activityID - * @return an ordered array of loop variable names, outermost one is first - */ - public String[] getIteratorVariables(String activityID){ - List<String>res=new ArrayList<String>(); - //find path of loops that lead to the subflow containing the activity - Attributes subflow=attributes.findSubFlowContainingActivity(activityID); - if(subflow==null)return null; - - String var=subflow.getIteratorName(); - - while(var!=null){ - res.add(var); - //find next outer one... - String parentLoopID=subflow.getParentLoopID(); - if(parentLoopID==null)break; - subflow=findSubflowAttributes(parentLoopID); - if(subflow==null)break; - var=subflow.getIteratorName(); - } - if(res.size()==0)return null; - - Collections.reverse(res); - return res.toArray(new String[res.size()]); - } - -} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import de.fzj.unicore.persist.PersistenceException; +import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.Configuration; import de.fzj.unicore.xnjs.ems.Action; import de.fzj.unicore.xnjs.ems.ActionResult; @@ -15,7 +16,7 @@ import de.fzj.unicore.xnjs.ems.InternalAction; import de.fzj.unicore.xnjs.ems.ProcessingException; import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; -import de.fzj.unicore.xnjs.util.LogUtil; + import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; @@ -32,7 +33,7 @@ */ public class ActivityGroupProcessor extends DefaultProcessor { - private static final Logger logger=LogUtil.getLogger("unicore.workflow",ActivityGroupProcessor.class); + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ActivityGroupProcessor.class); public ActivityGroupProcessor(Configuration configuration) { super(configuration); @@ -59,16 +60,16 @@ List<String>subTasks=new ArrayList<String>(); action.getProcessingContext().put(List.class, subTasks); - submitAllEligibleActivities(); + submitAllEligibleActivities(true); } @SuppressWarnings("unchecked") - protected void submitAllEligibleActivities()throws ProcessingException{ + protected void submitAllEligibleActivities(boolean subActionsStillRunning)throws ProcessingException{ List<String>subTasks=action.getProcessingContext().get(List.class); ActivityGroup ag=(ActivityGroup)action.getAjd(); List<Activity>activities=ag.getDueActivities(); - if(activities==null||activities.size()==0){ + if(!subActionsStillRunning && (activities==null||activities.size()==0)){ action.addLogTrace("No more transitions left to follow."); logger.info("ActivityGroup "+action.getUUID()+": No more transitions left to follow."); setToDoneSuccessfully(); @@ -127,7 +128,7 @@ @Override @SuppressWarnings("unchecked") protected void handleRunning() throws ProcessingException { - logger.info("Handle running for "+action.getUUID()); + if(logger.isTraceEnabled())logger.trace("Handle running for "+action.getUUID()); ActivityGroup ag=(ActivityGroup)action.getAjd(); //check substates ... @@ -135,7 +136,7 @@ if(subTasks==null){ throw new ProcessingException("Could not find list of sub-tasks."); } - boolean stillRunning=false; + WorkflowContainer workflowInfo; Attributes attr; @@ -146,6 +147,8 @@ throw new ProcessingException(ex); } + boolean stillRunning=false; + try{ attr=workflowInfo.findSubFlowAttributes(ag.getID()); Iterator<String>iterator=subTasks.iterator(); @@ -159,13 +162,17 @@ } else{ int status=sub.getStatus(); - if(ActionStatus.RUNNING==status){ + if(logger.isTraceEnabled()){ + logger.trace("Sub-Action <"+subActionID+"> is "+ActionStatus.toString(status)); + } + + //check status + + if(ActionStatus.DONE!=status){ stillRunning=true; continue subActionLoop; } - - //check status - if(ActionStatus.DONE==status){ + else{ //check result if(!sub.getResult().isSuccessful()){ //TODO rule engine callout @@ -215,9 +222,7 @@ } } - if(!stillRunning){ - submitAllEligibleActivities(); - } + submitAllEligibleActivities(stillRunning); } private void setToDoneSuccessfully(){ Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,42 @@ +package eu.unicore.workflow.pe.xnjs; + +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.xnjs.XNJS; + +import eu.unicore.workflow.pe.CallbackProcessor; + +public class CallbackProcessorImpl implements CallbackProcessor{ + + private final XNJS xnjs; + + public CallbackProcessorImpl(){ + //TODO : init XNJS if using this default constructor + xnjs=null; + throw new NullPointerException("TODO!!!"); + } + + public CallbackProcessorImpl(XNJS xnjs){ + this.xnjs=xnjs; + } + + public void failed(String workAssignmentID, String errorCode, + String errorDescription, EndpointReferenceType jobEPR) + throws Exception { + // TODO Auto-generated method stub + + } + + public void finished(String workAssignmentID, EndpointReferenceType jobEPR) + throws Exception { + // TODO Auto-generated method stub + + } + + public void submitted(String workAssignmentID, EndpointReferenceType jobEPR) + throws Exception { + // TODO Auto-generated method stub + + } + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-04-09 08:54:40 UTC (rev 4466) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -3,10 +3,13 @@ import java.util.Map; import de.fzj.unicore.xnjs.XNJS; +import de.fzj.unicore.xnjs.aaa.Client; import de.fzj.unicore.xnjs.ems.Action; +import de.fzj.unicore.xnjs.ems.ActionStatus; import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.ProcessEngine; +import eu.unicore.workflow.pe.ProcessState; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.WorkflowContainer; @@ -20,7 +23,7 @@ private final XNJS xnjs; public XNJSProcessEngine(){ - //TODO : init XNJS + //TODO : init XNJS if using this default constructor xnjs=null; throw new NullPointerException("TODO!!!"); } @@ -42,8 +45,29 @@ action.getProcessingContext().put(ProcessVariables.class, vars); WorkflowContainer attr=new WorkflowContainer(); attr.build(workflow); + attr.setSecurityContext(securityContext); PEConfig.getInstance().getPersistence().write(attr); xnjs.getConfig().getEMSManager().add(action, null); } + public ProcessState getProcessState(String workflowID, Map<String, Object> securityContext) + throws Exception { + Action action=xnjs.getConfig().getInternalManager().getAction(workflowID); + if(action==null)return ProcessState.UNDEFINED; + + int status=action.getStatus(); + if(ActionStatus.DONE==status){ + if(!action.getResult().isSuccessful())return ProcessState.FAILED; + return ProcessState.COMPLETED; + } + return ProcessState.RUNNING; + } + + public void abort(String workflowID, Map<String, Object> securityContext) + throws Exception { + Client client=(Client)securityContext.get("unicore.authz.client"); + xnjs.getConfig().getEMSManager().abort(workflowID, client); + } + + } Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,86 @@ +package org.chemomentum.dsws; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import eu.unicore.workflow.pe.model.ActivityGroup; + +/** + * When submitting a workflow, the {@link DSLDelegate} produces + * a set of attributes during the conversion process. + * These include conversion errors and the converted workflow + * + * @author schuller + */ +public class ConversionResult implements Serializable{ + + private static final long serialVersionUID = 1L; + + private String processID; + + private String dialect; + + private List<String> outputFiles=new ArrayList<String>(); + + private transient List<String> errors=new ArrayList<String>(); + + private ActivityGroup convertedWorkflow; + + public ConversionResult(){} + + /** + * check whether errors occured during conversion of the domain workflow + * @return + */ + public boolean hasConversionErrors(){ + return errors.size()>0; + } + + /** + * get the conversion errors for the (sub-)flow that produced these attributes + * + * @see #getAllConversionErrors() + * @return a list of error messages produced while converting the domain workflow + */ + public List<String> getConversionErrors(){ + return errors; + } + + public void addError(String error){ + errors.add(error); + } + + public String getDialect(){ + return dialect; + } + + public void setDialect(String dialect){ + this.dialect=dialect; + } + + public String getProcessID(){ + return processID; + } + + public void setProcessID(String id){ + processID=id; + } + + public List<String> getOutputFiles(){ + return outputFiles; + } + + public void setOutputFiles(List<String>files){ + outputFiles=files; + } + + public ActivityGroup getConvertedWorkflow() { + return convertedWorkflow; + } + + public void setConvertedWorkflow(ActivityGroup convertedWorkflow) { + this.convertedWorkflow = convertedWorkflow; + } + +} Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/DSLDelegate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/DSLDelegate.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/DSLDelegate.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,44 @@ +package org.chemomentum.dsws; + +import java.util.Map; + +import org.chemomentum.workflow.xmlbeans.DetailedStatusDocument; +import org.chemomentum.workflow.xmlbeans.RulesDocument.Rules; +import org.chemomentum.workflow.xmlbeans.WorkflowDocument.Workflow; + +/** + * Delegate for domain-specific processing in the workflow service<br/> + * + * Delegates support a specific workflow dialect, that can be queried by {@link #getDialect()}. + * + * @author schuller + */ +public interface DSLDelegate { + + /** + * add a new workflow instance with the specified unique ID, workflow and rules + * + * @param uniqueID - unique ID for this workflow instance + * @param workflow - the workflow description + * @param rules - rules description + * + * @return an map containing attributes + */ + public ConversionResult addNewWorkflow(String uniqueID, Workflow workflow, Rules rules, Map<String,Object>securityContext); + + /** + * get the detailed status for the given workflow instance + * + * @param uniqueID - the process id + * @param attributes - the workflow instance attributes + * @param securityContext - security context + */ + public DetailedStatusDocument getDetailedStatus(String uniqueID, ConversionResult attributes, Map<String,Object>securityContext); + + /** + * get the dialect understood by this delegate + * @return SupportedDialectDocument + */ + public String getDialect(); + +} Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryHomeImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryHomeImpl.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryHomeImpl.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,20 @@ +package org.chemomentum.dsws; + +import de.fzj.unicore.uas.impl.UASWSResourceHomeImpl; +import de.fzj.unicore.wsrflite.WSRFInstance; + +/** + * the "home" class for the workflow submission + * @author schuller + * + */ +public class WorkflowFactoryHomeImpl extends UASWSResourceHomeImpl { + + public static final String DEFAULT_RESOURCEID="default_workflow_submission"; + + @Override + protected WSRFInstance doCreateInstance() { + return new WorkflowFactoryImpl(); + } + +} Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,185 @@ +package org.chemomentum.dsws; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.namespace.QName; + +import org.apache.log4j.Logger; +import org.chemomentum.common.ws.IWorkflowFactory; +import org.chemomentum.dsws.groovy.GroovyDelegate; +import org.chemomentum.dsws.rp.ApplicationsResourceProperty; +import org.chemomentum.dsws.rp.DialectsResourceProperty; +import org.chemomentum.dsws.rp.FilteredWorkflowReferenceRP; +import org.chemomentum.dsws.rp.WorkflowReferenceRP; +import org.chemomentum.workflow.xmlbeans.CreateWorkflowResourceDocument; +import org.chemomentum.workflow.xmlbeans.CreateWorkflowResponseDocument; +import org.chemomentum.workflow.xmlbeans.WorkflowFactoryPropertiesDocument; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.uas.impl.UASWSResourceImpl; +import de.fzj.unicore.uas.impl.bp.BPSupportImpl; +import de.fzj.unicore.uas.util.AddressingUtil; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.wsrflite.Home; +import de.fzj.unicore.wsrflite.Kernel; +import de.fzj.unicore.wsrflite.messaging.MessagingImpl; +import de.fzj.unicore.wsrflite.messaging.PullPoint; +import de.fzj.unicore.wsrflite.persistence.Persist; +import de.fzj.unicore.wsrflite.utils.Utilities; + +/** + * Implementation of the workflow submission service + * + * @see org.chemomentum.common.front.ISubmitWorkflow + * @author schuller + */ +public class WorkflowFactoryImpl extends UASWSResourceImpl implements IWorkflowFactory { + + private static final long serialVersionUID = 1L; + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,WorkflowFactoryImpl.class); + + /** + * maps dialect URIs to DSLDelegates that do the actual DSL processing + */ + private static Map<String, DSLDelegate>dslDelegates=new HashMap<String, DSLDelegate>(); + + /** + * maps ws resource IDs to clients + */ + @Persist + private Map<String, String>owners=new HashMap<String, String>(); + + @Override + protected void addWSResourceInterfaces(BPSupportImpl baseProfile) { + super.addWSResourceInterfaces(baseProfile); + baseProfile.addWSResourceInterface(getPortType()); + } + + @Override + public QName getResourcePropertyDocumentQName() { + return WorkflowFactoryPropertiesDocument.type.getDocumentElementName(); + } + + + /** + * simply creates the workflow resource and returns the EPR + * does NOT submit to the process engine... + */ + public CreateWorkflowResponseDocument create(CreateWorkflowResourceDocument in)throws Exception{ + String uid=Utilities.newUniqueID(); + String clientName=getClient().getDistinguishedName(); + logger.info("Creating new workflow instance <"+uid+"> for client "+clientName); + owners.put(uid, clientName); + Home workflowHome=Kernel.getKernel().getServiceHome(WorkflowInstance.SERVICE_NAME); + Map<String,Object>map=new HashMap<String,Object>(); + map.put(INITPARAM_SECURITYCONTEXT, getSecurityContext()); + map.put(WorkflowInstance.INIT_UNIQUE_ID, uid); + map.put(WorkflowInstance.INITPARAM_PARENTID, getUniqueID()); + String name=in.getCreateWorkflowResource().getWorkflowName(); + if(name!=null)map.put(WorkflowInstance.INITPARAM_WORKFLOW_NAME, name); + if(in.getCreateWorkflowResource().getTerminationTime()!=null){ + java.util.Calendar tt=in.getCreateWorkflowResource().getTerminationTime().getCalendarValue(); + if(tt!=null){ + map.put(WorkflowInstance.INIT_INITIAL_TERMINATION_TIME, tt); + } + } + workflowHome.createWSRFServiceInstance(map); + + EndpointReferenceType epr=AddressingUtil.newEPR(); + AddressingUtil.addPortType(epr, WorkflowInstance.PORTTYPE); + epr.addNewAddress().setStringValue(Utilities.makeAddress(WorkflowInstance.SERVICE_NAME, uid)); + CreateWorkflowResponseDocument res=CreateWorkflowResponseDocument.Factory.newInstance(); + res.addNewCreateWorkflowResponse().setEndpointReference(epr); + ((WorkflowReferenceRP)properties.get(RP_WORKFLOW_REFS)).add(res.getCreateWorkflowResponse().getEndpointReference()); + setDirty(); + return res; + } + + + @Override + public void initialise(String arg0, Map<String, Object> arg1) throws Exception { + super.initialise(arg0, arg1); + addDelegates(); + + properties.put(RP_WORKFLOW_REFS, new WorkflowReferenceRP()); + properties.put(RP_FILTERED_WORKFLOW_REFS, new FilteredWorkflowReferenceRP(this)); + properties.put(RP_DIALECTS, new DialectsResourceProperty()); + properties.put(RP_Applications, new ApplicationsResourceProperty()); + Boolean val=(Boolean)arg1.get(UASWSResourceImpl.INITPARAM_PUBLISH_TO_REGISTRY); + if(Boolean.TRUE.equals(val)){ + try{ + publish(); + }catch(Exception e){ + LogUtil.logException("Could not publish to registry",e,logger); + } + } + } + + + @Override + public void activate(Map<String, Serializable> arg0) { + super.activate(arg0); + addDelegates(); + } + + @Override + public void customPostActivate(){ + //check for deleted workflow instances and remove them... + try{ + logger.trace("Getting messages from queue "+getUniqueID()); + PullPoint p=MessagingImpl.get().getPullPoint(getUniqueID()); + WorkflowReferenceRP wfRef=(WorkflowReferenceRP)properties.get(RP_WORKFLOW_REFS); + while(p.hasNext()){ + String m=(String)p.next().getBody(); + logger.trace("Read: "+m); + if(m.startsWith("deleted:")){ + String id=m.substring(m.indexOf(":")+1); + logger.debug("Removing workflow instance with ID "+id+"..."); + wfRef.remove(id); + owners.remove(id); + setDirty(); + } + } + }catch(Exception e){ + LogUtil.logException("Error in customPostActivate()",e,logger); + } + } + + public String getOwnerForWorkflow(String workflowID){ + return owners.get(workflowID); + } + + //hook for adding delegates + protected void addDelegates(){ + //Groovy scripting voodoo support + //TODO need some checking/sandboxing of the groovy ;-) + dslDelegates.put(GroovyDelegate.DIALECT, new GroovyDelegate()); + } + + @Override + public QName getPortType() { + return IWorkflowFactory.PORTTYPE; + } + + public WorkflowReferenceRP getWorkflowReferenceProperty(){ + return (WorkflowReferenceRP)properties.get(RP_WORKFLOW_REFS); + } + + public static void addDelegate(String dialect, DSLDelegate delegate){ + dslDelegates.put(dialect, delegate); + } + + public static DSLDelegate getDelegate(String dialect){ + return dslDelegates.get(dialect); + } + + public static String[] getDialects(){ + return (String[])dslDelegates.keySet().toArray(new String[0]); + } + + +} + Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowHome.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowHome.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowHome.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,13 @@ +package org.chemomentum.dsws; + +import de.fzj.unicore.uas.impl.UASWSResourceHomeImpl; +import de.fzj.unicore.wsrflite.WSRFInstance; + +public class WorkflowHome extends UASWSResourceHomeImpl { + + @Override + protected WSRFInstance doCreateInstance() { + return new WorkflowInstance(); + } + +} Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,476 @@ +package org.chemomentum.dsws; + +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +import javax.xml.namespace.QName; + +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlObject; +import org.chemomentum.common.util.Config; +import org.chemomentum.common.ws.WorkflowManagement; +import org.chemomentum.dsws.datamanagement.StoreWorkflowMetadata; +import org.chemomentum.dsws.rp.DetailedStatusResourceProperty; +import org.chemomentum.dsws.rp.JobReferenceRP; +import org.chemomentum.dsws.rp.OutputFilesResourceProperty; +import org.chemomentum.dsws.rp.StatusResourceProperty; +import org.chemomentum.traceproducer.ITraceProducer; +import org.chemomentum.traceproducer.NonBlockingTracer; +import org.chemomentum.tracer.xmlbeans.EntryDocument.Entry; +import org.chemomentum.workflow.xmlbeans.AbortWorkflowRequestDocument; +import org.chemomentum.workflow.xmlbeans.AbortWorkflowResponseDocument; +import org.chemomentum.workflow.xmlbeans.DetailedStatusDocument; +import org.chemomentum.workflow.xmlbeans.LocationMapperAddressDocument; +import org.chemomentum.workflow.xmlbeans.StatusType; +import org.chemomentum.workflow.xmlbeans.SubmissionTimeDocument; +import org.chemomentum.workflow.xmlbeans.SubmitWorkflowDocument; +import org.chemomentum.workflow.xmlbeans.SubmitWorkflowResponseDocument; +import org.chemomentum.workflow.xmlbeans.SubmitWorkflowType; +import org.chemomentum.workflow.xmlbeans.SubmittedWorkflowDocument; +import org.chemomentum.workflow.xmlbeans.TracerAddressDocument; +import org.chemomentum.workflow.xmlbeans.WorkflowNameDocument; +import org.chemomentum.workflow.xmlbeans.WorkflowResourcePropertiesDocument; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.uas.client.BaseUASClient; +import de.fzj.unicore.uas.impl.UASWSResourceImpl; +import de.fzj.unicore.uas.security.IUASSecurityProperties; +import de.fzj.unicore.uas.security.SecurityManager; +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.wsrflite.ResourcePool; +import de.fzj.unicore.wsrflite.messaging.Message; +import de.fzj.unicore.wsrflite.messaging.MessagingImpl; +import de.fzj.unicore.wsrflite.messaging.PullPoint; +import de.fzj.unicore.wsrflite.persistence.Persist; +import de.fzj.unicore.wsrflite.xmlbeans.BaseFault; +import de.fzj.unicore.wsrflite.xmlbeans.rp.ImmutableResourceProperty; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.ProcessState; +import eu.unicore.workflow.pe.model.WorkflowContainer; + +/** + * a workflow instance + * + * @author schuller + */ +public class WorkflowInstance extends UASWSResourceImpl implements WorkflowManagement { + + private static final long serialVersionUID = 1L; + + public static final String INITPARAM_DIALECT="dialect"; + + public static final String INITPARAM_PROCESSID="processid"; + + public static final String INITPARAM_PARENTID="processid"; + + public static final String INITPARAM_SUBMITTED_WORKFLOW="submitted_wf"; + + public static final String INITPARAM_ATTRIBUTES="attributes"; + + public static final String INITPARAM_WORKFLOW_NAME="workflowname"; + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,WorkflowInstance.class); + + /** + * TODO move to interface + * Resource property for the EPR of the location mapper used + */ + public static final QName RPLocationMapperAddress=LocationMapperAddressDocument.type.getDocumentElementName(); + + /** + * TODO move to interface + * Resource property for the human-friendly workflow name + */ + public static final QName RPWorkflowName=WorkflowNameDocument.type.getDocumentElementName(); + + @Persist + private String dialect; + + @Persist + private String parentID; + + @Persist + private ConversionResult conversionResult; + + @Persist + private StatusType.Enum workflowStatus; + + private DetailedStatusDocument detailedStatus=null; + + private boolean haveStatusUpdate=false; + + private transient static ITraceProducer tracer = new NonBlockingTracer(Config.getSecurityProperties()); + + @Override + public QName getResourcePropertyDocumentQName() { + return WorkflowResourcePropertiesDocument.type.getDocumentElementName(); + } + + @Override + public QName getPortType() { + return WorkflowManagement.PORTTYPE; + } + + @Override + @SuppressWarnings("unchecked") + public void initialise(String serviceName, Map<String, Object> initMap) throws Exception { + super.initialise(serviceName, initMap); + workflowStatus=StatusType.UNDEFINED; + dialect=(String)initMap.get(INITPARAM_DIALECT); + parentID=(String)initMap.get(INITPARAM_PARENTID); + String wfName=(String)initMap.get(INITPARAM_WORKFLOW_NAME); + if(wfName!=null){ + WorkflowNameDocument n=WorkflowNameDocument.Factory.newInstance(); + n.setWorkflowName(wfName); + properties.put(RPWorkflowName,new ImmutableResourceProperty(n)); + } + //make rps + addStatusResourceProperty(); + + SubmitWorkflowType submitted=(SubmitWorkflowType)initMap.get(INITPARAM_SUBMITTED_WORKFLOW); + SubmittedWorkflowDocument doc=SubmittedWorkflowDocument.Factory.newInstance(); + doc.setSubmittedWorkflow(submitted); + properties.put(RPSubmittedWorkflow,new ImmutableResourceProperty(doc)); + properties.put(RPJobReference,new JobReferenceRP()); + + try{ + //tracer epr + List<EndpointReferenceType> eprs = Config.getTracerEprs(); + if(eprs.size() == 0) + { + logger.warn("Could not find the Tracer Service!"); + return; + } + EndpointReferenceType epr = eprs.get(0); + TracerAddressDocument tad=TracerAddressDocument.Factory.newInstance(); + tad.setTracerAddress(epr); + properties.put(RPTracerAddress,new ImmutableResourceProperty(tad)); + }catch(Exception ex){ + LogUtil.logException("Could not create tracer address property.",ex,logger); + } + workflowStatus=StatusType.READY; + } + + public SubmitWorkflowResponseDocument submit(SubmitWorkflowDocument d) + throws Exception { + + setDirty(); + try{ + traceWorkflowSubmission(); + + dialect=d.getSubmitWorkflow().getWorkflow().getDialect(); + DSLDelegate del=WorkflowFactoryImpl.getDelegate(dialect); + if(del==null){ + throw new IllegalArgumentException("Dialect <"+dialect+"> not understood"); + } + conversionResult=del.addNewWorkflow(getUniqueID(),d.getSubmitWorkflow().getWorkflow(), d.getSubmitWorkflow().getRules(),getSecurityContext()); + + if(conversionResult.hasConversionErrors()){ + logger.info("Submitted workflow <"+getUniqueID()+"> contains errors, not submitting to process engine."); + } + else{ + logger.info("Start processing of workflow <"+getUniqueID()+">"); + PEConfig.getInstance().getProcessEngine().process(conversionResult.getConvertedWorkflow(),getSecurityContext()); + } + properties.put(RPOutputFiles,new OutputFilesResourceProperty(conversionResult)); + }catch(Exception e){ + LogUtil.logException("Error in submit.",e,logger); + throw BaseFault.createFault("Can't submit workflow: "+e.getMessage()); + } + + //if errors occured during conversion create an error msg and throw a BaseFault + if(conversionResult.hasConversionErrors()){ + StringBuilder msg=new StringBuilder(); + msg.append("Could not submit workflow. Workflow contains errors.\n"); + int i=1; + for(String s: conversionResult.getConversionErrors()){ + msg.append(i+": "+s+"\n"); + i++; + } + throw BaseFault.createFault(msg.toString()); + } + + try{ + SubmittedWorkflowDocument swf=SubmittedWorkflowDocument.Factory.newInstance(); + swf.setSubmittedWorkflow(d.getSubmitWorkflow()); + properties.put(RPSubmittedWorkflow, new ImmutableResourceProperty(swf)); + + SubmissionTimeDocument time=SubmissionTimeDocument.Factory.newInstance(); + time.setSubmissionTime(Calendar.getInstance()); + properties.put(RPSubmissionTime,new ImmutableResourceProperty(time)); + + addDetailedStatusResourceProperty(); + + SubmitWorkflowResponseDocument res=SubmitWorkflowResponseDocument.Factory.newInstance(); + res.addNewSubmitWorkflowResponse(); + workflowStatus=StatusType.READY; + + storeMetaData(); + + return res; + }catch(Exception e){ + LogUtil.logException("Error in submit.",e,logger); + throw BaseFault.createFault("Can't submit workflow: "+e.getMessage()); + } + + } + + protected void storeMetaData(){ + try{ + XmlObject workflow=properties.get(RPSubmittedWorkflow).getXml()[0]; + WorkflowNameDocument wfNameDoc=properties.get(RPWorkflowName)!=null? + ((WorkflowNameDocument)properties.get(RPWorkflowName).getXml()[0]): null; + String wfName=wfNameDoc!=null?wfNameDoc.getWorkflowName():getUniqueID(); + StoreWorkflowMetadata swmd=new StoreWorkflowMetadata(getUniqueID(),getSecurityTokens(),getOwner(),workflow,wfName); + //synchronous OK?! + swmd.run(); + }catch(Exception ex){ + LogUtil.logException("Could not store metadata",ex,logger); + } + } + + @Override + public void customPostActivate(){ + //check for new job instances and add them to the corresponding rp + try{ + PullPoint p=MessagingImpl.get().getPullPoint(getUniqueID()); + JobReferenceRP jobRef=(JobReferenceRP)properties.get(RPJobReference); + while(p.hasNext()){ + try{ + EndpointReferenceType epr=EndpointReferenceType.Factory.parse((String)p.next().getBody()); + logger.debug("Adding job instance with address "+epr); + jobRef.add(epr); + }catch(Exception ex){ + LogUtil.logException("Can't add job epr to job list in workflow "+getUniqueID(),ex,logger); + } + setDirty(); + } + }catch(Exception e){ + LogUtil.logException("Can't refresh job list in workflow "+getUniqueID(),e,logger); + } + } + + public AbortWorkflowResponseDocument abort( + AbortWorkflowRequestDocument workflow) throws Exception { + try{ + if(!canAbort())throw new Exception("Cannot abort: workflow status is "+workflowStatus); + getClient(); + PEConfig.getInstance().getProcessEngine().abort(getUniqueID(), getSecurityContext()); + workflowStatus=StatusType.ABORTED; + setDirty(); + AbortWorkflowResponseDocument res=AbortWorkflowResponseDocument.Factory.newInstance(); + res.addNewAbortWorkflowResponse(); + return res; + } + catch(Exception e){ + LogUtil.logException("Workflow not aborted.",e,logger); + throw e; + } + } + + //check if abort is possible + protected boolean canAbort(){ + getStatus(); + return workflowStatus.equals(StatusType.READY) + || workflowStatus.equals(StatusType.RUNNING) + || workflowStatus.equals(StatusType.USERINPUT_NEEDED); + } + + @Override + public void destroy() { + try{ + Message m=new Message(null,null,"deleted:"+getUniqueID()); + MessagingImpl.get().getChannel(parentID).publish(m); + } + catch(Exception e){ + LogUtil.logException("Could not send internal message.",e,logger); + } + try{ + //initiate cleanup task + final EndpointReferenceType[]jobs=((JobReferenceRP)properties.get(RPJobReference)).getProperty(); + final WorkflowContainer wfc=PEConfig.getInstance().getPersistence().read(getUniqueID()); + SecurityTokens tokens=(SecurityTokens)wfc.getSecurityContext().get(SecurityTokens.KEY); + final IUASSecurityProperties sp=SecurityManager.getClaimTrustDelegationProperties(tokens); + + Runnable r=new Runnable(){ + public void run(){ + //cleanup jobs + for(EndpointReferenceType job: jobs){ + try{ + logger.info("Delete job: "+job.getAddress().getStringValue()); + BaseUASClient b=new BaseUASClient(job.getAddress().getStringValue(),job,sp); + b.destroy(); + }catch(Exception e){ + LogUtil.logException("Could not delete job.",e,logger); + } + } + + try{ + PEConfig.getInstance().getPersistence().remove(getUniqueID()); + }catch(Exception e){ + LogUtil.logException("Could not delete persistent data for <"+getUniqueID()+">",e,logger); + } + } + }; + //execute asynchronusly + ResourcePool.getExecutorService().execute(r); + + //local cleanup... + //PEConfig.getInstance().clearBarrier(getUniqueID()); + + //more? + + }catch(Exception e){ + LogUtil.logException("Could not cleanup workflow <"+getUniqueID()+">",e); + } + + } + + protected void addStatusResourceProperty(){ + properties.put(RPWorkflowStatus, new StatusResourceProperty(this)); + } + + protected void addDetailedStatusResourceProperty(){ + properties.put(RPWorkflowDetailedStatus, new DetailedStatusResourceProperty(this)); + } + + public String getDialect(){ + return dialect; + } + + /** + * get the overall status + */ + public StatusType.Enum getStatus(){ + DetailedStatusDocument d=getDetailedStatus(); + workflowStatus=evaluateStatus(d); + if(logger.isDebugEnabled()){ + logger.debug("Workflow "+getUniqueID()+" is "+workflowStatus); + } + return workflowStatus; + } + + /** + * queries the current detailed status from the DSL delegate + * @return + */ + public DetailedStatusDocument getDetailedStatus(){ + if(haveStatusUpdate==true){ + haveStatusUpdate=false; + return detailedStatus; + } + try{ + DSLDelegate dsl=WorkflowFactoryImpl.getDelegate(getDialect()); + if(dsl!=null){ + detailedStatus=dsl.getDetailedStatus(getUniqueID(),conversionResult,getSecurityContext()); + haveStatusUpdate=true; + return detailedStatus; + } + }catch(Exception e){ + LogUtil.logException("Could not get status!",e,logger); + } + DetailedStatusDocument dsd=DetailedStatusDocument.Factory.newInstance(); + dsd.addNewDetailedStatus(); + return dsd; + } + + protected StatusType.Enum evaluateStatus(DetailedStatusDocument d){ + ProcessState ps=ProcessState.UNDEFINED; + try{ + ps=PEConfig.getInstance().getProcessEngine().getProcessState(getUniqueID(), getSecurityContext()); + }catch(Exception e){ + LogUtil.logException("Can't get process state for <"+getUniqueID()+">",e,logger); + } + switch(ps){ + case ABORTED: return StatusType.ABORTED; + case COMPLETED: return StatusType.SUCCESSFUL; + case FAILED: return StatusType.FAILED; + } + + boolean processIsRunning=ProcessState.RUNNING.equals(ps); + + if(workflowStatus.equals(StatusType.ABORTED))return StatusType.ABORTED; + + String s=d.toString(); + + if(s.contains("FAILED")){ + return StatusType.FAILED; + } + + if(s.contains("RUNNING")){ + return StatusType.RUNNING; + } + + if(!processIsRunning && s.contains("SUCCESSFUL") && s.contains("NOT_STARTED")){ + return StatusType.SUCCESSFUL; + } + + if(processIsRunning){ // && s.contains("NOT_STARTED")){ + return StatusType.RUNNING; + } + + return StatusType.UNDEFINED; + } + + + private void traceWorkflowSubmission(){ + try{ + if(isTracing()){ + XmlObject req=XmlObject.Factory.parse("<ww:empty xmlns:ww=\"chemomentum.org/workflow/trace\"/>"); + trace(getClient().getDistinguishedName(),"Client", + getEPR().getAddress().getStringValue(), WorkflowManagement.SERVICE_NAME, "submitWorkflow", + getUniqueID(),req); + } + }catch(Exception e){ + LogUtil.logException("Trace problem",e,logger); + } + } + + public static boolean isTracing(){ + return PEConfig.getInstance().getTraceEnabled(); + } + + /** + * send a message to the trace service + * @param source_id + * @param source_type + * @param target_id + * @param target_type + * @param operation + * @param messageId + * @param message + */ + protected static void trace(String source_id, String source_type, String target_id, + String target_type, String operation, String messageId,XmlObject message) + { + if(source_id == null || source_type == null || target_id == null || target_type == null + || operation == null || messageId == null || message == null) + { + logger.warn("Not tracing message. Essential information missing:\n" + +"source id = "+source_id+"\n" + +"source type = "+source_type+"\n" + +"target id = "+target_id+"\n" + +"target type = "+target_type+"\n" + +"operation = "+operation+"\n" + +"message id = "+messageId+"\n" + +"message = "+message); + return; + } + try { + Entry entry = Entry.Factory.newInstance(); + entry.setSourceID(source_id); + entry.setSourceType(source_type); + entry.setTargetID(target_id); + entry.setTargetType(target_type); + entry.setOperation(operation); + entry.setMessageId(messageId); + entry.setMessage(message); + tracer.sendEntry(entry); + } catch (Exception e) { + LogUtil.logException("Could not send trace message.",e,logger); + } + } + +} Added: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java 2009-04-09 11:14:48 UTC (rev 4467) @@ -0,0 +1,189 @@ +package org.chemomentum.dsws.datamanagement; + +import java.io.FileNotFoundException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.Future; + +import javax.security.auth.x500.X500Principal; + +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlObject; +import org.chemomentum.common.ws.IAccessService; +import org.chemomentum.dataManagement.client.query.SimpleSchemaQuery; +import org.chemomentum.dataManagement.client.query.SimpleStoreQuery; +import org.chemomentum.dataManagement.client.store.StoreTable; +import org.chemomentum.dataManagement.client.util.SecureAccessService; +import org.chemomentum.dataManagement.common.api.Schema; +import org.chemomentum.dataManagement.common.api.util.SchemaHandler; +import org.chemomentum.dataManagement.common.api.util.SetEqualAttribute; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.uas.client.UASClientFactory; +import de.fzj.unicore.uas.impl.registry.RegistryHandler; +import de.fzj.unicore.uas.security.IUASSecurityProperties; +import de.fzj.unicore.uas.security.SecurityManager; +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.security.UASSecurityProperties; +import de.fzj.unicore.uas.util.AddressingUtil; + +/** + * Store metadata to the Chemomentum datamanagement system + * + * @author schuller + */ +public class StoreWorkflowMetadata implements Runnable{ + + private static Logger log=Logger.getLogger(StoreWorkflowMetadata.class); + + private final SecurityTokens tokens; + + private final Calendar submissionTime; + private final XmlObject workflow; + private final X500Principal owner; + private final String id; + private final String workflowName; + + private List<SecureAccessService>accessServices=null; + + private static Schema schema; + + public static final String FIXED_AS_ADDRESS="workflow.accessservice.address"; + public static final String FIXED_AS_DN="workflow.accessservice.dn"; + + + public StoreWorkflowMetadata(String id, SecurityTokens tokens, X500Principal owner, XmlObject workflow, String workflowName){ + this.tokens=tokens; + this.submissionTime=Calendar.getInstance(); + this.owner=owner; + this.workflow=workflow; + this.workflowName=workflowName; + this.id=id; + if(log.isDebugEnabled()){ + StringBuilder sb=new StringBuilder(); + sb.append("Workflow id: "+id+"\n"); + sb.append("Workflow owner: "+owner.getName()+"\n"); + sb.append("Workflow XML: "+workflow+"\n"); + log.debug("Storing metadata: "+sb.toString()); + } + } + + public void setAccessServices(List<SecureAccessService>accessServices){ + this.accessServices=accessServices; + } + + protected synchronized void initSchema(Collection<SecureAccessService>accessServices)throws Exception{ + if(schema!=null)return; + schema = SimpleSchemaQuery.getSchema(new String[]{"common"}, accessServices); + SchemaHandler.insertSchema(schema); + } + + public void run(){ + try{ + if(accessServices==null){ + setupAccessServices(); + } + if(accessServices==null || accessServices.size()==0){ + log.debug("No access service -- not storing any metadata."); + return; + } + final SimpleStoreQuery ssq=new SimpleStoreQuery(); + ssq.setSecureAccessServices(accessServices); + initSchema(accessServices); + StoreTable workflowTable=new StoreTable(SchemaHandler.getTable("common", "WorkflowInstance")); + workflowTable.setSetting( + new SetEqualAttribute(SchemaHandler.getSchemaAttribute( + "common","WorkflowInstance","SubmissionTime"), + submissionTime)); + + workflowTable.setSetting( + new SetEqualAttribute(SchemaHandler.getSchemaAttribute( + "common","WorkflowInstance","Name"), + workflowName)); + + workflowTable.setSetting( + new SetEqualAttribute(SchemaHandler.getSchemaAttribute( + "common","WorkflowInstance","WorkflowDescription"), + workflow.toString())); + + workflowTable.setSetting( + new SetEqualAttribute(SchemaHandler.getSchemaAttribute( + "common","WorkflowInstance","Owner"), + owner.getName())); + + workflowTable.setSetting( + new SetEqualAttribute(SchemaHandler.getSchemaAttribute( + "common","WorkflowInstance","UnicoreWorkflowID"), + id)); + + ssq.addStoreTable(workflowTable); + + Collection<Future<?>> futures = ssq.start(); + for (Future<?> future : futures) { + Object res=future.get(); + System.out.println(res); + } + + } + catch(Exception e){ + log.error("Could not store workflow metadata.",e); + } + } + + private void setupAccessServices()throws Exception{ + String configuredAS=UAS.getProperty(FIXED_AS_ADDRESS); + if(configuredAS!=null){ + setupConfiguredAccessService(configuredAS); + } + else findAccessServices(); + } + + private void setupConfiguredAccessService(String address)throws Exception{ + String receiver=UAS.getProperty(FIXED_AS_DN); + UASSecurityProperties sp=SecurityManager.getClaimTrustDelegationProperties(tokens); + sp.setReceiver(new X500Principal(receiver)); + IAccessService as = (IAccessService) new UASClientFactory(sp).createPlainWSProxy(IAccessService.class, address, sp); + SecureAccessService lm=new SecureAccessService(new URI(address),as,sp); + accessServices=new ArrayList<SecureAccessService>(); + accessServices.add(lm); + log.info("Using fixed access service at <"+address+"> to store metadata."); + } + + /** + * find access services in the registry + * @throws FileNotFoundException - when no AS found + * @throws Exception - other errors (e.g. remoting) + */ + private synchronized void findAccessServices()throws Exception{ + List<EndpointReferenceType> available=new ArrayList<EndpointReferenceType>(); + // ... find available AccessService(s) + if(RegistryHandler.usesExternalRegistry()){ + available=RegistryHandler.getExternalRegistryClient().listServices(IAccessService.PORT); + if(available.size()==0){ + log.debug("No access service available! Not storin... [truncated message content] |
From: <bsc...@us...> - 2009-04-15 07:40:54
|
Revision: 4496 http://unicore.svn.sourceforge.net/unicore/?rev=4496&view=rev Author: bschuller Date: 2009-04-15 07:40:45 +0000 (Wed, 15 Apr 2009) Log Message: ----------- convert tests from junit to testng Modified Paths: -------------- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestAppWrapper.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java workflow/trunk/workflowservice/testng-unittests.xml Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestAppWrapper.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestAppWrapper.java 2009-04-15 07:05:30 UTC (rev 4495) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestAppWrapper.java 2009-04-15 07:40:45 UTC (rev 4496) @@ -1,20 +1,20 @@ package org.chemomentum.dsws; -import junit.framework.TestCase; - import org.chemomentum.dsws.rp.ApplicationsResourceProperty.AppWrapper; +import org.testng.annotations.Test; -public class TestAppWrapper extends TestCase { +public class TestAppWrapper { + @Test public void testEquality(){ AppWrapper a1=new AppWrapper("Date","1.0"); AppWrapper a2=new AppWrapper("Date","1.0"); - assertEquals(a1,a2); + assert(a1.equals(a2)); AppWrapper a3=new AppWrapper("Date","2.0"); - assertFalse(a1.equals(a3)); + assert(!a1.equals(a3)); AppWrapper a4=new AppWrapper("Date",null); - assertEquals(a1,a4); - assertEquals(a3,a4); + assert(a1.equals(a4)); + assert(a3.equals(a4)); } } Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java 2009-04-15 07:05:30 UTC (rev 4495) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java 2009-04-15 07:40:45 UTC (rev 4496) @@ -3,6 +3,8 @@ import org.chemomentum.common.ws.IWorkflowFactory; import org.chemomentum.workflow.xmlbeans.CreateWorkflowResourceDocument; import org.chemomentum.workflow.xmlbeans.CreateWorkflowResponseDocument; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import de.fzj.unicore.wsrflite.xmlbeans.client.BaseWSRFClient; @@ -12,6 +14,7 @@ private MockDelegate fooMock=new MockDelegate("foo"); private MockDelegate barMock=new MockDelegate("bar"); + @BeforeClass protected void setUp()throws Exception{ //add some dialects WorkflowFactoryImpl.addDelegate(fooMock.getDialect(), fooMock); @@ -19,6 +22,7 @@ super.setUp(); } + @Test public void test1(){ try{ String rd=wssClient.getResourceProperty(WorkflowFactoryImpl.RP_DIALECTS); @@ -30,6 +34,7 @@ } } + @Test public void test2(){ try{ //make a client and submit a workflow Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java 2009-04-15 07:05:30 UTC (rev 4495) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java 2009-04-15 07:40:45 UTC (rev 4496) @@ -5,6 +5,8 @@ import org.chemomentum.common.impl.workflow.WorkflowSubmissionClient; import org.chemomentum.dsws.groovy.GroovyDelegate; import org.chemomentum.workflow.xmlbeans.WorkflowDocument.Workflow; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; /** * some tests on basic service deployment @@ -13,6 +15,7 @@ private MockDelegate fooMock=new MockDelegate("foo"); + @BeforeClass protected void setUp()throws Exception{ //add a dialect WorkflowFactoryImpl.addDelegate(fooMock.getDialect(), fooMock); @@ -20,7 +23,7 @@ super.setUp(); } - + @Test public void test1(){ try{ WorkflowSubmissionClient wfs=new WorkflowSubmissionClient(wssClient.getEPR().getAddress().getStringValue(),wssClient.getEPR(),wssClient.getSecurityProperties()); Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java 2009-04-15 07:05:30 UTC (rev 4495) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java 2009-04-15 07:40:45 UTC (rev 4496) @@ -5,6 +5,7 @@ import org.chemomentum.common.ws.WorkflowManagement; import org.chemomentum.dsws.util.SetupWorkflowService; import org.chemomentum.workflow.callback.CallbackImpl; +import org.testng.annotations.BeforeClass; import org.w3.x2005.x08.addressing.EndpointReferenceType; import de.fzj.unicore.uas.Registry; @@ -20,7 +21,8 @@ public abstract class WSSTestBase extends JettyTestCase { protected static BaseUASClient wssClient; - + + @BeforeClass protected void setUp()throws Exception{ try{ super.setUp(); Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-04-15 07:05:30 UTC (rev 4495) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-04-15 07:40:45 UTC (rev 4496) @@ -1,5 +1,7 @@ <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="U6-workflow-unittests"> + + <!-- Backend tests --> <test verbose="2" name="XNJS setup" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> @@ -30,9 +32,22 @@ <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> </classes> </test> - <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> + <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> </classes> </test> + + <!-- Frontend --> + <test verbose="2" name="App wrapper" annotations="JDK"> + <classes> + <class name="org.chemomentum.dsws.TestAppWrapper"/> + </classes> + </test> + <test verbose="2" name="Service tests" annotations="JDK"> + <classes> + <class name="org.chemomentum.dsws.TestDelegates"/> + <class name="org.chemomentum.dsws.TestSubmissionClient"/> + </classes> + </test> </suite> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-04-15 14:38:06
|
Revision: 4499 http://unicore.svn.sourceforge.net/unicore/?rev=4499&view=rev Author: bschuller Date: 2009-04-15 14:37:51 +0000 (Wed, 15 Apr 2009) Log Message: ----------- add SO communication; start callback stuff Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/CallbackImpl.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/MockDelegate.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Publisher.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentUtils.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestUtils.java Removed Paths: ------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,288 @@ +package eu.unicore.workflow.pe.messaging; + +import java.util.Calendar; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.apache.log4j.Logger; +import org.apache.xmlbeans.XmlObject; +import org.chemomentum.common.util.Config; +import org.chemomentum.common.ws.Callback; +import org.chemomentum.common.ws.IServiceOrchestrator; +import org.chemomentum.common.ws.IWorkflowFactory; + +import org.chemomentum.traceproducer.ITraceProducer; +import org.chemomentum.traceproducer.NonBlockingTracer; +import org.chemomentum.tracer.xmlbeans.EntryDocument.Entry; +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; +import org.chemomentum.workflow.callback.xmlbeans.ErrorCodeType; +import org.chemomentum.workflow.callback.xmlbeans.NotifyFailedRequestDocument; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.uas.client.UASClientFactory; +import de.fzj.unicore.uas.security.IUASSecurityProperties; +import de.fzj.unicore.uas.security.SecurityManager; +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.security.UASSecurityProperties; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.wsrflite.Kernel; +import de.fzj.unicore.wsrflite.ResourcePool; +import de.fzj.unicore.wsrflite.messaging.IMessagingChannel; +import de.fzj.unicore.wsrflite.messaging.IMessagingProvider; +import de.fzj.unicore.wsrflite.messaging.Message; +import de.fzj.unicore.wsrflite.messaging.MessagingException; +import eu.unicore.workflow.pe.PEConfig; + + +public class Provider implements IMessagingProvider{ + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,Provider.class); + + private transient static ITraceProducer tracer = new NonBlockingTracer(Config.getSecurityProperties()); + + //message queue + private static ConcurrentLinkedQueue<Message> queue; + private static ScheduledExecutorService executor; + private static IUASSecurityProperties securityProperties = null; + private static Random random=new Random(); + + /** + * name of the messaging channel targeted at service orchestrators + */ + public static final String SO_CHANNEL="CHANNEL:org.chemomentum.messaging.destinations.serviceorchestrator"; + + /** + * for sending messages, this uses the pool of execution threads provided by wsrflite + */ + private static ExecutorService es=ResourcePool.getExecutorService(); + + public Provider() { + configure(); + } + + + + public IMessagingChannel getChannel() { + return new Publisher(); + } + + /** + * a channel for storing messages whose delivery failed + * for some reason. <br/> + * This implementation sends a message to the callback service + * @return + */ + public static Publisher getDeadLetterChannel() { + return new Publisher(){ + public void publish(Message message) throws MessagingException { + try{ + SOMessage soMessage=(SOMessage)message; + String waID=soMessage.getRequest().getSubmitWorkAssignmentRequest().getWorkAssignment().getId(); + String [] callbacks=soMessage.getRequest().getSubmitWorkAssignmentRequest().getWorkAssignment().getNotificationURLArray(); + for(String url: callbacks){ + try{ + Callback cb=new UASClientFactory(UAS.getSecurityProperties()).createPlainWSProxy(Callback.class, url, UAS.getSecurityProperties()); + NotifyFailedRequestDocument notification=NotifyFailedRequestDocument.Factory.newInstance(); + notification.addNewNotifyFailedRequest().setWorkAssignmentID(waID); + notification.getNotifyFailedRequest().setErrorCode(ErrorCodeType.NOT_SUBMITTED_TO_SO); + notification.getNotifyFailedRequest().setErrorDescription("Could not submit to service orchestrator."); + cb.notifyFailed(notification); + }catch(Exception e){ + logger.fatal("Could not send callback",e); + } + } + }catch(Exception e){ + logger.fatal("Could not send callback",e); + } + } + }; + } + + /** + * configure messaging + */ + public void configure() { + if(securityProperties == null) securityProperties = Config.getSecurityProperties(); + if(queue==null){ + queue=new ConcurrentLinkedQueue<Message>(); + //set up runner + Runnable runner=new Runner(); + executor = Executors.newScheduledThreadPool(1); + //check and send messages + executor.scheduleWithFixedDelay(runner,500,500,TimeUnit.MILLISECONDS); + } + } + + /** + * Runnable class that contains the queue polling and message + * sending code + */ + private final class Runner implements Runnable{ + public void run(){ + while(true){ + final Message msg=queue.poll(); + if(msg==null) break; + try{ + es.submit(new Runnable(){ + public void run(){ + try{ + doSend((SOMessage)msg); + }catch(MessagingException e){ + //place back into queue (try again later) + //sleep a bit to reduce load + if(isRecoverableError(e)){ + try{ + Thread.sleep(100); + }catch(InterruptedException ie){} + queue.add(msg); + + } + else{ + sendToDeadLetter(msg,e); + } + } + } + }); + }catch(RejectedExecutionException re){ + //place back into queue (try again later) + queue.add(msg); + }catch(Exception e){ + sendToDeadLetter(msg,e); + } + } + } + } + + static void sendToDeadLetter(Message m, Throwable cause){ + logger.info("Error sending message to serviceorchestrator, sending to dead letter channel instead."); + try{ + Provider.getDeadLetterChannel().publish(m); + } + catch(Exception t){ + logger.fatal("Error sending message to dead letter channel.",cause); + } + } + + public static boolean isRecoverableError(Exception e){ + if(e.getMessage().toLowerCase().contains("access denied"))return false; + + return true; + } + + /** + * send a message. Returns immediately, because the message is placed + * into a queue + * + * @param m + */ + public static void send(Message msg) { + queue.add(msg); + } + + /** + * send a single message + * @param msg + */ + private static void doSend(SOMessage msg) throws MessagingException{ + try{ + + //if a fixed SO is set, use it (intended for testing scenarios) + if(PEConfig.getInstance().getServiceOrchestrator()!=null){ + PEConfig.getInstance().getServiceOrchestrator().submitWorkAssignment(msg.getRequest()); + } + //in real life we need to configure a new SO proxy per call for + //security reasons + else{ + List<EndpointReferenceType>eprs=Config.getSOEprs(); + if(eprs.size()>0){ + EndpointReferenceType epr=select(eprs); + SecurityTokens st=msg.getTokens(); + UASSecurityProperties sp=SecurityManager.getIssueTrustDelegationProperties(st, epr); + if(logger.isDebugEnabled())logger.debug("Security Settings\n"+sp); + IServiceOrchestrator so=new UASClientFactory(sp).createPlainWSProxy(IServiceOrchestrator.class, epr.getAddress().getStringValue(), sp); + SubmitWorkAssignmentRequestDocument req=msg.getRequest(); + so.submitWorkAssignment(req); + + try{ + if(isTracing()){ + trace(Kernel.getKernel().getProperty(Kernel.WSRF_BASEURL),IWorkflowFactory.SERVICE_NAME, + epr.getAddress().getStringValue(), IServiceOrchestrator.ServiceName, "submitWorkAssignment", + "WA ID: "+req.getSubmitWorkAssignmentRequest().getWorkAssignment().getId(),req); + } + }catch(Exception e){ + logger.fatal("Trace problem!",e); + } + + } + else { + throw new Exception("No service orchestrator found."); + } + } + }catch(Exception e){ + logger.fatal("Could not send message.",e); + throw new MessagingException(e); + } + } + + //TODO policy on which SO to use? + private static EndpointReferenceType select(List<EndpointReferenceType> eprs){ + int l=random.nextInt(eprs.size()); + return eprs.get(l); + } + + public static boolean isTracing(){ + return PEConfig.getInstance().getTraceEnabled(); + } + + /** + * send a message to the trace service + * @param source_id + * @param source_type + * @param target_id + * @param target_type + * @param operation + * @param messageId + * @param message + */ + protected static void trace(String source_id, String source_type, String target_id, + String target_type, String operation, String messageId,XmlObject message) + { + if(source_id == null || source_type == null || target_id == null || target_type == null + || operation == null || messageId == null || message == null) + { + logger.warn("Not tracing message. Essential information missing:\n" + +"source id = "+source_id+"\n" + +"source type = "+source_type+"\n" + +"target id = "+target_id+"\n" + +"target type = "+target_type+"\n" + +"operation = "+operation+"\n" + +"message id = "+messageId+"\n" + +"message = "+message); + return; + } + try { + Entry entry = Entry.Factory.newInstance(); + entry.setSourceID(source_id); + entry.setSourceType(source_type); + entry.setTargetID(target_id); + entry.setTargetType(target_type); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(System.currentTimeMillis()); + entry.setTimeStamp(cal); + entry.setOperation(operation); + entry.setMessageId(messageId); + entry.setMessage(message); + tracer.sendEntry(entry); + } catch (Exception e) { + logger.fatal("Could not trace message.",e); + } + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Publisher.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Publisher.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Publisher.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,13 @@ +package eu.unicore.workflow.pe.messaging; + +import de.fzj.unicore.wsrflite.messaging.IMessagingChannel; +import de.fzj.unicore.wsrflite.messaging.Message; +import de.fzj.unicore.wsrflite.messaging.MessagingException; + +public class Publisher implements IMessagingChannel{ + + public void publish(Message msg) throws MessagingException { + Provider.send(msg); + } + +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,35 @@ +package eu.unicore.workflow.pe.messaging; + +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; + +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.wsrflite.messaging.Message; + +public class SOMessage extends Message { + + private static final long serialVersionUID = 1L; + + private final SubmitWorkAssignmentRequestDocument req; + + private final SecurityTokens tokens; + + private final String parent; + + public SOMessage(SubmitWorkAssignmentRequestDocument req, SecurityTokens tokens){ + this.req=req; + this.tokens=tokens; + this.parent=req.getSubmitWorkAssignmentRequest().getWorkAssignment().getParent(); + } + + public SubmitWorkAssignmentRequestDocument getRequest() { + return req; + } + + public SecurityTokens getTokens() { + return tokens; + } + + public String getParentWorkflow(){ + return parent; + } +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,39 @@ +package eu.unicore.workflow.pe.messaging; + +import org.apache.log4j.Logger; +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; + +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.wsrflite.Kernel; +import de.fzj.unicore.wsrflite.messaging.MessagingException; + +/** + * a non-blocking sender to service orchestrators. + * Will issue a callback in case sending a message to the SO fails + * <br/> + * underneath this uses the WSRFlite message system + * + * @author schuller + */ +public class SOSender { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,SOSender.class); + + public SOSender(){ + Kernel.getMessaging().registerProvider(new Provider(),Provider.SO_CHANNEL); + } + + public void submitWorkAssignment(SubmitWorkAssignmentRequestDocument in, SecurityTokens tokens) throws MessagingException{ + SOMessage msg=new SOMessage(in,tokens); + if(logger.isDebugEnabled()){ + try{ + logger.debug("Sending message to service orchestrator\n"+msg.getRequest()); + }catch(Exception e){ + LogUtil.logException("No message.",e,logger); + } + } + Kernel.getMessaging().getChannel(Provider.SO_CHANNEL).publish(msg); + } + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -1,5 +1,8 @@ package eu.unicore.workflow.pe.model; +import java.util.HashMap; +import java.util.Map; + import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; /** @@ -20,6 +23,11 @@ private JobDefinitionDocument jobDefinition; + private final Map<String,String>options=new HashMap<String,String>(); + + //count (re)submissions of the same workassignment + private int submissionCounter=0; + public JSDLExecutionActivity(String id, String workflowID){ super(id, workflowID); } @@ -35,4 +43,34 @@ public String getType(){ return ACTION_TYPE; } + + public int getSubmissionCounter() { + return submissionCounter; + } + + public void incrementSubmissionCounter() { + submissionCounter++; + } + + /** + * gets an option + * + * @param key - the option to retrieve + * @return the option value + */ + public String getOption(String key){ + return options.get(key); + } + + /** + * sets an option + * + * @param key + * @param value + * @return the value previously mapped to the key (see also Map.put()) + */ + public String setOption(String key, String value){ + return options.put(key,value); + } + } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,166 @@ +package eu.unicore.workflow.pe.util; + +import org.apache.log4j.Logger; +import org.chemomentum.common.util.jsdl.Input; +import org.chemomentum.common.util.jsdl.JSDLUtils; +import org.chemomentum.common.util.jsdl.Output; +import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; + +import de.fzj.unicore.uas.util.LogUtil; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * this filter inserts variables from the workflow context into + * the job definition in a workassignment + * + * @author schuller + */ +public class InsertVariablesFilter { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,InsertVariablesFilter.class); + + private final ProcessVariables context; + + public InsertVariablesFilter(ProcessVariables context){ + this.context=context; + } + + /** + * 1) extract inputs where source is the workflow context and target + * the environment. Create environment variables from these. <br/> + * 2) replace occurences of "${VARIABLENAME}" in stagein/stageout + * by the appropriate values + * 3) replace occurences of "${VARIABLENAME}" in job name + * + */ + public WorkAssignmentDocument filter(WorkAssignmentDocument wa) { + try{ + JobDefinitionDocument job=JobDefinitionDocument.Factory.newInstance(); + job.setJobDefinition(wa.getWorkAssignment().getWork().getJobDefinition()); + JSDLUtils ju=new JSDLUtils(job); + POSIXApplicationDocument pApp=ju.getPOSIXApplicationCopy(); + if(pApp==null){ + pApp=POSIXApplicationDocument.Factory.newInstance(); + pApp.addNewPOSIXApplication(); + } + + replaceVariablesInStagingSections(ju, pApp); + + replaceVariablesInJobName(ju); + + setEnvironmentVariables(ju); + + insertContextVariablesIntoEnvironment(pApp); + + ju.setPOSIXApplication(pApp); + wa.getWorkAssignment().getWork().setJobDefinition(ju.getJsdl().getJobDefinition()); + + return wa; + + }catch(Exception e){ + logger.warn("Can't process workassignment document",e); + return wa; + } + } + + protected void replaceVariablesInStagingSections(JSDLUtils ju, POSIXApplicationDocument pApp){ + for(Input t: ju.getInputs()){ + if(isEnv(t.getTarget())&& isContext(t.getSource())){ + EnvironmentType env=pApp.getPOSIXApplication().addNewEnvironment(); + env.setName(t.getTarget().replace("env://", "")); + env.setStringValue(String.valueOf(context.get(t.getSource().replace("context://", "")))); + } + if(t.getSource().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getSource().contains(s)){ + t.setSource(t.getSource().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + if(t.getTarget().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getTarget().contains(s)){ + t.setTarget(t.getTarget().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + } + //remove inputs where source is context:// + ju.removeInputs("context"); + } + + protected void replaceVariablesInJobName(JSDLUtils ju){ + try{ + String jobName=ju.getJsdl().getJobDefinition().getJobDescription().getJobIdentification().getJobName(); + if(jobName.contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(jobName.contains(s)){ + jobName=jobName.replaceAll(p,String.valueOf(context.get(o))); + } + } + } + ju.getJsdl().getJobDefinition().getJobDescription().getJobIdentification().setJobName(jobName); + }catch(Exception ignored){} + } + + protected void insertContextVariablesIntoEnvironment(POSIXApplicationDocument pApp){ + for(EnvironmentType env: pApp.getPOSIXApplication().getEnvironmentArray()){ + String value=env.getStringValue(); + if(isContext(value)){ + Object oVal=context.get(stripContextMarker(value)); + if(oVal!=null){ + String newValue=oVal.toString(); + env.setStringValue(newValue); + } + } + } + } + + protected void setEnvironmentVariables(JSDLUtils ju){ + for(Output t: ju.getOutputs()){ + if(t.getSource().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getSource().contains(s)){ + t.setSource(t.getSource().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + if(t.getTarget().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getTarget().contains(s)){ + t.setTarget(t.getTarget().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + } + + } + + protected boolean isEnv(String s){ + return s!=null && s.startsWith("env://"); + } + + protected boolean isContext(String s){ + return s!=null && s.startsWith("context://"); + } + + private static int L="context://".length(); + + protected String stripContextMarker(String s){ + return s.substring(L); + } + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -64,7 +64,7 @@ * @return WorkAssignmentDocument */ public WorkAssignmentDocument getWorkAssignmentDocument(){ - WorkAssignmentDocument wa=WorkAssignmentConverter.fromJSON(json); + WorkAssignmentDocument wa=WorkAssignmentUtils.fromJSON(json); if(jsdl!=null){ if(posixApp!=null){ JSDLUtils.setPOSIXApplication(posixApp, getApplicationDocument()); Deleted: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -1,197 +0,0 @@ -package eu.unicore.workflow.pe.util; - -import org.apache.log4j.Logger; - -import org.chemomentum.common.util.json.JSONArray; -import org.chemomentum.common.util.json.JSONException; -import org.chemomentum.common.util.json.JSONObject; -import org.chemomentum.workassignment.xmlbeans.HostListType; -import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; -import org.chemomentum.workassignment.xmlbeans.WorkAssignmentType; -import org.chemomentum.workassignment.xmlbeans.WorkDocument.Work; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; -import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.ArgumentType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; -import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; - -import de.fzj.unicore.wsrflite.utils.Utilities; - -/** - * helper methods to build a workassignment from a JSON object - * - * @author schuller - * - */ -public class WorkAssignmentConverter implements WAConstants{ - - protected static Logger logger=Logger.getLogger(WorkAssignmentConverter.class); - - public static WorkAssignmentDocument fromJSON(JSONObject j){ - - WorkAssignmentDocument wad=WorkAssignmentDocument.Factory.newInstance(); - WorkAssignmentType wa=wad.addNewWorkAssignment(); - - try{ - wa.setBlackList(makeHostList(j.getJSONArray(BLACKLIST))); - }catch(JSONException e){} - - try{ - wa.setWhiteList(makeHostList(j.getJSONArray(WHITELIST))); - }catch(JSONException e){} - - try{ - JSONArray nUrls=j.getJSONArray(NOTIFICATION_URLS); - for(Object nUrl: nUrls){ - wa.addNewNotificationURL().setStringValue((String)nUrl); - } - }catch(JSONException e){} - - try{ - wa.setWork(makeWork(j.getJSONObject(WORK))); - }catch(JSONException e){} - - return wad; - } - - public static WorkAssignmentDocument fromJSON(String json){ - try{ - return fromJSON(new JSONObject(json)); - }catch(Exception e){ - logger.fatal("Could not parse JSON string",e); - } - return null; - } - - private static Work makeWork(JSONObject j)throws JSONException{ - Work work=Work.Factory.newInstance(); - work.setJobDefinition(makeJob(j)); - return work; - } - - private static HostListType makeHostList(JSONArray jList) throws JSONException{ - HostListType list=HostListType.Factory.newInstance(); - for(int i=0; i<jList.length();i++){ - list.addHost( (String)jList.getString(i)); - } - return list; - } - - - private static JobDefinitionType makeJob(JSONObject j)throws JSONException{ - JobDefinitionType job=JobDefinitionType.Factory.newInstance(); - - ApplicationDocument ad=ApplicationDocument.Factory.newInstance(); - ApplicationType app=ad.addNewApplication(); - try{ - app.setApplicationName(j.getString(APP_NAME)); - }catch(JSONException e){} - - try{ - app.setApplicationVersion(j.getString(APP_VERSION)); - }catch(JSONException e){} - - POSIXApplicationDocument pd=POSIXApplicationDocument.Factory.newInstance(); - POSIXApplicationType p=pd.addNewPOSIXApplication(); - try{ - String executable=j.getString(EXECUTABLE); - p.addNewExecutable().setStringValue(executable); - }catch(JSONException e){} - - try{ - p.setArgumentArray(makeArgs(j.getJSONArray(ARGUMENTS))); - }catch(JSONException e){} - try{ - p.setEnvironmentArray(makeEnvironment(j.getJSONArray(ENVIRONMENT))); - }catch(JSONException e){} - - Utilities.append(pd, ad); - return job; - } - - - private static ArgumentType[] makeArgs(JSONArray j) throws JSONException{ - ArgumentType[] args=new ArgumentType[j.length()]; - for (int i = 0; i < args.length; i++) { - args[i]=ArgumentType.Factory.newInstance(); - args[i].setStringValue(j.getString(i)); - } - return args; - } - - private static EnvironmentType[] makeEnvironment(JSONArray j) throws JSONException{ - EnvironmentType[] args=new EnvironmentType[j.length()]; - int i=0; - for(Object o: j){ - String[] split=((String)o).split("=",2); - args[i]=EnvironmentType.Factory.newInstance(); - args[i].setName(split[0].trim()); - if(split.length>1)args[i].setStringValue(split[1].trim()); - else args[i].setStringValue(""); - i++; - } - return args; - } - - - /** - * encode some parameters into a workassignment ID - * @param workflowID - the ID of the parent workflow - * @param specID - the ID of the workflow activity - * @param activityID - the XPDL activity as defined by Shark - * @param iteration, String submissionCounter - the submission count for this workassignment - * @return - */ - public static String getEncodedWorkAssignmentID(String workflowID, String specID, String activityID, String iteration, String submissionCounter){ - return workflowID+"/"+specID+"_"+activityID+"_"+iteration+"_"+submissionCounter; - } - - /** - * extract the workflow ID from a workassignment ID - * @param workAssignmentID - the encoded ID - * @return - */ - public static String getWorkflowIDFromEncodedWAID(String workAssignmentID){ - return workAssignmentID.split("/")[0]; - } - - /** - * extract the "specification ID" (i.e. workflow activity ID) from a workassignment ID - * @param workAssignmentID - the encoded ID - * @return - */ - public static String getSpecIDFromEncodedWAID(String workAssignmentID){ - return workAssignmentID.split("/")[1].split("_")[0]; - } - - /** - * extract the Shark XPDL activity ID from a workassignment ID - * @param workAssignmentID - the encoded ID - * @return - */ - public static String getActivityIDFromEncodedWAID(String workAssignmentID){ - return workAssignmentID.split("/")[1].split("_")[1]; - } - - /** - * extract the "specification ID" (i.e. workflow activity ID) from a workassignment ID - * @param workAssignmentID - the encoded ID - * @return - */ - public static String getIterationEncodedWAID(String workAssignmentID){ - return workAssignmentID.split("/")[1].split("_")[2]; - } - - /** - * extract the "specification ID" (i.e. workflow activity ID) from a workassignment ID - * @param workAssignmentID - the encoded ID - * @return - */ - public static String getSubmissionCounterEncodedWAID(String workAssignmentID){ - return workAssignmentID.split("/")[1].split("_")[3]; - } - - -} Copied: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentUtils.java (from rev 4468, workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentConverter.java) =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentUtils.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WorkAssignmentUtils.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,198 @@ +package eu.unicore.workflow.pe.util; + +import org.chemomentum.common.util.json.JSONArray; +import org.chemomentum.common.util.json.JSONException; +import org.chemomentum.common.util.json.JSONObject; +import org.chemomentum.workassignment.xmlbeans.HostListType; +import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; +import org.chemomentum.workassignment.xmlbeans.WorkAssignmentType; +import org.chemomentum.workassignment.xmlbeans.WorkDocument.Work; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationDocument; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.ArgumentType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationType; + +import de.fzj.unicore.wsrflite.utils.Utilities; +import eu.unicore.workflow.pe.model.Activity; + +/** + * WA utilities + * @author schuller + * + */ +public class WorkAssignmentUtils implements WAConstants{ + + public static WorkAssignmentDocument fromJSON(JSONObject j){ + + WorkAssignmentDocument wad=WorkAssignmentDocument.Factory.newInstance(); + WorkAssignmentType wa=wad.addNewWorkAssignment(); + + try{ + wa.setBlackList(makeHostList(j.getJSONArray(BLACKLIST))); + }catch(JSONException e){} + + try{ + wa.setWhiteList(makeHostList(j.getJSONArray(WHITELIST))); + }catch(JSONException e){} + + try{ + JSONArray nUrls=j.getJSONArray(NOTIFICATION_URLS); + for(Object nUrl: nUrls){ + wa.addNewNotificationURL().setStringValue((String)nUrl); + } + }catch(JSONException e){} + + try{ + wa.setWork(makeWork(j.getJSONObject(WORK))); + }catch(JSONException e){} + + return wad; + } + + private static Work makeWork(JSONObject j)throws JSONException{ + Work work=Work.Factory.newInstance(); + work.setJobDefinition(makeJob(j)); + return work; + } + + private static HostListType makeHostList(JSONArray jList) throws JSONException{ + HostListType list=HostListType.Factory.newInstance(); + for(int i=0; i<jList.length();i++){ + list.addHost( (String)jList.getString(i)); + } + return list; + } + + + private static JobDefinitionType makeJob(JSONObject j)throws JSONException{ + JobDefinitionType job=JobDefinitionType.Factory.newInstance(); + + ApplicationDocument ad=ApplicationDocument.Factory.newInstance(); + ApplicationType app=ad.addNewApplication(); + try{ + app.setApplicationName(j.getString(APP_NAME)); + }catch(JSONException e){} + + try{ + app.setApplicationVersion(j.getString(APP_VERSION)); + }catch(JSONException e){} + + POSIXApplicationDocument pd=POSIXApplicationDocument.Factory.newInstance(); + POSIXApplicationType p=pd.addNewPOSIXApplication(); + try{ + String executable=j.getString(EXECUTABLE); + p.addNewExecutable().setStringValue(executable); + }catch(JSONException e){} + + try{ + p.setArgumentArray(makeArgs(j.getJSONArray(ARGUMENTS))); + }catch(JSONException e){} + try{ + p.setEnvironmentArray(makeEnvironment(j.getJSONArray(ENVIRONMENT))); + }catch(JSONException e){} + + Utilities.append(pd, ad); + return job; + } + + + private static ArgumentType[] makeArgs(JSONArray j) throws JSONException{ + ArgumentType[] args=new ArgumentType[j.length()]; + for (int i = 0; i < args.length; i++) { + args[i]=ArgumentType.Factory.newInstance(); + args[i].setStringValue(j.getString(i)); + } + return args; + } + + private static EnvironmentType[] makeEnvironment(JSONArray j) throws JSONException{ + EnvironmentType[] args=new EnvironmentType[j.length()]; + int i=0; + for(Object o: j){ + String[] split=((String)o).split("=",2); + args[i]=EnvironmentType.Factory.newInstance(); + args[i].setName(split[0].trim()); + if(split.length>1)args[i].setStringValue(split[1].trim()); + else args[i].setStringValue(""); + i++; + } + return args; + } + + /** + * encode some parameters into a XNJS action ID + * + * @param workflowID + * @param activityID + * @param iteration + * + * @return a UUID (provided workflow ID is a UUID) + */ + public static String buildActionID(String workflowID, String activityID, String iteration){ + return workflowID+"/"+activityID+"_"+iteration; + } + + + /** + * encode some parameters into a workassignment ID + * @param workflowID - the ID of the parent workflow + * @param activityID - the ID of the underlying {@link Activity} + * @param iteration - the current iteration value + * @param submissionCounter - the submission count for this workassignment + * @return a UUID (provided workflow ID is a UUID) + */ + public static String getEncodedWorkAssignmentID(String workflowID, String activityID, String iteration, String submissionCounter){ + return buildActionID(workflowID, activityID, iteration)+"_"+submissionCounter; + } + + /** + * extract the workflow ID from a workassignment ID + * @param workAssignmentID - the encoded ID + * @return + */ + public static String getWorkflowIDFromEncodedWAID(String workAssignmentID){ + return workAssignmentID.split("/")[0]; + } + + /** + * extract the Activity id from a workassignment ID + * @param waID - the encoded ID + * @return + */ + public static String getActivityIDFromEncodedWAID(String waID){ + return waID.split("/")[1].split("_")[0]; + } + + + /** + * extract the XNJS Action UUID from a workassignment ID + * @param waID - the encoded ID + * @return + */ + public static String getActionIDFromEncodedWAID(String waID){ + return waID.substring(0, waID.lastIndexOf("_")); + } + + /** + * extract the "specification ID" (i.e. workflow activity ID) from a workassignment ID + * @param workAssignmentID - the encoded ID + * @return + */ + public static String getIterationFromEncodedWAID(String workAssignmentID){ + return workAssignmentID.split("/")[1].split("_")[2]; + } + + /** + * extract the "specification ID" (i.e. workflow activity ID) from a workassignment ID + * @param workAssignmentID - the encoded ID + * @return + */ + public static String getSubmissionCounterEncodedWAID(String workAssignmentID){ + return workAssignmentID.split("/")[1].split("_")[2]; + } + + +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -25,6 +25,7 @@ import eu.unicore.workflow.pe.persistence.SubflowContainer; import eu.unicore.workflow.pe.persistence.PEStatus; import eu.unicore.workflow.pe.persistence.WorkflowContainer; +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; /** * processes activity groups, i.e. both toplevel workflows and sub-workflows @@ -142,7 +143,8 @@ subAction.setType(a.getType()); subAction.setAjd(a); subAction.setClient(action.getClient()); - subAction.setUUID(a.getWorkflowID()+"_"+a.getID()+"_"+a.getIteration().getCurrentValue()); + String uid=WorkAssignmentUtils.buildActionID(a.getWorkflowID(), a.getID(), a.getIteration().getCurrentValue()); + subAction.setUUID(uid); subAction.getProcessingContext().put(ProcessVariables.class,vars); a.setStatus(ActivityStatus.RUNNING); PEStatus activityStatus=new PEStatus(); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -5,6 +5,9 @@ import de.fzj.unicore.xnjs.XNJS; import eu.unicore.workflow.pe.CallbackProcessor; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.persistence.WorkflowContainer; +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; public class CallbackProcessorImpl implements CallbackProcessor{ @@ -23,7 +26,6 @@ public void failed(String workAssignmentID, String errorCode, String errorDescription, EndpointReferenceType jobEPR) throws Exception { - // TODO Auto-generated method stub } @@ -35,8 +37,18 @@ public void submitted(String workAssignmentID, EndpointReferenceType jobEPR) throws Exception { - // TODO Auto-generated method stub - + String wfID=WorkAssignmentUtils.getWorkflowIDFromEncodedWAID(workAssignmentID); + WorkflowContainer wfc=PEConfig.getInstance().getPersistence().getForUpdate(wfID); + try{ + + } + finally{ + if(wfc!=null)PEConfig.getInstance().getPersistence().write(wfc); + } } + private String getActionID(String waID){ + return WorkAssignmentUtils.getActionIDFromEncodedWAID(waID); + } + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -12,10 +12,7 @@ import eu.unicore.workflow.pe.model.util.VariableUtil; /** - * Processes a single workflow activity<br/> - * It will submit workassignments until it succeeded or failed (subject to - * business rules) - * + * Processes a variable declaration * @author schuller */ public class DeclarationActivityProcessor extends DefaultProcessor { Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,119 @@ +package eu.unicore.workflow.pe.xnjs; + +import java.util.Map; + +import org.apache.log4j.Logger; +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; +import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; + +import de.fzj.unicore.uas.security.SecurityTokens; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.xnjs.Configuration; +import de.fzj.unicore.xnjs.ems.ActionResult; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.messaging.SOSender; +import eu.unicore.workflow.pe.model.JSDLExecutionActivity; +import eu.unicore.workflow.pe.util.InsertVariablesFilter; +import eu.unicore.workflow.pe.util.WABuilder; +import eu.unicore.workflow.pe.util.WAConstants; + +/** + * Processes a single workflow activity<br/> + * It will submit workassignments until it succeeded or failed (subject to + * business rules) + * + * @author schuller + */ +public class JSDLExecutionActivityProcessor extends DefaultProcessor { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,JSDLExecutionActivityProcessor.class); + + private transient static final SOSender sender=new SOSender(); + + public JSDLExecutionActivityProcessor(Configuration configuration) { + super(configuration); + } + + @Override + protected void handleCreated() throws ProcessingException { + action.setStatus(ActionStatus.RUNNING); + action.addLogTrace("Status set to RUNNING."); + JSDLExecutionActivity work=(JSDLExecutionActivity)action.getAjd(); + String iteration=work.getIteration().getCurrentValue(); + logger.info("Start processing work assignment exacution for activity <"+work.getID()+"> in iteration <"+iteration+">"); + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + if(vars==null){ + vars=new ProcessVariables(); + action.getProcessingContext().put(ProcessVariables.class,vars); + } + vars.put("CURRENT_TOTAL_ITERATOR",iteration); + submitToSO(work); + //callback will wake it up again... + //TODO need also slow polling in case we miss a message from the SO! + action.setWaiting(true); + } + + private void submitToSO(JSDLExecutionActivity work){ + WABuilder builder=new WABuilder(); + builder.setJsdl(work.getJobDefinition()); + + //TODO + boolean noWait=Boolean.parseBoolean(work.getOption(WAConstants.NOWAIT)); + + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + for(String var: vars.keySet()){ + builder.withEnvironment(var+"="+vars.get(var)); + } + + WorkAssignmentDocument wa=new InsertVariablesFilter(vars).filter(builder.getWorkAssignmentDocument()); + //generate the unique workassignment id that includes the workflow id + String workflowID=work.getWorkflowID(); + //add a disambiguator in case of re-submits? + String waID=action.getUUID()+"_"+work.getSubmissionCounter(); + + wa.getWorkAssignment().setId(waID); + wa.getWorkAssignment().setParent(workflowID); + wa.getWorkAssignment().addNewNotificationURL().setStringValue(PEConfig.getInstance().getCallbackURL()); + + /** + * send the workassignment + */ + SubmitWorkAssignmentRequestDocument in=SubmitWorkAssignmentRequestDocument.Factory.newInstance(); + in.addNewSubmitWorkAssignmentRequest().setWorkAssignment(wa.getWorkAssignment()); + try{ + Map<String,Object>securityContext=PEConfig.getInstance().getPersistence().read(workflowID).getSecurityContext(); + SecurityTokens tokens=securityContext!=null?(SecurityTokens)securityContext.get(SecurityTokens.KEY):null; + work.incrementSubmissionCounter(); + sender.submitWorkAssignment(in, tokens); + }catch(Exception e){ + String msg="Problem creating/sending message to service orchestrator."; + LogUtil.logException(msg,e); + setToDoneAndFailed(msg); + } + + } + + private void setToDoneSuccessfully(){ + action.setStatus(ActionStatus.DONE); + action.addLogTrace("Status set to DONE."); + action.setResult(new ActionResult(ActionResult.SUCCESSFUL,"Success.",0)); + action.addLogTrace("Result: Success."); + logger.info("Action "+action.getUUID()+ " SUCCESSFUL."); + } + + private void setToDoneAndFailed(String errorMessage){ + action.fail(); + action.getResult().setErrorMessage(errorMessage); + logger.info("Action "+action.getUUID()+ " FAILED: "+errorMessage); + } + + + @Override + protected void handleRunning(){ + setToDoneSuccessfully(); + } + +} Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/ConversionResult.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -17,7 +17,7 @@ private static final long serialVersionUID = 1L; - private String processID; + private String workflowID; private String dialect; @@ -59,12 +59,12 @@ this.dialect=dialect; } - public String getProcessID(){ - return processID; + public String getWorkflowID(){ + return workflowID; } - public void setProcessID(String id){ - processID=id; + public void setWorkflowID(String id){ + workflowID=id; } public List<String> getOutputFiles(){ Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/CallbackImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/CallbackImpl.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/workflow/callback/CallbackImpl.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -22,7 +22,7 @@ import de.fzj.unicore.wsrflite.messaging.Message; import de.fzj.unicore.wsrflite.messaging.MessagingImpl; import eu.unicore.workflow.pe.PEConfig; -import eu.unicore.workflow.pe.util.WorkAssignmentConverter; +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; /** * Implementation of the callback interface<br/> @@ -57,7 +57,7 @@ res.addNewNotifySubmittedResponse(); //put job EPR to workflow properties try{ - String workflowID=WorkAssignmentConverter.getWorkflowIDFromEncodedWAID(workAssignmentId); + String workflowID=WorkAssignmentUtils.getWorkflowIDFromEncodedWAID(workAssignmentId); EndpointReferenceType jobEPR=notification.getNotifySubmittedRequest().getExecutionResources().getJob(); Message m=new Message(null,null,jobEPR.toString()); MessagingImpl.get().getChannel(workflowID).publish(m); @@ -92,7 +92,7 @@ res.addNewNotifyDoneResponse(); //put job EPR to workflow properties try{ - String workflowID=WorkAssignmentConverter.getWorkflowIDFromEncodedWAID(workAssignmentId); + String workflowID=WorkAssignmentUtils.getWorkflowIDFromEncodedWAID(workAssignmentId); EndpointReferenceType jobEPR=notification.getNotifyDoneRequest().getExecutionResources().getJob(); Message m=new Message(null,null,jobEPR.toString()); MessagingImpl.get().getChannel(workflowID).publish(m); @@ -138,7 +138,7 @@ if(er!=null){ EndpointReferenceType jobEPR=er.getJob(); if(jobEPR!=null){ - String workflowID=WorkAssignmentConverter.getWorkflowIDFromEncodedWAID(workAssignmentId); + String workflowID=WorkAssignmentUtils.getWorkflowIDFromEncodedWAID(workAssignmentId); Message m=new Message(null,null,jobEPR.toString()); MessagingImpl.get().getChannel(workflowID).publish(m); } Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,120 @@ +package eu.unicore.workflow.pe; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.chemomentum.common.ws.IServiceOrchestrator; +import org.chemomentum.workassignment.xmlbeans.CancelResultType; +import org.chemomentum.workassignment.xmlbeans.CancelWorkAssignmentRequestDocument; +import org.chemomentum.workassignment.xmlbeans.CancelWorkAssignmentResponseDocument; +import org.chemomentum.workassignment.xmlbeans.GetWorkAssignmentStatusResponseDocument; +import org.chemomentum.workassignment.xmlbeans.StatusType; +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; +import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentResponseDocument; +import org.chemomentum.workassignment.xmlbeans.GetWorkAssignmentStatusRequestDocument.GetWorkAssignmentStatusRequest; + +/** + * Mock implementation of the service orchestrator + * Very useful for unit-testing + * + * @author schuller + */ +public class MockSO implements IServiceOrchestrator { + + private final List<String> received=new ArrayList<String>();; + + private boolean doCallbacks; + + private float failurePercentage; + + private final Random rand=new Random(); + + ScheduledExecutorService exec=Executors.newSingleThreadScheduledExecutor(); + + /** + * set the callback mode: if true, this mock so will do a callback + * to notify the engine of success. + * @param doCallbacks + */ + public void setCallbacks(boolean doCallbacks){ + this.doCallbacks=doCallbacks; + } + + /** + * set the probability that any given work assignment will "fail" + * + * @param percentage + */ + public void setFailureProbability(float percentage){ + if(percentage>1 || percentage <0)throw new IllegalArgumentException("Value must be 0...1 "); + this.failurePercentage=percentage; + } + + public CancelWorkAssignmentResponseDocument cancelWorkAssignment( + CancelWorkAssignmentRequestDocument in) { + CancelWorkAssignmentResponseDocument res=CancelWorkAssignmentResponseDocument.Factory.newInstance(); + res.addNewCancelWorkAssignmentResponse().setCancelResult(CancelResultType.FAILURE); + return res; + + } + + /** + * always returns "successful" + */ + public GetWorkAssignmentStatusResponseDocument getWorkAssignmentStatus( + GetWorkAssignmentStatusRequest in) { + GetWorkAssignmentStatusResponseDocument res=GetWorkAssignmentStatusResponseDocument.Factory.newInstance(); + res.addNewGetWorkAssignmentStatusResponse().setStatusResult(StatusType.SUCCESS); + return res; + } + + public SubmitWorkAssignmentResponseDocument submitWorkAssignment( + SubmitWorkAssignmentRequestDocument in) { + String id=in.getSubmitWorkAssignmentRequest().getWorkAssignment().getId(); + received.add(id); + SubmitWorkAssignmentResponseDocument res=SubmitWorkAssignmentResponseDocument.Factory.newInstance(); + res.addNewSubmitWorkAssignmentResponse(); + if(doCallbacks){ + callback(in.getSubmitWorkAssignmentRequest().getWorkAssignment().getId()); + } + return res; + } + + public void callback(final String waID){ + try{ + if (rand.nextFloat()>=failurePercentage){ + exec.schedule(new Callable<Object>(){ + public Object call()throws Exception{ + PEConfig.getInstance().getCallbackProcessor().finished(waID,null); + return null; + } + }, 20, TimeUnit.MILLISECONDS); + + } + else{ + exec.schedule(new Callable<Object>(){ + public Object call()throws Exception{ + PEConfig.getInstance().getCallbackProcessor().failed(waID,"","",null); + return null; + } + }, 20, TimeUnit.MILLISECONDS); + + } + }catch(Exception e){ + e.printStackTrace(); + } + } + /** + * returns a list of received wa ids, in the order in which they were received + * @return + */ + public List<String> getReceived(){ + return received; + } + +} Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,70 @@ +package eu.unicore.workflow.pe; + +import java.util.ArrayList; +import java.util.List; + +import org.testng.annotations.Test; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.xnjs.ems.ActionStatus; +import eu.unicore.workflow.pe.model.Activity; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.Transition; +import eu.unicore.workflow.pe.persistence.PEStatus; +import eu.unicore.workflow.pe.persistence.SubflowContainer; +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; +import eu.unicore.workflow.pe.xnjs.CallbackProcessorImpl; +import eu.unicore.workflow.pe.xnjs.TestActivity; +import eu.unicore.workflow.pe.xnjs.Validate; +import eu.unicore.workflow.xnjs.TestBase; + +public class TestCallbackProcessing extends TestBase { + + private ActivityGroup buildJob(String workflowID){ + ActivityGroup job=new ActivityGroup("1234",workflowID); + List<Activity>as=new ArrayList<Activity>(); + TestActivity a1=new TestActivity("a1",job.getWorkflowID()); + a1.setWaitForCallback(true); + as.add(a1); + as.add(new TestActivity("a2",job.getWorkflowID())); + Transition t=new Transition("a1->a2",job.getWorkflowID(),"a1","a2"); + job.setActivities(as); + job.setTransitions(t); + job.init(); + return job; + } + + + @Test + public void test1()throws Exception{ + CallbackProcessorImpl cp=new CallbackProcessorImpl(xnjs); + String uid=WorkAssignmentUtils.getActionIDFromEncodedWAID("1_2_3_cutthis"); + assert uid.equals("1_2_3"); + } + + + @Test + public void testNotifyFailed()throws Exception{ + CallbackProcessorImpl cp=new CallbackProcessorImpl(xnjs); + PEConfig.getInstance().setCallbackProcessor(cp); + + String wfID="5678"; + ActivityGroup job=buildJob(wfID); + PEConfig.getInstance().getProcessEngine().process(job, null); + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); + System.out.println("Status: "+ActionStatus.toString(s)); + if(ActionStatus.RUNNING!=s.intValue()){ + Thread.sleep(1000); + } + else break; + } + System.out.println("Action is running"); + + cp.failed("1_", "aborted", "Manually aborted", null); + + assert Validate.wasInvoked("a1"); + assert !Validate.wasInvoked("a2"); + } + +} \ No newline at end of file Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestUtils.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestUtils.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestUtils.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -0,0 +1,33 @@ +package eu.unicore.workflow.pe; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; + +public class TestUtils { + + @Test + public void test1(){ + String wfID="wf"; + String actID="activity"; + String iteration="iteration"; + String submission="sub1"; + String waID=WorkAssignmentUtils.getEncodedWorkAssignmentID(wfID, actID, + iteration, submission); + assert "wf/activity_iteration_sub1".equals(waID); + String wf_ext=WorkAssignmentUtils.getWorkflowIDFromEncodedWAID(waID); + assert wfID.equals(wf_ext); + + String submission_ext=WorkAssignmentUtils.getSubmissionCounterEncodedWAID(waID); + assert submission.equals(submission_ext); + + String actID_ext=WorkAssignmentUtils.getActivityIDFromEncodedWAID(waID); + assert "activity".equals(actID_ext); + + String actionID_ext=WorkAssignmentUtils.getActionIDFromEncodedWAID(waID); + assert "wf/activity_iteration".equals(actionID_ext); + + + } + +} Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -15,6 +15,8 @@ private final int delay; + private boolean waitForCallback=false; + public TestActivity(String id, String workflowID){ super(id,workflowID); status=ActivityStatus.CREATED; @@ -34,5 +36,13 @@ public int getDelay(){ return delay; } + + public boolean isWaitForCallback() { + return waitForCallback; + } + + public void setWaitForCallback(boolean waitForCallback) { + this.waitForCallback = waitForCallback; + } } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java 2009-04-15 12:49:18 UTC (rev 4498) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java 2009-04-15 14:37:51 UTC (rev 4499) @@ -41,10 +41,16 @@ logger.info("Processing activity <"+activity.getID()+"> in iteration <" +activity.getIteration().getCurrentValue()+">, waiting <"+n+"> millis"); Validate.invoked(activity.getID()); - try{ - Thread.sleep(n); - }catch(InterruptedException ie){} - setToDo... [truncated message content] |
From: <bsc...@us...> - 2009-04-16 15:25:42
|
Revision: 4511 http://unicore.svn.sourceforge.net/unicore/?rev=4511&view=rev Author: bschuller Date: 2009-04-16 15:25:37 +0000 (Thu, 16 Apr 2009) Log Message: ----------- use latest unicore version Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/SetupWorkflowService.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/pom.xml 2009-04-16 15:25:37 UTC (rev 4511) @@ -70,6 +70,12 @@ <groupId>org.chemomentum</groupId> <artifactId>tracer</artifactId> <version>1.5.3</version> + <exclusions> + <exclusion> + <groupId>de.fzj.unicore</groupId> + <artifactId>uas-core</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.chemomentum</groupId> @@ -77,6 +83,10 @@ <version>1.5.10</version> <exclusions> <exclusion> + <groupId>de.fzj.unicore</groupId> + <artifactId>uas-core</artifactId> + </exclusion> + <exclusion> <groupId>net.sf.saxon</groupId> <artifactId>saxon</artifactId> </exclusion> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/Provider.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -16,7 +16,6 @@ import org.chemomentum.common.ws.Callback; import org.chemomentum.common.ws.IServiceOrchestrator; import org.chemomentum.common.ws.IWorkflowFactory; - import org.chemomentum.traceproducer.ITraceProducer; import org.chemomentum.traceproducer.NonBlockingTracer; import org.chemomentum.tracer.xmlbeans.EntryDocument.Entry; @@ -29,7 +28,6 @@ import de.fzj.unicore.uas.client.UASClientFactory; import de.fzj.unicore.uas.security.IUASSecurityProperties; import de.fzj.unicore.uas.security.SecurityManager; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.uas.security.UASSecurityProperties; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.wsrflite.Kernel; @@ -38,6 +36,7 @@ import de.fzj.unicore.wsrflite.messaging.IMessagingProvider; import de.fzj.unicore.wsrflite.messaging.Message; import de.fzj.unicore.wsrflite.messaging.MessagingException; +import eu.unicore.security.xfireutil.SecurityTokens; import eu.unicore.workflow.pe.PEConfig; Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOMessage.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -2,8 +2,8 @@ import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.wsrflite.messaging.Message; +import eu.unicore.security.xfireutil.SecurityTokens; public class SOMessage extends Message { Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -3,10 +3,10 @@ import org.apache.log4j.Logger; import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.wsrflite.Kernel; import de.fzj.unicore.wsrflite.messaging.MessagingException; +import eu.unicore.security.xfireutil.SecurityTokens; /** * a non-blocking sender to service orchestrators. Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -6,13 +6,13 @@ import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.Configuration; import de.fzj.unicore.xnjs.ems.ActionResult; import de.fzj.unicore.xnjs.ems.ActionStatus; import de.fzj.unicore.xnjs.ems.ProcessingException; import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; +import eu.unicore.security.xfireutil.SecurityTokens; import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.messaging.SOSender; import eu.unicore.workflow.pe.model.JSDLExecutionActivity; @@ -91,7 +91,7 @@ sender.submitWorkAssignment(in, tokens); }catch(Exception e){ String msg="Problem creating/sending message to service orchestrator."; - LogUtil.logException(msg,e); + LogUtil.logException(msg,e,logger); setToDoneAndFailed(msg); } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -37,7 +37,6 @@ import de.fzj.unicore.uas.impl.UASWSResourceImpl; import de.fzj.unicore.uas.security.IUASSecurityProperties; import de.fzj.unicore.uas.security.SecurityManager; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.wsrflite.ResourcePool; import de.fzj.unicore.wsrflite.messaging.Message; @@ -46,6 +45,7 @@ import de.fzj.unicore.wsrflite.persistence.Persist; import de.fzj.unicore.wsrflite.xmlbeans.BaseFault; import de.fzj.unicore.wsrflite.xmlbeans.rp.ImmutableResourceProperty; +import eu.unicore.security.xfireutil.SecurityTokens; import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.ProcessState; import eu.unicore.workflow.pe.persistence.WorkflowContainer; Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/StoreWorkflowMetadata.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -27,9 +27,9 @@ import de.fzj.unicore.uas.impl.registry.RegistryHandler; import de.fzj.unicore.uas.security.IUASSecurityProperties; import de.fzj.unicore.uas.security.SecurityManager; -import de.fzj.unicore.uas.security.SecurityTokens; import de.fzj.unicore.uas.security.UASSecurityProperties; import de.fzj.unicore.uas.util.AddressingUtil; +import eu.unicore.security.xfireutil.SecurityTokens; /** * Store metadata to the Chemomentum datamanagement system @@ -38,7 +38,7 @@ */ public class StoreWorkflowMetadata implements Runnable{ - private static Logger log=Logger.getLogger(StoreWorkflowMetadata.class); + private static final Logger log=Logger.getLogger(StoreWorkflowMetadata.class); private final SecurityTokens tokens; Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/SetupWorkflowService.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/SetupWorkflowService.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/util/SetupWorkflowService.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -1,5 +1,6 @@ package org.chemomentum.dsws.util; +import java.io.File; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; @@ -15,6 +16,7 @@ import de.fzj.unicore.persist.Persist; import de.fzj.unicore.persist.PersistenceFactory; import de.fzj.unicore.persist.impl.PropertyConfigSource; +import de.fzj.unicore.uas.UAS; import de.fzj.unicore.uas.impl.UASWSResourceImpl; import de.fzj.unicore.uas.impl.registry.RegistryHandler; import de.fzj.unicore.uas.util.LogUtil; @@ -37,6 +39,8 @@ private final static Logger logger=LogUtil.getLogger(LogUtil.SERVICES,SetupWorkflowService.class); + public static final String XNJS_CONFIGFILE="workflow.xnjs.configfile"; + protected void init() throws Exception{ String header="\nUNICORE Workflow service, version "+getClass().getPackage().getImplementationVersion() @@ -46,8 +50,12 @@ Config.setProperty(Config.COMPONENT_UPDATE_INTERVAL,"60"); Config.scheduleComponentFinder(); - //TODO check config for file, else load a default config - XNJS xnjs=new XNJS("src/test/resources/xnjs.xml"); + String configFile=UAS.getProperty(XNJS_CONFIGFILE); + if(configFile==null){ + configFile="conf"+File.separator+"xnjs.xml"; + logger.info("XNJS configuration property <"+XNJS_CONFIGFILE+"> not set, using default <"+configFile+">"); + } + XNJS xnjs=new XNJS(configFile); xnjs.start(); //set default persistence Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java 2009-04-16 15:10:17 UTC (rev 4510) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java 2009-04-16 15:25:37 UTC (rev 4511) @@ -12,11 +12,11 @@ import org.chemomentum.workassignment.xmlbeans.CancelResultType; import org.chemomentum.workassignment.xmlbeans.CancelWorkAssignmentRequestDocument; import org.chemomentum.workassignment.xmlbeans.CancelWorkAssignmentResponseDocument; +import org.chemomentum.workassignment.xmlbeans.GetWorkAssignmentStatusRequestDocument; import org.chemomentum.workassignment.xmlbeans.GetWorkAssignmentStatusResponseDocument; import org.chemomentum.workassignment.xmlbeans.StatusType; import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentResponseDocument; -import org.chemomentum.workassignment.xmlbeans.GetWorkAssignmentStatusRequestDocument.GetWorkAssignmentStatusRequest; import eu.unicore.workflow.pe.util.WorkAssignmentUtils; @@ -71,7 +71,7 @@ * always returns "successful" */ public GetWorkAssignmentStatusResponseDocument getWorkAssignmentStatus( - GetWorkAssignmentStatusRequest in) { + GetWorkAssignmentStatusRequestDocument in) { GetWorkAssignmentStatusResponseDocument res=GetWorkAssignmentStatusResponseDocument.Factory.newInstance(); res.addNewGetWorkAssignmentStatusResponse().setStatusResult(StatusType.SUCCESS); return res; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-04-22 12:37:38
|
Revision: 4533 http://unicore.svn.sourceforge.net/unicore/?rev=4533&view=rev Author: bschuller Date: 2009-04-22 12:37:28 +0000 (Wed, 22 Apr 2009) Log Message: ----------- Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java 2009-04-22 11:49:12 UTC (rev 4532) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java 2009-04-22 12:37:28 UTC (rev 4533) @@ -12,7 +12,7 @@ protected ActivityStatus status; - protected SplitType splitType=SplitType.AND; + protected SplitType splitType=SplitType.FOLLOW_ALL_MATCHING; public Activity(String id, String workflowID){ super(id,workflowID); @@ -47,14 +47,16 @@ * define semantics of multiple outgoing transitions */ public static enum SplitType{ + /** - * first matching transition is followed + * only the first matching transition is followed */ - XOR, + FOLLOW_FIRST_MATCHING, + /** * all matching transition are followed */ - AND + FOLLOW_ALL_MATCHING }; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-22 11:49:12 UTC (rev 4532) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-04-22 12:37:28 UTC (rev 4533) @@ -98,7 +98,7 @@ //find outgoing transitions List<Transition>out=findOutgoingTransitions(a); - boolean followFirst=SplitType.XOR.equals(a.splitType); + boolean followFirst=SplitType.FOLLOW_FIRST_MATCHING.equals(a.splitType); outer: for(Transition t: out){ //now find activity and set to READY *IF* all the incoming Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java 2009-04-22 12:37:28 UTC (rev 4533) @@ -0,0 +1,25 @@ +package eu.unicore.workflow.pe.model; + +/** + * a top-level workflow to be executed by the process engine + * @author schuller + * + */ +public class PEWorkflow extends ActivityGroup { + + private static final long serialVersionUID = 1L; + + public PEWorkflow(String workflowID) { + super(workflowID, workflowID); + this.iteration=new NullIteration(); + } + + private static class NullIteration extends Iteration{ + + private static final long serialVersionUID = 1L; + + public String getCurrentValue(){ + return null; + } + } +} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java 2009-04-22 11:49:12 UTC (rev 4532) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java 2009-04-22 12:37:28 UTC (rev 4533) @@ -26,7 +26,11 @@ public ScriptCondition(String id, String workflowID, String script) { super(id, workflowID); - this.script=script; + if(script.trim().endsWith(";")){ + this.script=script.trim(); + }else{ + this.script=script.trim()+";"; + } } public synchronized boolean evaluate()throws EvaluationException{ Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java 2009-04-22 12:37:28 UTC (rev 4533) @@ -0,0 +1,116 @@ +package eu.unicore.workflow.pe; + +import org.testng.annotations.Test; + +import de.fzj.unicore.xnjs.ems.ActionStatus; +import eu.unicore.workflow.pe.model.Condition; +import eu.unicore.workflow.pe.model.PEWorkflow; +import eu.unicore.workflow.pe.model.ScriptCondition; +import eu.unicore.workflow.pe.model.Transition; +import eu.unicore.workflow.pe.model.Activity.SplitType; +import eu.unicore.workflow.pe.xnjs.TestActivity; +import eu.unicore.workflow.pe.xnjs.Validate; +import eu.unicore.workflow.xnjs.TestBase; + +public class TestSplitConditionProcessing extends TestBase { + + @Test + public void testFollowFirstMatchingConditionOnly()throws Exception{ + Validate.clear(); + String wfID="wf"; + TestActivity a1=new TestActivity("a1",wfID); + a1.setSplitType(SplitType.FOLLOW_FIRST_MATCHING); + TestActivity a2=new TestActivity("a2",wfID); + TestActivity a3=new TestActivity("a3",wfID); + PEWorkflow wf=new PEWorkflow(wfID); + wf.setActivities(a1,a2,a3); + Condition cond=new ScriptCondition("cond1",wfID,"true;"); + Transition t1=new Transition("a1->a2",wfID,"a1","a2",cond); + Transition t2=new Transition("a1->a3",wfID,"a1","a3"); + wf.setTransitions(t1,t2); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(500); + } + else break; + } + assert(Validate.wasInvoked("a1")); + assert(Validate.wasInvoked("a2")); + assert(!Validate.wasInvoked("a3")); + } + + @Test + public void testDiamondShapeWithOneBranchFollowed()throws Exception{ + Validate.clear(); + String wfID="wf"; + TestActivity a1=new TestActivity("a1",wfID); + a1.setSplitType(SplitType.FOLLOW_FIRST_MATCHING); + TestActivity a2=new TestActivity("a2",wfID); + TestActivity a3=new TestActivity("a3",wfID); + TestActivity a4=new TestActivity("a4",wfID); + PEWorkflow wf=new PEWorkflow(wfID); + wf.setActivities(a1,a2,a3,a4); + Condition cond=new ScriptCondition("cond1",wfID,"true;"); + Transition t1=new Transition("a1->a2",wfID,"a1","a2",cond); + Transition t2=new Transition("a1->a3",wfID,"a1","a3"); + Transition t3=new Transition("a2->a4",wfID,"a2","a4"); + Transition t4=new Transition("a3->a4",wfID,"a3","a4"); + wf.setTransitions(t1,t2,t3,t4); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(500); + } + else break; + } + assert Validate.wasInvoked("a1"); + assert Validate.wasInvoked("a2"); + assert !Validate.wasInvoked("a3"); + assert Validate.wasInvoked("a4"); + assert Validate.before("a1", "a4"); + assert 1==Validate.getInvocations("a4"); + } + + @Test(enabled=true) + public void testDiamondShapeWithBypass()throws Exception{ + Validate.clear(); + String wfID="wf"; + TestActivity a0=new TestActivity("a0",wfID); + TestActivity a1=new TestActivity("a1",wfID); + a1.setSplitType(SplitType.FOLLOW_FIRST_MATCHING); + TestActivity a2=new TestActivity("a2",wfID); + TestActivity a3=new TestActivity("a3",wfID); + TestActivity a4=new TestActivity("a4",wfID); + PEWorkflow wf=new PEWorkflow(wfID); + wf.setActivities(a0,a1,a2,a3,a4); + Condition cond=new ScriptCondition("cond1",wfID,"true;"); + Transition t1=new Transition("a1->a2",wfID,"a1","a2",cond); + Transition t2=new Transition("a1->a3",wfID,"a1","a3"); + Transition t3=new Transition("a2->a4",wfID,"a2","a4"); + Transition t4=new Transition("a3->a4",wfID,"a3","a4"); + Transition t5=new Transition("a0->a4",wfID,"a0","a4"); + wf.setTransitions(t1,t2,t3,t4,t5); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(500); + } + else break; + } + assert Validate.wasInvoked("a0"); + assert Validate.wasInvoked("a1"); + assert Validate.wasInvoked("a2"); + assert !Validate.wasInvoked("a3"); + assert Validate.wasInvoked("a4"); + } +} \ No newline at end of file Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-04-22 11:49:12 UTC (rev 4532) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-04-22 12:37:28 UTC (rev 4533) @@ -1,7 +1,7 @@ <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="U6-workflow-unittests"> - <!-- Backend tests --> + <!-- Backend workflow processing tests --> <test verbose="2" name="XNJS setup" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> @@ -37,6 +37,11 @@ <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> </classes> </test> + <test verbose="2" name="Splitting condition evaluation" annotations="JDK"> + <classes> + <class name="eu.unicore.workflow.pe.model.TestSplitConditionProcessing"/> + </classes> + </test> <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-05-06 08:11:34
|
Revision: 4578 http://unicore.svn.sourceforge.net/unicore/?rev=4578&view=rev Author: bschuller Date: 2009-05-06 08:11:29 +0000 (Wed, 06 May 2009) Log Message: ----------- remove direct dependency to DMClientAPI; fix test suite and reduce test chattiness Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java workflow/trunk/workflowservice/src/test/resources/log4j.properties workflow/trunk/workflowservice/testng-unittests.xml Removed Paths: ------------- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/datamanagement/ Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/pom.xml 2009-05-06 08:11:29 UTC (rev 4578) @@ -1,7 +1,7 @@ <?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>eu.unicore</groupId> + <groupId>eu.unicore.workflow</groupId> <artifactId>workflowservice</artifactId> <packaging>jar</packaging> <description>UNICORE Workflow engine</description> @@ -11,12 +11,14 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.0.0-SNAPSHOT</version> + <version>2.0.0-preview1</version> <name>Workflow engine</name> + <scm> <connection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk/workflowservice</connection> <developerConnection>scm:svn:https://unicore.svn.sourceforge.net/svnroot/unicore/workflow/trunk/workflowservice</developerConnection> </scm> + <mailingLists> <mailingList> <name>Development</name> @@ -31,25 +33,23 @@ <archive>http://sourceforge.net/mailarchive/forum.php?forum_name=unicore-support</archive> </mailingList> </mailingLists> + <prerequisites> <maven>2.0.9</maven> </prerequisites> + <properties> <compiler.fork>false</compiler.fork> </properties> + <dependencies> - <dependency> - <groupId>eu.unicore</groupId> - <artifactId>uas-core</artifactId> - <version>1.2.0</version> - </dependency> - <dependency> + <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>5.8</version> <scope>test</scope> <classifier>jdk15</classifier> - </dependency> + </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all-minimal</artifactId> @@ -65,66 +65,12 @@ <artifactId>bsh</artifactId> <version>1.3.0</version> </dependency> - <!-- CHEMOMENTUM GENERAL --> <dependency> - <groupId>org.chemomentum</groupId> - <artifactId>tracer</artifactId> - <version>1.5.3</version> - <exclusions> - <exclusion> - <groupId>de.fzj.unicore</groupId> - <artifactId>uas-core</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.chemomentum</groupId> + <groupId>eu.unicore.workflow</groupId> <artifactId>common</artifactId> - <version>1.5.10</version> - <exclusions> - <exclusion> - <groupId>de.fzj.unicore</groupId> - <artifactId>uas-core</artifactId> - </exclusion> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon</artifactId> - </exclusion> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon-dom</artifactId> - </exclusion> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon-xpath</artifactId> - </exclusion> - </exclusions> - </dependency> + <version>2.0.0-preview1</version> + </dependency> -<!-- CHEMOMENTUM DATAMANAGEMENT --> - <dependency> - <groupId>org.chemomentum</groupId> - <artifactId>DMClientAPI</artifactId> - <version>2.3.2</version> - <exclusions> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon</artifactId> - </exclusion> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon-dom</artifactId> - </exclusion> - <exclusion> - <groupId>net.sf.saxon</groupId> - <artifactId>saxon-xpath</artifactId> - </exclusion> - <exclusion> - <groupId>pl.edu.icm.unicore</groupId> - <artifactId>uas-vo</artifactId> - </exclusion> - </exclusions> - </dependency> </dependencies> <repositories> <repository> Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -8,9 +8,9 @@ import org.apache.log4j.Logger; import org.apache.xmlbeans.XmlObject; +import org.chemomentum.common.api.workflow.MetadataStore; import org.chemomentum.common.util.Config; import org.chemomentum.common.ws.WorkflowManagement; -import org.chemomentum.dsws.datamanagement.StoreWorkflowMetadata; import org.chemomentum.dsws.rp.DetailedStatusResourceProperty; import org.chemomentum.dsws.rp.JobReferenceRP; import org.chemomentum.dsws.rp.OutputFilesResourceProperty; @@ -73,18 +73,6 @@ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,WorkflowInstance.class); - /** - * TODO move to interface - * Resource property for the EPR of the location mapper used - */ - public static final QName RPLocationMapperAddress=LocationMapperAddressDocument.type.getDocumentElementName(); - - /** - * TODO move to interface - * Resource property for the human-friendly workflow name - */ - public static final QName RPWorkflowName=WorkflowNameDocument.type.getDocumentElementName(); - @Persist private String dialect; @@ -219,11 +207,8 @@ protected void storeMetaData(){ try{ if(Config.isUnitTesting())return; - XmlObject workflow=properties.get(RPSubmittedWorkflow).getXml()[0]; - WorkflowNameDocument wfNameDoc=properties.get(RPWorkflowName)!=null? - ((WorkflowNameDocument)properties.get(RPWorkflowName).getXml()[0]): null; - String wfName=wfNameDoc!=null?wfNameDoc.getWorkflowName():getUniqueID(); - StoreWorkflowMetadata swmd=new StoreWorkflowMetadata(getUniqueID(),getSecurityTokens(),getOwner(),workflow,wfName); + MetadataStore swmd=Config.getMetadataStore(); + swmd.setWorkflowInstance(this); //synchronous OK?! swmd.run(); }catch(Exception ex){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -50,13 +50,11 @@ PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.RUNNING!=s.intValue()){ Thread.sleep(1000); } else break; } - System.out.println("Action is running"); Thread.sleep(2000); String waID=WorkAssignmentUtils.getEncodedWorkAssignmentID(wfID,"a1", "1", "1"); cp.failed(waID, "aborted", "Manually aborted", null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -44,7 +44,6 @@ } assert(Validate.wasInvoked("a1")); Integer i=Validate.getInvocations("a1"); - System.out.println("Was invoked: "+i.intValue()); assert(N==i.intValue()); } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -49,7 +49,6 @@ while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -31,7 +31,6 @@ while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } @@ -61,7 +60,6 @@ while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -29,7 +29,6 @@ PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } @@ -48,7 +47,6 @@ PEConfig.getInstance().getProcessEngine().process(job, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } @@ -87,7 +85,6 @@ xnjs.getConfig().getEMSManager().add(action, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); - System.out.println("Status: "+ActionStatus.toString(s)); if(ActionStatus.DONE!=s.intValue()){ Thread.sleep(1000); } Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestDelegates.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -43,7 +43,6 @@ d.addNewCreateWorkflowResource(); CreateWorkflowResponseDocument res=ws.create(d); assertNotNull(res); - System.out.println(res); BaseWSRFClient w=new BaseWSRFClient(res.getCreateWorkflowResponse().getEndpointReference()); String s=(w.getResourcePropertyDocument()); assertNotNull(s); Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/WSSTestBase.java 2009-05-06 08:11:29 UTC (rev 4578) @@ -6,6 +6,7 @@ import org.chemomentum.common.ws.WorkflowManagement; import org.chemomentum.dsws.util.SetupWorkflowService; import org.chemomentum.workflow.callback.CallbackImpl; +import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.w3.x2005.x08.addressing.EndpointReferenceType; @@ -36,7 +37,13 @@ new SetupWorkflowService().run(); } + @AfterClass @Override + protected void tearDown()throws Exception{ + super.tearDown(); + } + + @Override protected void addServices() throws Exception { DeploymentCenter.getInstance().deployService(IWorkflowFactory.SERVICE_NAME, Modified: workflow/trunk/workflowservice/src/test/resources/log4j.properties =================================================================== --- workflow/trunk/workflowservice/src/test/resources/log4j.properties 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/src/test/resources/log4j.properties 2009-05-06 08:11:29 UTC (rev 4578) @@ -2,7 +2,7 @@ # default/fallback log4j config on classpath # # Set root logger level to WARN and its only appender to A1. -log4j.rootLogger=INFO, A1 +log4j.rootLogger=WARN, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender @@ -12,6 +12,4 @@ log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c{1} %x - %m%n -log4j.logger.unicore.services.WSResourceImpl=DEBUG - -log4j.logger.unicore.services=DEBUG +log4j.logger.unicore.services=WARN Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-05-05 12:01:57 UTC (rev 4577) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-05-06 08:11:29 UTC (rev 4578) @@ -39,7 +39,7 @@ </test> <test verbose="2" name="Splitting condition evaluation" annotations="JDK"> <classes> - <class name="eu.unicore.workflow.pe.model.TestSplitConditionProcessing"/> + <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> </classes> </test> <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-05-12 12:35:38
|
Revision: 4603 http://unicore.svn.sourceforge.net/unicore/?rev=4603&view=rev Author: bschuller Date: 2009-05-12 12:35:30 +0000 (Tue, 12 May 2009) Log Message: ----------- use less storage for EPR lists; add no-wait feature; re-organise test suite xml file Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WAConstants.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/EndpointReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/JobReferenceRP.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/WorkflowReferenceRP.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -73,8 +74,23 @@ public void setTransitions(Transition... transitions) { this.transitions = Arrays.asList(transitions); } - + public void addTransition(Transition t) { + transitions.add(t); + } + + public boolean removeTransition(Transition t) { + Iterator<Transition>iter=transitions.iterator(); + while(iter.hasNext()){ + if(iter.next().getID().equals(t.getID())){ + iter.remove(); + return true; + } + } + return false; + } + + /** * update this group: put activities that can be submitted * into "READY" state. Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/JSDLExecutionActivity.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -9,8 +9,9 @@ * Information about an workflow execution activity * <ul> * <li>Job definition (JSDL)</li> - * <li>Blacklist/whitelist</li> - * <li>etc</li> + * <li>Requested job lifetime</li> + * <li>Engine waiting behaviour</li> + * <li>other properties (unused yet)</li> * </ul> * * @author schuller @@ -25,9 +26,15 @@ private final Map<String,String>options=new HashMap<String,String>(); + //requested job resource lifetime + private long lifetimeMillis=-1; + //count (re)submissions of the same workassignment private int submissionCounter=0; + //will the workflow engine wait for this activity to finish? + private boolean noWait; + public JSDLExecutionActivity(String id, String workflowID){ super(id, workflowID); } @@ -73,4 +80,28 @@ return options.put(key,value); } -} + /** + * get the requested job lifetime (or -1 if none set) + */ + public long getLifetimeMillis() { + return lifetimeMillis; + } + + /** + * set the requested job lifetime in millis + * + * @param lifetimeMillis + */ + public void setLifetimeMillis(long lifetimeMillis) { + this.lifetimeMillis = lifetimeMillis; + } + + + public boolean isNoWait() { + return noWait; + } + + public void setNoWait(boolean noWait) { + this.noWait = noWait; + } +} \ No newline at end of file Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WAConstants.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WAConstants.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WAConstants.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -23,7 +23,4 @@ //TODO resources - //Processing options - public static final String NOWAIT="NoWait"; - } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; + import de.fzj.unicore.persist.PersistenceException; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.Configuration; @@ -21,7 +22,10 @@ import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.ActivityStatus; +import eu.unicore.workflow.pe.model.Condition; import eu.unicore.workflow.pe.model.EvaluationException; +import eu.unicore.workflow.pe.model.JSDLExecutionActivity; +import eu.unicore.workflow.pe.model.Transition; import eu.unicore.workflow.pe.persistence.PEStatus; import eu.unicore.workflow.pe.persistence.SubflowContainer; import eu.unicore.workflow.pe.persistence.WorkflowContainer; @@ -35,7 +39,7 @@ public class ActivityGroupProcessor extends DefaultProcessor { private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ActivityGroupProcessor.class); - + public ActivityGroupProcessor(Configuration configuration) { super(configuration); } @@ -49,6 +53,7 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); ActivityGroup ag=(ActivityGroup)action.getAjd(); + handleNoWait(ag); ag.init(); if(ag.getID().equals(ag.getWorkflowID())){ logger.info("Processing workflow <"+ag.getWorkflowID()+">"); @@ -57,7 +62,7 @@ logger.info("Processing group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+ag.getIteration().getCurrentValue()+">"); } ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); - + if(vars==null){ vars=new ProcessVariables(); action.getProcessingContext().put(ProcessVariables.class,vars); @@ -71,7 +76,7 @@ protected void submitAllEligibleActivities(boolean subActionsStillRunning)throws ProcessingException{ List<String>subTasks=action.getProcessingContext().get(List.class); ActivityGroup ag=(ActivityGroup)action.getAjd(); - + List<Activity>activities=ag.getDueActivities(); if(!subActionsStillRunning && (activities==null||activities.size()==0)){ action.addLogTrace("No more transitions left to follow."); @@ -82,6 +87,10 @@ WorkflowContainer workflowInfo=null; try{ workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + if(workflowInfo==null){ + logger.debug("No workflow info for <"+ag.getWorkflowID()+">"); + return; + } SubflowContainer attr=workflowInfo.findSubFlowAttributes(ag.getID()); if(attr==null)throw new PersistenceException("Persistent information about <"+ag.getID()+"> is missing"); try{ @@ -101,7 +110,7 @@ setToDoneAndFailed(); throw new ProcessingException(ex); } - + }catch(Exception ex){ throw new ProcessingException(ex); } @@ -116,7 +125,7 @@ } } } - + protected String submit(Activity a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); @@ -132,7 +141,7 @@ action.setDirty(); return uuid; } - + protected String submit(ActivityGroup a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); @@ -147,7 +156,7 @@ action.setDirty(); return uuid; } - + protected String submitToXNJS(Activity a, ProcessVariables vars)throws ExecutionException{ InternalAction subAction=new InternalAction(); subAction.setType(a.getType()); @@ -160,28 +169,28 @@ PEStatus activityStatus=new PEStatus(); activityStatus.setActivityStatus(ActivityStatus.RUNNING); activityStatus.setIteration(a.getIteration().getCurrentValue()); - + manager.addInternalAction(subAction); return subAction.getUUID(); } - + @Override @SuppressWarnings("unchecked") protected void handleRunning() throws ProcessingException { if(logger.isTraceEnabled())logger.trace("Handle running for "+action.getUUID()); ActivityGroup ag=(ActivityGroup)action.getAjd(); - + //check substates ... List<String>subTasks=action.getProcessingContext().get(List.class); if(subTasks==null){ throw new ProcessingException("Could not find list of sub-tasks."); } - + WorkflowContainer workflowInfo=null; SubflowContainer attr; - + boolean stillRunning=false; - + try{ Iterator<String>iterator=subTasks.iterator(); subActionLoop: while(iterator.hasNext()){ @@ -197,58 +206,57 @@ if(logger.isTraceEnabled()){ logger.trace("Sub-Action <"+subActionID+"> is "+ActionStatus.toString(status)); } - + //check status - + if(ActionStatus.DONE!=status){ stillRunning=true; continue subActionLoop; } - else{ + + if(ActionStatus.DONE==status){ //check result if(!sub.getResult().isSuccessful()){ //TODO rule engine callout setToDoneAndFailed(); return; } - else{ - //copy results - ProcessVariables pv=sub.getProcessingContext().get(ProcessVariables.class); - if(pv!=null){ - //TODO what about overwrite of existing values ... - action.getProcessingContext().get(ProcessVariables.class).putAll(pv); - } - - //set subactivity status - String subActivityID=((Activity)sub.getAjd()).getID(); - Activity subActivity=ag.getActivity(subActivityID); - subActivity.setStatus(ActivityStatus.SUCCESS); - - //clean up the sub-action - configuration.getEMSManager().destroy(subActionID, action.getClient()); - iterator.remove(); - action.setDirty(); - - //submit follow on activities - ag.activityDone(subActivity, pv); - - //store activity status to global workflow info - try{ - workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); - attr=workflowInfo.findSubFlowAttributes(ag.getID()); - PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); - stat.setActivityStatus(ActivityStatus.SUCCESS); - }finally{ - if(workflowInfo!=null){ - try{ - PEConfig.getInstance().getPersistence().write(workflowInfo); - }catch(Exception ex){ - throw new ProcessingException(ex); - } + //copy results + ProcessVariables pv=sub.getProcessingContext().get(ProcessVariables.class); + if(pv!=null){ + //TODO what about overwrite of existing values ... + action.getProcessingContext().get(ProcessVariables.class).putAll(pv); + } + + //set subactivity status + String subActivityID=((Activity)sub.getAjd()).getID(); + Activity subActivity=ag.getActivity(subActivityID); + subActivity.setStatus(ActivityStatus.SUCCESS); + + //clean up the sub-action + configuration.getEMSManager().destroy(subActionID, action.getClient()); + iterator.remove(); + action.setDirty(); + + //submit follow on activities + ag.activityDone(subActivity, pv); + + //store activity status to global workflow info + try{ + workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + attr=workflowInfo.findSubFlowAttributes(ag.getID()); + PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); + stat.setActivityStatus(ActivityStatus.SUCCESS); + }finally{ + if(workflowInfo!=null){ + try{ + PEConfig.getInstance().getPersistence().write(workflowInfo); + }catch(Exception ex){ + throw new ProcessingException(ex); } } - action.setDirty(); } + action.setDirty(); } } } @@ -262,10 +270,46 @@ setToDoneAndFailed(); throw new ProcessingException(ex); } - + submitAllEligibleActivities(stillRunning); } + + protected void handleNoWait(ActivityGroup ag){ + List<JSDLExecutionActivity>noWaitActivities=new ArrayList<JSDLExecutionActivity>(); + for(Activity a: ag.getActivities()){ + if(a instanceof JSDLExecutionActivity){ + JSDLExecutionActivity j=(JSDLExecutionActivity)a; + if(j.isNoWait()){ + noWaitActivities.add(j); + } + } + } + for(JSDLExecutionActivity j: noWaitActivities){ + handleNoWaitActivity(j, ag); + } + } + + //change transitions, so that activities depending on the given actitity + //are started immediately + protected void handleNoWaitActivity(JSDLExecutionActivity j, ActivityGroup ag){ + List<Transition>incoming=ag.findIncomingTransitions(j); + List<Transition>outgoing=ag.findOutgoingTransitions(j); + //for each outgoing transition, add a transition from each incoming activity + int i=0; + for(Transition out: outgoing){ + for(Transition in: incoming){ + String from=in.getFrom(); + String to=out.getTo(); + Condition c=out.getCondition(); + Transition t=new Transition(in.getID()+"_"+i,ag.getID(),from,to,c); + ag.addTransition(t); + } + //and remove the outgoing one + ag.removeTransition(out); + } + } + private void setToDoneSuccessfully(){ action.setStatus(ActionStatus.DONE); action.addLogTrace("Status set to DONE."); @@ -273,11 +317,13 @@ action.addLogTrace("Result: Success."); logger.info("ActivityGroup "+action.getUUID()+ " SUCCESSFUL."); } - + private void setToDoneAndFailed(){ action.fail(); logger.info("ActivityGroup "+action.getUUID()+ " FAILED."); } + + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -53,15 +53,13 @@ //callback will wake it up again... //TODO need also slow polling in case we miss a message from the SO! action.setWaiting(true); + action.setDirty(); } private void submitToSO(JSDLExecutionActivity work){ WABuilder builder=new WABuilder(); builder.setJsdl(work.getJobDefinition()); - //TODO - //boolean noWait=Boolean.parseBoolean(work.getOption(WAConstants.NOWAIT)); - ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); for(String var: vars.keySet()){ builder.withEnvironment(var+"="+vars.get(var)); Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/EndpointReferenceRP.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/EndpointReferenceRP.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/EndpointReferenceRP.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -39,6 +39,7 @@ import org.apache.log4j.Logger; import org.w3.x2005.x08.addressing.EndpointReferenceType; +import de.fzj.unicore.uas.util.AddressingUtil; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.wsrflite.xmlbeans.ResourceProperty; @@ -48,38 +49,39 @@ * @author schuller */ public abstract class EndpointReferenceRP extends ResourceProperty<EndpointReferenceType[]>{ - protected static final long serialVersionUID=1L; + private static final long serialVersionUID=1L; + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,EndpointReferenceRP.class); - protected ArrayList<EndpointReferenceType> eprs; - + protected final ArrayList<String> uuids; + public EndpointReferenceRP(){ - eprs=new ArrayList<EndpointReferenceType>(); + uuids=new ArrayList<String>(); } - + /** * @param EndpointReferenceType[] */ @Override public void setProperty(EndpointReferenceType[] types) { - eprs=new ArrayList<EndpointReferenceType>(types.length); - for(int i=0;i<types.length;i++){ - eprs.add(types[i]); + synchronized(uuids){ + uuids.clear(); + for(int i=0;i<types.length;i++){ + uuids.add(AddressingUtil.UIDFromEPR(types[i])); + } } - handleSetProperty(); } - protected abstract void handleSetProperty(); - /** * add an entry if it not already exists */ public void add(EndpointReferenceType epr){ - if(!exists(epr))eprs.add(epr); - setProperty(eprs.toArray(new EndpointReferenceType[eprs.size()])); + synchronized(uuids){ + if(!exists(epr))uuids.add(extractUID(epr)); + } } - + /** * checks if epr exists in this epr list * @@ -89,43 +91,62 @@ */ protected boolean exists(EndpointReferenceType epr)throws NullPointerException{ if(epr==null)throw new NullPointerException(); - Iterator<EndpointReferenceType> it=eprs.iterator(); - try{ - String my=epr.getAddress().getStringValue(); - while(it.hasNext()){ - if(it.next().getAddress().getStringValue().equals(my)){ + String my=extractUID(epr); + synchronized (uuids) { + for(String uid: uuids){ + if(uid.equals(my)){ return true; } } - }catch(Exception e){ - logger.warn(e.getMessage()); } return false; } /** - * remove an entry by ID + * remove an entry by unique (!) ID * @param id */ public void remove(String id){ - Iterator<EndpointReferenceType> it=eprs.iterator(); - while(it.hasNext()){ - try{ - if(it.next().getAddress().getStringValue().endsWith(id)){ - it.remove(); - logger.debug("Removed "+id); + synchronized (uuids) { + Iterator<String> it=uuids.iterator(); + while(it.hasNext()){ + try{ + if(it.next().endsWith(id)){ + it.remove(); + logger.debug("Removed "+id); + } + }catch(Exception e){ + logger.warn(e.getMessage()); } - }catch(Exception e){ - logger.warn(e.getMessage()); } } - setProperty(eprs.toArray(new EndpointReferenceType[eprs.size()])); + } - @Override public EndpointReferenceType[] getProperty() { - return eprs.toArray(new EndpointReferenceType[eprs.size()]); - } + EndpointReferenceType[] res=new EndpointReferenceType[uuids.size()]; + int i=0; + for(String uuid: uuids){ + res[i]=makeEPR(uuid); + } + return res; + } + /** + * create a correct EPR from the given unique ID<br/> + * must set correct URL base and possibly add EPR metadata + * + * @param uid + * @return {@link EndpointReferenceType} + */ + protected abstract EndpointReferenceType makeEPR(String uid); + + /** + * extract a minimal, meaningful UID from the given EPR + * @param {@link EndpointReferenceType} + * @return a unique String containing all relevant info + */ + protected abstract String extractUID(EndpointReferenceType epr); + } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/JobReferenceRP.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/JobReferenceRP.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/JobReferenceRP.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -34,34 +34,43 @@ package org.chemomentum.dsws.rp; import org.chemomentum.workflow.xmlbeans.JobReferenceDocument; +import org.w3.x2005.x08.addressing.EndpointReferenceType; /** - * holds a set of references to Workflows submitted to a Workflowservice + * holds a set of references to Job submitted for a Workflow instance * * @author schuller */ public class JobReferenceRP extends EndpointReferenceRP{ private static final long serialVersionUID=1L; - - private JobReferenceDocument[] xdoc; public JobReferenceRP(){ super(); - xdoc=new JobReferenceDocument[0]; } + + @Override + public JobReferenceDocument[] getXml() { + synchronized (uuids) { + JobReferenceDocument[] xdoc=new JobReferenceDocument[uuids.size()]; + for(int i=0;i<uuids.size();i++){ + xdoc[i]=JobReferenceDocument.Factory.newInstance(); + xdoc[i].setJobReference(makeEPR(uuids.get(i))); + } + return xdoc; + } - protected void handleSetProperty() { - xdoc=new JobReferenceDocument[eprs.size()]; - for(int i=0;i<eprs.size();i++){ - xdoc[i]=JobReferenceDocument.Factory.newInstance(); - xdoc[i].setJobReference(eprs.get(i)); - } } + + protected EndpointReferenceType makeEPR(String uid){ + EndpointReferenceType epr=EndpointReferenceType.Factory.newInstance(); + epr.addNewAddress().setStringValue(uid); + return epr; + } + @Override - public JobReferenceDocument[] getXml() { - return xdoc; + protected String extractUID(EndpointReferenceType epr) { + return epr.getAddress().getStringValue(); } - } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/WorkflowReferenceRP.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/WorkflowReferenceRP.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/rp/WorkflowReferenceRP.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -29,39 +29,57 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ - + package org.chemomentum.dsws.rp; +import org.chemomentum.common.ws.WorkflowManagement; import org.chemomentum.workflow.xmlbeans.WorkflowReferenceDocument; +import org.w3.x2005.x08.addressing.EndpointReferenceType; +import de.fzj.unicore.wsrflite.utils.Utilities; + /** * holds a set of references to Workflows submitted to a Workflowservice * * @author schuller */ public class WorkflowReferenceRP extends EndpointReferenceRP{ - + private static final long serialVersionUID=1L; - - private WorkflowReferenceDocument[] xdoc; + private final static String BASE=Utilities.makeAddress(WorkflowManagement.SERVICE_NAME, ""); + public WorkflowReferenceRP(){ super(); - xdoc=new WorkflowReferenceDocument[0]; } - - protected void handleSetProperty() { - xdoc=new WorkflowReferenceDocument[eprs.size()]; - for(int i=0;i<eprs.size();i++){ - xdoc[i]=WorkflowReferenceDocument.Factory.newInstance(); - xdoc[i].setWorkflowReference(eprs.get(i)); + + + @Override + public WorkflowReferenceDocument[] getXml() { + synchronized (uuids) { + WorkflowReferenceDocument[] xdoc=new WorkflowReferenceDocument[uuids.size()]; + for(int i=0;i<uuids.size();i++){ + xdoc[i]=WorkflowReferenceDocument.Factory.newInstance(); + xdoc[i].setWorkflowReference(makeEPR(uuids.get(i))); + } + return xdoc; } + } @Override - public WorkflowReferenceDocument[] getXml() { - return xdoc; + protected EndpointReferenceType makeEPR(String uid){ + EndpointReferenceType epr=EndpointReferenceType.Factory.newInstance(); + epr.addNewAddress().setStringValue(BASE+uid); + return epr; } + + + @Override + protected String extractUID(EndpointReferenceType epr) { + return Utilities.extractResourceID(epr); + } + } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/MockSO.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -84,6 +84,11 @@ SubmitWorkAssignmentResponseDocument res=SubmitWorkAssignmentResponseDocument.Factory.newInstance(); res.addNewSubmitWorkAssignmentResponse(); if(doCallbacks){ + try{ + Thread.sleep(2000); + }catch(InterruptedException ie){ + ie.printStackTrace(); + } callback(in.getSubmitWorkAssignmentRequest().getWorkAssignment().getId()); } return res; Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -121,4 +121,5 @@ assert it.getCurrentValue().startsWith("TEST"); } + } \ No newline at end of file Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -44,10 +44,8 @@ //validations assert MockSO.wasReceived("a1"); assert Validate.wasInvoked("a2"); - - } - + @Test public void testWithFailure()throws Exception{ Validate.clear(); Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -0,0 +1,49 @@ +package eu.unicore.workflow.pe.xnjs; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.JSDLExecutionActivity; +import eu.unicore.workflow.pe.model.Transition; + +public class TestActivityGroupProcessor { + + @Test + public void testNoWaitRemoveTransition(){ + String wfID="1"; + ActivityGroup ag=new ActivityGroup("1",wfID); + JSDLExecutionActivity a1=new JSDLExecutionActivity("a1",wfID); + a1.setNoWait(true); + JSDLExecutionActivity a2=new JSDLExecutionActivity("a2",wfID); + ag.setActivities(a1,a2); + Transition tr=new Transition("1-2",wfID,"a1","a2"); + ag.addTransition(tr); + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + agp.handleNoWait(ag); + //check that transition "tr" is gone. + assert ag.getTransitions().size()==0; + } + + @Test + public void testNoWaitAddTransition(){ + String wfID="1"; + ActivityGroup ag=new ActivityGroup("1",wfID); + JSDLExecutionActivity a0=new JSDLExecutionActivity("a0",wfID); + JSDLExecutionActivity a1=new JSDLExecutionActivity("a1",wfID); + a1.setNoWait(true); + JSDLExecutionActivity a2=new JSDLExecutionActivity("a2",wfID); + ag.setActivities(a0,a1,a2); + Transition tr0=new Transition("0-1",wfID,"a0","a1"); + ag.addTransition(tr0); + Transition tr=new Transition("1-2",wfID,"a1","a2"); + ag.addTransition(tr); + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + agp.handleNoWait(ag); + //check that a transition a0->a2 has been added + assert ag.getTransitions().size()==2; + tr=ag.getTransitions().get(1); + assert "a0".equals(tr.getFrom()); + assert "a2".equals(tr.getTo()); + } + +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java 2009-05-12 12:35:30 UTC (rev 4603) @@ -0,0 +1,65 @@ +package org.chemomentum.dsws.rp; + +import org.chemomentum.common.ws.WorkflowManagement; +import org.testng.annotations.Test; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.wsrflite.utils.Utilities; + +public class TestReferenceRPs { + + @Test + public void testJobReferenceRP(){ + String adr="http://foo/services?res=1"; + JobReferenceRP rp=new JobReferenceRP(); + + EndpointReferenceType epr1=EndpointReferenceType.Factory.newInstance(); + epr1.addNewAddress().setStringValue(adr); + //check uid extract + assert(adr.equals(rp.extractUID(epr1))); + + rp.add(epr1); + assert rp.uuids.size()==1; + + //duplicate check + EndpointReferenceType epr2=EndpointReferenceType.Factory.newInstance(); + epr2.addNewAddress().setStringValue(adr); + rp.add(epr2); + assert rp.uuids.size()==1; + + //check that epr is correct + assert adr.equals(rp.getXml()[0].getJobReference().getAddress().getStringValue()); + + rp.remove("1"); + assert rp.uuids.size()==0; + } + + + @Test + public void testWFReferenceRP(){ + String adr="http://foo/services?res=1"; + WorkflowReferenceRP rp=new WorkflowReferenceRP(); + + EndpointReferenceType epr1=EndpointReferenceType.Factory.newInstance(); + epr1.addNewAddress().setStringValue(adr); + //check uid extract + assert("1".equals(rp.extractUID(epr1))); + + rp.add(epr1); + assert rp.uuids.size()==1; + + //duplicate check + EndpointReferenceType epr2=EndpointReferenceType.Factory.newInstance(); + epr2.addNewAddress().setStringValue(adr); + rp.add(epr2); + assert rp.uuids.size()==1; + + //check that epr is correct + String baseURL=Utilities.makeAddress(WorkflowManagement.SERVICE_NAME,""); + assert (baseURL+"1").equals(rp.getXml()[0].getWorkflowReference().getAddress().getStringValue()); + + rp.remove("1"); + assert rp.uuids.size()==0; + } + +} Property changes on: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-05-11 17:01:41 UTC (rev 4602) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-05-12 12:35:30 UTC (rev 4603) @@ -5,64 +5,32 @@ <test verbose="2" name="XNJS setup" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> + <class name="eu.unicore.workflow.pe.xnjs.TestActivityGroupProcessor"/> </classes> </test> - <test verbose="2" name="Various utils" annotations="JDK"> + + <test verbose="2" name="Process engine tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.TestUtils"/> - </classes> - </test> - <test verbose="2" name="Variable declaration and modification" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.TestVariablesActivities"/> - </classes> - </test> - <test verbose="2" name="Basic workflow processing" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.TestWorkflowProcessing"/> - </classes> - </test> - <test verbose="2" name="Basic status storage and reporting" annotations="JDK"> - <classes> - <class name="eu.unicore.workflow.pe.TestStatusReporting"/> - </classes> - </test> - <test verbose="2" name="Iteration value handling" annotations="JDK"> - <classes> + <class name="eu.unicore.workflow.pe.TestStatusReporting"/> <class name="eu.unicore.workflow.pe.TestIteration"/> - </classes> - </test> - <test verbose="2" name="Script condition evaluation" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> - </classes> - </test> - <test verbose="2" name="Splitting condition evaluation" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> - </classes> - </test> - <test verbose="2" name="Workflow containing simple loops" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> - </classes> - </test> - <test verbose="2" name="XNJS callback processing" annotations="JDK"> - <classes> <class name="eu.unicore.workflow.pe.TestCallbackProcessing"/> </classes> </test> <!-- Frontend --> - <test verbose="2" name="App wrapper" annotations="JDK"> + <test verbose="2" name="Web service frontend" annotations="JDK"> <classes> <class name="org.chemomentum.dsws.TestAppWrapper"/> - </classes> - </test> - <test verbose="2" name="Service tests" annotations="JDK"> - <classes> <class name="org.chemomentum.dsws.TestDelegates"/> <class name="org.chemomentum.dsws.TestSubmissionClient"/> + <class name="org.chemomentum.dsws.rp.TestReferenceRPs"/> </classes> </test> + </suite> \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-05-14 11:39:16
|
Revision: 4633 http://unicore.svn.sourceforge.net/unicore/?rev=4633&view=rev Author: bschuller Date: 2009-05-14 11:39:10 +0000 (Thu, 14 May 2009) Log Message: ----------- implement limit for number of activities within a single group Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityCounter.java Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityCounter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityCounter.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityCounter.java 2009-05-14 11:39:10 UTC (rev 4633) @@ -0,0 +1,9 @@ +package eu.unicore.workflow.pe.xnjs; + +import java.util.concurrent.atomic.AtomicInteger; + +public class ActivityCounter extends AtomicInteger{ + + private static final long serialVersionUID = 1L; + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityCounter.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-14 10:05:38 UTC (rev 4632) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-14 11:39:10 UTC (rev 4633) @@ -9,6 +9,7 @@ import de.fzj.unicore.persist.PersistenceException; +import de.fzj.unicore.uas.UAS; import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.Configuration; import de.fzj.unicore.xnjs.ems.Action; @@ -40,6 +41,18 @@ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ActivityGroupProcessor.class); + /** + * property key for defining the maximum number of activities per activity group + */ + public static final String PROPERTY_MAX_ACTIVITIES_PER_GROUP="unicore.workflow.maxActivitiesPerGroup"; + + /** + * default value for the maximum number of activities per activity group + * + * @see PROPERTY_MAX_ACTIVITIES_PER_GROUP + */ + public static final String DEFAULT_MAX_ACTIVITIES_PER_GROUP="1000"; + public ActivityGroupProcessor(Configuration configuration) { super(configuration); } @@ -107,7 +120,7 @@ subTasks.add(id); } }catch(Exception ex){ - setToDoneAndFailed(); + setToDoneAndFailed(LogUtil.createFaultMessage("Exception occured", ex)); throw new ProcessingException(ex); } @@ -129,6 +142,7 @@ protected String submit(Activity a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + incrementCounterAndCheckMaxActivities(); //compute next iteration value a.getIteration().next(vars); //setup XNJS action @@ -145,6 +159,7 @@ protected String submit(ActivityGroup a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + incrementCounterAndCheckMaxActivities(); PEStatus activityStatus=new PEStatus(); activityStatus.setActivityStatus(ActivityStatus.RUNNING); a.getIteration().next(vars); @@ -157,6 +172,15 @@ return uuid; } + private ActivityCounter getActivityCounter(){ + ActivityCounter activityCounter=action.getProcessingContext().get(ActivityCounter.class); + if(activityCounter==null){ + activityCounter=new ActivityCounter(); + action.getProcessingContext().put(ActivityCounter.class,activityCounter); + } + return activityCounter; + } + protected String submitToXNJS(Activity a, ProcessVariables vars)throws ExecutionException{ InternalAction subAction=new InternalAction(); subAction.setType(a.getType()); @@ -218,7 +242,7 @@ //check result if(!sub.getResult().isSuccessful()){ //TODO rule engine callout - setToDoneAndFailed(); + setToDoneAndFailed("Sub-action failed."); return; } //copy results @@ -263,11 +287,11 @@ }catch(TimeoutException ex){ throw new ProcessingException(ex); }catch(EvaluationException ee){ - setToDoneAndFailed(); + setToDoneAndFailed(LogUtil.createFaultMessage("Evaluation failed", ee)); //TODO report which evaluation failed throw new ProcessingException(ee); }catch(Exception ex){ - setToDoneAndFailed(); + setToDoneAndFailed(LogUtil.createFaultMessage("Error occurred", ex)); throw new ProcessingException(ex); } @@ -309,6 +333,22 @@ ag.removeTransition(out); } } + + + /** + * check whether the maximum number of activities per group is exceeded <br/> + * + * TODO allow to specify max number using a property on the activity group + * + * @throws ExecutionException - thrown if too many activities for the current group + */ + protected void incrementCounterAndCheckMaxActivities()throws ExecutionException{ + int ac=getActivityCounter().incrementAndGet(); + Integer maxProp=Integer.parseInt(UAS.getProperty(PROPERTY_MAX_ACTIVITIES_PER_GROUP, DEFAULT_MAX_ACTIVITIES_PER_GROUP)); + if(ac>maxProp){ + throw new ExecutionException("Maximum number <"+maxProp+"> of activities per group exceeded!"); + } + } private void setToDoneSuccessfully(){ action.setStatus(ActionStatus.DONE); @@ -318,12 +358,16 @@ logger.info("ActivityGroup "+action.getUUID()+ " SUCCESSFUL."); } - private void setToDoneAndFailed(){ + private void setToDoneAndFailed(String reason){ action.fail(); - logger.info("ActivityGroup "+action.getUUID()+ " FAILED."); + logger.info("ActivityGroup "+action.getUUID()+ " FAILED. "+reason); } + /* + * set the action (unit testing use) + */ + void setAction(Action a){ + this.action=a; + } - - } Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-05-14 10:05:38 UTC (rev 4632) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-05-14 11:39:10 UTC (rev 4633) @@ -2,6 +2,9 @@ import org.testng.annotations.Test; +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.xnjs.ems.Action; +import de.fzj.unicore.xnjs.ems.ExecutionException; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.JSDLExecutionActivity; import eu.unicore.workflow.pe.model.Transition; @@ -46,4 +49,69 @@ assert "a2".equals(tr.getTo()); } + @Test + public void testMaxActivities(){ + UAS.setProperty(ActivityGroupProcessor.PROPERTY_MAX_ACTIVITIES_PER_GROUP, "10"); + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + Action a=new Action(); + agp.setAction(a); + try{ + agp.incrementCounterAndCheckMaxActivities(); + ActivityCounter c=a.getProcessingContext().get(ActivityCounter.class); + assert c!=null; + assert 1==c.get(); + }catch(Exception ex){ + assert 1==0; + } + + } + + + @Test(expectedExceptions=ExecutionException.class) + public void testExceptionWhenCounterExceeded()throws ExecutionException{ + UAS.setProperty(ActivityGroupProcessor.PROPERTY_MAX_ACTIVITIES_PER_GROUP, "10"); + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + Action a=new Action(); + agp.setAction(a); + //now exceed the counter + for(int i=0;i<100;i++){ + agp.incrementCounterAndCheckMaxActivities(); + } + } + + @Test + public void testGeneratedErrorMessageWhenCounterExceeded(){ + int n=10; + UAS.setProperty(ActivityGroupProcessor.PROPERTY_MAX_ACTIVITIES_PER_GROUP, String.valueOf(n)); + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + Action a=new Action(); + agp.setAction(a); + try{ + //now exceed the counter + for(int i=0;i<100;i++){ + agp.incrementCounterAndCheckMaxActivities(); + } + }catch(ExecutionException ee){ + String msg=ee.getMessage(); + assert msg.contains("<"+n+">"); + } + } + + @Test + public void testExceedDefaultCounterValue(){ + int n=Integer.valueOf(ActivityGroupProcessor.DEFAULT_MAX_ACTIVITIES_PER_GROUP); + + ActivityGroupProcessor agp=new ActivityGroupProcessor(null); + Action a=new Action(); + agp.setAction(a); + try{ + //now exceed the counter + for(int i=0;i<2*n;i++){ + agp.incrementCounterAndCheckMaxActivities(); + } + }catch(ExecutionException ee){ + String msg=ee.getMessage(); + assert msg.contains("<"+n+">"); + } + } } Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-05-14 10:05:38 UTC (rev 4632) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-05-14 11:39:10 UTC (rev 4633) @@ -2,16 +2,16 @@ <suite name="U6-workflow-unittests"> <!-- Backend workflow processing tests --> - <test verbose="2" name="XNJS setup" annotations="JDK"> + <test verbose="2" name="XNJS" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> - <class name="eu.unicore.workflow.pe.xnjs.TestActivityGroupProcessor"/> </classes> </test> <test verbose="2" name="Process engine tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.TestUtils"/> + <class name="eu.unicore.workflow.pe.xnjs.TestActivityGroupProcessor"/> <class name="eu.unicore.workflow.pe.TestVariablesActivities"/> <class name="eu.unicore.workflow.pe.TestWorkflowProcessing"/> <class name="eu.unicore.workflow.pe.TestStatusReporting"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-05-14 12:55:12
|
Revision: 4638 http://unicore.svn.sourceforge.net/unicore/?rev=4638&view=rev Author: bschuller Date: 2009-05-14 12:55:03 +0000 (Thu, 14 May 2009) Log Message: ----------- tests organisation Modified Paths: -------------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java workflow/trunk/workflowservice/testng-unittests.xml Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-05-14 12:11:13 UTC (rev 4637) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-05-14 12:55:03 UTC (rev 4638) @@ -63,7 +63,6 @@ }catch(Exception ex){ assert 1==0; } - } @@ -96,22 +95,5 @@ assert msg.contains("<"+n+">"); } } - - @Test - public void testExceedDefaultCounterValue(){ - int n=Integer.valueOf(ActivityGroupProcessor.DEFAULT_MAX_ACTIVITIES_PER_GROUP); - - ActivityGroupProcessor agp=new ActivityGroupProcessor(null); - Action a=new Action(); - agp.setAction(a); - try{ - //now exceed the counter - for(int i=0;i<2*n;i++){ - agp.incrementCounterAndCheckMaxActivities(); - } - }catch(ExecutionException ee){ - String msg=ee.getMessage(); - assert msg.contains("<"+n+">"); - } - } + } Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-05-14 12:11:13 UTC (rev 4637) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-05-14 12:55:03 UTC (rev 4638) @@ -2,16 +2,21 @@ <suite name="U6-workflow-unittests"> <!-- Backend workflow processing tests --> - <test verbose="2" name="XNJS" annotations="JDK"> + <test verbose="2" name="Basic tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> + <class name="eu.unicore.workflow.pe.TestUtils"/> </classes> </test> <test verbose="2" name="Process engine tests" annotations="JDK"> <classes> - <class name="eu.unicore.workflow.pe.TestUtils"/> <class name="eu.unicore.workflow.pe.xnjs.TestActivityGroupProcessor"/> + </classes> + </test> + + <test verbose="2" name="More process engine tests" annotations="JDK"> + <classes> <class name="eu.unicore.workflow.pe.TestVariablesActivities"/> <class name="eu.unicore.workflow.pe.TestWorkflowProcessing"/> <class name="eu.unicore.workflow.pe.TestStatusReporting"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-05-27 14:35:21
|
Revision: 4683 http://unicore.svn.sourceforge.net/unicore/?rev=4683&view=rev Author: bschuller Date: 2009-05-27 14:35:16 +0000 (Wed, 27 May 2009) Log Message: ----------- for-each implementation; some refactoring Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/SubflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/RoutingActivityProcessor.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestingActivityProcessor.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java workflow/trunk/workflowservice/src/test/resources/xnjs.xml workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/Constants.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java Removed Paths: ------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/pom.xml 2009-05-27 14:35:16 UTC (rev 4683) @@ -11,7 +11,7 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.0.0-preview1</version> + <version>2.0.0</version> <name>Workflow engine</name> <scm> Copied: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java (from rev 4565, workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java) =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,157 @@ +package eu.unicore.workflow.pe.iterators; + +import java.io.Serializable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.uas.util.LogUtil; + +import eu.unicore.workflow.pe.model.Iterate; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * Default implementation of the {@link Iterate} interface. Iteration values are + * based on evaluating process variables. + * + * @author schuller + */ +public class Iteration implements Serializable, Iterate{ + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,Iteration.class); + + private static final long serialVersionUID = 1L; + /* + * an inner iteration value that is incremented on each new iteration + */ + protected int counter=0; + + /* + * the name of the iteration variable. This is a single variable name, + * without "${...}" + */ + protected String iteratorName=null; + + /* + * the resolved value of the iteration variable + */ + protected String resolvedIteratorName=null; + + /* + * the base value of the iteration. This can contain + * variables ${...} that are resolved when computing the iteration value + * using resolveBase() + */ + protected String base=null; + + /* + * the base value with all variables resolved + */ + protected String resolvedBase=null; + + /* (non-Javadoc) + * @see eu.unicore.workflow.pe.model.Iterate#next(eu.unicore.workflow.pe.xnjs.ProcessVariables) + */ + public void next(ProcessVariables vars){ + if(base!=null || iteratorName!=null)resolve(vars); + counter++; + } + + /** + * check if a next value exists. This implementation always returns true. + */ + public boolean hasNext(){ + return true; + } + + /** + * get the full, resolved value of the iteration + * @return + */ + public String getCurrentValue(){ + StringBuilder sb=new StringBuilder(); + if(base!=null){ + if(resolvedBase==null){ + //progammer error + throw new IllegalStateException("Need to call next() before retrieving value!"); + } + sb.append(resolvedBase); + } + if(iteratorName!=null){ + if(resolvedIteratorName==null){ + //progammer error + throw new IllegalStateException("Can't resolve iterator <"+iteratorName+">"); + } + sb.append(SEPARATOR); + sb.append(resolvedIteratorName); + } + if(base==null && iteratorName==null){ + if(resolvedBase!=null || resolvedIteratorName!=null){ + sb.append(SEPARATOR); + } + sb.append(counter); + } + return sb.toString(); + } + + public String getBase() { + return base; + } + + public void setBase(String base) { + this.base = base; + } + + public String getIteratorName() { + return iteratorName; + } + + public void setIteratorName(String iteratorName) { + this.iteratorName = iteratorName; + } + + /* + * resolves variables in the "base" iteration value + */ + private static Pattern p=Pattern.compile("\\$\\{\\w*\\}"); + + protected void resolveBase(ProcessVariables vars){ + Matcher m=p.matcher(base); + resolvedBase=base; + while(m.find()){ + String key=m.group().substring(2, m.group().length()-1); + Object val=vars.get(key); + String value=val!=null?String.valueOf(vars.get(key)):""; + resolvedBase=resolvedBase.replace(m.group(), value); + } + if(logger.isDebugEnabled())logger.debug("Resolved base <"+base+"> as <"+resolvedBase+">"); + } + + protected void resolveIterator(ProcessVariables vars){ + String value=String.valueOf(vars.get(iteratorName)); + resolvedIteratorName=value; + if(logger.isDebugEnabled())logger.debug("Resolved iterator <"+iteratorName+"> as <"+resolvedIteratorName+">"); + } + + protected void resolve(ProcessVariables vars){ + resolveBase(vars); + if(iteratorName!=null)resolveIterator(vars); + } + + public String getResolvedBase() { + return resolvedBase; + } + + public String toString(){ + return getCurrentValue()+"["+String.valueOf(counter)+"]"; + } + + public int getCounter(){ + return counter; + } + + public void resetCounter(){ + //counter=0; + } +} Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,57 @@ +package eu.unicore.workflow.pe.iterators; + +import java.util.NoSuchElementException; + +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * iterate over a set of string values. Works similar to a normal Iterator. + * + * @author schuller + */ +public class ValueSetIterator extends Iteration{ + + private static final long serialVersionUID = 1L; + + private final String[] values; + private int position=-1; + + public ValueSetIterator(String ... values){ + this.values=values; + } + + public String getCurrentUnderlyingValue(){ + return values[position]; + } + + /** + * get the full, resolved value of the iteration + * @return + */ + public String getCurrentValue(){ + StringBuilder sb=new StringBuilder(); + if(position<0 || base!=null){ + if(resolvedBase==null || position<0){ + //progammer error + throw new IllegalStateException("Need to call next() before retrieving value!"); + } + sb.append(resolvedBase); + } + + if(sb.length()>0)sb.append(SEPARATOR); + sb.append(String.valueOf(position)); + + return sb.toString(); + } + + public boolean hasNext() { + return values!=null && values.length>0 && position<values.length-1; + } + + public void next(ProcessVariables vars) { + if(!hasNext())throw new NoSuchElementException("No more values"); + super.next(vars); + position++; + } + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Activity.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -16,9 +16,12 @@ public Activity(String id, String workflowID){ super(id,workflowID); - status=ActivityStatus.CREATED; } + public Activity(String id, String workflowID, Iterate iteration){ + super(id,workflowID,iteration); + } + public ActivityStatus getStatus() { return status; } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityContainer.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityContainer.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,71 @@ +package eu.unicore.workflow.pe.model; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * An abstract container for activities + * + * @author schuller + */ +public abstract class ActivityContainer extends Activity{ + + private static final long serialVersionUID=1; + + protected final Map<String,Activity>activities=new HashMap<String, Activity>(); + + protected String loopIteratorName=null; + + public ActivityContainer(String id,String workflowID) { + super(id,workflowID); + } + + public ActivityContainer(String id,String workflowID, Iterate iteration) { + super(id,workflowID,iteration); + } + + public Collection<Activity> getActivities() { + return activities.values(); + } + + public Activity getActivity(String id) { + return activities.get(id); + } + + public void setActivities(List<Activity> activities) { + this.activities.clear(); + for(Activity a: activities){ + this.activities.put(a.getID(), a); + } + } + + public void setActivities(Activity... activities) { + setActivities(Arrays.asList(activities)); + } + + /** + * sets the variable name that is used as a loop iterator + * @param iteratorName + */ + public void setLoopIteratorName(String iteratorName){ + this.loopIteratorName=iteratorName; + } + + public String getLoopIteratorName(){ + return loopIteratorName; + } + + /** + * Checks if this is a loop. To make this a loop, call setLoopIteratorName() with + * a non-zero variable name + * + * @return true if loop iterator name is not null + */ + public boolean isLoop(){ + return loopIteratorName!=null; + } + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityContainer.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -2,35 +2,32 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import eu.unicore.workflow.pe.xnjs.ProcessVariables; /** - * A group of activities + * A group of activities connected by transitions * * @author schuller */ -public class ActivityGroup extends Activity{ +public class ActivityGroup extends ActivityContainer{ private static final long serialVersionUID=1; public static final String ACTION_TYPE="UNICORE_WORKFLOW"; - private final Map<String,Activity>activities=new HashMap<String, Activity>(); - private List<Transition>transitions=new ArrayList<Transition>(); - private String loopIteratorName=null; - public ActivityGroup(String id,String workflowID) { super(id,workflowID); } + public ActivityGroup(String id,String workflowID, Iterate iteration) { + super(id,workflowID,iteration); + } + /** * get all activities that can be submitted * @@ -44,32 +41,9 @@ return result; } - public Collection<Activity> getActivities() { - return activities.values(); - } - - public Activity getActivity(String id) { - return activities.get(id); - } - - public void setActivities(List<Activity> activities) { - this.activities.clear(); - for(Activity a: activities){ - this.activities.put(a.getID(), a); - } - } - - public void setActivities(Activity... activities) { - setActivities(Arrays.asList(activities)); - } - - public List<Transition> getTransitions() { + public List<Transition> getTransitions(){ return transitions; } - - public void setTransitions(List<Transition> transitions) { - this.transitions = transitions; - } public void setTransitions(Transition... transitions) { this.transitions = Arrays.asList(transitions); @@ -135,6 +109,7 @@ }//end of outer } + @Override public String getType(){ return ACTION_TYPE; } @@ -189,26 +164,4 @@ return true; } - /** - * sets the variable name that is used as a loop iterator - * @param iteratorName - */ - public void setLoopIteratorName(String iteratorName){ - this.loopIteratorName=iteratorName; - } - - public String getLoopIteratorName(){ - return loopIteratorName; - } - - /** - * Checks if this is a loop. To make this a loop, call setLoopIteratorName() with - * a non-zero variable name - * - * @return true if loop iterator name is not null - */ - public boolean isLoop(){ - return loopIteratorName!=null; - } - } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,10 @@ +package eu.unicore.workflow.pe.model; + +public interface ForEachIterate extends Iterate { + + /** + * get the current value of the underlying value set + */ + public String getCurrentUnderlyingValue(); + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForGroup.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForGroup.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,67 @@ +package eu.unicore.workflow.pe.model; + +import java.util.Collection; +import java.util.List; + + +/** + * "for-each" group + * + * @author schuller + */ +public class ForGroup extends ActivityContainer{ + + private static final long serialVersionUID=1; + + public static final String ACTION_TYPE="UNICORE_WORKFLOW_FOR_EACH"; + + private Activity body; + + public ForGroup(String id,String workflowID, Iterate iteration, Activity body) { + super(id,workflowID,iteration); + this.body=body; + super.setActivities(body); + } + + public ForGroup(String id,String workflowID, Activity body) { + super(id,workflowID); + this.body=body; + super.setActivities(body); + } + + public Activity getBody() { + return body; + } + + @Override + public String getType(){ + return ACTION_TYPE; + } + + @Override + public Collection<Activity> getActivities() { + return super.getActivities(); + } + + @Override + public Activity getActivity(String id) { + return super.getActivity(id); + } + + @Override + public void setActivities(Activity... activities) { + if(activities.length!=1)throw new IllegalArgumentException("For-each supports only a single activity"); + super.setActivities(activities); + body=activities[0]; + } + + @Override + public void setActivities(List<Activity> activities) { + if(activities.size()!=1)throw new IllegalArgumentException("For-each supports only a single activity"); + super.setActivities(activities); + body=activities.get(0); + } + + + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForGroup.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,46 @@ +package eu.unicore.workflow.pe.model; + +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * Deal with iteration values.<br/> + * Since workflow elements can be executed multiple + * times, it is necessary to disambiguate them. + * + * @author schuller + */ +public interface Iterate { + + /** + * separates the various levels of the iterator value + */ + public static final String SEPARATOR=":::"; + + /** + * check if there are more possible values for this iteration + */ + public boolean hasNext(); + + /** + * trigger the next iteration + * + * @parem vars - the process variables + */ + public void next(ProcessVariables vars); + + /** + * reset, if possible + */ + public void resetCounter(); + + /** + * get the full, resolved value of the iteration + */ + public String getCurrentValue(); + + /** + * set the base of this iteration, i.e. the prefix that is used + * @param base + */ + public void setBase(String base); +} \ No newline at end of file Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java ___________________________________________________________________ Added: svn:mime-type + text/plain Deleted: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iteration.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -1,157 +0,0 @@ -package eu.unicore.workflow.pe.model; - -import java.io.Serializable; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.log4j.Logger; - -import de.fzj.unicore.uas.util.LogUtil; - -import eu.unicore.workflow.pe.xnjs.ProcessVariables; - -/** - * Deal with iteration values.<br/> - * Since workflow elements can be executed multiple - * times, it is necessary to disambiguate them. - * - * @author schuller - */ -public class Iteration implements Serializable{ - - private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,Iteration.class); - - private static final long serialVersionUID = 1L; - - /** - * separates the various levels of the iterator value - */ - public static final String SEPARATOR=":::"; - - /* - * an inner iteration value that is incremented on each new iteration - */ - private int counter=0; - - /* - * the name of the iteration variable. This is a single variable name, - * without "${...}" - */ - private String iteratorName=null; - - /* - * the resolved value of the iteration variable - */ - private String resolvedIteratorName=null; - - /* - * the base value of the iteration. This can contain - * variables ${...} that are resolved when computing the iteration value - * using resolveBase() - */ - private String base=null; - - /* - * the base value with all variables resolved - */ - private String resolvedBase=null; - - /** - * trigger the next iteration - * - * @parem vars - the process variables - */ - public void next(ProcessVariables vars){ - if(base!=null || iteratorName!=null)resolve(vars); - counter++; - } - - /** - * get the full, resolved value of the iteration - * @return - */ - public String getCurrentValue(){ - StringBuilder sb=new StringBuilder(); - if(base!=null){ - if(resolvedBase==null){ - //progammer error - throw new IllegalStateException("Need to call next() before retrieving value!"); - } - sb.append(resolvedBase); - } - if(iteratorName!=null){ - if(resolvedIteratorName==null){ - //progammer error - throw new IllegalStateException("Can't resolve iterator <"+iteratorName+">"); - } - sb.append(SEPARATOR); - sb.append(resolvedIteratorName); - } - if(base==null && iteratorName==null){ - if(resolvedBase!=null || resolvedIteratorName!=null){ - sb.append(SEPARATOR); - } - sb.append(counter); - } - return sb.toString(); - } - - public String getBase() { - return base; - } - - public void setBase(String base) { - this.base = base; - } - - public String getIteratorName() { - return iteratorName; - } - - public void setIteratorName(String iteratorName) { - this.iteratorName = iteratorName; - } - - /* - * resolves variables in the "base" iteration value - */ - private static Pattern p=Pattern.compile("\\$\\{\\w*\\}"); - protected void resolveBase(ProcessVariables vars){ - Matcher m=p.matcher(base); - resolvedBase=base; - while(m.find()){ - String key=m.group().substring(2, m.group().length()-1); - Object val=vars.get(key); - String value=val!=null?String.valueOf(vars.get(key)):""; - resolvedBase=resolvedBase.replace(m.group(), value); - } - if(logger.isDebugEnabled())logger.debug("Resolved base <"+base+"> as <"+resolvedBase+">"); - } - - protected void resolveIterator(ProcessVariables vars){ - String value=String.valueOf(vars.get(iteratorName)); - resolvedIteratorName=value; - if(logger.isDebugEnabled())logger.debug("Resolved iterator <"+iteratorName+"> as <"+resolvedIteratorName+">"); - } - - protected void resolve(ProcessVariables vars){ - resolveBase(vars); - if(iteratorName!=null)resolveIterator(vars); - } - - public String getResolvedBase() { - return resolvedBase; - } - - public String toString(){ - return getCurrentValue()+"["+String.valueOf(counter)+"]"; - } - - public int getCounter(){ - return counter; - } - - public void resetCounter(){ - //counter=0; - } -} Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -2,6 +2,8 @@ import java.io.Serializable; +import eu.unicore.workflow.pe.iterators.Iteration; + /** * Base class for workflow elements, having an identifier, a parent workflow ID, * and an {@link Iteration} that tracks repeated execution of this workflow element @@ -16,7 +18,7 @@ protected final String workflowID; - protected Iteration iteration; + protected final Iterate iteration; /** * construct a new model object @@ -24,16 +26,20 @@ * @param workflowID */ public ModelBase(String id, String workflowID){ + this(id,workflowID,new Iteration()); + } + + public ModelBase(String id, String workflowID, Iterate iteration){ this.id=id; this.workflowID=workflowID; - this.iteration=new Iteration(); + this.iteration=iteration; } public String getID(){ return id; } - public Iteration getIteration(){ + public Iterate getIteration(){ return iteration; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/PEWorkflow.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -1,5 +1,7 @@ package eu.unicore.workflow.pe.model; +import eu.unicore.workflow.pe.iterators.Iteration; + /** * a top-level workflow to be executed by the process engine * @author schuller @@ -10,8 +12,7 @@ private static final long serialVersionUID = 1L; public PEWorkflow(String workflowID) { - super(workflowID, workflowID); - this.iteration=new NullIteration(); + super(workflowID, workflowID, new NullIteration()); } private static class NullIteration extends Iteration{ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/SubflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/SubflowContainer.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/SubflowContainer.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -8,7 +8,7 @@ import java.util.Map; import eu.unicore.workflow.pe.model.Activity; -import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.ActivityContainer; /** * During runtime of the workflow the {@link SubflowContainer} class is used to store @@ -250,13 +250,13 @@ * * @param activityGroup */ - public void build(ActivityGroup activityGroup){ + public void build(ActivityContainer activityGroup){ workflowID=activityGroup.getWorkflowID(); id=activityGroup.getID(); for(Activity act: activityGroup.getActivities()){ - if(act instanceof ActivityGroup){ + if(act instanceof ActivityContainer){ SubflowContainer subAttributes=new SubflowContainer(); - subAttributes.build((ActivityGroup)act); + subAttributes.build((ActivityContainer)act); subFlowAttributes.add(subAttributes); } activityStati.put(act.getID(),new ArrayList<PEStatus>()); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -3,11 +3,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.concurrent.TimeoutException; import org.apache.log4j.Logger; - import de.fzj.unicore.persist.PersistenceException; import de.fzj.unicore.uas.UAS; import de.fzj.unicore.uas.util.LogUtil; @@ -37,22 +35,10 @@ * * @author schuller */ -public class ActivityGroupProcessor extends DefaultProcessor { +public class ActivityGroupProcessor extends DefaultProcessor implements Constants{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ActivityGroupProcessor.class); - /** - * property key for defining the maximum number of activities per activity group - */ - public static final String PROPERTY_MAX_ACTIVITIES_PER_GROUP="unicore.workflow.maxActivitiesPerGroup"; - - /** - * default value for the maximum number of activities per activity group - * - * @see PROPERTY_MAX_ACTIVITIES_PER_GROUP - */ - public static final String DEFAULT_MAX_ACTIVITIES_PER_GROUP="1000"; - public ActivityGroupProcessor(Configuration configuration) { super(configuration); } @@ -72,7 +58,7 @@ logger.info("Processing workflow <"+ag.getWorkflowID()+">"); } else{ - logger.info("Processing group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+ag.getIteration().getCurrentValue()+">"); + logger.info("Processing group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+getCurrentIteration()+">"); } ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); @@ -85,6 +71,10 @@ submitAllEligibleActivities(true); } + protected String getCurrentIteration(){ + return (String)action.getProcessingContext().get(PV_KEY_ITERATION); + } + @SuppressWarnings("unchecked") protected void submitAllEligibleActivities(boolean subActionsStillRunning)throws ProcessingException{ List<String>subTasks=action.getProcessingContext().get(List.class); @@ -114,7 +104,7 @@ id=submit((ActivityGroup)a,attr); } else { - String base=ag.getIteration().getCurrentValue(); + String base=getCurrentIteration(); a.getIteration().setBase(base); id=submit(a,attr); } @@ -145,24 +135,25 @@ } } - protected String submit(Activity a, SubflowContainer attr)throws ExecutionException{ + private String submit(Activity a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); incrementCounterAndCheckMaxActivities(); //compute next iteration value a.getIteration().next(vars); + String iteration=a.getIteration().getCurrentValue(); //setup XNJS action String uuid=submitToXNJS(a, vars); a.setStatus(ActivityStatus.RUNNING); PEStatus activityStatus=new PEStatus(); activityStatus.setActivityStatus(ActivityStatus.RUNNING); - activityStatus.setIteration(a.getIteration().getCurrentValue()); + activityStatus.setIteration(iteration); attr.getActivityStatus(a.getID()).add(activityStatus); action.setDirty(); return uuid; } - protected String submit(ActivityGroup a, SubflowContainer attr)throws ExecutionException{ + private String submit(ActivityGroup a, SubflowContainer attr)throws ExecutionException{ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); incrementCounterAndCheckMaxActivities(); @@ -192,14 +183,12 @@ subAction.setType(a.getType()); subAction.setAjd(a); subAction.setClient(action.getClient()); - String uid=WorkAssignmentUtils.buildActionID(a.getWorkflowID(), a.getID(), a.getIteration().getCurrentValue()); + String iteration=a.getIteration().getCurrentValue(); + String uid=WorkAssignmentUtils.buildActionID(a.getWorkflowID(), a.getID(), iteration); subAction.setUUID(uid); subAction.getProcessingContext().put(ProcessVariables.class,vars); + subAction.getProcessingContext().put(PV_KEY_ITERATION, iteration); a.setStatus(ActivityStatus.RUNNING); - PEStatus activityStatus=new PEStatus(); - activityStatus.setActivityStatus(ActivityStatus.RUNNING); - activityStatus.setIteration(a.getIteration().getCurrentValue()); - manager.addInternalAction(subAction); return subAction.getUUID(); } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/Constants.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/Constants.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/Constants.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,27 @@ +package eu.unicore.workflow.pe.xnjs; + +public interface Constants { + + /** + * property key for defining the maximum number of activities per activity group + */ + public static final String PROPERTY_MAX_ACTIVITIES_PER_GROUP="unicore.workflow.maxActivitiesPerGroup"; + + /** + * default value for the maximum number of activities per activity group + * + * @see PROPERTY_MAX_ACTIVITIES_PER_GROUP + */ + public static final String DEFAULT_MAX_ACTIVITIES_PER_GROUP="1000"; + + /** + * key for storing the current iteration value in the XNJS Action processing context + */ + public static final String PV_KEY_ITERATION="ITERATION_CURRENTVALUE"; + + /** + * special workflow variable (can be used in job environment and file names) holding the current itera + */ + public static final String VAR_KEY_CURRENT_TOTAL_ITERATION="CURRENT_TOTAL_ITERATOR"; + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/Constants.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/DeclarationActivityProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -15,7 +15,7 @@ * Processes a variable declaration * @author schuller */ -public class DeclarationActivityProcessor extends DefaultProcessor { +public class DeclarationActivityProcessor extends DefaultProcessor implements Constants{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,DeclarationActivityProcessor.class); @@ -28,7 +28,8 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); DeclareVariableActivity activity=(DeclareVariableActivity)action.getAjd(); - logger.info("Start processing activity <"+activity.getID()+"> in iteration <"+activity.getIteration().getCurrentValue()+">"); + String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); + logger.info("Start processing activity <"+activity.getID()+"> in iteration <"+myIteration+">"); ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); if(vars==null){ vars=new ProcessVariables(); Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,368 @@ +package eu.unicore.workflow.pe.xnjs; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.persist.PersistenceException; +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.xnjs.Configuration; +import de.fzj.unicore.xnjs.ems.Action; +import de.fzj.unicore.xnjs.ems.ActionResult; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ExecutionException; +import de.fzj.unicore.xnjs.ems.InternalAction; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.model.Activity; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.ActivityStatus; +import eu.unicore.workflow.pe.model.ForEachIterate; +import eu.unicore.workflow.pe.model.ForGroup; +import eu.unicore.workflow.pe.model.Iterate; +import eu.unicore.workflow.pe.persistence.PEStatus; +import eu.unicore.workflow.pe.persistence.SubflowContainer; +import eu.unicore.workflow.pe.persistence.WorkflowContainer; +import eu.unicore.workflow.pe.util.WorkAssignmentUtils; + +/** + * processes "for-each" loops + * + * @author schuller + */ +public class ForGroupProcessor extends DefaultProcessor implements Constants { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ForGroupProcessor.class); + + /** + * property key for defining the maximum number of concurrent activities per for-each group + */ + public static final String PROPERTY_MAX_CONCURRENT_ACTIVITIES="unicore.workflow.forEach.maxConcurrentActivitiesPerGroup"; + + /** + * default value for the maximum number of activities per activity group + * + * @see PROPERTY_MAX_CONCURRENT_ACTIVITIES + */ + public static final String DEFAULT_MAX_CONCURRENT="50"; + + /** + * Workflow variable containing the current iterator value in a for-each group + */ + public static final String PV_CURRENT_FOR_EACH_VALUE="CURRENT_ITERATOR_VALUE"; + + + public ForGroupProcessor(Configuration configuration) { + super(configuration); + } + + /** + * will look at the activities in the action's ActitivyGroup, and spawn + * subactions for dealing with those + */ + @Override + protected void handleCreated() throws ProcessingException { + action.setStatus(ActionStatus.RUNNING); + action.addLogTrace("Status set to RUNNING."); + ForGroup ag=(ForGroup)action.getAjd(); + String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); + logger.info("Processing for-each group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+myIteration+">"); + + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + + if(vars==null){ + vars=new ProcessVariables(); + action.getProcessingContext().put(ProcessVariables.class,vars); + } + List<String>subTasks=new ArrayList<String>(); + action.getProcessingContext().put(List.class, subTasks); + submitAllEligibleActivities(); + } + + @SuppressWarnings("unchecked") + protected void submitAllEligibleActivities()throws ProcessingException{ + List<String>subTasks=action.getProcessingContext().get(List.class); + ForGroup ag=(ForGroup)action.getAjd(); + boolean dirty=false; + Iterate iterate=ag.getBody().getIteration(); + boolean haveMore=iterate.hasNext(); + if(!haveMore && (subTasks.size()==0)){ + action.addLogTrace("All iterations processed."); + logger.info("ActivityGroup "+action.getUUID()+": All iterations processed."); + setToDoneSuccessfully(); + } + else{ + + //process some more iterations of the loop + + WorkflowContainer workflowInfo=null; + try{ + workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + if(workflowInfo==null){ + logger.debug("No workflow info for <"+ag.getWorkflowID()+">"); + return; + } + SubflowContainer attr=workflowInfo.findSubFlowAttributes(ag.getID()); + if(attr==null)throw new PersistenceException("Persistent information about <"+ag.getID()+"> is missing"); + + try{ + int maxConcurrent=Integer.parseInt(UAS.getProperty(PROPERTY_MAX_CONCURRENT_ACTIVITIES, DEFAULT_MAX_CONCURRENT)); + + while(iterate.hasNext()){ + //limit the number of concurrent loop iterations + if(subTasks.size()>=maxConcurrent){ + if(logger.isDebugEnabled()){ + logger.debug("Limit of <"+maxConcurrent+"> concurrent loop iterations reached, not submitting new actions"); + } + break; + } + Activity a=ag.getBody(); + dirty=true; + String id; + if(a instanceof ActivityGroup){ + id=submit((ActivityGroup)a,attr); + } + else { + String base=ag.getIteration().getCurrentValue(); + a.getIteration().setBase(base); + id=submit(a,attr); + } + subTasks.add(id); + } + }catch(Exception ex){ + setToDoneAndFailed(LogUtil.createFaultMessage("Exception occured", ex)); + throw new ProcessingException(ex); + } + + }catch(Exception ex){ + throw new ProcessingException(ex); + } + finally{ + if(workflowInfo!=null){ + try{ + if(dirty){ + PEConfig.getInstance().getPersistence().write(workflowInfo); + } + else{ + PEConfig.getInstance().getPersistence().unlock(workflowInfo); + } + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + } + } + } + + protected String submit(Activity a, SubflowContainer attr)throws ExecutionException{ + ProcessVariables vars=new ProcessVariables(); + vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + incrementCounterAndCheckMaxActivities(); + //compute next iteration value + Iterate iterate=a.getIteration(); + iterate.next(vars); + String iteration=iterate.getCurrentValue(); + if(iterate instanceof ForEachIterate){ + String underlying=((ForEachIterate)iterate).getCurrentUnderlyingValue(); + vars.put(PV_CURRENT_FOR_EACH_VALUE, underlying); + } + //setup XNJS action + String uuid=submitToXNJS(a, vars, iteration); + a.setStatus(ActivityStatus.RUNNING); + PEStatus activityStatus=new PEStatus(); + activityStatus.setActivityStatus(ActivityStatus.RUNNING); + activityStatus.setIteration(iterate.getCurrentValue()); + attr.getActivityStatus(a.getID()).add(activityStatus); + action.setDirty(); + return uuid; + } + + protected String submit(ActivityGroup a, SubflowContainer attr)throws ExecutionException{ + ProcessVariables vars=new ProcessVariables(); + vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); + incrementCounterAndCheckMaxActivities(); + Iterate iterate=a.getIteration(); + iterate.next(vars); + String iteration=iterate.getCurrentValue(); + if(iterate instanceof ForEachIterate){ + String underlying=((ForEachIterate)iterate).getCurrentUnderlyingValue(); + vars.put(PV_CURRENT_FOR_EACH_VALUE, underlying); + } + //setup XNJS action + String uuid=submitToXNJS(a, vars,iteration); + PEStatus activityStatus=new PEStatus(); + activityStatus.setActivityStatus(ActivityStatus.RUNNING); + activityStatus.setIteration(iteration); + attr.getActivityStatus(a.getID()).add(activityStatus); + logger.info("Submitting activity group <"+a.getID()+"> status "+activityStatus); + a.setStatus(ActivityStatus.RUNNING); + action.setDirty(); + return uuid; + } + + private ActivityCounter getActivityCounter(){ + ActivityCounter activityCounter=action.getProcessingContext().get(ActivityCounter.class); + if(activityCounter==null){ + activityCounter=new ActivityCounter(); + action.getProcessingContext().put(ActivityCounter.class,activityCounter); + } + return activityCounter; + } + + protected String submitToXNJS(Activity a, ProcessVariables vars, String iteration)throws ExecutionException{ + InternalAction subAction=new InternalAction(); + subAction.setType(a.getType()); + subAction.setAjd(a); + subAction.setClient(action.getClient()); + String uid=WorkAssignmentUtils.buildActionID(a.getWorkflowID(), a.getID(),iteration); + subAction.setUUID(uid); + subAction.getProcessingContext().put(ProcessVariables.class,vars); + subAction.getProcessingContext().put(PV_KEY_ITERATION,iteration); + a.setStatus(ActivityStatus.RUNNING); + PEStatus activityStatus=new PEStatus(); + activityStatus.setActivityStatus(ActivityStatus.RUNNING); + activityStatus.setIteration(iteration); + manager.addInternalAction(subAction); + return subAction.getUUID(); + } + + @Override + @SuppressWarnings("unchecked") + protected void handleRunning() throws ProcessingException { + if(logger.isTraceEnabled())logger.trace("Handle running for "+action.getUUID()); + ForGroup ag=(ForGroup)action.getAjd(); + + //check substates ... + List<String>subTasks=action.getProcessingContext().get(List.class); + if(subTasks==null){ + throw new ProcessingException("Could not find list of sub-tasks."); + } + + WorkflowContainer workflowInfo=null; + boolean dirty=false; + SubflowContainer attr; + + try{ + Iterator<String>iterator=subTasks.iterator(); + subActionLoop: while(iterator.hasNext()){ + String subActionID=iterator.next(); + Action sub=manager.getAction(subActionID); + boolean stillRunning=false; + if(sub==null){ + String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; + action.addLogTrace(msg); + throw new ExecutionException(msg); + } + else{ + int status=sub.getStatus(); + if(logger.isTraceEnabled()){ + logger.trace("Sub-Action <"+subActionID+"> is "+ActionStatus.toString(status)); + } + + //check status + + if(ActionStatus.DONE!=status){ + stillRunning=true; + continue subActionLoop; + } + + if(ActionStatus.DONE==status){ + dirty=true; + action.setDirty(); + + //check result + if(!sub.getResult().isSuccessful()){ + //TODO rule engine callout + setToDoneAndFailed("Sub-action failed."); + return; + } + //copy results + ProcessVariables pv=sub.getProcessingContext().get(ProcessVariables.class); + if(pv!=null){ + //TODO what about overwrite of existing values ... + action.getProcessingContext().get(ProcessVariables.class).putAll(pv); + } + + //set subactivity status + String subActivityID=((Activity)sub.getAjd()).getID(); + //Activity subActivity=ag.getActivity(subActivityID); + //subActivity.setStatus(ActivityStatus.SUCCESS); + + //clean up the sub-action + configuration.getEMSManager().destroy(subActionID, action.getClient()); + iterator.remove(); + + //store activity status to global workflow info + try{ + workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + attr=workflowInfo.findSubFlowAttributes(ag.getID()); + String iteration=(String)sub.getProcessingContext().get(PV_KEY_ITERATION); + PEStatus stat=attr.getActivityStatus(subActivityID, iteration); + stat.setActivityStatus(ActivityStatus.SUCCESS); + }finally{ + if(workflowInfo!=null){ + try{ + if(dirty) { + PEConfig.getInstance().getPersistence().write(workflowInfo); + } + else{ + PEConfig.getInstance().getPersistence().unlock(workflowInfo); + } + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + } + } + } + } + }catch(Exception ex){ + setToDoneAndFailed(LogUtil.createFaultMessage("Error occurred", ex)); + throw new ProcessingException(ex); + } + + submitAllEligibleActivities(); + } + + + + /** + * check whether the maximum number of activities per group is exceeded <br/> + * + * TODO allow to specify max number using a property on the activity group + * + * @throws ExecutionException - thrown if too many activities for the current group + */ + protected void incrementCounterAndCheckMaxActivities()throws ExecutionException{ + int ac=getActivityCounter().incrementAndGet(); + Integer maxProp=Integer.parseInt(UAS.getProperty(PROPERTY_MAX_ACTIVITIES_PER_GROUP, DEFAULT_MAX_ACTIVITIES_PER_GROUP)); + if(ac>maxProp){ + throw new ExecutionException("Maximum number <"+maxProp+"> of activities per group exceeded!"); + } + } + + private void setToDoneSuccessfully(){ + action.setStatus(ActionStatus.DONE); + action.addLogTrace("Status set to DONE."); + action.setResult(new ActionResult(ActionResult.SUCCESSFUL,"Success.",0)); + action.addLogTrace("Result: Success."); + logger.info("ActivityGroup "+action.getUUID()+ " SUCCESSFUL."); + } + + private void setToDoneAndFailed(String reason){ + action.fail(); + logger.info("ActivityGroup "+action.getUUID()+ " FAILED. "+reason); + } + + /* + * set the action (unit testing use) + */ + void setAction(Action a){ + this.action=a; + } + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -26,7 +26,7 @@ * * @author schuller */ -public class JSDLExecutionActivityProcessor extends DefaultProcessor { +public class JSDLExecutionActivityProcessor extends DefaultProcessor implements Constants{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,JSDLExecutionActivityProcessor.class); @@ -48,7 +48,7 @@ vars=new ProcessVariables(); action.getProcessingContext().put(ProcessVariables.class,vars); } - vars.put("CURRENT_TOTAL_ITERATOR",iteration); + vars.put(VAR_KEY_CURRENT_TOTAL_ITERATION,iteration); submitToSO(work); //callback will wake it up again... //TODO need also slow polling in case we miss a message from the SO! Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ModificationActivityProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -17,13 +17,11 @@ import eu.unicore.workflow.pe.model.ModifyVariableActivity; /** - * Processes a single workflow activity<br/> - * It will submit workassignments until it succeeded or failed (subject to - * business rules) + * Modifies a variable <br/> * * @author schuller */ -public class ModificationActivityProcessor extends DefaultProcessor { +public class ModificationActivityProcessor extends DefaultProcessor implements Constants{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ModificationActivityProcessor.class); @@ -36,7 +34,8 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); ModifyVariableActivity activity=(ModifyVariableActivity)action.getAjd(); - logger.info("Start processing activity <"+activity.getID()+"> in iteration <"+activity.getIteration().getCurrentValue()+">"); + String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); + logger.info("Start processing activity <"+activity.getID()+"> in iteration <"+myIteration+">"); ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); if(vars==null){ vars=new ProcessVariables(); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/RoutingActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/RoutingActivityProcessor.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/RoutingActivityProcessor.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -15,7 +15,7 @@ * * @author schuller */ -public class RoutingActivityProcessor extends DefaultProcessor { +public class RoutingActivityProcessor extends DefaultProcessor implements Constants{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,RoutingActivityProcessor.class); @@ -27,9 +27,10 @@ protected void handleCreated() throws ProcessingException { action.setStatus(ActionStatus.DONE); action.setResult(new ActionResult(ActionResult.SUCCESSFUL,"Success.",0)); + String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); if(logger.isDebugEnabled()){ Activity activity=(Activity)action.getAjd(); - logger.debug("Processed routing activity <"+activity.getID()+"> in iteration <"+activity.getIteration().getCurrentValue()+">"); + logger.debug("Processed routing activity <"+activity.getID()+"> in iteration <"+myIteration+">"); } } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -98,7 +98,7 @@ epr.addNewAddress().setStringValue(Utilities.makeAddress(WorkflowInstance.SERVICE_NAME, uid)); CreateWorkflowResponseDocument res=CreateWorkflowResponseDocument.Factory.newInstance(); res.addNewCreateWorkflowResponse().setEndpointReference(epr); - ((WorkflowReferenceRP)properties.get(RP_WORKFLOW_REFS)).add(res.getCreateWorkflowResponse().getEndpointReference()); + ((WorkflowReferenceRP)properties.get(RP_WORKFLOW_REFS)).add(epr); setDirty(); return res; } Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -0,0 +1,76 @@ +package eu.unicore.workflow.pe; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.testng.annotations.Test; + +import de.fzj.unicore.uas.UAS; +import de.fzj.unicore.xnjs.ems.ActionStatus; +import eu.unicore.workflow.pe.iterators.ValueSetIterator; +import eu.unicore.workflow.pe.model.ActivityGroup; +import eu.unicore.workflow.pe.model.ForGroup; +import eu.unicore.workflow.pe.model.Iterate; +import eu.unicore.workflow.pe.model.PEWorkflow; +import eu.unicore.workflow.pe.xnjs.ForGroupProcessor; +import eu.unicore.workflow.pe.xnjs.TestActivity; +import eu.unicore.workflow.pe.xnjs.Validate; +import eu.unicore.workflow.xnjs.TestBase; + +public class TestForLoopProcessing extends TestBase { + + @Test + public void test1()throws Exception{ + Validate.clear(); + String wfID="wf"; + String[] iterationValues=new String[]{"a","b","c"}; + PEWorkflow wf=new PEWorkflow(wfID); + Iterate iter=new ValueSetIterator(iterationValues); + TestActivity a1=new TestActivity("a1",wfID,iter); + ForGroup fl=new ForGroup("for1",wfID,a1); + wf.setActivities(fl); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(500); + } + else break; + } + assert(Validate.wasInvoked("a1")); + Integer i=Validate.getInvocations("a1"); + assert(iterationValues.length==i.intValue()); + } + + + @Test + public void test2()throws Exception{ + Validate.clear(); + String wfID="wf"; + String[] iterationValues=new String[]{"a","b","c"}; + PEWorkflow wf=new PEWorkflow(wfID); + Iterate iter=new ValueSetIterator(iterationValues); + ActivityGroup ag=new ActivityGroup("grp1",wfID,iter); + TestActivity a1=new TestActivity("a1",wfID); + ag.setActivities(a1); + ForGroup fl=new ForGroup("for1", wfID, ag); + wf.setActivities(fl); + //UAS.setProperty(ForGroupProcessor.PROPERTY_MAX_CONCURRENT_ACTIVITIES, "1"); + + PEConfig.getInstance().getProcessEngine().process(wf, null); + + while(true){ + Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); + if(ActionStatus.DONE!=s.intValue()){ + Thread.sleep(500); + } + else break; + } + assert(Validate.wasInvoked("a1")); + Integer i=Validate.getInvocations("a1"); + assert(iterationValues.length==i.intValue()); + } + + +} \ No newline at end of file Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -2,7 +2,7 @@ import org.testng.annotations.Test; -import eu.unicore.workflow.pe.model.Iteration; +import eu.unicore.workflow.pe.iterators.Iteration; import eu.unicore.workflow.pe.xnjs.ProcessVariables; public class TestIteration { Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-27 12:58:56 UTC (rev 4682) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-27 14:35:16 UTC (rev 4683) @@ -3,10 +3,11 @@ import org.testng.annotations.Test; import de.fzj.unicore.xnjs.ems.ActionStatus; +import eu.unicore.workflow.pe.iterators.Iteration; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Condition; import eu.unicore.workflow.pe.model.DeclareVariableActivity; -import eu.unicore.workflow.pe.model.Iteration; +import eu.unicore.workflow.pe.model.Iterate; import eu.unicore.workflow.pe.model.ModifyVariableActivity; import eu.unicore.workflow.pe.model.PEWorkflow; import eu.unicore.workflow.pe.model.ScriptCondition; @@ -117,7 +118,7 @@ Integer i=Validate.getInvocations("inner"); assert(N==i.intValue()); - Iteration it=a1.getIteration(); + Iterate it=a1.getIteration(); assert it.getCurrentValue().startsWith("TEST"); } Ad... [truncated message content] |
From: <bsc...@us...> - 2009-05-28 13:20:31
|
Revision: 4685 http://unicore.svn.sourceforge.net/unicore/?rev=4685&view=rev Author: bschuller Date: 2009-05-28 13:20:21 +0000 (Thu, 28 May 2009) Log Message: ----------- Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/TestWABuilder.java Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -71,7 +71,7 @@ */ public void init(){ for(Activity a: activities.values()){ - a.getIteration().resetCounter(); + a.getIterate().resetCounter(); if(isStartActivity(a)){ a.status=ActivityStatus.READY; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -18,7 +18,7 @@ protected final String workflowID; - protected final Iterate iteration; + protected Iterate iteration; /** * construct a new model object @@ -39,10 +39,14 @@ return id; } - public Iterate getIteration(){ + public Iterate getIterate(){ return iteration; } + public void setIterate(Iterate iteration){ + this.iteration=iteration; + } + public String getWorkflowID(){ return workflowID; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/WABuilder.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -67,7 +67,9 @@ WorkAssignmentDocument wa=WorkAssignmentUtils.fromJSON(json); if(jsdl!=null){ if(posixApp!=null){ - JSDLUtils.setPOSIXApplication(posixApp, getApplicationDocument()); + ApplicationDocument doc=getApplicationDocument(); + JSDLUtils.setPOSIXApplication(posixApp, doc); + jsdl.getJobDefinition().getJobDescription().setApplication(doc.getApplication()); } Work w=wa.getWorkAssignment().getWork(); if(w==null)w=wa.getWorkAssignment().addNewWork(); @@ -75,7 +77,7 @@ w.setJobDefinition(jsdl.getJobDefinition()); } catch(Exception e){ - logger.error("",e); + LogUtil.logException("",e); } } return wa; @@ -150,11 +152,7 @@ * @return this builder */ public WABuilder runApplication(String name){ - try{ - getApplication().setApplicationName(name); - }catch(Exception e){ - logger.error("",e); - } + getApplication().setApplicationName(name); return this; } @@ -166,12 +164,8 @@ * @return this builder */ public WABuilder runApplication(String name, String version){ - try{ - getApplication().setApplicationName(name); - getApplication().setApplicationVersion(version); - }catch(Exception e){ - logger.error("",e); - } + getApplication().setApplicationName(name); + getApplication().setApplicationVersion(version); return this; } @@ -201,12 +195,8 @@ * @return this builder */ public WABuilder withArguments(String ... args){ - try{ - for(String s: args){ - getPosixApplicationDocument().getPOSIXApplication().addNewArgument().setStringValue(s); - } - }catch(Exception e){ - logger.error("",e); + for(String s: args){ + getPosixApplicationDocument().getPOSIXApplication().addNewArgument().setStringValue(s); } return this; } @@ -218,16 +208,12 @@ * @return this builder */ public WABuilder withEnvironment(String ... args){ - try{ - for(String s: args){ - EnvironmentType e=getPosixApplicationDocument().getPOSIXApplication().addNewEnvironment(); - String name=s.split("=")[0]; - String value=s.split("=")[1]; - e.setName(name); - e.setStringValue(value); - } - }catch(Exception e){ - logger.error("",e); + for(String s: args){ + EnvironmentType e=getPosixApplicationDocument().getPOSIXApplication().addNewEnvironment(); + String name=s.split("=")[0]; + String value=s.split("=")[1]; + e.setName(name); + e.setStringValue(value); } return this; } @@ -240,14 +226,10 @@ * @return this builder */ public WABuilder withInputFile(String source, String target){ - try{ - DataStagingType ds=getJSDL().getJobDefinition().getJobDescription().addNewDataStaging(); - ds.addNewSource().setURI(source); - ds.setFileName(target); - logicalNames.add(source); - }catch(Exception e){ - logger.error("",e); - } + DataStagingType ds=getJSDL().getJobDefinition().getJobDescription().addNewDataStaging(); + ds.addNewSource().setURI(source); + ds.setFileName(target); + logicalNames.add(source); return this; } @@ -259,14 +241,10 @@ * @return */ public WABuilder withOutputFile(String source, String target){ - try{ - DataStagingType ds=getJSDL().getJobDefinition().getJobDescription().addNewDataStaging(); - ds.addNewTarget().setURI(target); - ds.setFileName(source); - logicalNames.add(target); - }catch(Exception e){ - logger.error("",e); - } + DataStagingType ds=getJSDL().getJobDefinition().getJobDescription().addNewDataStaging(); + ds.addNewTarget().setURI(target); + ds.setFileName(source); + logicalNames.add(target); return this; } @@ -278,11 +256,7 @@ * @return this */ public WABuilder withWorkflowVariable(String name){ - try{ - getJSONWorkflowVariables().put(name); - }catch(Exception e){ - logger.error("",e); - } + getJSONWorkflowVariables().put(name); return this; } @@ -296,8 +270,8 @@ public WABuilder withNotificationURL(String ... URLs){ try{ json.put(NOTIFICATION_URLS,new JSONArray(Arrays.asList(URLs))); - }catch(Exception e){ - logger.error("",e); + }catch(JSONException je){ + LogUtil.logException("", je); } return this; } @@ -316,24 +290,19 @@ try{ if(json.optJSONArray(WORKFLOWVARIABLES)==null)json.put(WORKFLOWVARIABLES, new JSONArray()); return json.optJSONArray(WORKFLOWVARIABLES); - }catch(Exception e){ - logger.error("",e); + }catch(JSONException e){ + LogUtil.logException("",e); return null; } } public List<String> getWorkflowVariables(){ - try{ - List<String>res=new ArrayList<String>(); - Iterator i=getJSONWorkflowVariables().iterator(); - while(i.hasNext()){ - res.add(i.next().toString()); - } - return res; - }catch(Exception e){ - logger.error("",e); - return null; + List<String>res=new ArrayList<String>(); + Iterator i=getJSONWorkflowVariables().iterator(); + while(i.hasNext()){ + res.add(i.next().toString()); } + return res; } public JobDefinitionDocument getJsdl() { @@ -369,7 +338,7 @@ try{ json.put(name, value); }catch(JSONException je){ - logger.error("",je); + LogUtil.logException("",je); } } @@ -377,7 +346,7 @@ try{ return json.get(name).toString(); }catch(JSONException je){ - logger.error("",je); + LogUtil.logException("",je); return null; } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -105,7 +105,7 @@ } else { String base=getCurrentIteration(); - a.getIteration().setBase(base); + a.getIterate().setBase(base); id=submit(a,attr); } subTasks.add(id); @@ -140,8 +140,8 @@ vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); incrementCounterAndCheckMaxActivities(); //compute next iteration value - a.getIteration().next(vars); - String iteration=a.getIteration().getCurrentValue(); + a.getIterate().next(vars); + String iteration=a.getIterate().getCurrentValue(); //setup XNJS action String uuid=submitToXNJS(a, vars); a.setStatus(ActivityStatus.RUNNING); @@ -159,8 +159,8 @@ incrementCounterAndCheckMaxActivities(); PEStatus activityStatus=new PEStatus(); activityStatus.setActivityStatus(ActivityStatus.RUNNING); - a.getIteration().next(vars); - activityStatus.setIteration(a.getIteration().getCurrentValue()); + a.getIterate().next(vars); + activityStatus.setIteration(a.getIterate().getCurrentValue()); attr.getActivityStatus(a.getID()).add(activityStatus); logger.info("Submitting activity group <"+a.getID()+"> status "+activityStatus); String uuid=submitToXNJS(a, vars); @@ -183,7 +183,7 @@ subAction.setType(a.getType()); subAction.setAjd(a); subAction.setClient(action.getClient()); - String iteration=a.getIteration().getCurrentValue(); + String iteration=a.getIterate().getCurrentValue(); String uid=WorkAssignmentUtils.buildActionID(a.getWorkflowID(), a.getID(), iteration); subAction.setUUID(uid); subAction.getProcessingContext().put(ProcessVariables.class,vars); @@ -267,7 +267,7 @@ try{ workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); attr=workflowInfo.findSubFlowAttributes(ag.getID()); - PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIteration().getCurrentValue()); + PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIterate().getCurrentValue()); stat.setActivityStatus(ActivityStatus.SUCCESS); }finally{ if(workflowInfo!=null){ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -88,7 +88,7 @@ List<String>subTasks=action.getProcessingContext().get(List.class); ForGroup ag=(ForGroup)action.getAjd(); boolean dirty=false; - Iterate iterate=ag.getBody().getIteration(); + Iterate iterate=ag.getBody().getIterate(); boolean haveMore=iterate.hasNext(); if(!haveMore && (subTasks.size()==0)){ action.addLogTrace("All iterations processed."); @@ -127,8 +127,8 @@ id=submit((ActivityGroup)a,attr); } else { - String base=ag.getIteration().getCurrentValue(); - a.getIteration().setBase(base); + String base=ag.getIterate().getCurrentValue(); + a.getIterate().setBase(base); id=submit(a,attr); } subTasks.add(id); @@ -163,7 +163,7 @@ vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); incrementCounterAndCheckMaxActivities(); //compute next iteration value - Iterate iterate=a.getIteration(); + Iterate iterate=a.getIterate(); iterate.next(vars); String iteration=iterate.getCurrentValue(); if(iterate instanceof ForEachIterate){ @@ -185,7 +185,7 @@ ProcessVariables vars=new ProcessVariables(); vars.putAll(action.getProcessingContext().get(ProcessVariables.class).copy()); incrementCounterAndCheckMaxActivities(); - Iterate iterate=a.getIteration(); + Iterate iterate=a.getIterate(); iterate.next(vars); String iteration=iterate.getCurrentValue(); if(iterate instanceof ForEachIterate){ @@ -251,7 +251,6 @@ subActionLoop: while(iterator.hasNext()){ String subActionID=iterator.next(); Action sub=manager.getAction(subActionID); - boolean stillRunning=false; if(sub==null){ String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; action.addLogTrace(msg); @@ -266,7 +265,6 @@ //check status if(ActionStatus.DONE!=status){ - stillRunning=true; continue subActionLoop; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -41,7 +41,7 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); JSDLExecutionActivity work=(JSDLExecutionActivity)action.getAjd(); - String iteration=work.getIteration().getCurrentValue(); + String iteration=work.getIterate().getCurrentValue(); logger.info("Start processing work assignment execution for activity <"+work.getID()+"> in iteration <"+iteration+">"); ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); if(vars==null){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -1,17 +1,13 @@ package eu.unicore.workflow.pe; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; import org.testng.annotations.Test; -import de.fzj.unicore.uas.UAS; import de.fzj.unicore.xnjs.ems.ActionStatus; import eu.unicore.workflow.pe.iterators.ValueSetIterator; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.ForGroup; import eu.unicore.workflow.pe.model.Iterate; import eu.unicore.workflow.pe.model.PEWorkflow; -import eu.unicore.workflow.pe.xnjs.ForGroupProcessor; import eu.unicore.workflow.pe.xnjs.TestActivity; import eu.unicore.workflow.pe.xnjs.Validate; import eu.unicore.workflow.xnjs.TestBase; Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -3,7 +3,6 @@ import org.testng.annotations.Test; import de.fzj.unicore.xnjs.ems.ActionStatus; -import eu.unicore.workflow.pe.iterators.Iteration; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Condition; import eu.unicore.workflow.pe.model.DeclareVariableActivity; @@ -61,9 +60,9 @@ PEWorkflow wf=new PEWorkflow(wfID); //use the counter variable as iteration base value - a1.getIteration().setBase("${C}"); - m1.getIteration().setBase("${C}"); - d1.getIteration().setBase("${C}"); + a1.getIterate().setBase("${C}"); + m1.getIterate().setBase("${C}"); + d1.getIterate().setBase("${C}"); wf.setActivities(d1,m1,a1); Transition t1=new Transition("d1->a1",wfID,"d1","a1"); @@ -92,7 +91,7 @@ int N=5; DeclareVariableActivity d1=new DeclareVariableActivity("d1",wfID,"C","Integer","0"); ActivityGroup loopBody=new ActivityGroup("a1",wfID); - loopBody.getIteration().setBase("TEST"); + loopBody.getIterate().setBase("TEST"); loopBody.setLoopIteratorName("C"); TestActivity a1=new TestActivity("inner",wfID); loopBody.setActivities(a1); @@ -118,7 +117,7 @@ Integer i=Validate.getInvocations("inner"); assert(N==i.intValue()); - Iterate it=a1.getIteration(); + Iterate it=a1.getIterate(); assert it.getCurrentValue().startsWith("TEST"); } Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/TestWABuilder.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/TestWABuilder.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/TestWABuilder.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -0,0 +1,58 @@ +package eu.unicore.workflow.pe.util; + +import org.ggf.schemas.jsdl.x2005.x11.jsdl.ApplicationType; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument; +import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; +import org.testng.annotations.Test; + +public class TestWABuilder { + + @Test + public void test1(){ + + JobDefinitionDocument orig=JobDefinitionDocument.Factory.newInstance(); + ApplicationType app=orig.addNewJobDefinition().addNewJobDescription().addNewApplication(); + POSIXApplicationDocument posix=POSIXApplicationDocument.Factory.newInstance(); + EnvironmentType env=posix.addNewPOSIXApplication().addNewEnvironment(); + env.setName("test"); + env.setStringValue("value"); + posix.getPOSIXApplication().addNewArgument().setStringValue("-v"); + + app.set(posix); + + WABuilder b=new WABuilder(); + b.setJsdl(orig); + b.withEnvironment("new=value2"); + b.withArguments("-d","-c"); + JobDefinitionDocument mod=b.getJsdl(); + assert mod!=null; + assert 2==JSDLUtils.extractPosixApplication(mod.getJobDefinition().getJobDescription().getApplication()).getPOSIXApplication().sizeOfEnvironmentArray(); + assert 3==JSDLUtils.extractPosixApplication(mod.getJobDefinition().getJobDescription().getApplication()).getPOSIXApplication().sizeOfArgumentArray(); + } + + @Test + public void test2(){ + + JobDefinitionDocument orig=JobDefinitionDocument.Factory.newInstance(); + ApplicationType app=orig.addNewJobDefinition().addNewJobDescription().addNewApplication(); + POSIXApplicationDocument posix=POSIXApplicationDocument.Factory.newInstance(); + EnvironmentType env=posix.addNewPOSIXApplication().addNewEnvironment(); + env.setName("test"); + env.setStringValue("value"); + posix.getPOSIXApplication().addNewArgument().setStringValue("-v"); + + app.set(posix); + + WABuilder b=new WABuilder(); + b.setJsdl(orig); + b.withEnvironment("new=value2"); + b.withArguments("-d","-c"); + JobDefinitionType mod=b.getWorkAssignmentDocument().getWorkAssignment().getWork().getJobDefinition(); + assert mod!=null; + System.out.println(mod); + assert 2==JSDLUtils.extractPosixApplication(orig.getJobDefinition().getJobDescription().getApplication()).getPOSIXApplication().sizeOfEnvironmentArray(); + assert 3==JSDLUtils.extractPosixApplication(orig.getJobDefinition().getJobDescription().getApplication()).getPOSIXApplication().sizeOfArgumentArray(); + } +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/util/TestWABuilder.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivity.java 2009-05-28 13:20:21 UTC (rev 4685) @@ -6,7 +6,7 @@ /** - * Information about a workflow activity + * Special no-op activity for testing purposes * * @author schuller */ Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-05-28 07:48:21 UTC (rev 4684) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-05-28 13:20:21 UTC (rev 4685) @@ -5,10 +5,16 @@ <test verbose="2" name="Basic tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.TestXNJSSetup"/> + </classes> + </test> + + <test verbose="2" name="Utils tests" annotations="JDK"> + <classes> <class name="eu.unicore.workflow.pe.TestUtils"/> + <class name="eu.unicore.workflow.pe.utils.TestWABuilder"/> </classes> </test> - + <test verbose="2" name="Process engine tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.xnjs.TestActivityGroupProcessor"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-06-08 06:56:48
|
Revision: 4718 http://unicore.svn.sourceforge.net/unicore/?rev=4718&view=rev Author: bschuller Date: 2009-06-08 06:56:40 +0000 (Mon, 08 Jun 2009) Log Message: ----------- fix test bug Modified Paths: -------------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java workflow/trunk/workflowservice/testng-unittests.xml Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-06-06 21:17:08 UTC (rev 4717) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/xnjs/TestActivityGroupProcessor.java 2009-06-08 06:56:40 UTC (rev 4718) @@ -1,5 +1,6 @@ package eu.unicore.workflow.pe.xnjs; +import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import de.fzj.unicore.uas.UAS; @@ -96,4 +97,9 @@ } } + @AfterMethod + protected void cleanUp(){ + UAS.setProperty(ActivityGroupProcessor.PROPERTY_MAX_ACTIVITIES_PER_GROUP, String.valueOf(Integer.MAX_VALUE)); + } + } Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-06-06 21:17:08 UTC (rev 4717) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-06-08 06:56:40 UTC (rev 4718) @@ -11,7 +11,7 @@ <test verbose="2" name="Utils tests" annotations="JDK"> <classes> <class name="eu.unicore.workflow.pe.TestUtils"/> - <class name="eu.unicore.workflow.pe.utils.TestWABuilder"/> + <class name="eu.unicore.workflow.pe.util.TestWABuilder"/> </classes> </test> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-06-09 21:12:32
|
Revision: 4732 http://unicore.svn.sourceforge.net/unicore/?rev=4732&view=rev Author: bschuller Date: 2009-06-09 21:12:27 +0000 (Tue, 09 Jun 2009) Log Message: ----------- new feature: iteration over file sets (currently from UNICORE storages) Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ResolverFactory.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/SMSResolver.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestSMSResolver.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestValueSetIterator.java Removed Paths: ------------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,96 @@ +package eu.unicore.workflow.pe.iterators; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import eu.unicore.workflow.pe.iterators.ResolverFactory.Resolver; + +/** + * iterator to traverse file sets + * + * @author schuller + */ +public class FileSetIterator extends ValueSetIterator { + + private static final long serialVersionUID = 1L; + + private final static Logger logger=LogUtil.getLogger(LogUtil.SERVICES, FileSetIterator.class); + + private final String workflowID; + private final FileSet[] fileSets; + + /** + * + * @param workflowID - the workflow ID + * @param fileSets - the file sets + */ + public FileSetIterator(String workflowID, FileSet... fileSets)throws ProcessingException{ + this.workflowID=workflowID; + this.fileSets=fileSets; + } + + /** + * (re-)initialise the list of values from the defined filesets + * @throws ProcessingException + */ + protected void reInit()throws ProcessingException{ + List<String>results=new ArrayList<String>(); + for(FileSet f: fileSets){ + try{ + Resolver r=ResolverFactory.getResolver(f.base); + results.addAll(r.resolve(workflowID, f)); + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + values=results.toArray(new String[results.size()]); + if(logger.isDebugEnabled()){ + StringBuilder sb=new StringBuilder(); + sb.append("Using the following files:\n"); + for(String val: values){ + sb.append(val+" "); + } + logger.debug(sb.toString()); + } + } + + public void reset()throws ProcessingException{ + try{ + reInit(); + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + + public String getWorkflowID() { + return workflowID; + } + + public static class FileSet implements Serializable{ + + private static final long serialVersionUID = 1L; + + final String base; + final String[] includes; + final String[] excludes; + final boolean recurse; + + /** + * @param base - the base path + * @param includes - path patterns to include + * @param excludes - path patterns to exclude + * @param recurse - whether to recurse into subdirs + */ + public FileSet(String base, String[] includes, String[] excludes, boolean recurse){ + this.base=base; + this.includes=includes!=null?includes:new String[]{}; + this.excludes=excludes!=null?excludes:new String[]{}; + this.recurse=recurse; + } + } +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -7,6 +7,7 @@ import org.apache.log4j.Logger; import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.xnjs.ems.ProcessingException; import eu.unicore.workflow.pe.model.Iterate; import eu.unicore.workflow.pe.xnjs.ProcessVariables; @@ -151,7 +152,7 @@ return counter; } - public void resetCounter(){ + public void reset()throws ProcessingException{ //counter=0; } } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ResolverFactory.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ResolverFactory.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ResolverFactory.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,40 @@ +package eu.unicore.workflow.pe.iterators; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import de.fzj.unicore.xnjs.ems.ProcessingException; + +import eu.unicore.workflow.pe.iterators.FileSetIterator.FileSet; + +/** + * Use this to get a {@link Resolver} that can resolve elements of file sets<br/> + * + * @author schuller + */ +public class ResolverFactory { + + private static final Set<Resolver> resolvers=new HashSet<Resolver>(); + + static { + resolvers.add(new SMSResolver()); + } + + public static void registerResolver(Resolver resolver){ + resolvers.add(resolver); + }; + + public static Resolver getResolver(String base)throws ProcessingException{ + for(Resolver r: resolvers){ + if(r.acceptBase(base))return r; + } + throw new ProcessingException("No matching resolver found for <"+base+">"); + } + + public static interface Resolver{ + public boolean acceptBase(String base); + public Collection<String> resolve(String workflowID, FileSet fileset)throws ProcessingException; + } + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ResolverFactory.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/SMSResolver.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/SMSResolver.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/SMSResolver.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,164 @@ +package eu.unicore.workflow.pe.iterators; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import org.unigrids.services.atomic.types.GridFileType; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + +import de.fzj.unicore.uas.client.StorageClient; +import de.fzj.unicore.uas.security.SecurityManager; +import de.fzj.unicore.uas.security.UASSecurityProperties; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import eu.unicore.security.xfireutil.SecurityTokens; +import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.iterators.FileSetIterator.FileSet; +import eu.unicore.workflow.pe.iterators.ResolverFactory.Resolver; + +/** + * resolve files on a UNICORE 6 storage + * + * @author schuller + */ +public class SMSResolver implements Resolver{ + + public boolean acceptBase(String base) { + + if(base!=null && base.contains("StorageManagement"))return true; + + return false; + } + + public Collection<String> resolve(String workflowID, FileSet fileset) throws ProcessingException { + try{ + String url=getURL(fileset.base); + String baseDir=getBaseDir(fileset.base); + List<String>results=new ArrayList<String>(); + StorageClient sms=getSMSClient(url, workflowID); + results.addAll(getMatches(sms,baseDir,fileset)); + return results; + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + + protected Collection<String>getMatches(StorageClient sms, String base, FileSet fileSet)throws Exception{ + //TODO protocol? + String urlBase="BFT:"+sms.getEPR().getAddress().getStringValue()+"#"; + List<String>results=new ArrayList<String>(); + GridFileType[] files=sms.listDirectory(base); + for(GridFileType f: files){ + if(fileSet.recurse && f.isSetIsDirectory() && f.getIsDirectory()){ + results.addAll(getMatches(sms, f.getPath(), fileSet)); + } + //now add individual files + if(matches(f.getPath(),base,fileSet)){ + results.add(urlBase+f.getPath()); + } + } + return results; + } + + protected boolean matches(String path, String base, FileSet fileSet){ + boolean res=false; + //check if it is in the includes + if(fileSet.includes.length>0){ + for(String include: fileSet.includes){ + res=res || match(path,include); + } + } + //else everything is included + else res=true; + + //if not explicitly excluded + if(fileSet.excludes.length>0){ + for(String exclude: fileSet.excludes){ + //if an exclude matches, we can simply return false + if(match(path,exclude))return false; + } + } + + + return res; + } + + + protected boolean match(String path, String expr){ + Pattern p = getPattern(expr); + boolean res=p.matcher(path).find(); + System.out.println("Match: "+path+" =? "+expr+" : "+res); + return res; + } + + private Map<String, Pattern>patterns=new HashMap<String, Pattern>(); + + protected Pattern getPattern(String expr){ + Pattern p=patterns.get(expr); + if(p==null){ + p=compilePattern(expr); + patterns.put(expr, p); + } + return p; + } + + /* + * translate wildcards "*" and "?" into a regular expression pattern + * and create the regexp Pattern + * + * TODO handle special characters? + */ + private Pattern compilePattern(String expr){ + StringBuilder pattern=new StringBuilder(); + pattern.append(expr.replace("*", ".*").replace("?", ".")); + + return Pattern.compile(pattern.toString()); + } + + /** + * make a valid URL from the given base (i.e. strip off any leading protocol) + * @param base + * @return + */ + String getURL(String base)throws Exception{ + //check if we have an extra U6 protocol in the string + int i=base.indexOf(':'); + String sub=base.substring(i+1); + if ( sub.startsWith("http://") || sub.startsWith("https://")){ + int j=sub.indexOf('#'); + if(j>-1){ + sub=sub.substring(0, j); + } + return sub; + } + return base; + } + + /** + * extract the base dir from the given UNICORE storage URI + * @param base + * @return the base dir, starting with "/" + */ + String getBaseDir(String base)throws Exception{ + if(!base.startsWith("/"))base="/"+base; + int i=base.indexOf('#'); + if(i>-1){ + String res=base.substring(i+1); + if(!res.startsWith("/"))res="/"+res; + return res; + } + return "/"; + } + + protected StorageClient getSMSClient(String url, String workflowID)throws Exception{ + SecurityTokens st=(SecurityTokens)PEConfig.getInstance().getPersistence().read(workflowID).getSecurityContext().get(SecurityTokens.KEY); + EndpointReferenceType epr=EndpointReferenceType.Factory.newInstance(); + epr.addNewAddress().setStringValue(url); + UASSecurityProperties sp=SecurityManager.getIssueTrustDelegationProperties(st, epr); + StorageClient sms=new StorageClient(epr.getAddress().getStringValue(),epr,sp); + return sms; + } +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/SMSResolver.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -2,6 +2,7 @@ import java.util.NoSuchElementException; +import eu.unicore.workflow.pe.model.ForEachIterate; import eu.unicore.workflow.pe.xnjs.ProcessVariables; /** @@ -9,11 +10,11 @@ * * @author schuller */ -public class ValueSetIterator extends Iteration{ +public class ValueSetIterator extends Iteration implements ForEachIterate{ private static final long serialVersionUID = 1L; - private final String[] values; + protected String[] values; private int position=-1; public ValueSetIterator(String ... values){ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -5,6 +5,8 @@ import java.util.Iterator; import java.util.List; +import de.fzj.unicore.xnjs.ems.ProcessingException; + import eu.unicore.workflow.pe.xnjs.ProcessVariables; /** @@ -69,9 +71,9 @@ * update this group: put activities that can be submitted * into "READY" state. */ - public void init(){ + public void init()throws ProcessingException{ for(Activity a: activities.values()){ - a.getIterate().resetCounter(); + a.getIterate().reset(); if(isStartActivity(a)){ a.status=ActivityStatus.READY; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -1,5 +1,6 @@ package eu.unicore.workflow.pe.model; +import de.fzj.unicore.xnjs.ems.ProcessingException; import eu.unicore.workflow.pe.xnjs.ProcessVariables; /** @@ -29,9 +30,9 @@ public void next(ProcessVariables vars); /** - * reset, if possible + * reset the "innermost" iteration (if applicable) */ - public void resetCounter(); + public void reset()throws ProcessingException; /** * get the full, resolved value of the iteration Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -69,6 +69,7 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); ForGroup ag=(ForGroup)action.getAjd(); + ag.getBody().getIterate().reset(); String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); logger.info("Processing for-each group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+myIteration+">"); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -6,6 +6,7 @@ import org.testng.annotations.Test; import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ProcessingException; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.PEWorkflow; import eu.unicore.workflow.pe.model.Transition; @@ -17,7 +18,7 @@ public class TestCallbackProcessing extends TestBase { - private PEWorkflow buildJob(String workflowID){ + private PEWorkflow buildJob(String workflowID)throws ProcessingException{ PEWorkflow job=new PEWorkflow(workflowID); List<Activity>as=new ArrayList<Activity>(); TestActivity a1=new TestActivity("a1",job.getWorkflowID()); @@ -34,7 +35,6 @@ @Test public void test1()throws Exception{ - CallbackProcessorImpl cp=new CallbackProcessorImpl(xnjs); String uid=WorkAssignmentUtils.getActionIDFromEncodedWAID("1/2/3/cutthis"); assert uid.equals("1/2/3"); } Deleted: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -1,60 +0,0 @@ -package eu.unicore.workflow.pe; - -import org.testng.annotations.Test; - -import eu.unicore.workflow.pe.iterators.Iteration; -import eu.unicore.workflow.pe.xnjs.ProcessVariables; - -public class TestIteration { - - @Test - public void test1Variable(){ - ProcessVariables vars=new ProcessVariables(); - vars.put("TEST", "123"); - Iteration i=new Iteration(); - i.setBase("${TEST}"); - i.next(vars); - assert("123".equals(i.getResolvedBase())); - } - - @Test - public void test2Variables(){ - ProcessVariables vars=new ProcessVariables(); - vars.put("TEST", "123"); - vars.put("FOO", "456"); - Iteration i=new Iteration(); - i.setBase("${TEST}:::${FOO}"); - i.next(vars); - assert("123:::456".equals(i.getResolvedBase())); - } - - @Test - public void testMixedContent(){ - ProcessVariables vars=new ProcessVariables(); - vars.put("TEST", "123"); - vars.put("FOO", "456"); - Iteration i=new Iteration(); - i.setBase("abc${TEST}:::SomeOtherFOOContent:::${FOO}abc"); - i.next(vars); - assert("abc123:::SomeOtherFOOContent:::456abc".equals(i.getResolvedBase())); - } - - @Test - public void testUseCounter(){ - ProcessVariables vars=new ProcessVariables(); - Iteration i=new Iteration(); - i.next(vars); - assert("1".equals(i.getCurrentValue())); - } - - - @Test(expectedExceptions=IllegalStateException.class) - public void testForIllegalState(){ - ProcessVariables vars=new ProcessVariables(); - vars.put("TEST", "123"); - Iteration i=new Iteration(); - i.setBase("foo"); - i.getCurrentValue(); - } - -} Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -6,6 +6,7 @@ import org.testng.annotations.Test; import de.fzj.unicore.xnjs.ems.ActionStatus; +import de.fzj.unicore.xnjs.ems.ProcessingException; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.PEWorkflow; import eu.unicore.workflow.pe.model.Transition; @@ -16,7 +17,7 @@ public class TestStatusReporting extends TestBase { - private PEWorkflow buildJob(String workflowID){ + private PEWorkflow buildJob(String workflowID)throws ProcessingException{ PEWorkflow job=new PEWorkflow(workflowID); List<Activity>as=new ArrayList<Activity>(); as.add(new TestActivity("a1",job.getWorkflowID())); Deleted: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -1,60 +0,0 @@ -package eu.unicore.workflow.pe; - -import org.testng.annotations.Test; - -import eu.unicore.workflow.pe.iterators.ValueSetIterator; -import eu.unicore.workflow.pe.model.Iterate; -import eu.unicore.workflow.pe.xnjs.ProcessVariables; - -public class TestValueSetIterator { - - @Test - public void testNoBase(){ - String[] values=new String[]{"foo","bar","baz"}; - ValueSetIterator vsi=new ValueSetIterator(values); - ProcessVariables vars=new ProcessVariables(); - for(int i=0;i< values.length;i++){ - assert vsi.hasNext(); - vsi.next(vars); - String next=vsi.getCurrentValue(); - assert next.equals(String.valueOf(i)); - } - assert !vsi.hasNext(); - } - - @Test - public void testBase(){ - String[] values=new String[]{"foo","bar","baz"}; - ValueSetIterator vsi=new ValueSetIterator(values); - ProcessVariables vars=new ProcessVariables(); - String base="base"; - vsi.setBase(base); - for(int i=0;i< values.length;i++){ - assert vsi.hasNext(); - vsi.next(vars); - String next=vsi.getCurrentValue(); - assert (base+Iterate.SEPARATOR+String.valueOf(i)).equals(next); - } - assert !vsi.hasNext(); - } - - @Test - public void testResolvedBase(){ - String[] values=new String[]{"foo","bar","baz"}; - ValueSetIterator vsi=new ValueSetIterator(values); - ProcessVariables vars=new ProcessVariables(); - String base="BASE"; - String baseVal="base"; - vars.put(base, baseVal); - vsi.setBase("${"+base+"}"); - for(int i=0;i< values.length;i++){ - assert vsi.hasNext(); - vsi.next(vars); - String next=vsi.getCurrentValue(); - assert (baseVal+Iterate.SEPARATOR+String.valueOf(i)).equals(next); - } - assert !vsi.hasNext(); - } - - -} Copied: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java (from rev 4683, workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestIteration.java) =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,60 @@ +package eu.unicore.workflow.pe.iterators; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.iterators.Iteration; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class TestIteration { + + @Test + public void test1Variable(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + Iteration i=new Iteration(); + i.setBase("${TEST}"); + i.next(vars); + assert("123".equals(i.getResolvedBase())); + } + + @Test + public void test2Variables(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + vars.put("FOO", "456"); + Iteration i=new Iteration(); + i.setBase("${TEST}:::${FOO}"); + i.next(vars); + assert("123:::456".equals(i.getResolvedBase())); + } + + @Test + public void testMixedContent(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + vars.put("FOO", "456"); + Iteration i=new Iteration(); + i.setBase("abc${TEST}:::SomeOtherFOOContent:::${FOO}abc"); + i.next(vars); + assert("abc123:::SomeOtherFOOContent:::456abc".equals(i.getResolvedBase())); + } + + @Test + public void testUseCounter(){ + ProcessVariables vars=new ProcessVariables(); + Iteration i=new Iteration(); + i.next(vars); + assert("1".equals(i.getCurrentValue())); + } + + + @Test(expectedExceptions=IllegalStateException.class) + public void testForIllegalState(){ + ProcessVariables vars=new ProcessVariables(); + vars.put("TEST", "123"); + Iteration i=new Iteration(); + i.setBase("foo"); + i.getCurrentValue(); + } + +} Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestSMSResolver.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestSMSResolver.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestSMSResolver.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,80 @@ +package eu.unicore.workflow.pe.iterators; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.iterators.FileSetIterator.FileSet; + +public class TestSMSResolver { + + @Test + public void testMakeURL()throws Exception{ + SMSResolver r=new SMSResolver(); + String b1="BFT:http://localhost:8080?res=xx#/basedir"; + String u1=r.getURL(b1); + assert "http://localhost:8080?res=xx".equals(u1); + String baseDir=r.getBaseDir(b1); + assert "/basedir".equals(baseDir); + + String b2="http://localhost:8080?res=xx"; + String u2=r.getURL(b2); + assert b2.equals(u2); + baseDir=r.getBaseDir(b2); + assert "/".equals(baseDir); + + String b3="BFT:http://localhost:8080?res=xx#basedir"; + String u3=r.getURL(b3); + assert "http://localhost:8080?res=xx".equals(u3); + baseDir=r.getBaseDir(b3); + assert "/basedir".equals(baseDir); + } + + @Test + public void testMatchIncludes(){ + SMSResolver r=new SMSResolver(); + String[]includes=new String[]{"*.pdf"}; + FileSet f=new FileSet("/",includes,null,false); + + String base="/"; + assert r.matches("/a.pdf", base, f); + assert !r.matches("/a.txt", base, f); + + base="/foo"; + assert r.matches("/foo/a.pdf", base, f); + assert !r.matches("/foo/a.txt", base, f); + } + + @Test + public void testMatchExcludes(){ + SMSResolver r=new SMSResolver(); + String[]excludes=new String[]{"*.txt"}; + FileSet f=new FileSet("/",null,excludes,false); + + String base="/"; + assert r.matches("/a.pdf", base, f); + assert !r.matches("/a.txt", base, f); + + base="/foo"; + assert r.matches("/foo/a.pdf", base, f); + assert !r.matches("/foo/a.txt", base, f); + } + + @Test + public void testMatchIncludeExclude(){ + SMSResolver r=new SMSResolver(); + String[]includes=new String[]{"*.txt"}; + String[]excludes=new String[]{"a.txt"}; + FileSet f=new FileSet("/",includes,excludes,false); + + String base="/"; + assert r.matches("/b.txt", base, f); + assert !r.matches("/a.txt", base, f); + assert !r.matches("/a.pdf", base, f); + + base="/foo"; + assert r.matches("/b.txt", base, f); + assert !r.matches("/foo/a.pdf", base, f); + assert !r.matches("/foo/a.txt", base, f); + } + + +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestSMSResolver.java ___________________________________________________________________ Added: svn:mime-type + text/plain Copied: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestValueSetIterator.java (from rev 4683, workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestValueSetIterator.java) =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestValueSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestValueSetIterator.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -0,0 +1,60 @@ +package eu.unicore.workflow.pe.iterators; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.iterators.ValueSetIterator; +import eu.unicore.workflow.pe.model.Iterate; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class TestValueSetIterator { + + @Test + public void testNoBase(){ + String[] values=new String[]{"foo","bar","baz"}; + ValueSetIterator vsi=new ValueSetIterator(values); + ProcessVariables vars=new ProcessVariables(); + for(int i=0;i< values.length;i++){ + assert vsi.hasNext(); + vsi.next(vars); + String next=vsi.getCurrentValue(); + assert next.equals(String.valueOf(i)); + } + assert !vsi.hasNext(); + } + + @Test + public void testBase(){ + String[] values=new String[]{"foo","bar","baz"}; + ValueSetIterator vsi=new ValueSetIterator(values); + ProcessVariables vars=new ProcessVariables(); + String base="base"; + vsi.setBase(base); + for(int i=0;i< values.length;i++){ + assert vsi.hasNext(); + vsi.next(vars); + String next=vsi.getCurrentValue(); + assert (base+Iterate.SEPARATOR+String.valueOf(i)).equals(next); + } + assert !vsi.hasNext(); + } + + @Test + public void testResolvedBase(){ + String[] values=new String[]{"foo","bar","baz"}; + ValueSetIterator vsi=new ValueSetIterator(values); + ProcessVariables vars=new ProcessVariables(); + String base="BASE"; + String baseVal="base"; + vars.put(base, baseVal); + vsi.setBase("${"+base+"}"); + for(int i=0;i< values.length;i++){ + assert vsi.hasNext(); + vsi.next(vars); + String next=vsi.getCurrentValue(); + assert (baseVal+Iterate.SEPARATOR+String.valueOf(i)).equals(next); + } + assert !vsi.hasNext(); + } + + +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestValueSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/rp/TestReferenceRPs.java 2009-06-09 21:12:27 UTC (rev 4732) @@ -1,7 +1,6 @@ package org.chemomentum.dsws.rp; import org.chemomentum.common.ws.WorkflowManagement; -import org.chemomentum.workflow.xmlbeans.WorkflowReferenceDocument; import org.testng.annotations.Test; import org.w3.x2005.x08.addressing.EndpointReferenceType; Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-06-09 20:44:42 UTC (rev 4731) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-06-09 21:12:27 UTC (rev 4732) @@ -26,8 +26,9 @@ <class name="eu.unicore.workflow.pe.TestVariablesActivities"/> <class name="eu.unicore.workflow.pe.TestWorkflowProcessing"/> <class name="eu.unicore.workflow.pe.TestStatusReporting"/> - <class name="eu.unicore.workflow.pe.TestIteration"/> - <class name="eu.unicore.workflow.pe.TestValueSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestIteration"/> + <class name="eu.unicore.workflow.pe.iterators.TestValueSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestSMSResolver"/> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-06-23 15:30:56
|
Revision: 4787 http://unicore.svn.sourceforge.net/unicore/?rev=4787&view=rev Author: bschuller Date: 2009-06-23 15:30:54 +0000 (Tue, 23 Jun 2009) Log Message: ----------- add basic code for variable set iterator Modified Paths: -------------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/C9MResolver.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/VariableSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/BeanShellEvaluator.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestVariableSetIterator.java Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/C9MResolver.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/C9MResolver.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/C9MResolver.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -9,7 +9,6 @@ import org.apache.log4j.Logger; import org.chemomentum.common.util.Config; import org.chemomentum.common.ws.ILocationManager; -import org.chemomentum.common.ws.exceptions.LocationMapperException; import org.chemomentum.dataManagement.locationManager.QueryLocationRequestDocument; import org.chemomentum.dataManagement.locationManager.QueryLocationResponseDocument; import org.chemomentum.dataManagement.locationManager.QueryLocationRequestDocument.QueryLocationRequest.Input; @@ -103,75 +102,8 @@ } } } - } - return results; } - - - protected String getLocation(ILocationManager lm, String c9mLocation)throws LocationMapperException{ - QueryLocationRequestDocument req=QueryLocationRequestDocument.Factory.newInstance(); - req.addNewQueryLocationRequest().addNewInput().setLogicalName(c9mLocation); - QueryLocationResponseDocument res=lm.queryLocation(req); - if(res.getQueryLocationResponse().getFaultsOccurred()){ - logger.debug("Could not resolve location, result "+res); - return null; - } - else{ - String[]locs=res.getQueryLocationResponse().getResultArray(0).getPhysicalLocationArray(); - if(locs.length>0){ - String l=locs[0]; - logger.debug("Resolved logical location as: "+l); - return l; - } - return null; - } - } - - /** - * resolve a logical name - * @param desc - the C9M URL - * @return the SMS URL - * @throws Exception - */ - private String resolveC9MLocation(String workflowID, String desc) throws Exception{ - IRegistryQuery registry=RegistryHandler.getExternalRegistryClient(); - List<EndpointReferenceType> available=registry.listServices(accessServicePortType); - available.addAll(registry.listServices(ILocationManager.PORT)); - if(available.size()==0){ - logger.debug("No location mapping service available!"); - } - - for(EndpointReferenceType epr: available){ - String url=epr.getAddress().getStringValue(); - logger.debug("Querying location mapping service at "+url); - SecurityTokens st=(SecurityTokens)PEConfig.getInstance().getPersistence().read(workflowID).getSecurityContext().get(SecurityTokens.KEY); - UASSecurityProperties sp=SecurityManager.getIssueTrustDelegationProperties(st, epr); - //now get location - ILocationManager lm=new UASClientFactory(sp).createPlainWSProxy(ILocationManager.class,url,sp); - - - QueryLocationRequestDocument req=QueryLocationRequestDocument.Factory.newInstance(); - req.addNewQueryLocationRequest().addNewInput().setLogicalName(desc); - QueryLocationResponseDocument res=lm.queryLocation(req); - if(res.getQueryLocationResponse().getFaultsOccurred()){ - logger.debug("Could not resolve location, result "+res); - } - else{ - String[]locs=res.getQueryLocationResponse().getResultArray(0).getPhysicalLocationArray(); - if(locs.length>0){ - String l=locs[0]; - logger.debug("Resolved logical location as: "+l); - return l; - } - } - } - - return null; - } - - - } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -54,7 +54,7 @@ /* (non-Javadoc) * @see eu.unicore.workflow.pe.model.Iterate#next(eu.unicore.workflow.pe.xnjs.ProcessVariables) */ - public void next(ProcessVariables vars){ + public void next(final ProcessVariables vars){ if(base!=null || iteratorName!=null)resolve(vars); counter++; } @@ -135,7 +135,7 @@ if(logger.isDebugEnabled())logger.debug("Resolved iterator <"+iteratorName+"> as <"+resolvedIteratorName+">"); } - protected void resolve(ProcessVariables vars){ + protected void resolve(final ProcessVariables vars){ resolveBase(vars); if(iteratorName!=null)resolveIterator(vars); } @@ -152,7 +152,7 @@ return counter; } - public void reset()throws ProcessingException{ + public void reset(final ProcessVariables vars)throws ProcessingException{ //counter=0; } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -54,10 +54,15 @@ return values!=null && values.length>0 && position<values.length-1; } - public void next(ProcessVariables vars) { + @Override + public void next(final ProcessVariables vars) { if(!hasNext())throw new NoSuchElementException("No more values"); super.next(vars); position++; } + public void fillContext(ProcessVariables vars){ + vars.put(PV_CURRENT_FOR_EACH_VALUE, getCurrentUnderlyingValue()); + vars.put(PV_CURRENT_FOR_EACH_INDEX, getCurrentIndex()); + } } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/VariableSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/VariableSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/VariableSetIterator.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -0,0 +1,156 @@ +package eu.unicore.workflow.pe.iterators; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import de.fzj.unicore.uas.util.LogUtil; +import de.fzj.unicore.xnjs.ems.ProcessingException; +import eu.unicore.workflow.pe.model.EvaluationException; +import eu.unicore.workflow.pe.util.BeanShellEvaluator; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +/** + * iterator over a set of values calulated from + * variable expressions + * + * @author schuller + */ +public class VariableSetIterator extends ValueSetIterator { + + private static final long serialVersionUID = 1L; + + private final static Logger logger=LogUtil.getLogger(LogUtil.SERVICES, VariableSetIterator.class); + + private final String workflowID; + private final VariableSet[] variableSets; + + /** + * + * @param workflowID - the workflow ID + * @param variableSets - the variable sets + */ + public VariableSetIterator(String workflowID, VariableSet... varSets){ + this.workflowID=workflowID; + this.variableSets=varSets; + } + + /** + * (re-)initialise the list of values from the defined filesets + * @throws ProcessingException + */ + protected void reInit(ProcessVariables vars)throws ProcessingException{ + List<String>results=new ArrayList<String>(); + for(int i=0;i<variableSets.length;i++){ + VariableSet v=variableSets[i]; + try{ + results=zip(vars,results,v); + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + values=results.toArray(new String[results.size()]); + if(logger.isDebugEnabled()){ + StringBuilder sb=new StringBuilder(); + sb.append("Iterating over the following values:\n"); + for(String val: values){ + sb.append(val+" "); + } + logger.debug(sb.toString()); + } + } + + protected List<String> zip( ProcessVariables ctx, List<String>base, VariableSet v)throws EvaluationException{ + List<String>results=new ArrayList<String>(); + if(base==null||base.size()==0){ + results.addAll(v.values(ctx)); + } + else{ + for(String left: base){ + List<String> rightVals=v.values(ctx); + for(String right: rightVals)results.add(left+"_"+right); + } + } + return results; + } + + @Override + public void reset(final ProcessVariables vars)throws ProcessingException{ + super.reset(vars); + try{ + reInit(vars); + }catch(Exception ex){ + throw new ProcessingException(ex); + } + } + + public String getWorkflowID() { + return workflowID; + } + + @Override + public void fillContext(ProcessVariables vars){ + super.fillContext(vars); + String curr=getCurrentUnderlyingValue(); + String[] varValues=curr.split("_"); + for(int i=0;i<variableSets.length;i++){ + vars.put(variableSets[i].variableName,varValues[i]); + } + } + + public static class VariableSet implements Serializable{ + + private static final long serialVersionUID = 1L; + + final String variableName; + final String startValue; + final String modifier; + final String condition; + + + /** + * + * @param variableName + * @param startValue + * @param condition + * @param modifier + */ + public VariableSet(String variableName, String startValue, String condition, String modifier){ + this.variableName=variableName; + this.startValue=startValue; + this.modifier=modifier; + this.condition=condition; + } + + public List<String> values(ProcessVariables ctx)throws EvaluationException{ + List<String>values=new ArrayList<String>(); + ProcessVariables vars=ctx.copy(); + vars.put(variableName, Integer.valueOf(startValue)); + values.add(startValue); + BeanShellEvaluator eval=new BeanShellEvaluator(); + int c=0; + try{ + while(true){ + Integer next=eval.evaluateToInteger(modifier, variableName, vars); + vars.put(variableName, next); + c++; + boolean cont=eval.evaluate(condition, vars); + if(!cont || c > 1000){ + if(c>1000){ + logger.debug("Stopping because of too many values"); + throw new EvaluationException("Too many values ("+c+") in value set for variable <"+variableName+">"); + } + break; + } + values.add(String.valueOf(next)); + } + return values; + }catch(Exception ex){ + throw new EvaluationException("Error building value set for variable <"+variableName+">",ex); + } + } + + } +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/VariableSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ActivityGroup.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -66,14 +66,17 @@ return false; } + public void init()throws ProcessingException{ + init(null); + } /** * update this group: put activities that can be submitted * into "READY" state. */ - public void init()throws ProcessingException{ + public void init(final ProcessVariables vars)throws ProcessingException{ for(Activity a: activities.values()){ - a.getIterate().reset(); + a.getIterate().reset(vars); if(isStartActivity(a)){ a.status=ActivityStatus.READY; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ForEachIterate.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -1,8 +1,20 @@ package eu.unicore.workflow.pe.model; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + public interface ForEachIterate extends Iterate { /** + * Workflow variable containing the current iterator value in a for-each group + */ + public static final String PV_CURRENT_FOR_EACH_VALUE="CURRENT_ITERATOR_VALUE"; + + /** + * Workflow variable containing the current iterator index in a for-each group + */ + public static final String PV_CURRENT_FOR_EACH_INDEX="CURRENT_ITERATOR_INDEX"; + + /** * get the current value of the underlying value set */ public String getCurrentUnderlyingValue(); @@ -12,4 +24,9 @@ */ public String getCurrentIndex(); + /** + * put all relevant values into the processing context + * @param vars + */ + public void fillContext(ProcessVariables vars); } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/Iterate.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -32,7 +32,7 @@ /** * reset the "innermost" iteration (if applicable) */ - public void reset()throws ProcessingException; + public void reset(final ProcessVariables vars)throws ProcessingException; /** * get the full, resolved value of the iteration Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ScriptCondition.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -1,16 +1,7 @@ package eu.unicore.workflow.pe.model; -import java.io.Reader; -import java.io.StringReader; -import java.util.Map.Entry; +import eu.unicore.workflow.pe.util.BeanShellEvaluator; -import org.apache.log4j.Logger; - -import bsh.EvalError; -import bsh.Interpreter; -import de.fzj.unicore.uas.util.LogUtil; -import eu.unicore.workflow.pe.xnjs.ProcessVariables; - /** * Evaluate a condition that is based on a Beanshell script * @@ -20,8 +11,6 @@ private static final long serialVersionUID = 1L; - private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ScriptCondition.class); - private final String script; public ScriptCondition(String id, String workflowID, String script) { @@ -35,38 +24,10 @@ public synchronized boolean evaluate()throws EvaluationException{ try{ - if(processVariables==null){ - throw new EvaluationException("No process variables were defined"); - } - Interpreter interpreter = new Interpreter(); - prepareInterpreter(interpreter, processVariables); - Reader sr = new StringReader(script); - logger.debug("Evaluating expression: "+script); - Object o=interpreter.eval(sr); - if(o instanceof Boolean){ - return ((Boolean)o).booleanValue(); - } - else throw new IllegalArgumentException("Conditional expression in condition <"+id+">does not evaluate to a boolean!"); - + return new BeanShellEvaluator().evaluate(script, processVariables); + }catch(Exception ex){ + throw new EvaluationException("Error evaluating condition with id <"+id+">",ex); } - catch(EvalError ee){ - throw new EvaluationException(ee); - } - catch(IllegalArgumentException iae){ - throw new EvaluationException(iae); - } - } - private void prepareInterpreter(Interpreter interpreter, ProcessVariables vars)throws EvalError{ - logger.debug("Context has "+vars.entrySet().size()+" entries"); - for(Entry<String,Object> entry: vars.entrySet()){ - String key=entry.getKey(); - Object val=entry.getValue(); - logger.debug("Context: "+key+"="+String.valueOf(val)); - interpreter.set(key, val); - } - } - - } Added: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/BeanShellEvaluator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/BeanShellEvaluator.java (rev 0) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/BeanShellEvaluator.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -0,0 +1,88 @@ +package eu.unicore.workflow.pe.util; + +import java.io.Reader; +import java.io.StringReader; +import java.util.Map.Entry; + +import org.apache.log4j.Logger; + +import bsh.EvalError; +import bsh.Interpreter; +import de.fzj.unicore.uas.util.LogUtil; +import eu.unicore.workflow.pe.model.EvaluationException; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class BeanShellEvaluator { + + private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,BeanShellEvaluator.class); + + /** + * + * @param script + * @param processVariables + * @return boolean + * @throws EvaluationException + * @throws IllegalArgumentException + */ + public boolean evaluate(String script, ProcessVariables processVariables)throws EvalError, IllegalArgumentException{ + if(processVariables==null){ + throw new IllegalArgumentException("Process variables can't be null."); + } + if(script==null){ + throw new IllegalArgumentException("Expression can't be null."); + } + Interpreter interpreter = new Interpreter(); + prepareInterpreter(interpreter, processVariables); + Reader sr = new StringReader(script); + logger.debug("Evaluating expression: "+script); + Object o=interpreter.eval(sr); + if(o instanceof Boolean){ + return ((Boolean)o).booleanValue(); + } + else throw new IllegalArgumentException("Conditional expression <"+script+"> does not evaluate to a boolean!"); + } + + public String evaluateToString(String script, ProcessVariables processVariables)throws EvalError, IllegalArgumentException{ + if(processVariables==null){ + throw new IllegalArgumentException("Process variables can't be null."); + } + if(script==null){ + throw new IllegalArgumentException("Expression can't be null."); + } + + Interpreter interpreter = new Interpreter(); + prepareInterpreter(interpreter, processVariables); + Reader sr = new StringReader(script); + logger.debug("Evaluating expression: "+script); + Object o=interpreter.eval(sr); + return String.valueOf(o); + } + + public Integer evaluateToInteger(String script, String varName, ProcessVariables processVariables)throws EvalError, IllegalArgumentException{ + if(processVariables==null){ + throw new IllegalArgumentException("Process variables can't be null."); + } + if(script==null){ + throw new IllegalArgumentException("Expression can't be null."); + } + Interpreter interpreter = new Interpreter(); + prepareInterpreter(interpreter, processVariables); + Reader sr = new StringReader(script); + logger.debug("Evaluating expression: "+script); + Object o=interpreter.eval(sr); + + return (Integer)interpreter.get(varName); + } + + private void prepareInterpreter(Interpreter interpreter, ProcessVariables vars)throws EvalError{ + logger.debug("Context has "+vars.entrySet().size()+" entries"); + for(Entry<String,Object> entry: vars.entrySet()){ + String key=entry.getKey(); + Object val=entry.getValue(); + logger.debug("Context: "+key+"="+String.valueOf(val)); + interpreter.set(key, val); + } + } + + +} Property changes on: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/BeanShellEvaluator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -1,6 +1,7 @@ package eu.unicore.workflow.pe.util; import org.apache.log4j.Logger; +import org.chemomentum.common.util.jsdl.Input; import org.chemomentum.common.util.jsdl.JSDLUtils; import org.chemomentum.common.util.jsdl.Output; import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; @@ -88,6 +89,29 @@ } } } + + for(Input t: ju.getInputs()){ + if(t.getSource().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getSource().contains(s)){ + t.setSource(t.getSource().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + if(t.getTarget().contains("${")){ + for(Object o: context.keySet()){ + String s="${"+o.toString()+"}"; + String p="\\$\\{"+o.toString()+"\\}"; + if(t.getTarget().contains(s)){ + t.setTarget(t.getTarget().replaceAll(p,String.valueOf(context.get(o)))); + } + } + } + } + + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -53,14 +53,14 @@ action.addLogTrace("Status set to RUNNING."); ActivityGroup ag=(ActivityGroup)action.getAjd(); handleNoWait(ag); - ag.init(); + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + ag.init(vars); if(ag.getID().equals(ag.getWorkflowID())){ logger.info("Processing workflow <"+ag.getWorkflowID()+">"); } else{ logger.info("Processing group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+getCurrentIteration()+">"); } - ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); if(vars==null){ vars=new ProcessVariables(); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -50,17 +50,8 @@ */ public static final String DEFAULT_MAX_CONCURRENT="50"; - /** - * Workflow variable containing the current iterator value in a for-each group - */ - public static final String PV_CURRENT_FOR_EACH_VALUE="CURRENT_ITERATOR_VALUE"; + - /** - * Workflow variable containing the current iterator index in a for-each group - */ - public static final String PV_CURRENT_FOR_EACH_INDEX="CURRENT_ITERATOR_INDEX"; - - public ForGroupProcessor(Configuration configuration) { super(configuration); } @@ -74,11 +65,10 @@ action.setStatus(ActionStatus.RUNNING); action.addLogTrace("Status set to RUNNING."); ForGroup ag=(ForGroup)action.getAjd(); - ag.getBody().getIterate().reset(); + ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); + ag.getBody().getIterate().reset(vars); String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); logger.info("Processing for-each group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+myIteration+">"); - - ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); if(vars==null){ vars=new ProcessVariables(); @@ -175,11 +165,7 @@ iterate.next(vars); String iteration=iterate.getCurrentValue(); if(iterate instanceof ForEachIterate){ - ForEachIterate fei=(ForEachIterate)iterate; - String underlying=fei.getCurrentUnderlyingValue(); - vars.put(PV_CURRENT_FOR_EACH_VALUE, underlying); - String index=fei.getCurrentIndex(); - vars.put(PV_CURRENT_FOR_EACH_INDEX, index); + ((ForEachIterate) iterate).fillContext(vars); } //setup XNJS action String uuid=submitToXNJS(a, vars, iteration); @@ -200,12 +186,7 @@ iterate.next(vars); String iteration=iterate.getCurrentValue(); if(iterate instanceof ForEachIterate){ - //put the current iteration underlying iteration value into the - //processing context - String key=a.getLoopIteratorName(); - String underlying=((ForEachIterate)iterate).getCurrentUnderlyingValue(); - vars.put(PV_CURRENT_FOR_EACH_VALUE, underlying); //TODO might not be needed?! - vars.put(key, underlying); + ((ForEachIterate) iterate).fillContext(vars); } //setup XNJS action String uuid=submitToXNJS(a, vars,iteration); Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestVariableSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestVariableSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestVariableSetIterator.java 2009-06-23 15:30:54 UTC (rev 4787) @@ -0,0 +1,53 @@ +package eu.unicore.workflow.pe.iterators; + +import java.util.List; + +import org.testng.annotations.Test; + +import eu.unicore.workflow.pe.iterators.VariableSetIterator.VariableSet; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; + +public class TestVariableSetIterator { + + @Test + public void testVariableSetBuildValues()throws Exception{ + int N=10; + VariableSet vs=new VariableSet("TEST","0","TEST<"+N+";","TEST++;"); + ProcessVariables vars=new ProcessVariables(); + List<String> values=vs.values(vars); + assert values.size()==N; + for(int i=0;i<10;i++){ + assert String.valueOf(i).equals(values.get(i)); + } + } + + @Test + public void testVariableSetIterator()throws Exception{ + int N=10; + VariableSet vs1=new VariableSet("FOO","0","FOO<"+N+";","FOO++;"); + VariableSetIterator vsi=new VariableSetIterator("wfID", vs1); + ProcessVariables vars=new ProcessVariables(); + vsi.reInit(vars); + String [] values=vsi.values; + assert values.length==N; + for(int i=0;i<10;i++){ + assert String.valueOf(i).equals(values[i]); + } + } + + @Test + public void testVariableSetFoldValues()throws Exception{ + int N=10; + VariableSet vs1=new VariableSet("FOO","0","FOO<"+N+";","FOO++;"); + VariableSet vs2=new VariableSet("BAR","0","BAR<"+N+";","BAR++;"); + VariableSetIterator vsi=new VariableSetIterator("wfID", vs1, vs2); + ProcessVariables vars=new ProcessVariables(); + vsi.reInit(vars); + String [] values=vsi.values; + assert values.length==N*N; + assert "0_0".equals(values[0]); + assert "9_9".equals(values[N*N-1]); + } + + +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestVariableSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-06-23 11:14:07 UTC (rev 4786) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-06-23 15:30:54 UTC (rev 4787) @@ -28,6 +28,7 @@ <class name="eu.unicore.workflow.pe.TestStatusReporting"/> <class name="eu.unicore.workflow.pe.iterators.TestIteration"/> <class name="eu.unicore.workflow.pe.iterators.TestValueSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestVariableSetIterator"/> <class name="eu.unicore.workflow.pe.iterators.TestSMSResolver"/> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-07-02 13:25:19
|
Revision: 4867 http://unicore.svn.sourceforge.net/unicore/?rev=4867&view=rev Author: bschuller Date: 2009-07-02 13:24:35 +0000 (Thu, 02 Jul 2009) Log Message: ----------- Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/testng-unittests.xml Added Paths: ----------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestFileSetIterator.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-07-02 13:07:38 UTC (rev 4866) +++ workflow/trunk/workflowservice/pom.xml 2009-07-02 13:24:35 UTC (rev 4867) @@ -58,7 +58,7 @@ <dependency> <groupId>de.fzj.unicore</groupId> <artifactId>xnjs-module-core</artifactId> - <version>1.2.1-preview1</version> + <version>1.2.1</version> </dependency> <dependency> <groupId>bsh</groupId> @@ -68,7 +68,7 @@ <dependency> <groupId>eu.unicore.workflow</groupId> <artifactId>common</artifactId> - <version>2.0.0-preview1</version> + <version>2.0.0</version> </dependency> </dependencies> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java 2009-07-02 13:07:38 UTC (rev 4866) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/FileSetIterator.java 2009-07-02 13:24:35 UTC (rev 4867) @@ -9,6 +9,7 @@ import de.fzj.unicore.uas.util.LogUtil; import de.fzj.unicore.xnjs.ems.ProcessingException; import eu.unicore.workflow.pe.iterators.ResolverFactory.Resolver; +import eu.unicore.workflow.pe.xnjs.ProcessVariables; /** * iterator to traverse file sets @@ -67,6 +68,27 @@ } } + @Override + public void fillContext(ProcessVariables vars){ + super.fillContext(vars); + //add the individual file name + vars.put("", getCurrentValue()); + } + + /** + * extract the file name from a file path + * + * @param path - the file path + * @return filename or null if filename cannot be determined + */ + protected String getFile(String path){ + int i=path.lastIndexOf('/'); + if(i<0 || path.endsWith("/"))return null; + String res=path.substring(i+1); + System.out.println(res); + return res; + } + public String getWorkflowID() { return workflowID; } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-07-02 13:07:38 UTC (rev 4866) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-07-02 13:24:35 UTC (rev 4867) @@ -124,7 +124,7 @@ ActivityGroup grp=(ActivityGroup)a; id=submit(grp,attr); } - else { + else { //TODO to simplify, we might force that loop body is a group String base=ag.getIterate().getCurrentValue(); a.getIterate().setBase(base); id=submit(a,attr); Added: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestFileSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestFileSetIterator.java (rev 0) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestFileSetIterator.java 2009-07-02 13:24:35 UTC (rev 4867) @@ -0,0 +1,21 @@ +package eu.unicore.workflow.pe.iterators; + +import org.testng.annotations.Test; + +import de.fzj.unicore.xnjs.ems.ProcessingException; +import eu.unicore.workflow.pe.iterators.FileSetIterator.FileSet; + +public class TestFileSetIterator { + + @Test + public void testGetFile()throws ProcessingException{ + FileSetIterator fsi=new FileSetIterator(null,(FileSet[])null); + String path="/foo/bar.txt"; + assert "bar.txt" .equals (fsi.getFile(path)); + + path="test/"; + assert fsi.getFile(path)==null; + + } + +} Property changes on: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestFileSetIterator.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-07-02 13:07:38 UTC (rev 4866) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-07-02 13:24:35 UTC (rev 4867) @@ -29,6 +29,7 @@ <class name="eu.unicore.workflow.pe.iterators.TestIteration"/> <class name="eu.unicore.workflow.pe.iterators.TestValueSetIterator"/> <class name="eu.unicore.workflow.pe.iterators.TestVariableSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestFileSetIterator"/> <class name="eu.unicore.workflow.pe.iterators.TestSMSResolver"/> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-07-27 21:12:40
|
Revision: 5018 http://unicore.svn.sourceforge.net/unicore/?rev=5018&view=rev Author: bschuller Date: 2009-07-27 21:12:27 +0000 (Mon, 27 Jul 2009) Log Message: ----------- fix iterations of loops nested in a for-loop Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/resources/log4j.properties Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/pom.xml 2009-07-27 21:12:27 UTC (rev 5018) @@ -11,7 +11,7 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.0.0</version> + <version>2.0.1</version> <name>Workflow engine</name> <scm> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/Iteration.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -23,10 +23,6 @@ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,Iteration.class); private static final long serialVersionUID = 1L; - /* - * an inner iteration value that is incremented on each new iteration - */ - protected int counter=0; /* * the name of the iteration variable. This is a single variable name, @@ -51,12 +47,23 @@ */ protected String resolvedBase=null; + + //this is used to detect if the value has changed + protected String lastValue=null; + /* (non-Javadoc) * @see eu.unicore.workflow.pe.model.Iterate#next(eu.unicore.workflow.pe.xnjs.ProcessVariables) */ public void next(final ProcessVariables vars){ - if(base!=null || iteratorName!=null)resolve(vars); - counter++; + if(base!=null || iteratorName!=null) + resolve(vars); + String val=getCurrentValue(); + if(val.equals(lastValue)){ + logger.warn("Iteration value did not change! " + + "Probably your workflow contains loops that are not labeled as LOOP_BODY"); + }else{ + lastValue=val; + } } /** @@ -67,7 +74,10 @@ } /** - * get the full, resolved value of the iteration + * get the full, resolved value of the iteration. + * This consists of the resolved value of the "base" parameter + * the resolved iterator and the default counter. + * * @return */ public String getCurrentValue(){ @@ -79,20 +89,16 @@ } sb.append(resolvedBase); } + if(iteratorName!=null){ if(resolvedIteratorName==null){ //progammer error throw new IllegalStateException("Can't resolve iterator <"+iteratorName+">"); } - sb.append(SEPARATOR); + if(resolvedBase!=null && resolvedBase.length()>0)sb.append(SEPARATOR); sb.append(resolvedIteratorName); } - //if(base==null && iteratorName==null){ - if(resolvedBase!=null || resolvedIteratorName!=null){ - sb.append(SEPARATOR); - } - sb.append(counter); - //} + return sb.toString(); } @@ -108,6 +114,11 @@ return iteratorName; } + /** + * a process variable can be used as the "inner" iterator, instead of the + * default counter + * @param iteratorName + */ public void setIteratorName(String iteratorName) { this.iteratorName = iteratorName; } @@ -118,8 +129,11 @@ private static Pattern p=Pattern.compile("\\$\\{\\w*\\}"); protected void resolveBase(ProcessVariables vars){ + resolvedBase=base; + if(base==null){ + return; + } Matcher m=p.matcher(base); - resolvedBase=base; while(m.find()){ String key=m.group().substring(2, m.group().length()-1); Object val=vars.get(key); @@ -145,14 +159,10 @@ } public String toString(){ - return getCurrentValue()+"["+String.valueOf(counter)+"]"; + return getCurrentValue(); } - public int getCounter(){ - return counter; - } + public void reset(final ProcessVariables vars)throws ProcessingException{ - public void reset(final ProcessVariables vars)throws ProcessingException{ - //counter=0; } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/iterators/ValueSetIterator.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -57,8 +57,8 @@ @Override public void next(final ProcessVariables vars) { if(!hasNext())throw new NoSuchElementException("No more values"); + position++; super.next(vars); - position++; } public void fillContext(ProcessVariables vars){ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/model/ModelBase.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -6,7 +6,7 @@ /** * Base class for workflow elements, having an identifier, a parent workflow ID, - * and an {@link Iteration} that tracks repeated execution of this workflow element + * and an {@link Iterate} that tracks repeated execution of this workflow element * * @author schuller */ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -18,11 +18,13 @@ import de.fzj.unicore.xnjs.ems.ProcessingException; import de.fzj.unicore.xnjs.ems.processors.DefaultProcessor; import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.iterators.Iteration; import eu.unicore.workflow.pe.model.Activity; import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.ActivityStatus; import eu.unicore.workflow.pe.model.Condition; import eu.unicore.workflow.pe.model.EvaluationException; +import eu.unicore.workflow.pe.model.Iterate; import eu.unicore.workflow.pe.model.JSDLExecutionActivity; import eu.unicore.workflow.pe.model.Transition; import eu.unicore.workflow.pe.persistence.PEStatus; @@ -102,12 +104,20 @@ for(Activity a: activities){ dirty=true; String id; + + String base=getCurrentIteration(); + a.getIterate().setBase(base); if(a instanceof ActivityGroup){ + String loopIteratorName=((ActivityGroup)a).getLoopIteratorName(); + if(loopIteratorName!=null){ + Iterate iter=a.getIterate(); + if(iter instanceof Iteration){ + ((Iteration) iter).setIteratorName(loopIteratorName); + } + } id=submit((ActivityGroup)a,attr); } else { - String base=getCurrentIteration(); - a.getIterate().setBase(base); id=submit(a,attr); } subTasks.add(id); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -63,8 +63,7 @@ ForGroup ag=(ForGroup)action.getAjd(); ProcessVariables vars=action.getProcessingContext().get(ProcessVariables.class); ag.getBody().getIterate().reset(vars); - String myIteration=(String)action.getProcessingContext().get(PV_KEY_ITERATION); - logger.info("Processing for-each group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+myIteration+">"); + logger.info("Processing for-each group <"+ag.getID()+"> in workflow <"+ag.getWorkflowID()+"> iteration <"+getCurrentIteration()+">"); if(vars==null){ vars=new ProcessVariables(); @@ -75,6 +74,10 @@ submitAllEligibleActivities(); } + protected String getCurrentIteration(){ + return (String)action.getProcessingContext().get(PV_KEY_ITERATION); + } + @SuppressWarnings("unchecked") protected void submitAllEligibleActivities()throws ProcessingException{ List<String>subTasks=action.getProcessingContext().get(List.class); @@ -120,13 +123,14 @@ dirty=true; String id; + String base=getCurrentIteration(); + a.getIterate().setBase(base); + if(a instanceof ActivityGroup){ ActivityGroup grp=(ActivityGroup)a; id=submit(grp,attr); } else { //TODO to simplify, we might force that loop body is a group - String base=ag.getIterate().getCurrentValue(); - a.getIterate().setBase(base); id=submit(a,attr); } subTasks.add(id); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-07-27 21:12:27 UTC (rev 5018) @@ -6,7 +6,6 @@ import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.Condition; import eu.unicore.workflow.pe.model.DeclareVariableActivity; -import eu.unicore.workflow.pe.model.Iterate; import eu.unicore.workflow.pe.model.ModifyVariableActivity; import eu.unicore.workflow.pe.model.PEWorkflow; import eu.unicore.workflow.pe.model.ScriptCondition; @@ -84,14 +83,15 @@ assert(N==i.intValue()); } + //test a loop with a specified iterator that does not start from 0 @Test public void testLoopedGroup()throws Exception{ Validate.clear(); String wfID="wf"; int N=5; - DeclareVariableActivity d1=new DeclareVariableActivity("d1",wfID,"C","Integer","0"); + //start from 5 + DeclareVariableActivity d1=new DeclareVariableActivity("d1",wfID,"C","Integer","5"); ActivityGroup loopBody=new ActivityGroup("a1",wfID); - loopBody.getIterate().setBase("TEST"); loopBody.setLoopIteratorName("C"); TestActivity a1=new TestActivity("inner",wfID); loopBody.setActivities(a1); @@ -101,7 +101,7 @@ wf.setActivities(d1,m1,loopBody); Transition t1=new Transition("d1->a1",wfID,"d1","a1"); Transition t2=new Transition("a1->m1",wfID,"a1","m1"); - Condition cond=new ScriptCondition("cond1",wfID,"C<"+String.valueOf(N)+";"); + Condition cond=new ScriptCondition("cond1",wfID,"C<"+String.valueOf(N+5)+";"); Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); wf.setTransitions(t1,t2,t3); @@ -117,9 +117,6 @@ Integer i=Validate.getInvocations("inner"); assert(N==i.intValue()); - Iterate it=a1.getIterate(); - assert it.getCurrentValue().startsWith("TEST"); - } } \ No newline at end of file Modified: workflow/trunk/workflowservice/src/test/resources/log4j.properties =================================================================== --- workflow/trunk/workflowservice/src/test/resources/log4j.properties 2009-07-27 18:40:26 UTC (rev 5017) +++ workflow/trunk/workflowservice/src/test/resources/log4j.properties 2009-07-27 21:12:27 UTC (rev 5018) @@ -12,4 +12,4 @@ log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c{1} %x - %m%n -log4j.logger.unicore.services=WARN +log4j.logger.unicore.services=INFO This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-08-05 18:47:48
|
Revision: 5104 http://unicore.svn.sourceforge.net/unicore/?rev=5104&view=rev Author: bschuller Date: 2009-08-05 18:47:32 +0000 (Wed, 05 Aug 2009) Log Message: ----------- fix tests Modified Paths: -------------- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java workflow/trunk/workflowservice/testng-unittests.xml Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-08-05 15:18:28 UTC (rev 5103) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-08-05 18:47:32 UTC (rev 5104) @@ -56,7 +56,7 @@ else break; } Thread.sleep(2000); - String waID=WorkAssignmentUtils.getEncodedWorkAssignmentID(wfID,"a1", "1", "1"); + String waID=WorkAssignmentUtils.getEncodedWorkAssignmentID(wfID,"a1", "", "1"); cp.failed(waID, "aborted", "Manually aborted", null); assert Validate.wasInvoked("a1"); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java 2009-08-05 15:18:28 UTC (rev 5103) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/iterators/TestIteration.java 2009-08-05 18:47:32 UTC (rev 5104) @@ -38,15 +38,6 @@ i.next(vars); assert("abc123:::SomeOtherFOOContent:::456abc".equals(i.getResolvedBase())); } - - @Test - public void testUseCounter(){ - ProcessVariables vars=new ProcessVariables(); - Iteration i=new Iteration(); - i.next(vars); - assert("1".equals(i.getCurrentValue())); - } - @Test(expectedExceptions=IllegalStateException.class) public void testForIllegalState(){ Modified: workflow/trunk/workflowservice/testng-unittests.xml =================================================================== --- workflow/trunk/workflowservice/testng-unittests.xml 2009-08-05 15:18:28 UTC (rev 5103) +++ workflow/trunk/workflowservice/testng-unittests.xml 2009-08-05 18:47:32 UTC (rev 5104) @@ -26,11 +26,6 @@ <class name="eu.unicore.workflow.pe.TestVariablesActivities"/> <class name="eu.unicore.workflow.pe.TestWorkflowProcessing"/> <class name="eu.unicore.workflow.pe.TestStatusReporting"/> - <class name="eu.unicore.workflow.pe.iterators.TestIteration"/> - <class name="eu.unicore.workflow.pe.iterators.TestValueSetIterator"/> - <class name="eu.unicore.workflow.pe.iterators.TestVariableSetIterator"/> - <class name="eu.unicore.workflow.pe.iterators.TestFileSetIterator"/> - <class name="eu.unicore.workflow.pe.iterators.TestSMSResolver"/> <class name="eu.unicore.workflow.pe.model.TestScriptCondition"/> <class name="eu.unicore.workflow.pe.TestSplitConditionProcessing"/> <class name="eu.unicore.workflow.pe.TestSimpleLoopProcessing"/> @@ -39,6 +34,16 @@ </classes> </test> + <test verbose="2" name="More process engine tests" annotations="JDK"> + <classes> + <class name="eu.unicore.workflow.pe.iterators.TestIteration"/> + <class name="eu.unicore.workflow.pe.iterators.TestValueSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestVariableSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestFileSetIterator"/> + <class name="eu.unicore.workflow.pe.iterators.TestSMSResolver"/> + </classes> + </test> + <!-- Frontend --> <test verbose="2" name="Web service frontend" annotations="JDK"> <classes> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-08-13 10:36:59
|
Revision: 5164 http://unicore.svn.sourceforge.net/unicore/?rev=5164&view=rev Author: bschuller Date: 2009-08-13 10:36:51 +0000 (Thu, 13 Aug 2009) Log Message: ----------- update xnjs version; handle null key in process vars Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-08-13 10:33:38 UTC (rev 5163) +++ workflow/trunk/workflowservice/pom.xml 2009-08-13 10:36:51 UTC (rev 5164) @@ -65,6 +65,11 @@ <artifactId>common</artifactId> <version>2.0.1</version> </dependency> + <dependency> + <groupId>de.fzj.unicore</groupId> + <artifactId>xnjs-module-core</artifactId> + <version>1.2.2</version> + </dependency> </dependencies> <repositories> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java 2009-08-13 10:33:38 UTC (rev 5163) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/util/InsertVariablesFilter.java 2009-08-13 10:36:51 UTC (rev 5164) @@ -74,8 +74,9 @@ for(Output t: ju.getOutputs()){ if(t.getSource().contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(t.getSource().contains(s)){ t.setSource(t.getSource().replaceAll(p,String.valueOf(context.get(o)))); } @@ -83,8 +84,9 @@ } if(t.getTarget().contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(t.getTarget().contains(s)){ t.setTarget(t.getTarget().replaceAll(p,String.valueOf(context.get(o)))); } @@ -95,8 +97,9 @@ for(Input t: ju.getInputs()){ if(t.getSource().contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(t.getSource().contains(s)){ t.setSource(t.getSource().replaceAll(p,String.valueOf(context.get(o)))); } @@ -104,8 +107,9 @@ } if(t.getTarget().contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(t.getTarget().contains(s)){ t.setTarget(t.getTarget().replaceAll(p,String.valueOf(context.get(o)))); } @@ -126,8 +130,9 @@ String jobName=ju.getJsdl().getJobDefinition().getJobDescription().getJobIdentification().getJobName(); if(jobName.contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(jobName.contains(s)){ jobName=jobName.replaceAll(p,String.valueOf(context.get(o))); } @@ -160,8 +165,9 @@ String value=env.getStringValue(); if(value.contains("${")){ for(Object o: context.keySet()){ - String s="${"+o.toString()+"}"; - String p="\\$\\{"+o.toString()+"\\}"; + String key=String.valueOf(o); + String s="${"+key+"}"; + String p="\\$\\{"+key+"\\}"; if(value.contains(s)){ value=value.replaceAll(p,String.valueOf(context.get(o))); } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java 2009-08-13 10:33:38 UTC (rev 5163) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java 2009-08-13 10:36:51 UTC (rev 5164) @@ -12,9 +12,18 @@ import de.fzj.unicore.xnjs.ems.ExecutionContext; import de.fzj.unicore.xnjs.ems.ExecutionException; import de.fzj.unicore.xnjs.jsdl.IGrounder; +import eu.unicore.jsdl.extensions.ExecutionEnvironmentDocument.ExecutionEnvironment; public class NullGrounder implements IGrounder { + public ExecutionEnvironment getExecutionEnvironment(String name) { + return null; + } + + public ExecutionEnvironment[] getExecutionEnvironments() { + return null; + } + public String getExecuteTemplate() { return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2009-10-15 13:15:06
|
Revision: 5546 http://unicore.svn.sourceforge.net/unicore/?rev=5546&view=rev Author: bschuller Date: 2009-10-15 13:14:55 +0000 (Thu, 15 Oct 2009) Log Message: ----------- store the selected storage epr and pass it on to the workassignments; allow flexible handling of task failures in task groups Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/pom.xml 2009-10-15 13:14:55 UTC (rev 5546) @@ -11,7 +11,7 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.0.1</version> + <version>2.0.2-SNAPSHOT</version> <name>Workflow engine</name> <scm> @@ -63,7 +63,7 @@ <dependency> <groupId>eu.unicore.workflow</groupId> <artifactId>common</artifactId> - <version>2.0.1</version> + <version>2.0.2-SNAPSHOT</version> </dependency> <dependency> <groupId>de.fzj.unicore</groupId> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/ProcessEngine.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -2,6 +2,8 @@ import java.util.Map; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + import eu.unicore.workflow.pe.model.ActivityGroup; import eu.unicore.workflow.pe.model.PEWorkflow; @@ -17,8 +19,9 @@ * * @param workflow - the workflow to process * @param securityContext - the ws layer security context + * @param storageEPR - the storage to use for workflow data */ - public void process(PEWorkflow workflow, Map<String,Object>securityContext) throws Exception; + public void process(PEWorkflow workflow, Map<String,Object>securityContext, EndpointReferenceType storageEPR) throws Exception; /** * get the state of the workflow Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/persistence/WorkflowContainer.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -3,6 +3,7 @@ import java.util.Map; import org.chemomentum.dsws.ConversionResult; +import org.w3.x2005.x08.addressing.EndpointReferenceType; import de.fzj.unicore.persist.annotations.ID; import de.fzj.unicore.persist.annotations.Table; @@ -23,6 +24,8 @@ private String dialect; + private EndpointReferenceType storageEPR; + @ID @Override public String getWorkflowID(){ @@ -55,4 +58,12 @@ public void setDialect(String dialect){ this.dialect=dialect; } + + public EndpointReferenceType getStorageEPR() { + return storageEPR; + } + + public void setStorageEPR(EndpointReferenceType storageEPR) { + this.storageEPR = storageEPR; + } } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -5,6 +5,8 @@ import java.util.List; import org.apache.log4j.Logger; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.EnvironmentType; +import org.ggf.schemas.jsdl.x2005.x11.jsdlPosix.POSIXApplicationDocument; import de.fzj.unicore.persist.PersistenceException; import de.fzj.unicore.uas.UAS; @@ -15,6 +17,7 @@ import de.fzj.unicore.xnjs.ems.ExecutionException; import de.fzj.unicore.xnjs.ems.InternalAction; import de.fzj.unicore.xnjs.ems.ProcessingException; +import de.fzj.unicore.xnjs.jsdl.JSDLUtils; import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.iterators.Iteration; import eu.unicore.workflow.pe.model.Activity; @@ -257,8 +260,14 @@ //check result if(!sub.getResult().isSuccessful()){ //TODO rule engine callout - subActivity.setStatus(ActivityStatus.FAILED); - setToDoneAndFailed("Sub-action failed."); + if(!shouldIgnoreFailure(sub)){ + subActivity.setStatus(ActivityStatus.FAILED); + setToDoneAndFailed("Sub-action failed."); + return; + } + else { + action.addLogTrace("Sub-action "+subActionID+" failed, ignoring."); + } } else{ subActivity.setStatus(ActivityStatus.SUCCESS); @@ -366,6 +375,32 @@ } } + /** + * + * @param sub + * @return + */ + protected boolean shouldIgnoreFailure(Action sub){ + + if(sub.getAjd() instanceof JSDLExecutionActivity){ + JSDLExecutionActivity work=(JSDLExecutionActivity)sub.getAjd(); + if(logger.isDebugEnabled()){ + logger.debug("check ignoreFailure for JSDL "+sub.getAjd()); + } + + //TODO this should not be a job environment variable + POSIXApplicationDocument pd=JSDLUtils.extractPosixApplication(work.getJobDefinition()); + EnvironmentType[] env=pd.getPOSIXApplication().getEnvironmentArray(); + for(EnvironmentType e: env){ + if(e.getName().equals("UC_IGNORE_FAILURE")){ + return Boolean.parseBoolean(e.getStringValue()); + } + } + } + + return false; + } + /* * set the action (unit testing use) */ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -286,8 +286,13 @@ //check result if(!sub.getResult().isSuccessful()){ //TODO rule engine callout - setToDoneAndFailed("Sub-action failed."); - return; + if(!shouldIgnoreFailure(sub)){ + setToDoneAndFailed("Sub-action failed."); + return; + } + else{ + action.addLogTrace("Sub-action failed, ignoring"); + } } //copy results ProcessVariables pv=sub.getProcessingContext().get(ProcessVariables.class); @@ -364,6 +369,16 @@ } } + /** + * TODO + * + * @param sub + * @return + */ + protected boolean shouldIgnoreFailure(Action sub){ + return false; + } + /* * set the action (unit testing use) */ Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -7,7 +7,9 @@ import org.chemomentum.workassignment.xmlbeans.StatusType; import org.chemomentum.workassignment.xmlbeans.SubmitWorkAssignmentRequestDocument; import org.chemomentum.workassignment.xmlbeans.WorkAssignmentDocument; +import org.chemomentum.workassignment.xmlbeans.WorkAssignmentType; import org.chemomentum.workflow.callback.xmlbeans.ErrorCodeType; +import org.w3.x2005.x08.addressing.EndpointReferenceType; import de.fzj.unicore.uas.UAS; import de.fzj.unicore.uas.util.LogUtil; @@ -112,22 +114,27 @@ //add a disambiguator in case of re-submits work.incrementSubmissionCounter(); String waID=action.getUUID()+WorkAssignmentUtils.SEP+work.getSubmissionCounter(); + WorkAssignmentType workAssignment=wa.getWorkAssignment(); + workAssignment.setId(waID); + workAssignment.setParent(workflowID); + workAssignment.addNewNotificationURL().setStringValue(PEConfig.getInstance().getCallbackURL()); - wa.getWorkAssignment().setId(waID); - wa.getWorkAssignment().setParent(workflowID); - wa.getWorkAssignment().addNewNotificationURL().setStringValue(PEConfig.getInstance().getCallbackURL()); - - /** - * send the workassignment - */ - SubmitWorkAssignmentRequestDocument in=SubmitWorkAssignmentRequestDocument.Factory.newInstance(); - in.addNewSubmitWorkAssignmentRequest().setWorkAssignment(wa.getWorkAssignment()); try{ WorkflowContainer wfc=PEConfig.getInstance().getPersistence().read(workflowID); if(wfc==null){ setToDoneAndFailed("Parent workflow information not found."); return; } + EndpointReferenceType storageEPR=wfc.getStorageEPR(); + if(storageEPR!=null){ + workAssignment.setStorageEPR(storageEPR); + } + /** + * send the workassignment + */ + SubmitWorkAssignmentRequestDocument in=SubmitWorkAssignmentRequestDocument.Factory.newInstance(); + in.addNewSubmitWorkAssignmentRequest().setWorkAssignment(workAssignment); + Map<String,Object>securityContext=wfc.getSecurityContext(); SecurityTokens tokens=securityContext!=null?(SecurityTokens)securityContext.get(SecurityTokens.KEY):null; sender.submitWorkAssignment(in, tokens); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/XNJSProcessEngine.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -2,6 +2,8 @@ import java.util.Map; +import org.w3.x2005.x08.addressing.EndpointReferenceType; + import de.fzj.unicore.xnjs.XNJS; import de.fzj.unicore.xnjs.aaa.Client; import de.fzj.unicore.xnjs.ems.Action; @@ -30,7 +32,7 @@ /** * start processing a workflow. This will add the required entry to the persisted data */ - public void process(PEWorkflow workflow, Map<String, Object> securityContext) throws Exception { + public void process(PEWorkflow workflow, Map<String, Object> securityContext, EndpointReferenceType storageEPR) throws Exception { workflow.init(); Action action=new Action(); action.setUUID(workflow.getWorkflowID()); @@ -41,6 +43,7 @@ WorkflowContainer attr=new WorkflowContainer(); attr.build(workflow); attr.setSecurityContext(securityContext); + attr.setStorageEPR(storageEPR); PEConfig.getInstance().getPersistence().write(attr); xnjs.getConfig().getEMSManager().add(action, null); } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -22,6 +22,7 @@ import org.chemomentum.workflow.xmlbeans.AbortWorkflowResponseDocument; import org.chemomentum.workflow.xmlbeans.DetailedStatusDocument; import org.chemomentum.workflow.xmlbeans.StatusType; +import org.chemomentum.workflow.xmlbeans.StorageEPRDocument; import org.chemomentum.workflow.xmlbeans.SubmissionTimeDocument; import org.chemomentum.workflow.xmlbeans.SubmitWorkflowDocument; import org.chemomentum.workflow.xmlbeans.SubmitWorkflowResponseDocument; @@ -43,10 +44,12 @@ import de.fzj.unicore.wsrflite.messaging.PullPoint; import de.fzj.unicore.wsrflite.persistence.Persist; import de.fzj.unicore.wsrflite.xmlbeans.BaseFault; +import de.fzj.unicore.wsrflite.xmlbeans.ResourceProperty; import de.fzj.unicore.wsrflite.xmlbeans.rp.ImmutableResourceProperty; import eu.unicore.security.xfireutil.SecurityTokens; import eu.unicore.workflow.pe.PEConfig; import eu.unicore.workflow.pe.ProcessState; +import eu.unicore.workflow.pe.model.PEWorkflow; import eu.unicore.workflow.pe.persistence.WorkflowContainer; /** @@ -128,19 +131,22 @@ if(eprs.size() == 0) { logger.warn("Could not find the Tracer Service!"); - return; } + else{ EndpointReferenceType epr = eprs.get(0); TracerAddressDocument tad=TracerAddressDocument.Factory.newInstance(); tad.setTracerAddress(epr); properties.put(RPTracerAddress,new ImmutableResourceProperty(tad)); + } }catch(Exception ex){ LogUtil.logException("Could not create tracer address property.",ex,logger); } EndpointReferenceType storageEPR=(EndpointReferenceType)initMap.get(INITPARAM_STORAGE_EPR); if(storageEPR!=null){ - properties.put(RPStorageEPR, new ImmutableResourceProperty(storageEPR)); + StorageEPRDocument sEprDoc=StorageEPRDocument.Factory.newInstance(); + sEprDoc.setStorageEPR(storageEPR); + properties.put(RPStorageEPR, new ImmutableResourceProperty(sEprDoc)); } workflowStatus=StatusType.READY; } @@ -164,7 +170,8 @@ } else{ logger.info("Start processing of workflow <"+getUniqueID()+">"); - PEConfig.getInstance().getProcessEngine().process(conversionResult.getConvertedWorkflow(),getSecurityContext()); + PEWorkflow peWorkflow=conversionResult.getConvertedWorkflow(); + PEConfig.getInstance().getProcessEngine().process(peWorkflow,getSecurityContext(),getStorageEPR()); } properties.put(RPOutputFiles,new OutputFilesResourceProperty(conversionResult)); }catch(Exception e){ @@ -209,6 +216,19 @@ } + public EndpointReferenceType getStorageEPR(){ + ResourceProperty<?> p=properties.get(RPStorageEPR); + if(p!=null){ + try{ + EndpointReferenceType epr=EndpointReferenceType.Factory.parse(p.getXml()[0].newInputStream()); + return epr; + }catch(Exception ex){ + logger.warn("",ex); + } + } + return null; + } + protected void storeMetaData(){ try{ if(Config.isUnitTesting())return; Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestCallbackProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -47,7 +47,7 @@ String wfID="5678"; PEWorkflow job=buildJob(wfID); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.RUNNING!=s.intValue()){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestForLoopProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -43,7 +43,7 @@ ForGroup fl=new ForGroup("for1",wfID,a1); wf.setActivities(fl); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -73,7 +73,7 @@ ForGroup fl=new ForGroup("for1", wfID, ag); wf.setActivities(fl); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -107,7 +107,7 @@ wf.setActivities(fl); //fl.setMaxConcurrentActivities(5); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSimpleLoopProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -32,7 +32,7 @@ Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); wf.setTransitions(t1,t2,t3); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -70,7 +70,7 @@ Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); wf.setTransitions(t1,t2,t3); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); if(ActionStatus.DONE!=s.intValue()){ @@ -105,7 +105,7 @@ Transition t3=new Transition("m1->a1",wfID,"m1","a1",cond); wf.setTransitions(t1,t2,t3); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); if(ActionStatus.DONE!=s.intValue()){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSplitConditionProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -29,7 +29,7 @@ Transition t2=new Transition("a1->a3",wfID,"a1","a3"); wf.setTransitions(t1,t2); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -61,7 +61,7 @@ Transition t4=new Transition("a3->a4",wfID,"a3","a4"); wf.setTransitions(t1,t2,t3,t4); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -98,7 +98,7 @@ Transition t5=new Transition("a0->a4",wfID,"a0","a4"); wf.setTransitions(t1,t2,t3,t4,t5); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestStatusReporting.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -46,7 +46,7 @@ String wfID="5678"; PEWorkflow job=buildJob(wfID); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestSubflows.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -27,7 +27,7 @@ Transition t1=new Transition("a1->sub1",wfID,"a1","sub1"); wf.setTransitions(t1); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); @@ -56,7 +56,7 @@ Transition t1=new Transition("a1->sub1",wfID,"a1","sub1"); wf.setTransitions(t1); - PEConfig.getInstance().getProcessEngine().process(wf, null); + PEConfig.getInstance().getProcessEngine().process(wf, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(wfID, null); Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestVariablesActivities.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -26,7 +26,7 @@ as.add(new DeclareVariableActivity("a2",job.getWorkflowID(),"test2","INTEGER","1")); job.setActivities(as); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ @@ -44,7 +44,7 @@ as.add(new DeclareVariableActivity("a1",job.getWorkflowID(),"test1","INTEGER",String.valueOf(initialValue))); job.setActivities(as); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWAProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -33,7 +33,7 @@ job.setActivities(as); job.setTransitions(t); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ @@ -62,7 +62,7 @@ job.setActivities(as); job.setTransitions(t); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ Modified: workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/eu/unicore/workflow/pe/TestWorkflowProcessing.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -28,7 +28,7 @@ job.setActivities(as); job.setTransitions(t); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ @@ -62,7 +62,7 @@ job.setActivities(as); job.setTransitions(t,t2,t3,t4); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ @@ -99,7 +99,7 @@ job.setActivities(as); job.setTransitions(t,t3,t4); job.init(); - PEConfig.getInstance().getProcessEngine().process(job, null); + PEConfig.getInstance().getProcessEngine().process(job, null, null); while(true){ Integer s=xnjs.getConfig().getEMSManager().getStatus(job.getWorkflowID(), null); if(ActionStatus.DONE!=s.intValue()){ Modified: workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java =================================================================== --- workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java 2009-10-15 13:04:29 UTC (rev 5545) +++ workflow/trunk/workflowservice/src/test/java/org/chemomentum/dsws/TestSubmissionClient.java 2009-10-15 13:14:55 UTC (rev 5546) @@ -7,6 +7,7 @@ import org.chemomentum.workflow.xmlbeans.WorkflowDocument.Workflow; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import org.w3.x2005.x08.addressing.EndpointReferenceType; /** * some tests on basic service deployment @@ -33,6 +34,9 @@ Workflow wf=Workflow.Factory.newInstance(); wf.setDialect("foo"); w.setWorkflow(wf); + EndpointReferenceType mockStorageAddress=EndpointReferenceType.Factory.newInstance(); + mockStorageAddress.addNewAddress().setStringValue("http://storage?res=123"); + w.setStorageAddress(mockStorageAddress); WorkflowManagementClient wfInst=wfs.submitSynchronous(w); assertNotNull(wfInst); String s=wfInst.getResourcePropertyDocument(); @@ -44,8 +48,13 @@ assertNotNull(status); String submittedWorkflow=wfInst.getSubmittedWorkflow().toString(); assertNotNull(submittedWorkflow); - Thread.sleep(3000); + EndpointReferenceType epr=wfInst.getResourcePropertiesDocument().getWorkflowResourceProperties().getStorageEPR(); + assertNotNull(epr); + assertEquals(mockStorageAddress.getAddress().getStringValue(),epr.getAddress().getStringValue()); + + Thread.sleep(1000); + }catch(Exception e){ e.printStackTrace(); fail(e.getMessage()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-02-16 13:33:03
|
Revision: 6375 http://unicore.svn.sourceforge.net/unicore/?rev=6375&view=rev Author: bschuller Date: 2010-02-16 12:38:17 +0000 (Tue, 16 Feb 2010) Log Message: ----------- update to common 2.1.0-SNAPSHOT and thus uas-core 1.3.0 Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2010-02-15 14:43:42 UTC (rev 6374) +++ workflow/trunk/workflowservice/pom.xml 2010-02-16 12:38:17 UTC (rev 6375) @@ -11,7 +11,7 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.0.2-SNAPSHOT</version> + <version>2.1.0-SNAPSHOT</version> <name>Workflow engine</name> <scm> @@ -63,13 +63,8 @@ <dependency> <groupId>eu.unicore.workflow</groupId> <artifactId>common</artifactId> - <version>2.0.2-SNAPSHOT</version> + <version>2.1.0-SNAPSHOT</version> </dependency> - <dependency> - <groupId>de.fzj.unicore</groupId> - <artifactId>xnjs-module-core</artifactId> - <version>1.2.2</version> - </dependency> </dependencies> <repositories> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java 2010-02-15 14:43:42 UTC (rev 6374) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/messaging/SOSender.java 2010-02-16 12:38:17 UTC (rev 6375) @@ -39,7 +39,13 @@ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,SOSender.class); public SOSender(){ - Kernel.getMessaging().registerProvider(new Provider(),Provider.SO_CHANNEL); + try{ + Kernel.getMessaging().registerProvider(new Provider(),Provider.SO_CHANNEL); + }catch(MessagingException e){ + logger.error("Error initialising the message system!", e); + //can't continue without messaging + throw new IllegalStateException(e); + } } /** Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java 2010-02-15 14:43:42 UTC (rev 6374) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/NullGrounder.java 2010-02-16 12:38:17 UTC (rev 6375) @@ -12,10 +12,29 @@ import de.fzj.unicore.xnjs.ems.ExecutionContext; import de.fzj.unicore.xnjs.ems.ExecutionException; import de.fzj.unicore.xnjs.jsdl.IGrounder; +import de.fzj.unicore.xnjs.jsdl.IncarnatedExecutionEnvironment; import eu.unicore.jsdl.extensions.ExecutionEnvironmentDocument.ExecutionEnvironment; +/* + * dummy implementation of IGrounder interface which is not needed in + * the workflow engine, but the XNJS wants to have it + */ public class NullGrounder implements IGrounder { + public String getProperty(String key, String defaultValue) { + return null; + } + + public String getProperty(String key) { + return null; + } + + public IncarnatedExecutionEnvironment incarnateExecutionEnvironment( + ExecutionEnvironment request, Client client) { + // TODO Auto-generated method stub + return null; + } + public ExecutionEnvironment getExecutionEnvironment(String name) { return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-02-22 09:10:36
|
Revision: 6415 http://unicore.svn.sourceforge.net/unicore/?rev=6415&view=rev Author: bschuller Date: 2010-02-22 09:10:25 +0000 (Mon, 22 Feb 2010) Log Message: ----------- update to latest "common"; some bugfixes Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ProcessorBase.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2010-02-22 08:00:22 UTC (rev 6414) +++ workflow/trunk/workflowservice/pom.xml 2010-02-22 09:10:25 UTC (rev 6415) @@ -180,6 +180,14 @@ </execution> </executions> </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptors> + <descriptor>src/main/assembly/dep.xml</descriptor> + </descriptors> + </configuration> + </plugin> </plugins> </build> <reporting> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2010-02-22 08:00:22 UTC (rev 6414) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2010-02-22 09:10:25 UTC (rev 6415) @@ -76,7 +76,7 @@ submitAllEligibleActivities(true); } - + @SuppressWarnings("unchecked") protected void submitAllEligibleActivities(boolean subActionsStillRunning)throws ProcessingException{ List<String>subTasks=action.getProcessingContext().get(List.class); @@ -105,7 +105,7 @@ for(Activity a: activities){ dirty=true; String id; - + String base=getCurrentIteration(); a.getIterate().setBase(base); if(a instanceof ActivityGroup){ @@ -176,7 +176,7 @@ a.getIterate().next(vars); activityStatus.setIteration(a.getIterate().getCurrentValue()); attr.getActivityStatus(a.getID()).add(activityStatus); - + logger.info("Submitting activity group <"+a.getID()+"> status "+activityStatus); String uuid=submitToXNJS(a, vars); a.setStatus(ActivityStatus.RUNNING); @@ -192,7 +192,7 @@ } return activityCounter; } - + protected String submitToXNJS(Activity a, ProcessVariables vars)throws ExecutionException{ InternalAction subAction=new InternalAction(); subAction.setType(a.getType()); @@ -212,33 +212,33 @@ @SuppressWarnings("unchecked") protected void handleRunning() throws ProcessingException { if(logger.isTraceEnabled())logger.trace("Handle running for "+action.getUUID()); - if(!isTopLevelWorkflowStillRunning()){ - setToDoneAndFailed("Parent workflow was aborted or failed"); - return; - } + boolean stillRunning=false; - ActivityGroup ag=(ActivityGroup)action.getAjd(); - //check substates ... - List<String>subTasks=action.getProcessingContext().get(List.class); - if(subTasks==null){ - throw new ProcessingException("Could not find list of sub-tasks."); - } - - WorkflowContainer workflowInfo=null; boolean dirty=false; - SubflowContainer attr; + boolean stopProcessingThisGroup=false; + + try{ + if(!isTopLevelWorkflowStillRunning()){ + setToDoneAndFailed("Parent workflow was aborted or failed"); + return; + } - boolean stillRunning=false; + ActivityGroup ag=(ActivityGroup)action.getAjd(); + //check substates ... + List<String>subTasks=action.getProcessingContext().get(List.class); + if(subTasks==null){ + throw new IllegalStateException("Could not find list of sub-tasks."); + } - try{ Iterator<String>iterator=subTasks.iterator(); - subActionLoop: while(iterator.hasNext()){ + + subActionLoop: while(iterator.hasNext() && !stopProcessingThisGroup){ String subActionID=iterator.next(); Action sub=manager.getAction(subActionID); if(sub==null){ String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; action.addLogTrace(msg); - throw new ExecutionException(msg); + throw new IllegalStateException(msg); } else{ int status=sub.getStatus(); @@ -246,13 +246,11 @@ logger.trace("Sub-Action <"+subActionID+"> is "+ActionStatus.toString(status)); } - //check status - if(ActionStatus.DONE!=status){ stillRunning=true; continue subActionLoop; } - + if(ActionStatus.DONE==status){ dirty=true; action.setDirty(); @@ -266,7 +264,7 @@ if(!shouldIgnoreFailure(sub)){ subActivity.setStatus(ActivityStatus.FAILED); setToDoneAndFailed("Sub-action failed."); - return; + stopProcessingThisGroup=true; } else { action.addLogTrace("Sub-action "+subActionID+" failed, ignoring."); @@ -288,27 +286,7 @@ //submit follow on activities ag.activityDone(subActivity, pv); } - - //store activity status to global workflow info - try{ - workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); - attr=workflowInfo.findSubFlowAttributes(ag.getID()); - PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIterate().getCurrentValue()); - stat.setActivityStatus(subActivity.getStatus()); - }finally{ - if(workflowInfo!=null){ - try{ - if(dirty) { - PEConfig.getInstance().getPersistence().write(workflowInfo); - } - else{ - PEConfig.getInstance().getPersistence().unlock(workflowInfo); - } - }catch(Exception ex){ - throw new ProcessingException(ex); - } - } - } + storeSubActivityStatus(ag,subActivity,subActivityID,dirty); } } } @@ -321,6 +299,8 @@ throw new ProcessingException(ex); } + if(stopProcessingThisGroup)return; + if(ActionStatus.DONE!=action.getStatus()){ submitAllEligibleActivities(stillRunning); } @@ -329,7 +309,31 @@ } } + /* + * store the status of a sub activity to the permanent storage + */ + private void storeSubActivityStatus(ActivityGroup ag, Activity subActivity, String subActivityID, boolean dirty)throws PersistenceException, InterruptedException{ + //store activity status to global workflow info + WorkflowContainer workflowInfo=null; + SubflowContainer attr; + try{ + workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); + attr=workflowInfo.findSubFlowAttributes(ag.getID()); + PEStatus stat=attr.getActivityStatus(subActivityID, subActivity.getIterate().getCurrentValue()); + stat.setActivityStatus(subActivity.getStatus()); + }finally{ + if(workflowInfo!=null){ + if(dirty) { + PEConfig.getInstance().getPersistence().write(workflowInfo); + } + else{ + PEConfig.getInstance().getPersistence().unlock(workflowInfo); + } + } + } + } + protected void sendActionToSleep(){ action.setWaiting(true); configuration.getScheduledExecutor().schedule(new Runnable(){ @@ -343,7 +347,7 @@ } }, 5000, TimeUnit.MILLISECONDS); } - + protected void handleNoWait(ActivityGroup ag){ List<JSDLExecutionActivity>noWaitActivities=new ArrayList<JSDLExecutionActivity>(); for(Activity a: ag.getActivities()){ @@ -358,7 +362,7 @@ handleNoWaitActivity(j, ag); } } - + //change transitions, so that activities depending on the given actitity //are started immediately protected void handleNoWaitActivity(JSDLExecutionActivity j, ActivityGroup ag){ @@ -395,38 +399,40 @@ throw new ExecutionException("Maximum number <"+maxProp+"> of activities per group exceeded!"); } } - + /** * * @param sub * @return */ protected boolean shouldIgnoreFailure(Action sub){ - + if(sub.getAjd() instanceof JSDLExecutionActivity){ JSDLExecutionActivity work=(JSDLExecutionActivity)sub.getAjd(); if(logger.isDebugEnabled()){ logger.debug("check ignoreFailure for JSDL "+sub.getAjd()); } - + //TODO this should not be a job environment variable POSIXApplicationDocument pd=JSDLUtils.extractPosixApplication(work.getJobDefinition()); - EnvironmentType[] env=pd.getPOSIXApplication().getEnvironmentArray(); - for(EnvironmentType e: env){ - if(e.getName().equals("UC_IGNORE_FAILURE")){ - return Boolean.parseBoolean(e.getStringValue()); + if(pd!=null && pd.getPOSIXApplication()!=null){ + EnvironmentType[] env=pd.getPOSIXApplication().getEnvironmentArray(); + for(EnvironmentType e: env){ + if(e.getName().equals("UC_IGNORE_FAILURE")){ + return Boolean.parseBoolean(e.getStringValue()); + } } } } - + return false; } - + /* * set the action (unit testing use) */ void setAction(Action a){ this.action=a; } - + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2010-02-22 08:00:22 UTC (rev 6414) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ForGroupProcessor.java 2010-02-22 09:10:25 UTC (rev 6415) @@ -37,7 +37,7 @@ public class ForGroupProcessor extends ProcessorBase{ private static final Logger logger=LogUtil.getLogger(LogUtil.SERVICES,ForGroupProcessor.class); - + /** * default value for the maximum number of activities per activity group * @@ -54,7 +54,7 @@ */ public static final String LIMIT_MAX_CONCURRENT="100"; - + public ForGroupProcessor(Configuration configuration) { super(configuration); } @@ -94,9 +94,9 @@ setToDoneSuccessfully(); } else{ - + //process some more iterations of the loop - + WorkflowContainer workflowInfo=null; try{ workflowInfo=PEConfig.getInstance().getPersistence().getForUpdate(ag.getWorkflowID()); @@ -108,14 +108,14 @@ } SubflowContainer attr=workflowInfo.findSubFlowAttributes(ag.getID()); if(attr==null)throw new PersistenceException("Persistent information about <"+ag.getID()+"> is missing"); - + try{ //get the system limit for the maximum concurrent activities int maxConcurrentSystem=Integer.parseInt(UAS.getProperty(ForGroup.PROPERTY_MAX_CONCURRENT_ACTIVITIES, LIMIT_MAX_CONCURRENT)); int maxConcurrentFromUser=ag.getMaxConcurrentActivities(); //the maximum concurrent iterations specified by the user must not exceed the system limit int maxConcurrent=Math.min(maxConcurrentFromUser, maxConcurrentSystem); - + while(iterate.hasNext()){ //limit the number of concurrent loop iterations if(subTasks.size()>=maxConcurrent){ @@ -127,10 +127,10 @@ Activity a=ag.getBody(); dirty=true; String id; - + String base=getCurrentIteration(); a.getIterate().setBase(base); - + if(a instanceof ActivityGroup){ ActivityGroup grp=(ActivityGroup)a; id=submit(grp,attr); @@ -217,7 +217,7 @@ } return activityCounter; } - + protected String submitToXNJS(Activity a, ProcessVariables vars, String iteration)throws ExecutionException{ InternalAction subAction=new InternalAction(); subAction.setType(a.getType()); @@ -239,24 +239,26 @@ @SuppressWarnings("unchecked") protected void handleRunning() throws ProcessingException { if(logger.isTraceEnabled())logger.trace("Handle running for "+action.getUUID()); - if(!isTopLevelWorkflowStillRunning()){ - setToDoneAndFailed("Parent workflow was aborted or failed"); - return; - } - - ForGroup ag=(ForGroup)action.getAjd(); - //check substates ... - List<String>subTasks=action.getProcessingContext().get(List.class); - if(subTasks==null){ - throw new ProcessingException("Could not find list of sub-tasks."); - } + boolean subTasksStillRunning=false; - WorkflowContainer workflowInfo=null; - boolean dirty=false; - SubflowContainer attr; - boolean subTasksStillRunning=false; - try{ + + if(!isTopLevelWorkflowStillRunning()){ + setToDoneAndFailed("Parent workflow was aborted or failed"); + return; + } + + ForGroup ag=(ForGroup)action.getAjd(); + //check substates ... + List<String>subTasks=action.getProcessingContext().get(List.class); + if(subTasks==null){ + throw new IllegalStateException("Could not find list of sub-tasks."); + } + + WorkflowContainer workflowInfo=null; + boolean dirty=false; + SubflowContainer attr; + Iterator<String>iterator=subTasks.iterator(); subActionLoop: while(iterator.hasNext()){ String subActionID=iterator.next(); @@ -264,7 +266,7 @@ if(sub==null){ String msg="INTERNAL ERROR: Can't find subaction with id "+subActionID; action.addLogTrace(msg); - throw new ExecutionException(msg); + throw new IllegalStateException(msg); } else{ int status=sub.getStatus(); @@ -278,14 +280,13 @@ subTasksStillRunning=true; continue subActionLoop; } - + if(ActionStatus.DONE==status){ dirty=true; action.setDirty(); //check result if(!sub.getResult().isSuccessful()){ - //TODO rule engine callout if(!shouldIgnoreFailure(sub)){ setToDoneAndFailed("Sub-action failed."); return; @@ -302,7 +303,7 @@ } String subActivityID=((Activity)sub.getAjd()).getID(); - + //clean up the sub-action configuration.getEMSManager().destroy(subActionID, action.getClient()); iterator.remove(); @@ -370,7 +371,7 @@ } /** - * TODO + * TODO rule engine callout * * @param sub * @return @@ -378,12 +379,12 @@ protected boolean shouldIgnoreFailure(Action sub){ return false; } - + /* * set the action (unit testing use) */ void setAction(Action a){ this.action=a; } - + } Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2010-02-22 08:00:22 UTC (rev 6414) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2010-02-22 09:10:25 UTC (rev 6415) @@ -152,11 +152,13 @@ @Override protected void handleRunning(){ logger.debug("Handling running action <"+action.getUUID()+">"); - if(!isTopLevelWorkflowStillRunning()){ - setToDoneAndFailed("Parent workflow was aborted or failed"); - return; - } try{ + + if(!isTopLevelWorkflowStillRunning()){ + setToDoneAndFailed("Parent workflow was aborted or failed"); + return; + } + JSDLExecutionActivity work=(JSDLExecutionActivity)action.getAjd(); String workflowID=work.getWorkflowID(); String waID=action.getUUID()+WorkAssignmentUtils.SEP+work.getSubmissionCounter(); @@ -176,12 +178,26 @@ case StatusType.INT_SUCCESS: action.setStatus(ActionStatus.DONE); return; + case StatusType.INT_FAILURE: + String err="Workassignment failed on service orchestrator."; + setToDoneAndFailed(err); + reportError("JobFailed",err); + return; case StatusType.INT_WA_UNKNOWN: - //not known to any service orch? - default: - //it is failed or cancelled - setToDoneAndFailed("Workassignment failed on service orchestrator, or cannot be found on any services orchestrator."); + err="Workassignment cannot be found on any services orchestrator."; + setToDoneAndFailed(err); + reportError("WorkassignmentLost",err); return; + case StatusType.INT_CANCELED: + err="Workassignment was cancelled on services orchestrator."; + setToDoneAndFailed(err); + reportError("WorkassignmentCancelled",err); + return; + default: + err="Unknown status"; + setToDoneAndFailed(err); + reportError("WorkassignmentStatusUnknown",err); + return; } }catch(Exception e){ String msg="Problem creating/sending message to service orchestrator."; Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ProcessorBase.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ProcessorBase.java 2010-02-22 08:00:22 UTC (rev 6414) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ProcessorBase.java 2010-02-22 09:10:25 UTC (rev 6415) @@ -33,18 +33,14 @@ /** * check whether the parent workflow is still running - * @return + * @return <code>true</code> if parent workflow is running + * @throws Exception */ - protected boolean isTopLevelWorkflowStillRunning(){ + protected boolean isTopLevelWorkflowStillRunning()throws Exception{ ModelBase ag=(ModelBase)action.getAjd(); String workflowID=ag.getWorkflowID(); - try{ - ProcessState ps=PEConfig.getInstance().getProcessEngine().getProcessState(workflowID); - return ProcessState.RUNNING.equals(ps); - }catch(Exception ex){ - LogUtil.logException("Can't get process state.", ex); - } - return true; + ProcessState ps=PEConfig.getInstance().getProcessEngine().getProcessState(workflowID); + return ProcessState.RUNNING.equals(ps); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-03-26 19:23:17
|
Revision: 6725 http://unicore.svn.sourceforge.net/unicore/?rev=6725&view=rev Author: bschuller Date: 2010-03-26 19:23:06 +0000 (Fri, 26 Mar 2010) Log Message: ----------- Modified Paths: -------------- workflow/trunk/workflowservice/pom.xml workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java Modified: workflow/trunk/workflowservice/pom.xml =================================================================== --- workflow/trunk/workflowservice/pom.xml 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/pom.xml 2010-03-26 19:23:06 UTC (rev 6725) @@ -11,7 +11,7 @@ <url>http://www.unicore.eu</url> </organization> <url>http://www.unicore.eu</url> - <version>2.1.0</version> + <version>2.1.1-SNAPSHOT</version> <name>Workflow engine</name> <scm> Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/ActivityGroupProcessor.java 2010-03-26 19:23:06 UTC (rev 6725) @@ -266,6 +266,7 @@ if(!shouldIgnoreFailure(sub)){ subActivity.setStatus(ActivityStatus.FAILED); setToDoneAndFailed("Sub-action failed."); + reportError("SubActivityFailed","Sub-activity failed"); stopProcessingThisGroup=true; } else { Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/CallbackProcessorImpl.java 2010-03-26 19:23:06 UTC (rev 6725) @@ -14,6 +14,7 @@ import de.fzj.unicore.xnjs.ems.event.ContinueProcessingEvent; import eu.unicore.workflow.pe.CallbackProcessor; import eu.unicore.workflow.pe.PEConfig; +import eu.unicore.workflow.pe.model.ActivityStatus; import eu.unicore.workflow.pe.persistence.PEStatus; import eu.unicore.workflow.pe.persistence.WorkflowContainer; import eu.unicore.workflow.pe.util.WorkAssignmentUtils; @@ -54,6 +55,7 @@ public void callback(final Action a){ a.setStatus(ActionStatus.POSTPROCESSING); a.getProcessingContext().put(JSDLExecutionActivityProcessor.LAST_ERROR_CODE, errorCode); + a.getProcessingContext().put(JSDLExecutionActivityProcessor.LAST_ERROR_DESCRIPTION, errorDescription); } }; xnjs.getConfig().getInternalManager().handleEvent(cpe); @@ -86,6 +88,7 @@ try{ PEStatus status=wfc.findSubFlowContainingActivity(activityID).getActivityStatus(activityID,iteration); status.setJobEPR(jobEPR); + status.setActivityStatus(ActivityStatus.SUCCESS); ContinueProcessingEvent cpe=new ContinueProcessingEvent(actionID){ public void callback(final Action a){ a.setStatus(ActionStatus.DONE); Modified: workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/src/main/java/eu/unicore/workflow/pe/xnjs/JSDLExecutionActivityProcessor.java 2010-03-26 19:23:06 UTC (rev 6725) @@ -42,6 +42,8 @@ public static final String LAST_ERROR_CODE=JSDLExecutionActivityProcessor.class.getName()+"_LAST_ERROR_CODE"; + public static final String LAST_ERROR_DESCRIPTION=JSDLExecutionActivityProcessor.class.getName()+"_LAST_ERROR_DESCRIPTION"; + /** * property key for defining the period for "slow" SO polling */ @@ -223,6 +225,7 @@ protected void handlePostProcessing(){ JSDLExecutionActivity work=(JSDLExecutionActivity)action.getAjd(); String errorCode=(String)action.getProcessingContext().get(LAST_ERROR_CODE); + String errorDescription=(String)action.getProcessingContext().get(LAST_ERROR_DESCRIPTION); action.getProcessingContext().remove(LAST_ERROR_CODE); logger.debug("Handling failure of <"+work.getID()+">, error code was <"+errorCode+">"); int submitted=work.getSubmissionCounter(); @@ -247,6 +250,7 @@ else{ logger.debug("Not resubmitting <"+work.getID()+">"); setToDoneAndFailed("Not resubmitting."); + reportError(errorCode,errorDescription); } } Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowFactoryImpl.java 2010-03-26 19:23:06 UTC (rev 6725) @@ -210,6 +210,7 @@ c.add(Calendar.MONTH, 24); init.put(EnumerationImpl.INIT_INITIAL_TERMINATION_TIME, c); init.put(INITPARAM_SECURITYCONTEXT, getSecurityContext()); + init.put(INIT_UNIQUE_ID, getUniqueID()+"_workflows"); Home h=Kernel.getKernel().getServiceHome(UAS.ENUMERATION); if(h==null){ throw new ResourceNotCreatedException("Enumeration service is not deployed!"); @@ -235,6 +236,7 @@ c.add(Calendar.MONTH, 24); init.put(EnumerationImpl.INIT_INITIAL_TERMINATION_TIME, c); init.put(INITPARAM_SECURITYCONTEXT, getSecurityContext()); + init.put(INIT_UNIQUE_ID, getUniqueID()+"_accessible_workflows"); Home h=Kernel.getKernel().getServiceHome(UAS.ENUMERATION); if(h==null){ throw new ResourceNotCreatedException("Enumeration service is not deployed!"); Modified: workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java =================================================================== --- workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2010-03-26 17:33:42 UTC (rev 6724) +++ workflow/trunk/workflowservice/src/main/java/org/chemomentum/dsws/WorkflowInstance.java 2010-03-26 19:23:06 UTC (rev 6725) @@ -204,7 +204,9 @@ else{ logger.info("Start processing of workflow <"+getUniqueID()+">"); PEWorkflow peWorkflow=conversionResult.getConvertedWorkflow(); - Calendar lifetime=getTerminationTime(); + Calendar tt=getTerminationTime(); + Calendar lifetime=Calendar.getInstance(); + lifetime.setTimeInMillis(tt.getTimeInMillis()); PEConfig.getInstance().getProcessEngine().process(peWorkflow,getSecurityContext(),storageURL,lifetime); } properties.put(RPOutputFiles,new OutputFilesResourceProperty(conversionResult)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |