Author: boisvert
Date: Wed Dec  3 16:06:01 2008
New Revision: 723157

URL: http://svn.apache.org/viewvc?rev=723157&view=rev
Log:
ODE-448: Message routing fails when implicit and explicit correlations are used 
together

Modified:
    
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKeySet.java
    
ode/branches/APACHE_ODE_1.X/bpel-api/src/test/java/org/apache/ode/bpel/common/CorrelationKeySetTest.java

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKeySet.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKeySet.java?rev=723157&r1=723156&r2=723157&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKeySet.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-api/src/main/java/org/apache/ode/bpel/common/CorrelationKeySet.java
 Wed Dec  3 16:06:01 2008
@@ -180,39 +180,43 @@
     public List<CorrelationKeySet> findSubSets() {
        List<CorrelationKeySet> subSets = new ArrayList<CorrelationKeySet>();
        
-       // split into two sets: with mandatory keys and with optional keys
-       CorrelationKeySet mandatoryKeySet = new CorrelationKeySet();
-       CorrelationKeySet optionalKeySet = new CorrelationKeySet();
+       // if the key set contains a opaque key and at least one non-opaque 
key, take out the opaque key
+       CorrelationKey opaqueKey = null;
+       boolean containsNonOpaque = false;
+       CorrelationKeySet explicitKeySet = new CorrelationKeySet();
        for( CorrelationKey ckey : correlationKeys ) {
-               if( ckey instanceof OptionalCorrelationKey ) {
-                       optionalKeySet.add(ckey);
+               // assumes only ONE opaque key if there is
+               if( ckey.getCSetId() == -1 ) {
+                       opaqueKey = ckey;
                } else {
-                       mandatoryKeySet.add(ckey);
+                       containsNonOpaque = true;
+               }
+               explicitKeySet.add(ckey);
+       }
+       if( opaqueKey != null && containsNonOpaque ) {
+               explicitKeySet.correlationKeys.remove(opaqueKey);
+       }
+       
+               // we are generating (2 powered by the number of correlation 
keys) number of sub-sets
+       for( int setIndex = 0; setIndex < Math.pow(2, 
explicitKeySet.correlationKeys.size()); setIndex++ ) {
+               CorrelationKeySet subKeySet = new CorrelationKeySet(); 
+               int bitPattern = setIndex; // the bitPattern will be 0b0000, 
0b0001, 0b0010 and so on
+               Iterator<CorrelationKey> ckeys = explicitKeySet.iterator();
+               while( ckeys.hasNext() && bitPattern > 0 ) { // bitPattern > 0 
condition saves half of the iterations
+                       CorrelationKey ckey = ckeys.next();
+                       if( (bitPattern & 0x01) > 0 ) {
+                               subKeySet.add(ckey);
+                       }
+                       bitPattern = bitPattern >> 1;
+               }
+
+               if(!subKeySet.isEmpty()) { // we don't want an empty set
+                       subSets.add(subKeySet);
                }
        }
        
-       if( optionalKeySet.isEmpty() ) {
-               // no optional keys found
-               subSets.add(this);
-       } else {
-               // we are generating (2 powered by the number of correlation 
keys) number of sub-sets
-               for( int setIndex = 0; setIndex < Math.pow(2, 
optionalKeySet.correlationKeys.size()); setIndex++ ) {
-                       CorrelationKeySet subKeySet = new CorrelationKeySet(); 
-                       int bitPattern = setIndex; // the bitPattern will be 
0b0000, 0b0001, 0b0010 and so on
-                       Iterator<CorrelationKey> ckeys = 
optionalKeySet.iterator();
-                       while( ckeys.hasNext() && bitPattern > 0 ) { // 
bitPattern > 0 condition saves half of the iterations
-                               CorrelationKey ckey = ckeys.next();
-                               if( (bitPattern & 0x01) > 0 ) {
-                                       subKeySet.add(ckey);
-                               }
-                               bitPattern = bitPattern >> 1;
-                       }
-                       // add the mandatory keys
-                       
subKeySet.correlationKeys.addAll(mandatoryKeySet.correlationKeys);
-                       if(!subKeySet.isEmpty()) { // we don't want an empty set
-                               subSets.add(subKeySet);
-                       }
-               }
+       if( subSets.isEmpty() ) {
+               subSets.add(new CorrelationKeySet());
        }
        
        return subSets;

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-api/src/test/java/org/apache/ode/bpel/common/CorrelationKeySetTest.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-api/src/test/java/org/apache/ode/bpel/common/CorrelationKeySetTest.java?rev=723157&r1=723156&r2=723157&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-api/src/test/java/org/apache/ode/bpel/common/CorrelationKeySetTest.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-api/src/test/java/org/apache/ode/bpel/common/CorrelationKeySetTest.java
 Wed Dec  3 16:06:01 2008
@@ -10,6 +10,7 @@
        private CorrelationKey optX = new OptionalCorrelationKey("1~a~b");
        private CorrelationKey optY = new OptionalCorrelationKey("2~b~c");
        private CorrelationKey optZ = new OptionalCorrelationKey("3~c~d");
+       private CorrelationKey implicit = new CorrelationKey("-1~a");
 
        @Test
        public void testCanonicalString() throws Exception {
@@ -57,7 +58,7 @@
                assertEquals(new 
CorrelationKeySet("@2[1~key1],[2~key2~key3]?"), 
                                new CorrelationKeySet().add(new 
CorrelationKey(1, new String[] {"key1"}))
                                .add(new CorrelationKey(2, new String[] 
{"key2", "key3"})));
-               assertEquals(2, new 
CorrelationKeySet("@2[1~key1],[2~key2~key3]?").findSubSets().size());
+               assertEquals(3, new 
CorrelationKeySet("@2[1~key1],[2~key2~key3]?").findSubSets().size());
        }
        
        @Test
@@ -89,6 +90,13 @@
                inbound.add(new CorrelationKey("-1~session_key_different"));
                assertFalse(inbound.isRoutableTo(candidate, false));
                assertFalse(inbound.isRoutableTo(candidate, true));
+               
+               inbound.clear();
+               inbound.add(keyX);
+               inbound.add(implicit);
+               candidate.clear();
+               candidate.add(keyX);
+               assertTrue(inbound.isRoutableTo(candidate, false));
        }
        
        @Test
