You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/01/05 18:57:20 UTC

svn commit: r731639 - in /ode/trunk: axis2/src/main/java/org/apache/ode/axis2/hooks/ bpel-api/src/main/java/org/apache/ode/bpel/common/ bpel-api/src/main/java/org/apache/ode/bpel/rapi/ bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/ bpel-...

Author: karthick
Date: Mon Jan  5 09:57:19 2009
New Revision: 731639

URL: http://svn.apache.org/viewvc?rev=731639&view=rev
Log:
Add support for unique correlation sets (see ODE-262).

Added:
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ConstantsModel.java
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.bpel
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.wsdl
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/deploy.xml
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/derby.log
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test1.properties
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test2.properties
    ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test3.properties
Modified:
    ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKey.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/CorrelationSetModel.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/InvalidProcessException.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/PartnerLinkModel.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/CorrelationSet.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/BpelCompilerImpl.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/PickReceiveGenerator.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BaseCompiler.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BpelCompilerImpl.java
    ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/PickReceiveGenerator.java
    ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessDAO.java
    ode/trunk/bpel-test/src/test/java/org/apache/ode/test/MessageRouting20Test.java
    ode/trunk/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java
    ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessDaoImpl.java
    ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessDaoImpl.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/BpelJacobRunnable.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OConstants.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OPartnerLink.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OScope.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/RuntimeInstanceImpl.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/BpelJacobRunnable.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OConstants.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OPartnerLink.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OScope.java
    ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java

Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java (original)
+++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/ODEAxisService.java Mon Jan  5 09:57:19 2009
@@ -80,7 +80,7 @@
             WSDL11ToAxisServiceBuilder serviceBuilder = new WSDL11ToAxisPatchedBuilder(is, wsdlServiceName, portName);
             serviceBuilder.setBaseUri(baseUri.toString());
             serviceBuilder.setCustomResolver(new Axis2UriResolver());
-            serviceBuilder.setCustomWSDLResolver(new Axis2WSDLLocator(baseUri));
+            serviceBuilder.setCustomWSLD4JResolver(new Axis2WSDLLocator(baseUri));
             serviceBuilder.setServerSide(true);
 
             AxisService axisService = serviceBuilder.populateService();

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKey.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKey.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKey.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKey.java Mon Jan  5 09:57:19 2009
@@ -52,6 +52,8 @@
     private int _csetId;
     /** Key values. */
     private final String _keyValues[];
+    /** System-Wide Unique? */
+    private boolean unique = false;
 
     /**
      * Constructor.
@@ -126,6 +128,20 @@
     }
 
     /**
+     * Is this correlation key system-wide unique?
+     * 
+     * @return <code>true</code> if the key is declared to be unique  
+     *         otherwise <code>false</code>
+     */
+    public boolean isUnique() {
+    	return unique;
+    }
+    
+    public void setUnique(boolean unique) {
+    	this.unique = unique;
+    }
+    
+    /**
      * Equals comperator method.
      * 
      * @param o

Added: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ConstantsModel.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ConstantsModel.java?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ConstantsModel.java (added)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ConstantsModel.java Mon Jan  5 09:57:19 2009
@@ -0,0 +1,29 @@
+package org.apache.ode.bpel.rapi;
+
+import javax.xml.namespace.QName;
+
+public interface ConstantsModel {
+	
+    // standard fault names
+    public QName getMissingRequest();
+    public QName getMissingReply();
+    public QName getUninitializedVariable();
+    public QName getConflictingReceive();
+    public QName getSelectionFailure();
+    public QName getMismatchedAssignmentFailure();
+    public QName getJoinFailure();
+    public QName getForcedTermination();
+    public QName getCorrelationViolation();
+    public QName getXsltInvalidSource();
+    public QName getSubLanguageExecutionFault();
+    public QName getUninitializedPartnerRole();
+    public QName getForEachCounterError();
+    public QName getInvalidBranchCondition();
+    public QName getInvalidExpressionValue();
+
+    // non-standard fault names
+    public QName getRetiredProcess();
+    public QName getDuplicateInstance();
+    public QName getUnknownFault();
+
+}

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/CorrelationSetModel.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/CorrelationSetModel.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/CorrelationSetModel.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/CorrelationSetModel.java Mon Jan  5 09:57:19 2009
@@ -10,4 +10,6 @@
     List<PropertyAliasModel> getAliases(QName messageType);
 
     List<PropertyExtractor> getExtractors();
+    
+    boolean isUnique();
 }

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/InvalidProcessException.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/InvalidProcessException.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/InvalidProcessException.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/InvalidProcessException.java Mon Jan  5 09:57:19 2009
@@ -31,6 +31,8 @@
 
     public final static int RETIRED_CAUSE_CODE = 1;
 
+    public final static int DUPLICATE_CAUSE_CODE = 2;
+    
     private final int causeCode;
 
     public InvalidProcessException(String msg, Throwable cause) {

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/PartnerLinkModel.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/PartnerLinkModel.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/PartnerLinkModel.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/PartnerLinkModel.java Mon Jan  5 09:57:19 2009
@@ -32,4 +32,5 @@
 
     Set<CorrelationSetModel> getCorrelationSetsForOperation(Operation operation);
 
+    Set<CorrelationSetModel> getUniqueCorrelationSetsForOperation(Operation operation);
 }

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java Mon Jan  5 09:57:19 2009
@@ -22,4 +22,6 @@
     ActivityModel getChild(final int id);
 
     int getModelVersion();
+    
+    ConstantsModel getConstantsModel();
 }

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/CorrelationSet.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/CorrelationSet.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/CorrelationSet.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/bom/CorrelationSet.java Mon Jan  5 09:57:19 2009
@@ -73,4 +73,12 @@
         return _props;
     }
 
+    /**
+     * Is the correlation set system-wide unique?
+     * 
+     * @return <code>true</code> iff the set is unique
+     */
+    public boolean isUnique() {
+        return getAttribute("unique", "no").equals("yes");
+    }
 }

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/BpelCompilerImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/BpelCompilerImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/BpelCompilerImpl.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/BpelCompilerImpl.java Mon Jan  5 09:57:19 2009
@@ -113,6 +113,7 @@
 import org.apache.ode.bpel.rtrep.v1.OXslSheet;
 import org.apache.ode.utils.GUID;
 import org.apache.ode.utils.NSContext;
+import org.apache.ode.utils.Namespaces;
 import org.apache.ode.utils.StreamUtils;
 import org.apache.ode.utils.fs.FileUtils;
 import org.apache.ode.utils.msg.MessageBundle;
@@ -768,6 +769,10 @@
         constants.qnForEachCounterError = new QName(getBpwsNamespace(), "forEachCounterError");
         constants.qnInvalidBranchCondition = new QName(getBpwsNamespace(), "invalidBranchCondition");
         constants.qnInvalidExpressionValue = new QName(getBpwsNamespace(), "invalidExpressionValue");
+        
+        constants.qnDuplicateInstance = new QName(getOdeNamespace(), "duplicateInstance");
+        constants.qnRetiredProcess = new QName(getOdeNamespace(), "retiredProcess");
+        constants.qnUnknownFault = new QName(getOdeNamespace(), "unknownFault");
         return constants;
     }
 
@@ -783,7 +788,11 @@
     // }
     // }
 
-    /**
+    protected String getOdeNamespace() {
+    	return Namespaces.ODE_EXTENSION_NS;
+    }
+
+	/**
      * Compile an import declaration. According to the specification:
      * <blockquote> A BPEL4WSWS-BPEL process definition relies on XML Schema and
      * WSDL 1.1 for the definition of datatypes and service interfaces. Process
@@ -1059,6 +1068,7 @@
         QName[] setprops = cset.getProperties();
         for (int j = 0; j < setprops.length; ++j)
             ocset.properties.add(resolveProperty(setprops[j]));
+        ocset.unique = cset.isUnique();
         oscope.addCorrelationSet(ocset);
     }
 

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/PickReceiveGenerator.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/PickReceiveGenerator.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/PickReceiveGenerator.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v1/PickReceiveGenerator.java Mon Jan  5 09:57:19 2009
@@ -99,6 +99,7 @@
             case YES:
                 onMessage.initCorrelations.add(cset);
                 onMessage.partnerLink.addCorrelationSetForOperation(onMessage.operation, cset);
+                onMessage.partnerLink.addUniqueCorrelationSetForOperation(onMessage.operation, cset);
                 break;
             case JOIN:
                 if (createInstance) {

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BaseCompiler.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BaseCompiler.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BaseCompiler.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BaseCompiler.java Mon Jan  5 09:57:19 2009
@@ -30,6 +30,10 @@
         constants.qnInvalidBranchCondition = new QName(getBpwsNamespace(), "invalidBranchCondition");
         constants.qnInvalidExpressionValue = new QName(getBpwsNamespace(), "invalidExpressionValue");
         constants.qnScopeRollback = new QName(getOdeNamespace(), "scopeRollback");
+        
+        constants.qnDuplicateInstance = new QName(getOdeNamespace(), "duplicateInstance");
+        constants.qnRetiredProcess = new QName(getOdeNamespace(), "retiredProcess");
+        constants.qnUnknownFault = new QName(getOdeNamespace(), "unknownFault");
         return constants;
     }
 

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BpelCompilerImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BpelCompilerImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BpelCompilerImpl.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/BpelCompilerImpl.java Mon Jan  5 09:57:19 2009
@@ -1053,6 +1053,7 @@
         QName[] setprops = cset.getProperties();
         for (int j = 0; j < setprops.length; ++j)
             ocset.properties.add(resolveProperty(setprops[j]));
+        ocset.unique = cset.isUnique();
         oscope.addCorrelationSet(ocset);
     }
 
@@ -1296,6 +1297,7 @@
                         break;
                     case YES:
                         oevent.initCorrelations.add(cset);
+                        oevent.partnerLink.addUniqueCorrelationSetForOperation(oevent.operation, cset);
                         break;
                     case JOIN:
                         throw new CompilationException(__cmsgs.errTODO("Rendezvous."));

Modified: ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/PickReceiveGenerator.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/PickReceiveGenerator.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/PickReceiveGenerator.java (original)
+++ ode/trunk/bpel-compiler/src/main/java/org/apache/ode/bpel/compiler/v2/PickReceiveGenerator.java Mon Jan  5 09:57:19 2009
@@ -100,6 +100,7 @@
             case YES:
                 onMessage.initCorrelations.add(cset);
                 onMessage.partnerLink.addCorrelationSetForOperation(onMessage.operation, cset);
+                onMessage.partnerLink.addUniqueCorrelationSetForOperation(onMessage.operation, cset);
                 break;
             case JOIN:
                 if (createInstance) {

Modified: ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessDAO.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessDAO.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessDAO.java (original)
+++ ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessDAO.java Mon Jan  5 09:57:19 2009
@@ -84,6 +84,7 @@
      * @return collection of {@link ProcessInstanceDAO} that match correlation key, ordered by date
      */
     Collection<ProcessInstanceDAO> findInstance(CorrelationKey cckey);