@@ -106,7 +114,7 @@
                keySet.add(keyX);
                keySet.add(keyY);
                keySet.add(keyZ);
-               assertTrue(keySet.findSubSets().size() == 1 && 
keySet.findSubSets().get(0).equals(keySet));
+               assertTrue(keySet.findSubSets().size() == 7);
 
                keySet = new CorrelationKeySet();               
                keySet.add(optX);
@@ -133,7 +141,7 @@
                        }
                        
buf.append("'").append(subSet.toCanonicalString()).append("'");
                }
-               assertEquals("'@2[1~a~b],[2~b~c]','@2[1~a~b],[2~b~c],[3~c~d]'", 
buf.toString());
+               
assertEquals("'@2[1~a~b]','@2[2~b~c]','@2[1~a~b],[2~b~c]','@2[3~c~d]','@2[1~a~b],[3~c~d]','@2[2~b~c],[3~c~d]','@2[1~a~b],[2~b~c],[3~c~d]'",
 buf.toString());
 
                keySet = new CorrelationKeySet();               
                keySet.add(keyX);
@@ -146,6 +154,6 @@
                        }
                        
buf.append("'").append(subSet.toCanonicalString()).append("'");
                }
-               
assertEquals("'@2[1~a~b]','@2[1~a~b],[2~b~c]','@2[1~a~b],[3~c~d]','@2[1~a~b],[2~b~c],[3~c~d]'",
 buf.toString());
+               
assertEquals("'@2[1~a~b]','@2[2~b~c]','@2[1~a~b],[2~b~c]','@2[3~c~d]','@2[1~a~b],[3~c~d]','@2[2~b~c],[3~c~d]','@2[1~a~b],[2~b~c],[3~c~d]'",
 buf.toString());
        }
 }
\ No newline at end of file


Reply via email to