+    Collection<ProcessInstanceDAO> findInstance(CorrelationKey cckey, boolean wait);
 
     /**
      * Remove the routes with the given Id for all the correlators in the process.

Modified: ode/trunk/bpel-test/src/test/java/org/apache/ode/test/MessageRouting20Test.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/MessageRouting20Test.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-test/src/test/java/org/apache/ode/test/MessageRouting20Test.java (original)
+++ ode/trunk/bpel-test/src/test/java/org/apache/ode/test/MessageRouting20Test.java Mon Jan  5 09:57:19 2009
@@ -84,4 +84,7 @@
 		negative("target/test-classes/bpel/2.0/NegativeInitializationTest");
 	}
 
+    @Test public void testCorrelationUnique() throws Throwable {
+        go("/bpel/2.0/TestCorrelationUnique");
+    }
 }

Modified: ode/trunk/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java (original)
+++ ode/trunk/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java Mon Jan  5 09:57:19 2009
@@ -36,7 +36,6 @@
          // Test Flow with XPath10
          go("/bpel/2.0/TestFlowLinks");
      }
-	@Ignore
     @Test public void testIsolatedScopes1() throws Throwable {
         // Test Flow with XPath10
         go("/bpel/2.0/TestIsolatedScopes1");

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.bpel
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.bpel?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.bpel (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.bpel Mon Jan  5 09:57:19 2009
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<b:process xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	   xsi:schemaLocation="http://docs.oasis-open.org/wsbpel/2.0/process/executable http://docs.oasis-open.org/wsbpel/2.0/CS01/process/executable/ws-bpel_executable.xsd"
+	   xmlns:b="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
+	   name="counter"
+	   xmlns:t="http://example.com/bpel/counter"
+	   targetNamespace="http://example.com/bpel/counter">
+  
+  <b:import importType="http://schemas.xmlsoap.org/wsdl/"
+	    location="counter.wsdl"
+	    namespace="http://example.com/bpel/counter" />
+  
+  <b:partnerLinks>
+    <b:partnerLink name="operations" partnerLinkType="t:plink" myRole="me" />
+  </b:partnerLinks>
+  
+  <b:variables>
+    <b:variable name="counter" messageType="t:responseMessage" />
+    <b:variable name="initiation" messageType="t:requestMessage" />
+    <b:variable name="empty" messageType="t:emptyResponse" />
+  </b:variables>
+  
+  <b:correlationSets>
+    <b:correlationSet name="name" properties="t:counterProp" unique="yes"/>
+  </b:correlationSets>
+  
+  <b:sequence>
+    <b:receive partnerLink="operations" createInstance="yes" operation="init" portType="t:port"
+        variable="initiation">
+      <b:correlations>
+        <b:correlation set="name" initiate="yes"/>
+      </b:correlations>
+    </b:receive>
+    <b:assign>
+      <b:copy>
+        <b:from>0</b:from>
+        <b:to variable="counter" part="value"></b:to>
+      </b:copy>
+    </b:assign>
+    <b:reply partnerLink="operations" operation="init" variable="empty" />
+    <b:flow>
+      <b:while>
+        <b:condition>true()</b:condition>
+          <b:scope>
+            <b:variables>
+              <b:variable name="tmp" messageType="t:requestMessage" />
+            </b:variables>
+            <b:sequence>
+              <b:receive partnerLink="operations" operation="getAndIncrement" portType="t:port"
+                  variable="tmp">
+                <b:correlations>
+                  <b:correlation set="name" initiate="no" />
+                </b:correlations>
+              </b:receive>          
+              <b:reply partnerLink="operations" operation="getAndIncrement" variable="counter" />
+              <b:assign>
+                <b:copy>
+                  <b:from>$counter.value+1</b:from>
+                  <b:to>$counter.value</b:to>
+                </b:copy>
+              </b:assign>          
+            </b:sequence>
+          </b:scope>
+      </b:while>
+      <b:while>
+        <b:condition>true()</b:condition>
+        <b:scope>
+          <b:variables>
+            <b:variable name="tmp" messageType="t:requestMessage" />
+          </b:variables>
+          <b:sequence>
+            <b:receive partnerLink="operations" operation="get" variable="tmp">
+              <b:correlations>
+                <b:correlation set="name" initiate="no" />
+              </b:correlations>            
+            </b:receive>
+            <b:reply partnerLink="operations" operation="get" variable="counter" />
+          </b:sequence>
+        </b:scope>
+      </b:while>
+        <b:scope>
+          <b:variables>
+            <b:variable name="tmp" messageType="t:requestMessage" />
+          </b:variables>          
+          <b:sequence>
+            <b:receive partnerLink="operations" operation="close" variable="tmp">
+              <b:correlations>
+                <b:correlation set="name" initiate="no" />
+              </b:correlations>
+            </b:receive>
+            <b:reply partnerLink="operations" operation="close" variable="empty"/>
+            <b:exit />
+          </b:sequence>
+        </b:scope>
+    </b:flow>
+  </b:sequence>
+</b:process>

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.wsdl
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.wsdl?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.wsdl (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/counter.wsdl Mon Jan  5 09:57:19 2009
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wsdl:definitions
+  targetNamespace="http://example.com/bpel/counter" 
+  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:p="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
+  xmlns:v="http://docs.oasis-open.org/wsbpel/2.0/varprop"
+  xmlns:t="http://example.com/bpel/counter">
+  
+  <wsdl:message name="requestMessage">
+    <wsdl:part name="name" type="xsd:string" />
+  </wsdl:message>
+  
+  <wsdl:message name="responseMessage">
+    <wsdl:part name="value" type="xsd:int" />
+  </wsdl:message>
+  
+  <wsdl:message name="emptyResponse" />
+  
+  <wsdl:portType name="port">
+    <wsdl:operation name="init">
+      <wsdl:input message="t:requestMessage" />
+      <wsdl:output message="t:emptyResponse" />
+    </wsdl:operation>
+    <wsdl:operation name="get">
+      <wsdl:input message="t:requestMessage" />
+      <wsdl:output message="t:responseMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="getAndIncrement">
+      <wsdl:input message="t:requestMessage" />
+      <wsdl:output message="t:responseMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="close">
+      <wsdl:input message="t:requestMessage" />
+      <wsdl:output message="t:emptyResponse" />
+    </wsdl:operation>
+  </wsdl:portType>
+  
+  <wsdl:binding name="binding" type="t:port">
+    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+    <wsdl:operation name="init">
+      <soap:operation soapAction="" style="rpc"/>
+      <wsdl:input>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="get">
+      <soap:operation soapAction="" style="rpc"/>
+      <wsdl:input>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="getAndIncrement">
+      <soap:operation soapAction="" style="rpc"/>
+      <wsdl:input>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body namespace="http://example.com/bpel/counter" use="literal"/>
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:binding>
+  <wsdl:service name="counter">
+    <wsdl:port name="port" binding="t:binding">
+      <soap:address location="http://localhost:8080/ode/processes/counter"/>
+    </wsdl:port>
+  </wsdl:service>
+  
+  <p:partnerLinkType name="plink">
+    <p:role name="me" portType="t:port" />
+    <p:role name="you" portType="t:port" />
+  </p:partnerLinkType>
+  
+  <v:property name="counterProp" type="xsd:string" />
+  
+  <v:propertyAlias propertyName="t:counterProp" part="name" messageType="t:requestMessage" />
+</wsdl:definitions>
\ No newline at end of file

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/deploy.xml
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/deploy.xml?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/deploy.xml (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/deploy.xml Mon Jan  5 09:57:19 2009
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<dd:deploy xmlns:dd="http://ode.fivesight.com/schemas/2006/06/27/dd">
+<dd:process xmlns:dd="http://ode.fivesight.com/schemas/2006/06/27/dd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:this="http://example.com/bpel/counter" name="this:counter" fileName="counter.bpel">
+  <dd:property name="PATH">counter</dd:property>
+  <dd:property name="SVG">counter.svg</dd:property>
+  <dd:provide partnerLink="operations">
+    <dd:service name="this:counter" port="port" />
+  </dd:provide>
+</dd:process></dd:deploy>
\ No newline at end of file

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/derby.log
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/derby.log?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/derby.log (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/derby.log Mon Jan  5 09:57:19 2009
@@ -0,0 +1,6 @@
+----------------------------------------------------------------
+2008-12-19 19:59:44.327 GMT:
+ Booting Derby version The Apache Software Foundation - Apache Derby - 10.1.3.1 - (417277): instance c013800d-011e-50d5-047f-0000031eb850
+on database directory C:\Intalio\integr\intalio-bpms-ee-5.2.3.003-tomcat-5-5.5.26\var\derby\BPMSDB 
+
+Database Class Loader started - derby.database.classpath=''

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test1.properties
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test1.properties?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test1.properties (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test1.properties Mon Jan  5 09:57:19 2009
@@ -0,0 +1,22 @@
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+namespace=http://example.com/bpel/counter
+service=counter
+operation=init
+request1=<message><name>foo</name></message>
+response1=.*

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test2.properties
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test2.properties?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test2.properties (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test2.properties Mon Jan  5 09:57:19 2009
@@ -0,0 +1,22 @@
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+namespace=http://example.com/bpel/counter
+service=counter
+operation=init
+request1=<message><name>foo</name></message>
+response1=FAULT

Added: ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test3.properties
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test3.properties?rev=731639&view=auto
==============================================================================
--- ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test3.properties (added)
+++ ode/trunk/bpel-test/src/test/resources/bpel/2.0/TestCorrelationUnique/test3.properties Mon Jan  5 09:57:19 2009
@@ -0,0 +1,22 @@
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+namespace=http://example.com/bpel/counter
+service=counter
+operation=init
+request1=<message><name>bar</name></message>
+response1=.*

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessDaoImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessDaoImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessDaoImpl.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessDaoImpl.java Mon Jan  5 09:57:19 2009
@@ -29,12 +29,16 @@
 import org.apache.ode.daohib.bpel.hobj.HProcessInstance;
 import org.hibernate.Criteria;
 import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
 import org.hibernate.Query;
 import org.hibernate.criterion.Expression;
 import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
 
 import javax.xml.namespace.QName;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.Iterator;
 
@@ -103,18 +107,28 @@
         return new ProcessInstanceDaoImpl(_sm,instance);
     }
 
+    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey key) {
+    	return findInstance(key, true);
+    }
+    
     /**
      * @see org.apache.ode.bpel.dao.ProcessDAO#findInstance(CorrelationKey)
      */
     @SuppressWarnings("unchecked")
-    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey ckeyValue) {
-        entering("ProcessDaoImpl.findInstance");
-        Criteria criteria = getSession().createCriteria(HCorrelationSet.class);
-        criteria.add(Expression.eq("scope.instance.process.id",_process.getId()));
-        criteria.add(Expression.eq("value", ckeyValue.toCanonicalString()));
-        criteria.addOrder(Order.desc("scope.instance.created"));
-        return criteria.list();
-
+    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey ckeyValue, boolean wait) {
+    	try {
+	        entering("ProcessDaoImpl.findInstance");
+	        Criteria correlationSet = getSession().createCriteria(HCorrelationSet.class);
+	        Criteria instance = correlationSet.createCriteria("scope").createCriteria("instance");
+	        instance.addOrder(Order.desc("created"));
+	        Criteria process = instance.createCriteria("process");
+	        process.add(Restrictions.eq("id", _process.getId()));
+	        correlationSet.add(Expression.eq("value", ckeyValue.toCanonicalString()));	        
+	        correlationSet.setLockMode(wait ? LockMode.UPGRADE : LockMode.UPGRADE_NOWAIT);
+	        return correlationSet.list();
+    	} catch (HibernateException he) {
+    		return Collections.EMPTY_LIST;
+    	}
     }
 
     /**

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java Mon Jan  5 09:57:19 2009
@@ -95,8 +95,12 @@
 		return inst;
 	}
 
+    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey key) {
+    	return findInstance(key, true);
+    }
+    
 	@SuppressWarnings("unchecked")
-    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey ckey) {
+    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey ckey, boolean wait) {
 		Query qry = getEM().createNamedQuery("InstanceByCKey");
         qry.setParameter("ckey", ckey.toCanonicalString());
         return qry.getResultList();

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java Mon Jan  5 09:57:19 2009
@@ -54,6 +54,7 @@
 import org.apache.ode.bpel.iapi.Endpoint;
 import org.apache.ode.bpel.iapi.EndpointReference;
 import org.apache.ode.bpel.iapi.InvocationStyle;
+import org.apache.ode.bpel.iapi.Message;
 import org.apache.ode.bpel.iapi.MessageExchange;
 import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
 import org.apache.ode.bpel.iapi.PartnerRoleChannel;
@@ -71,18 +72,23 @@
 import org.apache.ode.bpel.intercept.MessageExchangeInterceptor;
 import org.apache.ode.bpel.memdao.BpelDAOConnectionFactoryImpl;
 import org.apache.ode.bpel.memdao.ProcessInstanceDaoImpl;
+import org.apache.ode.bpel.rapi.ConstantsModel;
 import org.apache.ode.bpel.rapi.FaultInfo;
 import org.apache.ode.bpel.rapi.OdeRTInstance;
 import org.apache.ode.bpel.rapi.OdeRuntime;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
 import org.apache.ode.bpel.rapi.ProcessModel;
 import org.apache.ode.bpel.rapi.Serializer;
+import org.apache.ode.bpel.runtime.InvalidProcessException;
 import org.apache.ode.il.config.OdeConfigProperties;
 import org.apache.ode.jacob.soup.ReplacementMap;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
+import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.GUID;
+import org.apache.ode.utils.Namespaces;
 import org.apache.ode.utils.ObjectPrinter;
 import org.apache.ode.utils.msg.MessageBundle;
+import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
@@ -236,12 +242,14 @@
      */
     void invokeProcess(final MessageExchangeDAO mexdao) {
         InvocationStyle istyle = mexdao.getInvocationStyle();
+		ConstantsModel constants = null;
 
         _hydrationLatch.latch(1);
         try {
             // The following check is mostly for sanity purposes. MexImpls should prevent this from
             // happening.
             PartnerLinkMyRoleImpl target = getMyRoleForService(mexdao.getCallee());
+            constants = target._process.getProcessModel().getConstantsModel();
             Status oldstatus = mexdao.getStatus();
             if (target == null) {
                 String errmsg = __msgs.msgMyRoleRoutingFailure(mexdao.getMessageExchangeId());
@@ -322,6 +330,29 @@
             } else if (cstatus == CorrelationStatus.QUEUED) {
                 ; // do nothing
             }
+        } catch (InvalidProcessException ipe) {
+        	QName faultQName = null;
+        	if (constants != null) {
+        		Document document = DOMUtils.newDocument();
+        		Element faultElement = document.createElementNS(Namespaces.SOAP_ENV_NS, "Fault");
+        		Element faultDetail = document.createElementNS(Namespaces.ODE_EXTENSION_NS, "fault");
+        		faultElement.appendChild(faultDetail);
+	        	switch (ipe.getCauseCode()) {
+		        	case InvalidProcessException.DUPLICATE_CAUSE_CODE:
+		        		faultQName = constants.getDuplicateInstance();
+		        		faultDetail.setTextContent("Found a duplicate instance with the same message key");
+		        		break;
+		        	case InvalidProcessException.RETIRED_CAUSE_CODE:
+		        		faultQName = constants.getRetiredProcess();
+		        		faultDetail.setTextContent("The process you're trying to instantiate has been retired");
+		        		break;
+		        	case InvalidProcessException.DEFAULT_CAUSE_CODE:
+		        	default:
+		        		faultQName = constants.getUnknownFault();
+		        		break;
+	        	}
+	        	MexDaoUtil.setFaulted(mexdao, faultQName, faultElement);
+        	}
         } finally {
             _hydrationLatch.release(1);
 

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java Mon Jan  5 09:57:19 2009
@@ -99,7 +99,7 @@
         }
 
         // Is this a /possible/ createInstance Operation?
-        boolean isCreateInstnace = _plinkDef.isCreateInstanceOperation(operation);
+        boolean isCreateInstance = _plinkDef.isCreateInstanceOperation(operation);
         String correlatorId = ODEProcess.genCorrelatorId(_plinkDef, operation.getName());
         CorrelatorDAO correlator = _process.getProcessDAO().getCorrelator(correlatorId);
 
@@ -108,7 +108,7 @@
         // now, the tricks begin: when a message arrives we have to see if there is anyone waiting for it. Get the correlator, a
         // persisted communnication-reduction data structure supporting correlation correlationKey matching!
 
-        CorrelationKey[] keys;
+        CorrelationKey[] processKeys, uniqueKeys;
 
         // We need to compute the correlation keys (based on the operation
         // we can infer which correlation keys to compute - this is merely a set
@@ -116,7 +116,8 @@
         // that is ever referenced in an <receive>/<onMessage> on this
         // partnerlink/operation.
         try {
-            keys = computeCorrelationKeys(mex, operation);
+            processKeys = computeCorrelationKeys(mex, operation);
+            uniqueKeys = computeUniqueCorrelationKeys(mex, operation);
         } catch (InvalidMessageException ime) {
             // We'd like to do a graceful exit here, no sense in rolling back due to a
             // a message format problem.
@@ -128,14 +129,14 @@
         String mySessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_MYROLE_SESSIONID);
         String partnerSessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_PARTNERROLE_SESSIONID);
         if (__log.isDebugEnabled()) {
-            __log.debug("INPUTMSG: " + correlatorId + ": MSG RCVD keys=" + CollectionUtils.makeCollection(HashSet.class, keys)
+            __log.debug("INPUTMSG: " + correlatorId + ": MSG RCVD keys=" + CollectionUtils.makeCollection(HashSet.class, processKeys)
                     + " mySessionId=" + mySessionId + " partnerSessionId=" + partnerSessionId);
         }
 
         CorrelationKey matchedKey = null;
 
         // Try to find a route for one of our keys.
-        for (CorrelationKey key : keys) {
+        for (CorrelationKey key : processKeys) {
             messageRoute = correlator.findRoute(key);
             if (messageRoute != null) {
                 if (__log.isDebugEnabled()) {
@@ -151,8 +152,8 @@
         // If no luck, and this operation qualifies for create-instance
         // treatment, then create a new process
         // instance.
-        if (messageRoute == null && isCreateInstnace) {
-            invokeMyRoleCreateInstance(mex, operation, correlatorId, correlator);
+        if (messageRoute == null && isCreateInstance) {
+            invokeMyRoleCreateInstance(mex, operation, correlatorId, correlator, uniqueKeys);
         } else if (messageRoute != null) {
             if (__log.isDebugEnabled()) {
                 __log.debug("INPUTMSG: " + correlatorId + ": ROUTING to instance "
@@ -195,21 +196,21 @@
             // } else {
             // send event
             CorrelationNoMatchEvent evt = new CorrelationNoMatchEvent(mex.getPortType(), mex.getOperation(), mex
-                    .getMessageExchangeId(), keys);
+                    .getMessageExchangeId(), processKeys);
 
             evt.setProcessId(_process.getProcessDAO().getProcessId());
             evt.setProcessName(_process.getProcessModel().getQName());
             _process._debugger.onEvent(evt);
 
             mex.setCorrelationStatus(MyRoleMessageExchange.CorrelationStatus.QUEUED.toString());
-            correlator.enqueueMessage(mex, keys);
+            correlator.enqueueMessage(mex, processKeys);
         }
 
         return CorrelationStatus.valueOf(mex.getCorrelationStatus());
     }
 
     private void invokeMyRoleCreateInstance(MessageExchangeDAO mex, Operation operation, String correlatorId,
-            CorrelatorDAO correlator) {
+            CorrelatorDAO correlator, CorrelationKey[] uniqueKeys) {
         if (__log.isDebugEnabled()) {
             __log.debug("INPUTMSG: " + correlatorId + ": routing failed, CREATING NEW INSTANCE");
         }
@@ -224,8 +225,19 @@
         // return;
         // }
 
+        for (CorrelationKey uniqueKey : uniqueKeys) {
+        	// double-check that the correlation set is indeed unique
+        	if (uniqueKey.isUnique()) {
+        		Collection<ProcessInstanceDAO> instances = processDAO.findInstance(uniqueKey, false);
+        		if (instances.size() != 0) {
+                    __log.debug("Not creating a new instance for mex " + mex + "; unique correlation constraint would be violated!");
+                    throw new InvalidProcessException("Unique process constraint violated", InvalidProcessException.DUPLICATE_CAUSE_CODE);
+        		}
+        	}        	
+        }
+        
         ProcessInstanceDAO newInstance = processDAO.createInstance(correlator);
-
+        
         // send process instance event
         NewProcessInstanceEvent evt = new NewProcessInstanceEvent(_process.getProcessModel().getQName(),
                 processDAO.getProcessId(), newInstance.getInstanceId());
@@ -263,6 +275,25 @@
         return keys.toArray(new CorrelationKey[keys.size()]);
     }
 
+    private CorrelationKey[] computeUniqueCorrelationKeys(MessageExchangeDAO mex, Operation operation) {
+        Element msg = mex.getRequest().getData();
+        javax.wsdl.Message msgDescription = operation.getInput().getMessage();
+        List<CorrelationKey> keys = new ArrayList<CorrelationKey>();
+
+        Set<CorrelationSetModel> csets = _plinkDef.getUniqueCorrelationSetsForOperation(operation);
+        for (CorrelationSetModel cset : csets) {
+            CorrelationKey key = computeCorrelationKey(cset, msgDescription.getQName(), msg);
+            keys.add(key);
+        }
+
+        // Let's creata a key based on the sessionId
+        String mySessionId = mex.getProperty(MessageExchange.PROPERTY_SEP_MYROLE_SESSIONID);
+        if (mySessionId != null)
+            keys.add(new CorrelationKey(-1, new String[] { mySessionId }));
+
+        return keys.toArray(new CorrelationKey[keys.size()]);
+    }
+    
     private CorrelationKey computeCorrelationKey(CorrelationSetModel cset, QName messageName, Element msg) {
         String[] values;
         if (cset.getExtractors().isEmpty()) {
@@ -295,7 +326,9 @@
             }
         }
 
-        return new CorrelationKey(cset.getId(), values);
+        CorrelationKey key = new CorrelationKey(cset.getId(), values);
+        key.setUnique(cset.isUnique());
+        return key;
     }
 
 	public boolean isOneWayOnly() {

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessDaoImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessDaoImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessDaoImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessDaoImpl.java Mon Jan  5 09:57:19 2009
@@ -133,6 +133,10 @@
     }
 
     public Collection<ProcessInstanceDAO> findInstance(CorrelationKey key) {
+    	return findInstance(key, true);
+    }
+    
+    public Collection<ProcessInstanceDAO> findInstance(CorrelationKey key, boolean wait) {
         ArrayList<ProcessInstanceDAO> result = new ArrayList<ProcessInstanceDAO>();
         for (ProcessInstanceDAO instance : _instances.values()) {
             for (CorrelationSetDAO corrSet : instance.getCorrelationSets()) {

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java Mon Jan  5 09:57:19 2009
@@ -31,6 +31,8 @@
 
     public final static int RETIRED_CAUSE_CODE = 1;
 
+    public final static int DUPLICATE_CAUSE_CODE = 2;
+    
     private final int causeCode;
 
     public InvalidProcessException(String msg, Throwable cause) {

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/BpelJacobRunnable.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/BpelJacobRunnable.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/BpelJacobRunnable.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/BpelJacobRunnable.java Mon Jan  5 09:57:19 2009
@@ -96,6 +96,7 @@
         }
 
         CorrelationKey ckeyVal = new CorrelationKey(cset.declaration.getId(), propValues);
+        ckeyVal.setUnique(cset.declaration.unique);
         getBpelRuntime().writeCorrelation(cset,ckeyVal);
     }
     

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OConstants.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OConstants.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OConstants.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OConstants.java Mon Jan  5 09:57:19 2009
@@ -27,6 +27,8 @@
 public class OConstants extends OBase {
 
     private static final long serialVersionUID = 1L;
+
+    // standard fault names
     public QName qnMissingRequest;
     public QName qnMissingReply;
     public QName qnUninitializedVariable;
@@ -43,6 +45,10 @@
     public QName qnInvalidBranchCondition;
     public QName qnInvalidExpressionValue;
 
+    // non-standard fault names
+    public QName qnRetiredProcess;
+    public QName qnDuplicateInstance;
+    public QName qnUnknownFault;
 
     public OConstants(OProcess owner) {
         super(owner);

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OPartnerLink.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OPartnerLink.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OPartnerLink.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OPartnerLink.java Mon Jan  5 09:57:19 2009
@@ -57,6 +57,9 @@
     /** The set of CorrelationSets that may be used as a match criteria, organized by {@link Operation} */
     private final HashMap<String,Set<OScope.CorrelationSet>> _nonIntitiatingCorrelationSets = new HashMap<String,Set<OScope.CorrelationSet>>();
 
+    /** The set of initiating CorrelationSets that may be used as an uniqueness criteria, organized by {@link Operation} */
+    private final HashMap<String,Set<OScope.CorrelationSet>> _uniqueInitiatingCorrelationSets = new HashMap<String,Set<OScope.CorrelationSet>>();
+
     /** The set of {@link Operation}s that can be used to create a process instance. */
     private final HashSet<String> _createInstanceOperations = new HashSet<String>();
 
@@ -116,6 +119,43 @@
         return Collections.unmodifiableSet(new HashSet(ret));
     }
 
+    /**
+     * Add a {@link org.apache.ode.bpel.o.OScope.CorrelationSet} to an {@link Operation}'s list
+     * of "unique-initiating" correlation sets. The unique-initiating correlation sets are those
+     * sets that are used (along with the operation) to "initiate" incoming messages, provided
+     * that there doesn't already exist a process instance with that correlation key.
+     * We need to know which correlation sets are used with which operation in order to
+     * pre-compute correlation keys at the time of message receipt.
+     * @param operation WSDL {@link Operation}
+     * @param cset unique-initiating correlation used in this operation
+     */
+    @SuppressWarnings("unchecked")
+    public void addUniqueCorrelationSetForOperation(Operation operation, OScope.CorrelationSet cset) {    	
+    	if (cset.unique) {
+	        Set<OScope.CorrelationSet> ret = _uniqueInitiatingCorrelationSets.get(operation.getName());
+	        if (ret == null) {
+	            ret = new HashSet<OScope.CorrelationSet>();
+	            _uniqueInitiatingCorrelationSets.put(operation.getName(), ret);
+	        }
+	        ret.add(cset);
+    	}
+    }
+    
+    /**
+     * Get all unique initiating correlation sets that are ever used to qualify a receive for a the given
+     * operation.
+     * @param operation the operation
+     * @return all unique-initiating correlation sets used in the given operation
+     */
+    @SuppressWarnings("unchecked")
+    public Set<CorrelationSetModel> getUniqueCorrelationSetsForOperation(Operation operation) {
+        Set<OScope.CorrelationSet> ret = _uniqueInitiatingCorrelationSets.get(operation.getName());
+        if (ret == null) {
+            return Collections.EMPTY_SET;
+        }
+        return Collections.unmodifiableSet(new HashSet(ret));
+    }
+
     @SuppressWarnings("unchecked")
     public Operation getMyRoleOperation(String name) {
         for (Operation op : (List<Operation>)myRolePortType.getOperations()) 

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java Mon Jan  5 09:57:19 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.ode.bpel.rtrep.v1;
 
+import org.apache.ode.bpel.rapi.ConstantsModel;
 import org.apache.ode.bpel.rapi.ProcessModel;
 import org.apache.ode.bpel.rapi.ActivityModel;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
@@ -216,4 +217,81 @@
     public int getModelVersion() {
         return 1;
     }
+
+    public ConstantsModel getConstantsModel() {
+    	return new ConstantsModel() {
+
+			public QName getConflictingReceive() {
+				return constants.qnConflictingReceive;
+			}
+
+			public QName getCorrelationViolation() {
+				return constants.qnCorrelationViolation;
+			}
+
+			public QName getDuplicateInstance() {
+				return constants.qnDuplicateInstance;
+			}
+
+			public QName getForEachCounterError() {
+				return constants.qnForEachCounterError;
+			}
+
+			public QName getForcedTermination() {
+				return constants.qnForcedTermination;
+			}
+
+			public QName getInvalidBranchCondition() {
+				return constants.qnInvalidBranchCondition;
+			}
+
+			public QName getInvalidExpressionValue() {
+				return constants.qnInvalidExpressionValue;
+			}
+
+			public QName getJoinFailure() {
+				return constants.qnJoinFailure;
+			}
+
+			public QName getMismatchedAssignmentFailure() {
+				return constants.qnMismatchedAssignmentFailure;
+			}
+
+			public QName getMissingReply() {
+				return constants.qnMissingReply;
+			}
+
+			public QName getMissingRequest() {
+				return constants.qnMissingRequest;
+			}
+
+			public QName getRetiredProcess() {
+				return constants.qnRetiredProcess;
+			}
+
+			public QName getSelectionFailure() {
+				return constants.qnSelectionFailure;
+			}
+
+			public QName getSubLanguageExecutionFault() {
+				return constants.qnSubLanguageExecutionFault;
+			}
+
+			public QName getUninitializedPartnerRole() {
+				return constants.qnUninitializedPartnerRole;
+			}
+
+			public QName getUninitializedVariable() {
+				return constants.qnUninitializedVariable;
+			}
+
+			public QName getUnknownFault() {
+				return constants.qnUnknownFault;
+			}
+
+			public QName getXsltInvalidSource() {
+				return constants.qnXsltInvalidSource;
+			}
+    	};
+    }
 }

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OScope.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OScope.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OScope.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OScope.java Mon Jan  5 09:57:19 2009
@@ -158,6 +158,7 @@
         public String name;
         public OScope declaringScope;
         public final List<OProcess.OProperty>properties = new ArrayList<OProcess.OProperty>();
+        public boolean unique;
 
 
         public CorrelationSet(OProcess owner) {
@@ -183,7 +184,11 @@
         }
 
         public List<PropertyExtractor> getExtractors() {
-            return new ArrayList();
+            return new ArrayList<PropertyExtractor>();
+        }
+        
+        public boolean isUnique() {
+        	return unique;
         }
     }
 

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/RuntimeInstanceImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/RuntimeInstanceImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/RuntimeInstanceImpl.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/RuntimeInstanceImpl.java Mon Jan  5 09:57:19 2009
@@ -187,6 +187,7 @@
             propNames[m] = oProperty.name;
         }
 
+        ckeyVal.setUnique(cset.declaration.unique);
         _brc.writeCorrelation(cset, propNames, ckeyVal);
 
     }

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/BpelJacobRunnable.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/BpelJacobRunnable.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/BpelJacobRunnable.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/BpelJacobRunnable.java Mon Jan  5 09:57:19 2009
@@ -96,6 +96,7 @@
         }
 
         CorrelationKey ckeyVal = new CorrelationKey(cset.declaration.getId(), propValues);
+        ckeyVal.setUnique(cset.declaration.unique);
         getBpelRuntime().writeCorrelation(cset,ckeyVal);
     }
 

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OConstants.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OConstants.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OConstants.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OConstants.java Mon Jan  5 09:57:19 2009
@@ -27,6 +27,8 @@
 public class OConstants extends OBase {
 
     private static final long serialVersionUID = 1L;
+    
+    // standard fault names
     public QName qnMissingRequest;
     public QName qnMissingReply;
     public QName qnUninitializedVariable;
@@ -44,6 +46,10 @@
     public QName qnInvalidExpressionValue;
     public QName qnScopeRollback;
 
+    // non-standard fault names
+    public QName qnRetiredProcess;
+    public QName qnDuplicateInstance;
+    public QName qnUnknownFault;
 
     public OConstants(OProcess owner) {
         super(owner);

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OPartnerLink.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OPartnerLink.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OPartnerLink.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OPartnerLink.java Mon Jan  5 09:57:19 2009
@@ -57,6 +57,9 @@
     /** The set of CorrelationSets that may be used as a match criteria, organized by {@link Operation} */
     private final HashMap<String,Set<CorrelationSetModel>> _nonIntitiatingCorrelationSets = new HashMap<String,Set<CorrelationSetModel>>();
 
+    /** The set of initiating CorrelationSets that may be used as an uniqueness criteria, organized by {@link Operation} */
+    private final HashMap<String,Set<CorrelationSetModel>> _uniqueInitiatingCorrelationSets = new HashMap<String,Set<CorrelationSetModel>>();
+    
     /** The set of {@link Operation}s that can be used to create a process instance. */
     private final HashSet<String> _createInstanceOperations = new HashSet<String>();
 
@@ -138,6 +141,42 @@
         return Collections.unmodifiableSet(ret);
     }
 
+    /**
+     * Add a {@link org.apache.ode.bpel.o.OScope.CorrelationSet} to an {@link Operation}'s list
+     * of "unique-initiating" correlation sets. The unique-initiating correlation sets are those
+     * sets that are used (along with the operation) to "initiate" incoming messages, provided
+     * that there doesn't already exist a process instance with that correlation key.
+     * We need to know which correlation sets are used with which operation in order to
+     * pre-compute correlation keys at the time of message receipt.
+     * @param operation WSDL {@link Operation}
+     * @param cset unique-initiating correlation used in this operation
+     */
+    public void addUniqueCorrelationSetForOperation(Operation operation, CorrelationSetModel cset) {    	
+    	if (cset.isUnique()) {
+	        Set<CorrelationSetModel> ret = _uniqueInitiatingCorrelationSets.get(operation.getName());
+	        if (ret == null) {
+	            ret = new HashSet<CorrelationSetModel>();
+	            _uniqueInitiatingCorrelationSets.put(operation.getName(), ret);
+	        }
+	        ret.add(cset);
+    	}
+    }
+    
+    /**
+     * Get all unique initiating correlation sets that are ever used to qualify a receive for a the given
+     * operation.
+     * @param operation the operation
+     * @return all unique-initiating correlation sets used in the given operation
+     */
+    @SuppressWarnings("unchecked")
+    public Set<CorrelationSetModel> getUniqueCorrelationSetsForOperation(Operation operation) {
+        Set<CorrelationSetModel> ret = _uniqueInitiatingCorrelationSets.get(operation.getName());
+        if (ret == null) {
+            return Collections.EMPTY_SET;
+        }
+        return Collections.unmodifiableSet(ret);
+    }
+
     @SuppressWarnings("unchecked")
     public Operation getMyRoleOperation(String name) {
         for (Operation op : (List<Operation>)myRolePortType.getOperations()) 

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java Mon Jan  5 09:57:19 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.ode.bpel.rtrep.v2;
 
+import org.apache.ode.bpel.rapi.ConstantsModel;
 import org.apache.ode.bpel.rapi.ProcessModel;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
 import org.apache.ode.bpel.rapi.PropertyAliasModel;
@@ -238,4 +239,81 @@
     public int getModelVersion() {
         return 2;
     }
+    
+    public ConstantsModel getConstantsModel() {
+    	return new ConstantsModel() {
+
+			public QName getConflictingReceive() {
+				return constants.qnConflictingReceive;
+			}
+
+			public QName getCorrelationViolation() {
+				return constants.qnCorrelationViolation;
+			}
+
+			public QName getDuplicateInstance() {
+				return constants.qnDuplicateInstance;
+			}
+
+			public QName getForEachCounterError() {
+				return constants.qnForEachCounterError;
+			}
+
+			public QName getForcedTermination() {
+				return constants.qnForcedTermination;
+			}
+
+			public QName getInvalidBranchCondition() {
+				return constants.qnInvalidBranchCondition;
+			}
+
+			public QName getInvalidExpressionValue() {
+				return constants.qnInvalidExpressionValue;
+			}
+
+			public QName getJoinFailure() {
+				return constants.qnJoinFailure;
+			}
+
+			public QName getMismatchedAssignmentFailure() {
+				return constants.qnMismatchedAssignmentFailure;
+			}
+
+			public QName getMissingReply() {
+				return constants.qnMissingReply;
+			}
+
+			public QName getMissingRequest() {
+				return constants.qnMissingRequest;
+			}
+
+			public QName getRetiredProcess() {
+				return constants.qnRetiredProcess;
+			}
+
+			public QName getSelectionFailure() {
+				return constants.qnSelectionFailure;
+			}
+
+			public QName getSubLanguageExecutionFault() {
+				return constants.qnSubLanguageExecutionFault;
+			}
+
+			public QName getUninitializedPartnerRole() {
+				return constants.qnUninitializedPartnerRole;
+			}
+
+			public QName getUninitializedVariable() {
+				return constants.qnUninitializedVariable;
+			}
+
+			public QName getUnknownFault() {
+				return constants.qnUnknownFault;
+			}
+
+			public QName getXsltInvalidSource() {
+				return constants.qnXsltInvalidSource;
+			}
+    	};
+    }
 }

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OScope.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OScope.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OScope.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OScope.java Mon Jan  5 09:57:19 2009
@@ -166,6 +166,7 @@
         public OScope declaringScope;
         public final List<OProcess.OProperty> properties = new ArrayList<OProcess.OProperty>();
         public final List<PropertyExtractor> extractors = new ArrayList<PropertyExtractor>();
+        public boolean unique;
 
         public CorrelationSet(OProcess owner) {
             super(owner);
@@ -192,6 +193,10 @@
         public List<PropertyExtractor> getExtractors() {
             return extractors;
         }
+        
+        public boolean isUnique() {
+        	return unique;
+        }
     }
 
     public static final class Variable extends OBase {

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java?rev=731639&r1=731638&r2=731639&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java Mon Jan  5 09:57:19 2009
@@ -186,6 +186,7 @@
             propNames[m] = oProperty.name;
         }
 
+        ckeyVal.setUnique(cset.declaration.unique);
         _brc.writeCorrelation(cset, propNames, ckeyVal);
 
     }