summaryrefslogtreecommitdiffstats
path: root/sandbox/dougsleite/implementation-guardian/src
diff options
context:
space:
mode:
authordougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68>2009-09-28 14:37:58 +0000
committerdougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68>2009-09-28 14:37:58 +0000
commitf4f96f8c8ec04e4c1709d3037e57589145be12fa (patch)
treea8bf81061fdc2af53fae50eebf063bd1ecfdc854 /sandbox/dougsleite/implementation-guardian/src
parent215c005bde88752999978adce56b09d2a90a13b7 (diff)
- Changing the guardian-model, policy-recoveryrules, policy-resolutiontrees to a new module: implementation-guardian;
- The new module creates a new kind of implementation (implementation.guardian) git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@819561 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/dougsleite/implementation-guardian/src')
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java31
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java29
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java29
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java37
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java41
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java32
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java32
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java38
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java82
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java79
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java85
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java54
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java30
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java30
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java39
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java38
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java153
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java38
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java38
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java644
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java43
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java134
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java177
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java33
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java33
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java115
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java38
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java163
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java144
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java158
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java157
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor19
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory19
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory19
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite36
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite81
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml82
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml8
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite58
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml56
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml21
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gzbin0 -> 2441 bytes
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java77
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java115
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java22
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java37
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java282
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java26
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java24
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java26
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java69
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java55
-rw-r--r--sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java54
58 files changed, 4080 insertions, 0 deletions
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java
new file mode 100644
index 0000000000..1bb1066435
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+@Deprecated
+public interface BlockingInterface {
+
+ //@OneWay
+ public void block();
+
+ //@OneWay
+ public void unblock();
+
+ public boolean isBlocked();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java
new file mode 100644
index 0000000000..2775699843
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+public interface GuardianGroup extends GuardianPrimitives {
+
+ public static int NORMAL_PARTICIPANT_STATE = 0;
+ public static int SUSPENDED_PARTICIPANT_STATE = 1;
+
+ public void addGuardianMember(GuardianMember guardianMember);
+
+ public boolean removeGuardianMember(GuardianMember guardianMember);
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java
new file mode 100644
index 0000000000..cb7495f9e4
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.assembly.Implementation;
+
+public interface GuardianGroupImplementation extends Implementation {
+
+ public void setGuardianProperties(OMElement guardianProperties);
+
+ public OMElement getGuardianProperties();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java
new file mode 100644
index 0000000000..d0758753b3
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+public interface GuardianGroupImplementationFactory {
+
+ public GuardianGroupImplementation createGuardianGroupImplementation();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java
new file mode 100644
index 0000000000..b82bf082b1
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public interface GuardianMember extends GuardianPrimitives {
+
+ public void addException(GlobalException ex);
+
+ public Context getCurrentContext();
+
+ public String getParticipantIdentifier();
+
+ public void setUniqueParticipantID(int id);
+
+ public int getParticipantState();
+
+ public void setParticipantState(int state);
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java
new file mode 100644
index 0000000000..c50e855d30
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import java.util.List;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface;
+
+//@Remotable
+public interface GuardianPrimitives {
+
+ //Methods to manage contexts
+ public void enableContext(Context context);
+
+ public void removeContext();
+
+ //Methods to control the signaling of exceptions
+ public void gthrow(GlobalExceptionInterface ex, List<String> participantList);
+
+ public boolean propagate(GlobalExceptionInterface ex);
+
+ //Method to check pending global exceptions
+ public void checkExceptionStatus() throws GlobalException;
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java
new file mode 100644
index 0000000000..4757615c21
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import java.util.Map;
+import javax.xml.namespace.QName;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+
+public interface RecoveryRules {
+
+ public static final QName RECOVERY_RULES_POLICY_QNAME =
+ new QName(Constants.SCA10_TUSCANY_NS, org.apache.tuscany.sca.implementation.guardian.common.Constants.RECOVERY_RULES);
+
+ public Map<String, OMElement> getRuleElements();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java
new file mode 100644
index 0000000000..d35deff75a
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import java.util.Map;
+import javax.xml.namespace.QName;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+
+public interface ResolutionTrees {
+
+ public static final QName RESOLUTION_TREES_POLICY_QNAME =
+ new QName(Constants.SCA10_TUSCANY_NS, org.apache.tuscany.sca.implementation.guardian.common.Constants.RESOLUTION_TREES);
+
+ public Map<String, OMElement> getResolutionTreeElements();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java
new file mode 100644
index 0000000000..4bfe1320b4
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class ConcurrentExceptionOcurrenceException extends Exception {
+
+ public ConcurrentExceptionOcurrenceException() {
+ super();
+ }
+
+ public ConcurrentExceptionOcurrenceException(String message) {
+ super(message);
+ }
+
+ public ConcurrentExceptionOcurrenceException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ConcurrentExceptionOcurrenceException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java
new file mode 100644
index 0000000000..cf5d56179d
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+import javax.xml.namespace.QName;
+
+public interface Constants {
+
+ String RECOVERY_RULES = "recovery_rules";
+ QName RECOVERY_RULES_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RECOVERY_RULES);
+
+ String RULE = "rule";
+ QName RULE_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RULE);
+
+ String NAME = "name";
+ QName NAME_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, NAME);
+
+ String SIGNALED_EXCEPTION = "signaled_exception";
+ QName SIGNALED_EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, SIGNALED_EXCEPTION);
+
+ String PARTICIPANT = "participant";
+ QName PARTICIPANT_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, PARTICIPANT);
+
+ String MATCH = "match";
+ QName MATCH_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MATCH);
+
+ String THROW_EXCEPTION = "throw_exception";
+ QName THROW_EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, THROW_EXCEPTION);
+
+ String CLASS = "class";
+ QName CLASS_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, CLASS);
+
+ String TARGET_CONTEXT = "target_context";
+ QName TARGET_CONTEXT_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, TARGET_CONTEXT);
+
+ String MIN_PARTICIPANT_JOINED = "min_participant_joined";
+ QName MIN_PARTICIPANT_JOINED_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MIN_PARTICIPANT_JOINED);
+
+ String MAX_PARTICIPANT_JOINED = "max_participant_joined";
+ QName MAX_PARTICIPANT_JOINED_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MAX_PARTICIPANT_JOINED);
+
+ String AFFECTED_PARTICIPANTS = "affected_participants";
+ QName AFFECTED_PARTICIPANTS_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, AFFECTED_PARTICIPANTS);
+
+ String FIRST = "FIRST";
+ QName FIRST_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, FIRST);
+
+ String LAST = "LAST";
+ QName LAST_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, LAST);
+
+ String ALL = "ALL";
+ QName ALL_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, ALL);
+
+ String RESOLUTION_TREE = "resolution_tree";
+ QName RESOLUTION_TREE_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RESOLUTION_TREE);
+
+ String RESOLUTION_TREES = "resolution_trees";
+ QName RESOLUTION_TREES_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RESOLUTION_TREES);
+
+ String EXCEPTION_LEVEL = "exception_level";
+ QName EXCEPTION_LEVEL_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, EXCEPTION_LEVEL);
+
+ String EXCEPTION = "exception";
+ QName EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, EXCEPTION);
+
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java
new file mode 100644
index 0000000000..95c6f3bed6
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class Context {
+
+ public static Context CURRENT_CONTEXT = new Context("CURRENT_CONTEXT");
+ public static Context INIT_CONTEXT = new Context("INIT_CONTEXT");
+ public static Context GUARDIAN_CONTEXT = new Context("GUARDIAN_CONTEXT");
+
+ private String name;
+ private List<Class<? extends GlobalException>> exceptionList;
+
+ public Context() {
+ this(null);
+ }
+
+ public Context(String name) {
+ this(name, new LinkedList<Class<? extends GlobalException>>());
+ }
+
+ public Context(String name, List<Class<? extends GlobalException>> exceptionList) {
+ this.name = name;
+ this.exceptionList = exceptionList;
+ }
+
+ public void addException(Class<? extends GlobalException> ex) {
+ this.exceptionList.add(ex);
+ }
+
+ public void setExceptionList(List<Class<? extends GlobalException>> exceptionList) {
+ this.exceptionList = exceptionList;
+ }
+
+ public List<Class<? extends GlobalException>> getExceptionList() {
+ return this.exceptionList;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return (obj instanceof Context &&
+ (((Context) obj).getName().equals(this.getName()) ||
+ this == Context.CURRENT_CONTEXT ||
+ ((Context) obj) == Context.CURRENT_CONTEXT));
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java
new file mode 100644
index 0000000000..022fe1a5f8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class GlobalException extends RuntimeException implements GlobalExceptionInterface {
+
+ private List<String> signalingParticipants;
+ private Context signalingContext;
+ private Context targetContext;
+
+ public GlobalException() {
+ super();
+ signalingParticipants = new LinkedList<String>();
+ }
+
+ public GlobalException(String message) {
+ super(message);
+ signalingParticipants = new LinkedList<String>();
+ }
+
+ public GlobalException(String message, Throwable cause) {
+ super(message, cause);
+ signalingParticipants = new LinkedList<String>();
+ }
+
+ public GlobalException(Throwable cause) {
+ super(cause);
+ signalingParticipants = new LinkedList<String>();
+ }
+
+ /**
+ * @return the signalingContext
+ */
+ public Context getSignalingContext() {
+ return signalingContext;
+ }
+
+ /**
+ * @param signalingContext the signalingContext to set
+ */
+ public void setSignalingContext(Context signalingContext) {
+ this.signalingContext = signalingContext;
+ }
+
+ /**
+ * @return the targetContext
+ */
+ public Context getTargetContext() {
+ return targetContext;
+ }
+
+ /**
+ * @param targetContext the targetContext to set
+ */
+ public void setTargetContext(Context targetContext) {
+ this.targetContext = targetContext;
+ }
+
+ public void putSignalingParticipant(String participant) {
+ signalingParticipants.add(participant);
+ }
+
+ public List<String> getSignalingParticipants() {
+ return signalingParticipants;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java
new file mode 100644
index 0000000000..450d4ae18b
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+import java.util.List;
+
+public interface GlobalExceptionInterface {
+
+ /**
+ * @return the signalingContext
+ */
+ public Context getSignalingContext();
+
+ /**
+ * @param signalingContext the signalingContext to set
+ */
+ public void setSignalingContext(Context signalingContext);
+
+ /**
+ * @return the targetContext
+ */
+ public Context getTargetContext();
+
+ /**
+ * @param targetContext the targetContext to set
+ */
+ public void setTargetContext(Context targetContext);
+
+ /**
+ * @return the signalingProcess
+ */
+ public List<String> getSignalingParticipants();
+
+ /**
+ * @param signalingProcess the signalingProcess to set
+ */
+ public void putSignalingParticipant(String participant);
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java
new file mode 100644
index 0000000000..ed85661dbf
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class InvalidNodeException extends RuntimeException {
+
+ public InvalidNodeException() {
+ super();
+ }
+
+ public InvalidNodeException(String message) {
+ super(message);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java
new file mode 100644
index 0000000000..99aa027fb8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class InvalidRegularExpressionException extends RuntimeException {
+
+ public InvalidRegularExpressionException() {
+ super();
+ }
+
+ public InvalidRegularExpressionException(String message) {
+ super(message);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java
new file mode 100644
index 0000000000..890b8704ee
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class JoinException extends GlobalException {
+
+ public JoinException() {
+ super();
+ }
+
+ public JoinException(String message) {
+ super(message);
+ }
+
+ public JoinException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public JoinException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java
new file mode 100644
index 0000000000..9684de22ad
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class LeaveException extends GlobalException {
+
+ public LeaveException() {
+ super();
+ }
+
+ public LeaveException(String message) {
+ super(message);
+ }
+
+ public LeaveException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public LeaveException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java
new file mode 100644
index 0000000000..fbf147285e
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+
+public class ResolutionTreeUtils {
+
+ //E: Euler tour of the tree obtained by listing the nodes visited in a depth first search of the tree starting from the root. Contains 2n-1 elements
+ private List<String> eulerTour;
+ //L: Array of level numbers such that L[i] contains the tree-depth of the node E[i]. Contains 2n-1 elements
+ private List<Integer> levels;
+ //R: Map of size n such that R<K> contains the index of the first ocurrence of node 'K' in E
+ private Map<String, Integer> rMap;
+ private OMElement root;
+ private int treeSize;
+
+ public ResolutionTreeUtils() {
+ init(null);
+ }
+
+ public ResolutionTreeUtils(OMElement root) {
+ init(root);
+ }
+
+ public void setRoot(OMElement root) {
+ init(root);
+ }
+
+ public List<String> getEulerTourDepthFirstSearch() {
+
+ if (root == null) {
+ throw new NullPointerException("The root musn't be null");
+ }
+
+ if (eulerTour == null) {
+ eulerTour = new LinkedList<String>();
+ levels = new LinkedList<Integer>();
+
+ eulerTourDFSRecursive(root, 0);
+ }
+
+ return eulerTour;
+ }
+
+ public String getLowestCommonAncestor(String node1, String node2) {
+ String lca = null;
+ Integer indexNode1, indexNode2;
+
+ Map<String, Integer> r = getRMap();
+
+ indexNode1 = r.get(node1);
+ indexNode2 = r.get(node2);
+
+ //Check nodes existence
+ if (indexNode1 == null && indexNode2 == null) {
+ throw new InvalidNodeException("Could not find the specified nodes: " + node1 + " and " + node2);
+ } else if (indexNode1 == null) {
+ throw new InvalidNodeException("Could not find the specified nodes: " + node1);
+ } else if (indexNode2 == null) {
+ throw new InvalidNodeException("Could not find the specified nodes: " + node2);
+ }
+
+ int indexLCA;
+ if (indexNode1 < indexNode2) {
+ indexLCA = getRangeMinimumQuery(levels, indexNode1, indexNode2);
+ } else {
+ indexLCA = getRangeMinimumQuery(levels, indexNode2, indexNode1);
+ }
+
+ lca = eulerTour.get(indexLCA);
+
+ return lca;
+ }
+
+ //Get the index of the smallest element between beginIndex and endIndex (both inclusive) in the list
+ private int getRangeMinimumQuery(List list, int beginIndex, int endIndex) {
+
+ List sublist = list.subList(beginIndex, endIndex + 1);
+
+ Object elem = Collections.min(sublist);
+
+ return sublist.indexOf(elem) + beginIndex;
+ }
+
+ private void init(OMElement root) {
+ this.root = root;
+ eulerTour = null;
+ levels = null;
+ rMap = null;
+ treeSize = 0;
+ }
+
+ private void eulerTourDFSRecursive(OMElement node, int level) {
+ String classAttribute = ((OMAttribute) node.getAllAttributes().next()).getAttributeValue();
+ eulerTour.add(classAttribute);
+
+ levels.add(level);
+ treeSize++;
+
+ Iterator children = node.getChildElements();
+
+ OMElement child;
+ while (children.hasNext()) {
+ child = (OMElement) children.next();
+ eulerTourDFSRecursive(child, level + 1);
+ eulerTour.add(classAttribute);
+ levels.add(level);
+ }
+ }
+
+ private Map<String, Integer> getRMap() {
+ if (rMap == null) {
+ rMap = new Hashtable<String, Integer>();
+
+ List<String> tour = getEulerTourDepthFirstSearch();
+ for (int i = 0; i < tour.size(); i++) {
+ String key = tour.get(i);
+ if (!rMap.containsKey(key)) {
+ rMap.put(key, i);
+ }
+
+ if (rMap.size() == treeSize) {
+ break;
+ }
+ }
+ }
+ return rMap;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java
new file mode 100644
index 0000000000..5ce2f5afd9
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class SuspendException extends GlobalException {
+
+ public SuspendException() {
+ super();
+ }
+
+ public SuspendException(String message) {
+ super(message);
+ }
+
+ public SuspendException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public SuspendException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java
new file mode 100644
index 0000000000..a8f9cdfad6
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.common;
+
+public class UnhandledException extends GlobalException {
+
+ public UnhandledException() {
+ super();
+ }
+
+ public UnhandledException(String message) {
+ super(message);
+ }
+
+ public UnhandledException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public UnhandledException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java
new file mode 100644
index 0000000000..5a243560e3
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java
@@ -0,0 +1,644 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.implementation.guardian.common.InvalidRegularExpressionException;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroup;
+import org.apache.tuscany.sca.implementation.guardian.GuardianMember;
+import org.apache.tuscany.sca.implementation.guardian.common.ConcurrentExceptionOcurrenceException;
+import org.apache.tuscany.sca.implementation.guardian.common.Constants;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface;
+import org.apache.tuscany.sca.implementation.guardian.common.InvalidNodeException;
+import org.apache.tuscany.sca.implementation.guardian.common.ResolutionTreeUtils;
+import org.apache.tuscany.sca.implementation.guardian.common.SuspendException;
+import org.apache.tuscany.sca.implementation.guardian.xml.RecoveryRulesProcessor;
+import org.apache.tuscany.sca.implementation.guardian.xml.ResolutionTreesProcessor;
+
+public class GuardianGroupImpl implements GuardianGroup {
+
+ private List<GuardianMember> guardianList;
+ private InnerGuardianGroupThread innerThread;
+ private List<GlobalExceptionInterface> concurrentExList;
+ private Map<String, OMElement> resolutionTreeElements;
+ private ResolutionTreeUtils resolutionTreeUtils;
+ private Map<String, OMElement> ruleElements;
+
+ public GuardianGroupImpl(String recoveryRules, String resolutionTrees) {
+ guardianList = new LinkedList<GuardianMember>();
+ concurrentExList = new LinkedList<GlobalExceptionInterface>();
+ innerThread = new InnerGuardianGroupThread();
+ resolutionTreeUtils = new ResolutionTreeUtils();
+
+ setRecoveryRules(recoveryRules);
+ setResolutionTree(resolutionTrees);
+ }
+
+ private void setRecoveryRules(String recoveryRules) {
+ try {
+ FileInputStream fileInputStream = new FileInputStream(recoveryRules);
+ XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
+
+ RecoveryRulesProcessor processor = new RecoveryRulesProcessor();
+ ruleElements = processor.read(xmlReader).getRuleElements();
+
+ } catch (ContributionReadException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (XMLStreamException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ private void setResolutionTree(String resolutionTree) {
+
+ try {
+ FileInputStream fileInputStream = new FileInputStream(resolutionTree);
+ XMLStreamReader resolutionTreeReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
+
+ ResolutionTreesProcessor processor = new ResolutionTreesProcessor();
+ resolutionTreeElements = processor.read(resolutionTreeReader).getResolutionTreeElements();
+
+ } catch (ContributionReadException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (XMLStreamException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public void addGuardianMember(GuardianMember guardianMember) {
+ guardianList.add(guardianMember);
+ guardianMember.setUniqueParticipantID(guardianList.size() - 1);
+ }
+
+ public boolean removeGuardianMember(GuardianMember guardianMember) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void enableContext(Context context) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void removeContext() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public synchronized void gthrow(GlobalExceptionInterface ex, List<String> participantList) {
+
+ concurrentExList.add(ex);
+
+ //Sends a message representing the exception to the other guardian members
+ SuspendException suspendEx = new SuspendException();
+ suspendEx.putSignalingParticipant(ex.getSignalingParticipants().get(0));
+
+ if (participantList == null) {
+ for (GuardianMember g : guardianList) {
+ g.gthrow(suspendEx, null);
+ }
+ } else {
+ for (GuardianMember g : guardianList) {
+ if (participantList.contains(g.getParticipantIdentifier()) ||
+ g.getParticipantIdentifier().equals(ex.getSignalingParticipants().get(0))) {
+ g.gthrow(suspendEx, null);
+ }
+ }
+ }
+
+ if (!innerThread.isRunning()) {
+ innerThread.setGlobalException(ex);
+ new Thread(innerThread).start();
+ }
+
+ }
+
+ public boolean propagate(GlobalExceptionInterface ex) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public void checkExceptionStatus() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ private class InnerGuardianGroupThread implements Runnable {
+
+ private boolean isRunning;
+ private GlobalExceptionInterface ex = null;
+
+ public InnerGuardianGroupThread() {
+ isRunning = false;
+ }
+
+ public void setGlobalException(GlobalExceptionInterface ex) {
+ this.ex = ex;
+ }
+
+ public GlobalExceptionInterface getGlobalException() {
+ return ex;
+ }
+
+ public void run() {
+ isRunning = true;
+
+ if (ex != null) {
+
+ //Time window of 10 seconds just for tests
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ }
+
+ try {
+ applyRecoveryRules(ex);
+ } catch (ConcurrentExceptionOcurrenceException ce) {
+ applyConcurrentRecoveryRules();
+ }
+
+ //Clear the concurrent exception list
+ concurrentExList.clear();
+
+ //Set up the participant state to NORMAL
+ for (GuardianMember gm : guardianList) {
+ if (gm.getParticipantState() == SUSPENDED_PARTICIPANT_STATE) {
+ gm.setParticipantState(NORMAL_PARTICIPANT_STATE);
+ }
+ }
+ }
+ isRunning = false;
+ }
+
+ public boolean isRunning() {
+ return isRunning;
+ }
+
+ private void applyRecoveryRules(GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException {
+ ruleTag(ex, ruleElements.values().iterator());
+ }
+
+ private void ruleTag(GlobalExceptionInterface ex, Iterator<OMElement> ruleElements) throws ConcurrentExceptionOcurrenceException {
+ String signaledException;
+ String exceptionName;
+
+ OMElement rule;
+ while (ruleElements.hasNext()) {
+
+ rule = ruleElements.next();
+ signaledException = getAttributeValue(rule, Constants.SIGNALED_EXCEPTION);
+ exceptionName = ex.getClass().getName();
+
+ if (signaledException.equals(exceptionName)) {
+ participantExceptionTag(ex, rule.getChildElements());
+ break;
+ }
+ }
+ }
+
+ private void participantExceptionTag(GlobalExceptionInterface ex, Iterator<OMElement> participantElements) throws ConcurrentExceptionOcurrenceException {
+ String matchParticipant;
+ List<GuardianMember> gmList;
+
+ OMElement participant;
+ while (participantElements.hasNext()) {
+ participant = participantElements.next();
+
+ matchParticipant = getAttributeValue(participant, Constants.MATCH);
+ gmList = getMatchingParticipants(matchParticipant, ex);
+
+ if (!gmList.isEmpty()) {
+ throwExceptionTag(gmList, ex, participant.getChildElements());
+ }
+ }
+ }
+
+ private void throwExceptionTag(List<GuardianMember> gmList, GlobalExceptionInterface ex, Iterator<OMElement> throwExceptionElements) throws ConcurrentExceptionOcurrenceException {
+ String className;
+ String targetContextName;
+ Integer minParticipantJoined;
+ Integer maxParticipantJoined;
+
+ OMElement throwException;
+ while (throwExceptionElements.hasNext()) {
+
+ throwException = throwExceptionElements.next();
+
+ className = getAttributeValue(throwException, Constants.CLASS);
+ targetContextName = getAttributeValue(throwException, Constants.TARGET_CONTEXT);
+
+ try {
+ minParticipantJoined = Integer.parseInt(getAttributeValue(throwException, Constants.MIN_PARTICIPANT_JOINED));
+ } catch (NumberFormatException nex) {
+ minParticipantJoined = null;
+ }
+
+ try {
+ maxParticipantJoined = Integer.parseInt(getAttributeValue(throwException, Constants.MAX_PARTICIPANT_JOINED));
+ } catch (NumberFormatException nexc) {
+ maxParticipantJoined = null;
+ }
+
+ //Test the min and max joined participants condition
+ if (minParticipantJoined != null && maxParticipantJoined != null) {
+ if (!(guardianList.size() >= minParticipantJoined && guardianList.size() < maxParticipantJoined)) {
+ break;
+ }
+ } else if (minParticipantJoined != null) {
+ if (!(guardianList.size() >= minParticipantJoined)) {
+ break;
+ }
+ } else if (minParticipantJoined != null) {
+ if (!(guardianList.size() >= minParticipantJoined)) {
+ break;
+ }
+ }
+
+ //<affected_participants>
+ String affectedParticipants = affectedParticipantsTag(throwException.getChildElements());
+ int index = -1;
+
+ //Verify if the parameter is an index
+ try {
+ index = Integer.parseInt(affectedParticipants);
+ } catch (NumberFormatException nexc) {
+ index = -1;
+ }
+
+ //Create the new exception instance
+ Class exceptionClass;
+ try {
+ exceptionClass = Class.forName(className);
+
+ Context targetContext;
+ if (targetContextName.toUpperCase().equals(Context.CURRENT_CONTEXT.getName().toUpperCase())) {
+ targetContext = Context.CURRENT_CONTEXT;
+ } else if (targetContextName.toUpperCase().equals(Context.INIT_CONTEXT.getName().toUpperCase())) {
+ targetContext = Context.INIT_CONTEXT;
+ } else {
+ targetContext = new Context(targetContextName);
+ }
+ GlobalException newException = (GlobalException) exceptionClass.newInstance();
+
+ newException.setTargetContext(targetContext);
+ newException.setSignalingContext(ex.getSignalingContext());
+ newException.putSignalingParticipant(ex.getSignalingParticipants().toString());
+
+ //Check concurrent exception existence
+ if (concurrentExList.size() > 1) {
+ throw new ConcurrentExceptionOcurrenceException(concurrentExList.toString());
+ }
+
+ //Add the exception to the participants matched
+ if (index != -1) {
+ gmList.get(index).addException(newException);
+ } else if (affectedParticipants != null && affectedParticipants.length() != 0) {
+ if (affectedParticipants.toUpperCase().equals(Constants.FIRST)) {
+ gmList.get(0).addException(newException);
+ } else if (affectedParticipants.toUpperCase().equals(Constants.LAST)) {
+ gmList.get(gmList.size() - 1).addException(newException);
+ } else if (affectedParticipants.toUpperCase().equals(Constants.ALL)) {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
+ }
+ } else {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
+ }
+
+ } catch (InstantiationException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ } catch (IllegalAccessException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ } catch (ClassNotFoundException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ }
+ }
+ }
+
+ private String affectedParticipantsTag(Iterator<OMElement> affectedParticipantElements) {
+
+ String affectedParticipantValue = null;
+
+ OMElement affectedParticipant;
+ while (affectedParticipantElements.hasNext()) {
+
+ affectedParticipant = affectedParticipantElements.next();
+ affectedParticipantValue = affectedParticipant.getText();
+ }
+
+ if (affectedParticipantValue != null && affectedParticipantValue.length() == 0) {
+ affectedParticipantValue = null;
+ }
+
+ return affectedParticipantValue;
+ }
+
+ private String getAttributeValue(OMElement element, String attributeName) {
+ OMAttribute at;
+ Iterator it = element.getAllAttributes();
+
+ while (it.hasNext()) {
+ at = (OMAttribute) it.next();
+ if (at.getLocalName().equals(attributeName)) {
+ return at.getAttributeValue();
+ }
+ }
+
+ return null;
+ }
+
+ private void applyConcurrentRecoveryRules() {
+
+ boolean concurrentExOcurrence = false;
+ List<GlobalExceptionInterface> copyConcurrentExList;
+ GlobalExceptionInterface resolvedEx;
+
+ do {
+ System.out.println("Concurrent exceptions: " + concurrentExList);
+
+ copyConcurrentExList = new LinkedList(concurrentExList);
+
+ resolvedEx = checkExceptionResolutionTrees(copyConcurrentExList, resolutionTreeElements.values().iterator());
+
+ concurrentExList.clear();
+
+ System.out.println("Resolved Exception: " + resolvedEx);
+ if (resolvedEx != null) {
+ System.out.println("List of participants: " + resolvedEx.getSignalingParticipants());
+ }
+
+ try {
+ //Process the exception list sequentially
+ if (resolvedEx == null) {
+ for (GlobalExceptionInterface ex : copyConcurrentExList) {
+ applyRecoveryRules(ex);
+ }
+ } else {
+ applyRecoveryRules(resolvedEx);
+ }
+
+ } catch (ConcurrentExceptionOcurrenceException exc) {
+ concurrentExOcurrence = true;
+ break;
+ }
+ } while (concurrentExOcurrence);
+ }
+
+ //FIXME: Need to check the exception level
+ private GlobalExceptionInterface checkExceptionResolutionTrees(List<GlobalExceptionInterface> exceptionList, Iterator resolutionTreesElements) {
+
+ OMElement tree;
+ OMElement root;
+ String exceptionLevel = null;
+ GlobalExceptionInterface resolvedEx = null;
+
+ while (resolutionTreesElements.hasNext()) {
+ tree = (OMElement) resolutionTreesElements.next();
+ exceptionLevel = tree.getAttributeValue(Constants.EXCEPTION_LEVEL_QNAME);
+
+ root = (OMElement) tree.getChildElements().next();
+ resolvedEx = checkExceptionResolutionTree(exceptionList, root);
+
+ if (resolvedEx != null) {
+ break;
+ }
+ }
+
+ return resolvedEx;
+ }
+
+ //Search for the root of the smallest subtree that contains all the concurrently signaled exceptions. If not found, return null.
+ private GlobalExceptionInterface checkExceptionResolutionTree(List<GlobalExceptionInterface> exceptionList, OMElement rootTree) {
+
+ resolutionTreeUtils.setRoot(rootTree);
+ String ex1, ex2;
+ GlobalExceptionInterface resolvedEx = null;
+
+ ex1 = exceptionList.get(0).getClass().getName();
+ for (int i = 1; i < exceptionList.size(); i++) {
+ ex2 = exceptionList.get(i).getClass().getName();
+
+ try {
+ ex1 = resolutionTreeUtils.getLowestCommonAncestor(ex1, ex2);
+ } catch (InvalidNodeException invalidNodeException) {
+ ex1 = null;
+ break;
+ }
+ }
+
+ if (ex1 != null) {
+ Class exceptionClass;
+
+ try {
+ exceptionClass = Class.forName(ex1);
+ resolvedEx = (GlobalException) exceptionClass.newInstance();
+
+ for (GlobalExceptionInterface ex : exceptionList) {
+ resolvedEx.putSignalingParticipant(ex.getSignalingParticipants().get(0));
+ }
+
+ } catch (InstantiationException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IllegalAccessException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (ClassNotFoundException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return resolvedEx;
+
+ } else {
+ return null;
+ }
+ }
+
+ private List<GuardianMember> getMatchingParticipants(String regularExpression, GlobalExceptionInterface signaledException) {
+ List<GuardianMember> matchingParticipants = new LinkedList();
+ String[] splitByComma = regularExpression.split(",");
+
+ //Invalid regular expression
+ if (splitByComma.length > 2) {
+ throw new InvalidRegularExpressionException("The comma ',' operator can only be applied for two expressions");
+ }
+
+ //There is no comma on the regular expression
+ if (splitByComma.length == 1) {
+
+ if (regularExpression.toUpperCase().equals("SIGNALER")) {
+ for (GuardianMember gm : guardianList) {
+ if (signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+ }
+ } else if (regularExpression.toUpperCase().equals("!SIGNALER")) {
+ for (GuardianMember gm : guardianList) {
+ if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+ }
+
+ } else {
+ //Create an java regular expression
+ String re = createJavaRegularExpression(regularExpression);
+
+ for (GuardianMember gm : guardianList) {
+ if (gm.getParticipantIdentifier().matches(re)) {
+ matchingParticipants.add(gm);
+ }
+ }
+ }
+
+ } //There is comma on the regular expression
+ else {
+
+ String element;
+ int index = -1;
+ for (int i = 0; i < splitByComma.length; i++) {
+ element = splitByComma[i].toUpperCase();
+ if (element.equals("SIGNALER") || element.equals("!SIGNALER")) {
+ if (index == -1) {
+ index = i;
+ } else {
+ index = -1;
+ }
+ }
+ }
+
+ //Invalid expression
+ if (index == -1) {
+ throw new InvalidRegularExpressionException("The comma ',' requires a SIGNALER or !SIGNALER element in one side of the expression");
+ }
+
+ String re = createJavaRegularExpression(splitByComma[1 - index]);
+
+ for (GuardianMember gm : guardianList) {
+
+ //Test if the participant matches with the regular expression
+ if (gm.getParticipantIdentifier().matches(re)) {
+
+ //Test if the participant is Signaler
+ if (splitByComma[index].toUpperCase().equals("SIGNALER")) {
+
+ if (signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+ } //Test if the participant is not Signaler
+ else {
+ if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+ }
+ }
+ }
+
+ }
+
+ return matchingParticipants;
+ }
+
+ /* Valid expressions: *, <Context>.*, <Context>, *.<Context>, *.<Context>.*,
+ * *.<Context>.*.<Context>.*, <REG_EXP> || <REG_EXP>
+ *
+ * Invalid expressions: *.*, **,
+ *
+ * Not supported yet: !<Context>, !<Context> || <Context>, !(<Context> || <Context>)
+ */
+ private String createJavaRegularExpression(String regularExpression) throws InvalidRegularExpressionException {
+ StringBuffer re = new StringBuffer();
+
+ String[] splitByBar = regularExpression.split("\\|\\|");
+ String[] splitByPeriod;
+
+ for (int i = 0; i < splitByBar.length; i++) {
+
+ splitByPeriod = splitByBar[i].split("\\.");
+
+ if (i > 0) {
+ re.append("|");
+ }
+
+ re.append("^");
+ for (int j = 0; j < splitByPeriod.length; j++) {
+
+ //*
+ if (splitByPeriod[j].equals("*")) {
+
+ //Validate the regular expression
+ if (j + 1 != splitByPeriod.length && splitByPeriod[j + 1].equals("*")) {
+ throw new InvalidRegularExpressionException();
+ }
+
+ //*
+ if (splitByPeriod.length == 1) {
+ re.append("(\\w+)");
+ } //*.<CONTEXT>
+
+ if (j == 0 && splitByPeriod.length != 1) {
+ re.append("(\\w+\\");
+ re.append(".)*");
+ } //<CONTEXT>.*
+ else {
+ re.append("(\\");
+ re.append(".\\w+)*");
+ }
+ } //<CONTEXT>
+ else {
+
+// //Validate the regular expression
+// if (splitedByPeriod[j].matches("^(\\*)*$")) {
+// throw new RuntimeException("Invalid name for a context");
+// }
+
+ //<CONTEXT> || <CONTEXT>.<CONTEXT>.<CONTEXT> || *.<CONTEXT>
+ if (splitByPeriod.length == 1) {
+ re.append("(\\w+\\");
+ re.append(".)*");
+ }
+
+ if (j == 0 || j - 1 == 0) {
+ re.append("(" + splitByPeriod[j] + ")");
+ } else {
+ re.append("(\\." + splitByPeriod[j] + ")");
+ }
+ }
+ }
+ re.append("$");
+ }
+ return re.toString();
+ }
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java
new file mode 100644
index 0000000000..cf6b3245ce
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+
+public class GuardianGroupImplementationFactoryImpl implements GuardianGroupImplementationFactory {
+
+ private AssemblyFactory assemblyFactory;
+ private JavaInterfaceFactory javaFactory;
+
+ public GuardianGroupImplementationFactoryImpl(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory) {
+ this.assemblyFactory = assemblyFactory;
+ this.javaFactory = javaFactory;
+ }
+
+ public GuardianGroupImplementation createGuardianGroupImplementation() {
+ return new GuardianGroupImplementationImpl(assemblyFactory, javaFactory);
+ }
+
+// public GuardianGroupImplementation createGuardianGroupImplementation() {
+// return new GuardianGroupImplementationImpl();
+// }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java
new file mode 100644
index 0000000000..7520846d55
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java
@@ -0,0 +1,134 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import org.apache.tuscany.sca.implementation.guardian.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.ConstrainingType;
+import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+
+public class GuardianGroupImplementationImpl implements GuardianGroupImplementation {
+
+ private AssemblyFactory assemblyFactory;
+ private JavaInterfaceFactory javaFactory;
+ private List<Service> services = new ArrayList<Service>();
+ private OMElement guardianProperties;
+
+ public GuardianGroupImplementationImpl(AssemblyFactory assemblyFactory,
+ JavaInterfaceFactory javaFactory) {
+
+ this.assemblyFactory = assemblyFactory;
+ this.javaFactory = javaFactory;
+ this.guardianProperties = null;
+ }
+
+ private void introspectServices(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory) {
+
+ Service guardianService = assemblyFactory.createService();
+
+ guardianService.setName("GuardianGroup");
+
+ JavaInterface guardianInterface;
+
+ try {
+ guardianInterface = javaFactory.createJavaInterface(GuardianGroup.class);
+ } catch (InvalidInterfaceException ex) {
+ throw new IllegalArgumentException(ex);
+ }
+
+ JavaInterfaceContract guardianInterfaceContract = javaFactory.createJavaInterfaceContract();
+
+ guardianInterfaceContract.setInterface(guardianInterface);
+
+ guardianService.setInterfaceContract(guardianInterfaceContract);
+
+ services.add(guardianService);
+ }
+
+ public void setGuardianProperties(OMElement guardianProperties) {
+ this.guardianProperties = guardianProperties;
+ }
+
+ public OMElement getGuardianProperties() {
+ return this.guardianProperties;
+ }
+
+ @Override
+ public String getURI() {
+ // The Guardian Model implementation does not have a URI
+ return null;
+ }
+
+ @Override
+ public void setURI(String arg0) {
+ // The Guardian Model implementation does not have a URI
+ }
+
+ @Override
+ public List<Service> getServices() {
+ if (services == null || services.size() == 0) {
+ introspectServices(assemblyFactory, javaFactory);
+ }
+ return services;
+ }
+
+ @Override
+ public List<Reference> getReferences() {
+ // The Guardian Model implementation does not support references
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<Property> getProperties() {
+ // The sample DATA implementation does not support properties
+ return Collections.emptyList();
+ }
+
+ @Override
+ public ConstrainingType getConstrainingType() {
+ // The Guardian Model implementation does not support constrainingTypes
+ return null;
+ }
+
+ @Override
+ public void setConstrainingType(ConstrainingType arg0) {
+ // The Guardian Model implementation does not support constrainingTypes
+ }
+
+ @Override
+ public boolean isUnresolved() {
+ // The Guardian Model implementation is always resolved
+ return false;
+ }
+
+ @Override
+ public void setUnresolved(boolean arg0) {
+ // The Guardian Model implementation is always resolved
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java
new file mode 100644
index 0000000000..80b9321e79
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java
@@ -0,0 +1,177 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Stack;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroup;
+import org.apache.tuscany.sca.implementation.guardian.GuardianMember;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+import org.apache.tuscany.sca.implementation.guardian.common.JoinException;
+import org.apache.tuscany.sca.implementation.guardian.common.SuspendException;
+import org.osoa.sca.annotations.Destroy;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Service;
+
+@Service(GuardianMember.class)
+@Scope("COMPOSITE")
+public class GuardianMemberImpl implements GuardianMember {
+
+ private int participantState;
+ private Stack<Context> contextList;
+
+ private Queue<GlobalException> exceptionQueue;
+ @Reference(name = "guardian_group", required = true)
+ public GuardianGroup guardianGroup;
+ private int id;
+ //FIXME: Review the usage of this variable
+ private boolean exceptionThrown;
+
+ public GuardianMemberImpl() {
+ contextList = new Stack<Context>();
+ contextList.add(Context.INIT_CONTEXT);
+ exceptionQueue = new LinkedList<GlobalException>();
+ participantState = GuardianGroup.NORMAL_PARTICIPANT_STATE;
+ exceptionThrown = false;
+ }
+
+ @Init
+ public void init() {
+ guardianGroup.addGuardianMember(this);
+ }
+
+ @Destroy
+ public void destroy() {
+ guardianGroup.removeGuardianMember(this);
+ }
+
+ public void addException(GlobalException ex) {
+ exceptionQueue.add(ex);
+ }
+
+ public Context getCurrentContext() {
+ return contextList.peek();
+ }
+
+
+ public void enableContext(Context context) {
+ //Update the context list with the related set of exceptions
+ contextList.push(context);
+
+ if (contextList.size() == 2) {
+ JoinException ex = new JoinException();
+ ex.setSignalingContext(context);
+ ex.putSignalingParticipant(getParticipantIdentifier());
+ gthrow(ex, null);
+ }
+
+ }
+
+ public void removeContext() {
+ if (!contextList.isEmpty()) {
+ contextList.pop();
+ }
+ }
+
+ //If participantList is null then signal to ALL participants
+ public void gthrow(GlobalExceptionInterface ex, List<String> participantList) {
+ //1)Block the participant until raise an exception
+
+ if (!(ex instanceof SuspendException)) {
+ //Set the exception's parameters
+ ex.setSignalingContext(getCurrentContext());
+ ex.putSignalingParticipant(getParticipantIdentifier());
+
+ guardianGroup.gthrow(ex, participantList);
+ exceptionThrown = true;
+ } else {
+ setParticipantState(GuardianGroup.SUSPENDED_PARTICIPANT_STATE);
+ }
+ }
+
+ public boolean propagate(GlobalExceptionInterface ex) {
+ //1)Compares the current context with the exception's target context
+ return !getCurrentContext().equals(ex.getTargetContext());
+ }
+
+ public void checkExceptionStatus() throws GlobalException {
+
+ //Blocks until the state be diferent the SUSPENDED_STATE
+ while (participantState == GuardianGroup.SUSPENDED_PARTICIPANT_STATE && exceptionThrown) {
+ System.out.println(getParticipantIdentifier() + ": I am blocked!");
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException ex) {
+ Logger.getLogger(GuardianMemberImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ exceptionThrown = false;
+ System.out.println(getParticipantIdentifier() + ": I am not blocked!");
+
+ GlobalException exc;
+
+ if ((exc = exceptionQueue.peek()) == null) {
+ System.out.println(getParticipantIdentifier() + "#No exception on exception queue");
+ return;
+ }
+
+ //Check if ex.targetContext() matches the participant id
+ //Eg. ex.targetContext(): Main and participant id: Init.Main.Backup -> should thrown the exception
+ //Test if the exception should be thrown in the target context
+ for (Context c : contextList) {
+ if (exc.getTargetContext().equals(c) && (c.equals(Context.INIT_CONTEXT) || c.getExceptionList().contains(exc.getClass()))) {
+ System.out.println(getParticipantIdentifier() + "#Returning an exception");
+ exceptionQueue.poll();
+ throw exc;
+ }
+ }
+
+ return;
+ }
+
+ public String getParticipantIdentifier() {
+ //1) Return the participant identifier -> context list dot separated
+ StringBuffer participantIdentifier = new StringBuffer();
+ participantIdentifier.append(this.id);
+ for (int i = 0; i < contextList.size(); i++) {
+ participantIdentifier.append("." + contextList.get(i).getName());
+ }
+ return participantIdentifier.toString();
+ }
+
+ public void setUniqueParticipantID(int id) {
+ this.id = id;
+ }
+
+ public int getParticipantState() {
+ return participantState;
+ }
+
+ public void setParticipantState(int state) {
+ this.participantState = state;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java
new file mode 100644
index 0000000000..e2fc2f8048
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import org.apache.tuscany.sca.implementation.guardian.RecoveryRules;
+import java.util.Hashtable;
+import java.util.Map;
+import org.apache.axiom.om.OMElement;
+
+public class RecoveryRulesImpl implements RecoveryRules {
+
+ private Map<String, OMElement> ruleElements = new Hashtable<String, OMElement>();
+
+ public Map<String, OMElement> getRuleElements() {
+ return ruleElements;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java
new file mode 100644
index 0000000000..669f06b1ef
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.impl;
+
+import java.util.Hashtable;
+import java.util.Map;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.implementation.guardian.ResolutionTrees;
+
+public class ResolutionTreesImpl implements ResolutionTrees {
+
+ private Map<String, OMElement> resolutionTreeElements = new Hashtable<String, OMElement>();
+
+ public Map<String, OMElement> getResolutionTreeElements() {
+ return resolutionTreeElements;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java
new file mode 100644
index 0000000000..2eb3dbdf58
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.provider;
+
+import org.apache.tuscany.sca.implementation.guardian.impl.*;
+import java.util.Iterator;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroup;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.implementation.guardian.common.Constants;
+
+public class GuardianGroupImplementationProvider implements ImplementationProvider {
+
+ private GuardianGroupImplementation implementation;
+ private GuardianGroupImpl guardian;
+
+ public GuardianGroupImplementationProvider(RuntimeComponent component, GuardianGroupImplementation implementation) {
+ this.implementation = implementation;
+ this.guardian = createGuardian(implementation.getGuardianProperties());
+ }
+
+ private GuardianGroupImpl createGuardian(OMElement guardianProperties) {
+ GuardianGroupImpl guardian = null;
+
+ String recoveryRules = null;
+ String resolutionTrees = null;
+
+ OMAttribute at;
+ Iterator it = guardianProperties.getAllAttributes();
+ while (it.hasNext()) {
+ at = (OMAttribute) it.next();
+
+ if (at.getLocalName().equals(Constants.RECOVERY_RULES)) {
+ recoveryRules = at.getAttributeValue();
+ } else if (at.getLocalName().equals(Constants.RESOLUTION_TREES)) {
+ resolutionTrees = at.getAttributeValue();
+ }
+ }
+
+ if (recoveryRules != null && resolutionTrees != null) {
+ guardian = new GuardianGroupImpl(recoveryRules, resolutionTrees);
+ }
+
+ return guardian;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ }
+
+ public Invoker createInvoker(RuntimeComponentService service, Operation operation) {
+ String operationName = operation.getName();
+ String interfaceFullName = operation.getInterface().toString();
+
+ //GuardianGroup interface
+ if (interfaceFullName.equals(GuardianGroup.class.getName())) {
+
+ //Why is the createInvoker ivoked 'n' static inner class times?
+ //System.out.println("NAME: " + operationName);
+
+ //public void addGuardianMember(GuardianMember guardianMember)
+ if (operationName.equals("addGuardianMember")) {
+ return new GuardianGroupInvoker.AddGuardianMemberInvoker(guardian);
+ } //public boolean removeGuardianMember(GuardianMember guardianMember)
+ else if (operationName.equals("removeGuardianMember")) {
+ return new GuardianGroupInvoker.RemoveGuardianMemberInvoker(guardian);
+ } //public void enableContext(Context context);
+ else if (operationName.equals("enableContext")) {
+ return new GuardianGroupInvoker.EnableContextInvoker(guardian);
+ } //public void removeContext();
+ else if (operationName.equals("removeContext")) {
+ return new GuardianGroupInvoker.RemoveContextInvoker(guardian);
+ } //public void gthrow(GlobalExceptionInterface ex, List<String> participantList);
+ else if (operationName.equals("gthrow")) {
+ return new GuardianGroupInvoker.GthrowInvoker(guardian);
+ } //public boolean propagate(GlobalExceptionInterface ex);
+ else if (operationName.equals("propagate")) {
+ return new GuardianGroupInvoker.PropagateInvoker(guardian);
+ } //public void checkExceptionStatus() throws GlobalException;
+ else if (operationName.equals("checkExceptionStatus")) {
+ return new GuardianGroupInvoker.CheckExceptionStatusInvoker(guardian);
+ }
+ }
+
+ return new GuardianGroupInvoker(null);
+ }
+
+ public boolean supportsOneWayInvocation() {
+ return false;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java
new file mode 100644
index 0000000000..a42c35506d
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.provider;
+
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation;
+import org.apache.tuscany.sca.provider.ImplementationProvider;
+import org.apache.tuscany.sca.provider.ImplementationProviderFactory;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+
+public class GuardianGroupImplementationProviderFactory implements ImplementationProviderFactory<GuardianGroupImplementation> {
+ public GuardianGroupImplementationProviderFactory(ExtensionPointRegistry extensionPoints) {
+ }
+
+ public ImplementationProvider createImplementationProvider(RuntimeComponent component, GuardianGroupImplementation implementation) {
+ return new GuardianGroupImplementationProvider(component, implementation);
+ }
+
+ public Class<GuardianGroupImplementation> getModelType() {
+ return GuardianGroupImplementation.class;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java
new file mode 100644
index 0000000000..8f393ebcb9
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java
@@ -0,0 +1,163 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.provider;
+
+import org.apache.tuscany.sca.implementation.guardian.impl.*;
+import java.util.List;
+import org.apache.tuscany.sca.implementation.guardian.GuardianMember;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+
+public class GuardianGroupInvoker implements Invoker {
+
+ protected final GuardianGroupImpl guardian;
+
+ public GuardianGroupInvoker(GuardianGroupImpl guardian) {
+ this.guardian = guardian;
+ }
+
+ public Message invoke(Message arg0) {
+ throw new UnsupportedOperationException("Not supported yet. 1");
+ }
+
+ //AddGuardianMember operation invoker
+ public static class AddGuardianMemberInvoker extends GuardianGroupInvoker {
+
+ public AddGuardianMemberInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ GuardianMember guardianMember = (GuardianMember) ((Object[]) msg.getBody())[0];
+ this.guardian.addGuardianMember(guardianMember);
+
+ return msg;
+ }
+ }
+
+ //RemoveGuardianMember operation invoker
+ public static class RemoveGuardianMemberInvoker extends GuardianGroupInvoker {
+
+ public RemoveGuardianMemberInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ GuardianMember guardianMember = (GuardianMember) ((Object[]) msg.getBody())[0];
+ boolean returnedValue = this.guardian.removeGuardianMember(guardianMember);
+
+ msg.setBody(returnedValue);
+ return msg;
+ }
+ }
+
+ //EnableContext operation invoker
+ public static class EnableContextInvoker extends GuardianGroupInvoker {
+
+ public EnableContextInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ Context context = (Context) ((Object[]) msg.getBody())[0];
+
+ this.guardian.enableContext(context);
+
+ return msg;
+ }
+ }
+
+ //RemoveContext operation invoker
+ public static class RemoveContextInvoker extends GuardianGroupInvoker {
+
+ public RemoveContextInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ this.guardian.removeContext();
+
+ return msg;
+ }
+ }
+
+ //Gthrow operation invoker
+ public static class GthrowInvoker extends GuardianGroupInvoker {
+
+ public GthrowInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ GlobalExceptionInterface ex = (GlobalExceptionInterface) ((Object[]) msg.getBody())[0];
+ List<String> participantList = (List<String>) ((Object[]) msg.getBody())[1];
+
+ this.guardian.gthrow(ex, participantList);
+
+ return msg;
+ }
+ }
+
+ //Propagate operation invoker
+ public static class PropagateInvoker extends GuardianGroupInvoker {
+
+ public PropagateInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ GlobalExceptionInterface ex = (GlobalExceptionInterface) ((Object[]) msg.getBody())[0];
+
+ boolean needPropagation = this.guardian.propagate(ex);
+ msg.setBody(needPropagation);
+
+ return msg;
+ }
+ }
+
+ //CheckExceptionStatus operation invoker
+ public static class CheckExceptionStatusInvoker extends GuardianGroupInvoker {
+
+ public CheckExceptionStatusInvoker(GuardianGroupImpl guardian) {
+ super(guardian);
+ }
+
+ @Override
+ public Message invoke(Message msg) {
+
+ this.guardian.checkExceptionStatus();
+
+ return msg;
+ }
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java
new file mode 100644
index 0000000000..048ef7b9c8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.xml;
+
+import org.apache.tuscany.sca.implementation.guardian.*;
+import java.util.Iterator;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.assembly.xml.Constants;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.implementation.guardian.impl.GuardianGroupImplementationFactoryImpl;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
+import org.apache.tuscany.sca.monitor.Monitor;
+
+public class GuardianGroupImplementationProcessor implements StAXArtifactProcessor<GuardianGroupImplementation> {
+
+ protected static final QName IMPLEMENTATION_GUARDIAN = new QName(Constants.SCA10_TUSCANY_NS, "implementation.guardian");
+ protected static final QName GUARDIAN_PROPERTIES = new QName(Constants.SCA10_TUSCANY_NS, "guardianProperties");
+ private GuardianGroupImplementationFactory guardianGroupImplementationFactory;
+
+ private AssemblyFactory assemblyFactor;
+ private JavaInterfaceFactory javaFactory;
+
+ //public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ //public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories) {
+ public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+
+ assemblyFactor = modelFactories.getFactory(AssemblyFactory.class);
+ javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class);
+
+ guardianGroupImplementationFactory = new GuardianGroupImplementationFactoryImpl(assemblyFactor, javaFactory);
+ //guardianGroupImplementationFactory = modelFactories.getFactory(GuardianGroupImplementationFactory.class);
+ }
+
+ public GuardianGroupImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+ assert IMPLEMENTATION_GUARDIAN.equals(reader.getName());
+
+ GuardianGroupImplementation implementation = guardianGroupImplementationFactory.createGuardianGroupImplementation();
+
+ while (reader.hasNext()) {
+ reader.next();
+
+ if (reader.isStartElement() && reader.getName().equals(GUARDIAN_PROPERTIES)) {
+ OMElement guardianPropertiesElement = readGuardianProperties(reader);
+
+ //REVIEW
+ implementation.setGuardianProperties(guardianPropertiesElement);
+
+ break;
+ }
+ }
+
+ return implementation;
+ }
+
+ private OMElement readGuardianProperties(XMLStreamReader reader) {
+ OMFactory fac = OMAbstractFactory.getOMFactory();
+ OMElement element = fac.createOMElement(reader.getName());
+
+ for (int i = 0; i < reader.getAttributeCount(); i++) {
+
+ String ns = reader.getAttributeNamespace(i);
+ String prefix = reader.getAttributePrefix(i);
+ String qname = reader.getAttributeLocalName(i);
+ String value = reader.getAttributeValue(i);
+
+ if (ns != null) {
+ element.addAttribute(qname, value, fac.createOMNamespace(ns, prefix));
+ element.declareNamespace(ns, prefix);
+ } else {
+ element.addAttribute(qname, value, null);
+ }
+ }
+
+ return element;
+ }
+
+ public void write(GuardianGroupImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+ writer.writeStartElement(IMPLEMENTATION_GUARDIAN.getNamespaceURI(), IMPLEMENTATION_GUARDIAN.getLocalPart());
+
+ OMElement guardianProperties = implementation.getGuardianProperties();
+ if (guardianProperties != null) {
+ writeGuardianProperties(guardianProperties, writer);
+ }
+
+ writer.writeEndElement();
+ }
+
+ private void writeGuardianProperties(OMElement guardianProperties, XMLStreamWriter writer) throws XMLStreamException {
+
+ OMAttribute at;
+
+ //write the element's name
+ writer.writeStartElement(guardianProperties.getLocalName());
+
+ //write the attributes
+ Iterator attributes = guardianProperties.getAllAttributes();
+ while (attributes.hasNext()) {
+ at = (OMAttribute) attributes.next();
+ writer.writeAttribute(at.getLocalName(), at.getAttributeValue());
+ }
+
+ writer.writeEndElement();
+ }
+
+ public QName getArtifactType() {
+ return IMPLEMENTATION_GUARDIAN;
+ }
+
+ public void resolve(GuardianGroupImplementation arg0, ModelResolver arg1) throws ContributionResolveException {
+ }
+
+ public Class<GuardianGroupImplementation> getModelType() {
+ return GuardianGroupImplementation.class;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java
new file mode 100644
index 0000000000..7d82f356de
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java
@@ -0,0 +1,158 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.xml;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.implementation.guardian.common.Constants;
+import org.apache.tuscany.sca.implementation.guardian.impl.RecoveryRulesImpl;
+import org.apache.tuscany.sca.implementation.guardian.RecoveryRules;
+
+public class RecoveryRulesProcessor implements StAXArtifactProcessor<RecoveryRules>, Constants {
+
+ private static final QName RECOVERY_RULES_POLICY_QNAME = RecoveryRules.RECOVERY_RULES_POLICY_QNAME;
+
+ public RecoveryRulesProcessor() {
+ }
+
+ public RecoveryRules read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+
+ RecoveryRules policy = new RecoveryRulesImpl();
+ QName name = null;
+ String ruleName = null;
+ OMElement ruleElement = null;
+ while (reader.hasNext()) {
+
+ if (reader.isStartElement()) {
+
+ name = reader.getName();
+ if (RULE.equals(name.getLocalPart())) {
+
+ ruleName = reader.getAttributeValue(null, Constants.NAME);
+ ruleElement = loadElement(reader);
+
+ policy.getRuleElements().put(ruleName, ruleElement);
+ }
+ } else if (reader.isEndElement()) {
+ if (RECOVERY_RULES_POLICY_QNAME.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ reader.next();
+ }
+
+ return policy;
+ }
+
+ public void write(RecoveryRules policy, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public QName getArtifactType() {
+ return RECOVERY_RULES_POLICY_QNAME;
+ }
+
+ public void resolve(RecoveryRules arg0, ModelResolver arg1) throws ContributionResolveException {
+
+ }
+
+ public Class<RecoveryRules> getModelType() {
+ return RecoveryRules.class;
+ }
+
+ private OMElement loadElement(XMLStreamReader reader) throws XMLStreamException {
+ OMFactory fac = OMAbstractFactory.getOMFactory();
+ OMElement head = fac.createOMElement(reader.getName());
+
+ //Load the attributes for the rule tag
+ loadAttributes(reader, head, fac);
+
+ OMElement current = head;
+ while (true) {
+
+ switch (reader.next()) {
+ case XMLStreamConstants.START_ELEMENT:
+
+ QName name = new QName(reader.getName().getLocalPart());
+ OMElement child = fac.createOMElement(name, current);
+
+ int count = reader.getNamespaceCount();
+ for (int i = 0; i < count; i++) {
+ String prefix = reader.getNamespacePrefix(i);
+ String ns = reader.getNamespaceURI(i);
+ child.declareNamespace(ns, prefix);
+ }
+
+ if (!"".equals(name.getNamespaceURI())) {
+ child.declareNamespace(name.getNamespaceURI(), name.getPrefix());
+ }
+
+ // add the attributes for this element
+ loadAttributes(reader, child, fac);
+ current = child;
+ break;
+ case XMLStreamConstants.CDATA:
+ fac.createOMText(current, reader.getText());
+ break;
+ case XMLStreamConstants.CHARACTERS:
+ String text = reader.getText().trim();
+ if (text.length() != 0) {
+ fac.createOMText(current, reader.getText());
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if (current == head) {
+ return head;
+ } else {
+ current = (OMElement) current.getParent();
+ }
+ }
+ }
+ }
+
+ private void loadAttributes(XMLStreamReader reader, OMElement elem, OMFactory fac) {
+ int count = reader.getAttributeCount();
+ for (int i = 0; i < count; i++) {
+ String ns = reader.getAttributeNamespace(i);
+ String prefix = reader.getAttributePrefix(i);
+ String qname = reader.getAttributeLocalName(i);
+ String value = reader.getAttributeValue(i);
+
+ if (ns != null) {
+ elem.addAttribute(qname, value, fac.createOMNamespace(ns, prefix));
+ elem.declareNamespace(ns, prefix);
+ } else {
+ elem.addAttribute(qname, value, null);
+ }
+ }
+ }
+
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java
new file mode 100644
index 0000000000..b9cfe647b4
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java
@@ -0,0 +1,157 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.xml;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.implementation.guardian.common.Constants;
+import org.apache.tuscany.sca.implementation.guardian.impl.ResolutionTreesImpl;
+import org.apache.tuscany.sca.implementation.guardian.ResolutionTrees;
+
+public class ResolutionTreesProcessor implements StAXArtifactProcessor<ResolutionTrees>, Constants {
+
+ private static final QName RESOLUTION_TREES_POLICY_QNAME = ResolutionTrees.RESOLUTION_TREES_POLICY_QNAME;
+
+ public ResolutionTreesProcessor() {
+ }
+
+ public ResolutionTrees read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+
+ ResolutionTrees policy = new ResolutionTreesImpl();
+ QName name = null;
+ String ruleName = null;
+ OMElement ruleElement = null;
+ while (reader.hasNext()) {
+
+ if (reader.isStartElement()) {
+
+ name = reader.getName();
+ if (RESOLUTION_TREE.equals(name.getLocalPart())) {
+
+ ruleName = reader.getAttributeValue(null, Constants.EXCEPTION_LEVEL);
+ ruleElement = loadElement(reader);
+
+ policy.getResolutionTreeElements().put(ruleName, ruleElement);
+ }
+ } else if (reader.isEndElement()) {
+ if (RESOLUTION_TREES_POLICY_QNAME.equals(reader.getName())) {
+ break;
+ }
+ }
+
+ reader.next();
+ }
+
+ return policy;
+ }
+
+ public void write(ResolutionTrees policy, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public QName getArtifactType() {
+ return RESOLUTION_TREES_POLICY_QNAME;
+ }
+
+ public void resolve(ResolutionTrees arg0, ModelResolver arg1) throws ContributionResolveException {
+ //throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Class<ResolutionTrees> getModelType() {
+ return ResolutionTrees.class;
+ }
+
+ private OMElement loadElement(XMLStreamReader reader) throws XMLStreamException {
+ OMFactory fac = OMAbstractFactory.getOMFactory();
+ OMElement head = fac.createOMElement(reader.getName());
+
+ //Load the attributes for the rule tag
+ loadAttributes(reader, head, fac);
+
+ OMElement current = head;
+ while (true) {
+
+ switch (reader.next()) {
+ case XMLStreamConstants.START_ELEMENT:
+
+ QName name = new QName(reader.getName().getLocalPart());
+ OMElement child = fac.createOMElement(name, current);
+
+ int count = reader.getNamespaceCount();
+ for (int i = 0; i < count; i++) {
+ String prefix = reader.getNamespacePrefix(i);
+ String ns = reader.getNamespaceURI(i);
+ child.declareNamespace(ns, prefix);
+ }
+
+ if (!"".equals(name.getNamespaceURI())) {
+ child.declareNamespace(name.getNamespaceURI(), name.getPrefix());
+ }
+
+ // add the attributes for this element
+ loadAttributes(reader, child, fac);
+ current = child;
+ break;
+ case XMLStreamConstants.CDATA:
+ fac.createOMText(current, reader.getText());
+ break;
+ case XMLStreamConstants.CHARACTERS:
+ String text = reader.getText().trim();
+ if (text.length() != 0) {
+ fac.createOMText(current, reader.getText());
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ if (current == head) {
+ return head;
+ } else {
+ current = (OMElement) current.getParent();
+ }
+ }
+ }
+ }
+
+ private void loadAttributes(XMLStreamReader reader, OMElement elem, OMFactory fac) {
+ int count = reader.getAttributeCount();
+ for (int i = 0; i < count; i++) {
+ String ns = reader.getAttributeNamespace(i);
+ String prefix = reader.getAttributePrefix(i);
+ String qname = reader.getAttributeLocalName(i);
+ String value = reader.getAttributeValue(i);
+
+ if (ns != null) {
+ elem.addAttribute(qname, value, fac.createOMNamespace(ns, prefix));
+ elem.declareNamespace(ns, prefix);
+ } else {
+ elem.addAttribute(qname, value, null);
+ }
+ }
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
new file mode 100644
index 0000000000..b489bb90fc
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the artifact processor extension
+org.apache.tuscany.sca.implementation.guardian.xml.GuardianGroupImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.guardian,model=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation,factory=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory
new file mode 100644
index 0000000000..744815a572
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for implementation model factory
+org.apache.tuscany.sca.implementation.guardian.impl.GuardianGroupImplementationFactoryImpl
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
new file mode 100644
index 0000000000..4ab8d2e6a3
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory
@@ -0,0 +1,19 @@
+# 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.guardian.provider.GuardianGroupImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite
new file mode 100644
index 0000000000..d31485d67c
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://guardianTest"
+ name="guardianTest">
+
+ <component name="GuardianComponent">
+ <tuscany:implementation.guardian>
+
+ <tuscany:guardianProperties
+ recovery_rules="src/main/resources/recoveryrules_nbackpus_concurrent.xml"
+ resolution_trees="src/main/resources/resolutionTree.xml"/>
+
+ </tuscany:implementation.guardian>
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite
new file mode 100644
index 0000000000..fcb78e3879
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 (thea
+ * "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.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://guardianTest"
+ name="guardianTest">
+
+ <component name="Participant1">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember1"/>
+ <reference name="nodes" target="Participant2 Participant3 Participant4"/>
+ </component>
+
+ <component name="Participant2">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember2"/>
+ <reference name="nodes" target="Participant1 Participant3 Participant4"/>
+ </component>
+
+ <component name="Participant3">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember3"/>
+ <reference name="nodes" target="Participant1 Participant2 Participant4"/>
+ </component>
+
+ <component name="Participant4">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember4"/>
+ <reference name="nodes" target="Participant1 Participant2 Participant3"/>
+ </component>
+
+ <component name="GuardianMember1">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianMember2">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianMember3">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianMember4">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianComponent">
+ <tuscany:implementation.guardian>
+
+ <tuscany:guardianProperties
+ recovery_rules="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml"
+ resolution_trees="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml"/>
+
+ </tuscany:implementation.guardian>
+
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml
new file mode 100644
index 0000000000..b2eacf8b8a
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 (thea
+ * "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.
+-->
+
+<recovery_rules>
+
+ <!-- A new participant joins in the group -->
+ <rule name="Rule1" signaled_exception="org.apache.tuscany.sca.implementation.guardian.common.JoinException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/>
+ </participant>
+ </rule>
+
+ <!-- The Primary fails -->
+ <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+
+ <participant match="*.BACKUP">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN">
+ <affected_participants>FIRST</affected_participants>
+ </throw_exception>
+ </participant>
+ </rule>
+
+ <!-- The Backup fails -->
+ <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+ </rule>
+
+ <!-- The Primary and Backup fail together -->
+ <rule name="Rule4" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryBackupFailedTogetherException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+
+ <!-- Backup signaler -->
+ <participant match="*.BACKUP,SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+
+ <!-- Excluding the backup signaler -->
+ <participant match="*.BACKUP,!SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN">
+ <affected_participants>FIRST</affected_participants>
+ </throw_exception>
+ </participant>
+
+ </rule>
+
+</recovery_rules>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml
new file mode 100644
index 0000000000..ca3fa1534c
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml
@@ -0,0 +1,8 @@
+<resolution_trees>
+ <resolution_tree exception_level="1">
+ <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryBackupFailedTogetherException">
+ <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException"/>
+ <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException"/>
+ </exception>
+ </resolution_tree>
+</resolution_trees>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite
new file mode 100644
index 0000000000..85af4efd48
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 (thea
+ * "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.
+-->
+<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
+ xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://guardianTest"
+ name="guardianTest">
+
+ <component name="Participant1">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember1"/>
+ <reference name="nodes" target="Participant2"/>
+ </component>
+
+ <component name="Participant2">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember2"/>
+ <reference name="nodes" target="Participant1"/>
+ </component>
+
+ <component name="GuardianMember1">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianMember2">
+ <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianComponent"/>
+ </component>
+
+ <component name="GuardianComponent">
+ <tuscany:implementation.guardian>
+
+ <tuscany:guardianProperties
+ recovery_rules="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml"
+ resolution_trees="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml"/>
+
+ </tuscany:implementation.guardian>
+
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml
new file mode 100644
index 0000000000..0016fa4d9f
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 (thea
+ * "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.
+-->
+
+<recovery_rules>
+
+ <rule name="Rule1" signaled_exception="org.apache.tuscany.sca.implementation.guardian.common.JoinException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/>
+ </participant>
+ </rule>
+
+ <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+
+ <participant match="*.BACKUP">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN"/>
+ </participant>
+ </rule>
+
+ <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="*.BACKUP">
+ <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+ </rule>
+
+</recovery_rules>
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml
new file mode 100644
index 0000000000..e528760ad8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml
@@ -0,0 +1,21 @@
+<resolution_trees>
+ <resolution_tree exception_level="1">
+ <exception class="Exception1">
+ <exception class="Exception2">
+ <exception class="Exception4"/>
+ <exception class="Exception5"/>
+ </exception>
+ <exception class="Exception3">
+ <exception class="Exception6"/>
+ <exception class="Exception7"/>
+ <exception class="Exception8"/>
+ </exception>
+ </exception>
+ </resolution_tree>
+</resolution_trees>
+
+
+
+
+
+
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz b/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz
new file mode 100644
index 0000000000..8845a544fe
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz
Binary files differ
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java
new file mode 100644
index 0000000000..ba4f6230d8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import org.apache.tuscany.sca.implementation.guardian.*;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+import org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class GuardianImplementationTest {
+
+// private SCADomain scaDomain;
+// private GuardianGroup guardian;
+//
+// @Before
+// public void init() throws Exception {
+// scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/implementation/guardian/guardianTest.composite");
+// guardian = scaDomain.getService(GuardianGroup.class, "GuardianComponent");
+// }
+//
+// @Test
+// public void enabelContextTest() throws Exception {
+// guardian.enableContext(Context.INIT_CONTEXT);
+// }
+//
+// @After
+// public void destroy() {
+// scaDomain.close();
+// }
+ public static void main(String... args) {
+
+ SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/implementation/guardian/guardianTest.composite");
+ GuardianGroup guardian = scaDomain.getService(GuardianGroup.class, "GuardianComponent");
+
+ System.out.println("\n#EnableContext invocation");
+ guardian.enableContext(Context.INIT_CONTEXT);
+
+ System.out.println("\n#RemoveContext invocation");
+ guardian.removeContext();
+
+ System.out.println("\n#CheckExceptionStatus invocation");
+ guardian.checkExceptionStatus();
+
+ System.out.println("\n#CheckExceptionStatus invocation");
+ boolean value = guardian.propagate(new GlobalException());
+ System.out.println("returned value: " + value);
+
+ System.out.println("\n#AddGuardianMember invocation");
+ guardian.addGuardianMember(new GuardianMemberImpl());
+
+ System.out.println("\n#RemoveGuardianMember invocation");
+ value = guardian.removeGuardianMember(new GuardianMemberImpl());
+ System.out.println("returned value: " + value);
+
+ }
+
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java
new file mode 100644
index 0000000000..3c5e6b1b19
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java
@@ -0,0 +1,115 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian;
+
+import java.io.FileInputStream;
+import org.apache.tuscany.sca.implementation.guardian.common.ResolutionTreeUtils;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
+import org.junit.Test;
+import org.apache.axiom.om.OMElement;
+import java.util.List;
+import junit.framework.Assert;
+import org.apache.tuscany.sca.implementation.guardian.xml.ResolutionTreesProcessor;
+import org.junit.Before;
+
+public class LCATestCase {
+
+ private ResolutionTreeUtils treeUtils;
+
+ @Before
+ public void init() throws Exception {
+ ResolutionTreesProcessor processor = new ResolutionTreesProcessor();
+
+ FileInputStream fileInputStream = new FileInputStream("src/main/resources/org/apache/" +
+ "tuscany/sca/implementation/guardian/lcaTest.xml");
+ XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
+
+
+ ResolutionTrees policy = processor.read(reader);
+ Map<String, OMElement> resolutionTrees = policy.getResolutionTreeElements();
+
+ List<OMElement> rootElements = getRootElements(resolutionTrees.values());
+
+ treeUtils = new ResolutionTreeUtils();
+ treeUtils.setRoot(rootElements.get(0));
+ }
+
+ @Test
+ public void testLCAEx2Ex2() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception2");
+ System.out.println("lca: " + lca);
+ Assert.assertEquals("Exception2", lca);
+ }
+
+ @Test
+ public void testLCAEx2Ex3() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception3");
+ Assert.assertEquals("Exception1", lca);
+ }
+
+ @Test
+ public void testLCAEx2Ex8() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception8");
+ Assert.assertEquals("Exception1", lca);
+ }
+
+ @Test
+ public void testLCAEx4Ex3() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception4", "Exception3");
+ Assert.assertEquals("Exception1", lca);
+ }
+
+ @Test
+ public void testLCAEx4Ex5() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception4", "Exception5");
+ Assert.assertEquals("Exception2", lca);
+ }
+
+ @Test
+ public void testLCAEx6Ex7() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception6", "Exception7");
+ Assert.assertEquals("Exception3", lca);
+ }
+
+ @Test
+ public void testLCAEx1Ex8() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception1", "Exception8");
+ Assert.assertEquals("Exception1", lca);
+ }
+
+ @Test
+ public void testLCAEx2Ex5() throws Exception {
+ String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception5");
+ Assert.assertEquals("Exception2", lca);
+ }
+
+ private List<OMElement> getRootElements(Collection<OMElement> resolutionTrees) {
+ List<OMElement> rootElements = new LinkedList<OMElement>();
+
+ for (OMElement resolutionTree : resolutionTrees) {
+ rootElements.add(resolutionTree.getFirstElement());
+ }
+
+ return rootElements;
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java
new file mode 100644
index 0000000000..b08b26942d
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java
@@ -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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+public class ApplyUpdateFailureException extends RuntimeException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java
new file mode 100644
index 0000000000..25adf1d739
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class BackupFailedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java
new file mode 100644
index 0000000000..f0d29f461f
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class BackupJoinedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java
new file mode 100644
index 0000000000..6aa9456816
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.osoa.sca.annotations.OneWay;
+
+public interface Node {
+
+ @OneWay
+ public void execute();
+
+ public void sendUpdate(String s);
+
+ public void applyUpdate();
+
+ public String getID();
+
+ public void kill();
+
+ public boolean isDead();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java
new file mode 100644
index 0000000000..37f4f529f0
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java
@@ -0,0 +1,282 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.tuscany.sca.implementation.guardian.GuardianMember;
+import org.apache.tuscany.sca.implementation.guardian.common.Context;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.OneWay;
+
+@Scope("COMPOSITE")
+public class NodeImpl implements Node, TestInterface {
+
+ private static int PRIMARY = 0;
+ private static int BACKUP = 1;
+ private boolean isDead;
+ private Context mainContext;
+ private Context primaryContext;
+ private Context backupContext;
+ private int role;
+ private String pID;
+ private Queue<String> updates;
+ @Reference(name = "guardian_member", required = true)
+ public GuardianMember gm;
+ @Reference(name = "nodes", required = true)
+ public List<Node> nodeList;
+ private boolean forcePSFException;
+ private boolean forceAUFException;
+ private int upcount;
+
+ public NodeImpl() {
+
+ mainContext = new Context("MAIN");
+ mainContext.addException(PrimaryFailedException.class);
+ mainContext.addException(PrimaryExistsException.class);
+
+ primaryContext = new Context("PRIMARY");
+ primaryContext.addException(BackupFailedException.class);
+ primaryContext.addException(BackupJoinedException.class);
+ primaryContext.addException(PrimaryServiceFailureException.class);
+
+ backupContext = new Context("BACKUP", null);
+
+ updates = new LinkedList();
+
+ isDead = true;
+
+ nodeList = new LinkedList<Node>();
+
+ forcePSFException = false;
+ forceAUFException = false;
+ }
+
+ @Init
+ public void init() {
+ pID = gm.getParticipantIdentifier();
+ }
+
+ @OneWay
+ public void execute() {
+ isDead = false;
+ gm.enableContext(mainContext);
+ role = PRIMARY;
+
+ while (true) {
+
+ //blockingCheck();
+
+ try {
+ System.out.println(pID + "#Main context: ");
+ sleep(pID + "#Sleeping at main context...", 4000);
+
+ gm.checkExceptionStatus();
+
+ if (role == PRIMARY) {
+ //Config as primary then...
+ primaryService();
+ } else {
+ //Config as backup then...
+ backupService();
+ }
+
+
+ } catch (PrimaryExistsException ex) {
+ System.out.println(pID + "# Exception captured!: PrimaryExistsException");
+ role = BACKUP;
+
+ } catch (PrimaryFailedException ex) {
+ System.out.println(pID + "# Exception captured!: PrimaryFailedException");
+ System.out.println(pID + "#Needs propagation?: " + gm.propagate(ex));
+
+ if (gm.propagate(ex)) {
+ //throw ex;
+ this.kill();
+ ex.printStackTrace();
+ return;
+ }
+
+ role = PRIMARY;
+
+ } catch (BackupFailedException ex) {
+ System.out.println(pID + "# Exception captured!: BackupFailedException");
+ System.out.println(pID + "#Needs propagation?: " + gm.propagate(ex));
+
+ if (gm.propagate(ex)) {
+ //throw ex;
+ this.kill();
+ ex.printStackTrace();
+ return;
+ }
+ }
+ }
+ }
+
+ private void primaryService() {
+ boolean backupAvailable = isThereBackupAvailable();
+
+ upcount = 1;
+
+ while (true) {
+
+ gm.enableContext(primaryContext);
+
+ //blockingCheck();
+
+ try {
+ System.out.println(pID + "#Primary context: ");
+ sleep(pID + "#Sleeping at primary context...", 4000);
+ gm.checkExceptionStatus();
+
+ //Process the request then...
+ System.out.println(pID + "#Processing the request...");
+
+ //Check for an internal error
+ if (forcePSFException) {
+ throw new PrimaryServiceFailureException();
+ }
+
+ if (backupAvailable) {
+
+ if (!updateBackups()) {
+ backupAvailable = isThereBackupAvailable();
+ }
+
+ } else {
+ System.out.println(pID + "#No backup available to send updates!");
+ //backupAvailable = isThereBackupAvailable();
+ }
+ //send the reply to the client
+ System.out.println(pID + "#Sending the reply to the client...");
+
+ } catch (PrimaryServiceFailureException ex) {
+ System.out.println(pID + "# Exception captured!: PrimaryServiceFailureException");
+ gm.gthrow(new PrimaryFailedException(), null);
+ } catch (BackupFailedException ex) {
+ System.out.println(pID + "# Exception captured!: BackupFailedException");
+ //backupAvailable = false;
+ backupAvailable = isThereBackupAvailable();
+ } catch (BackupJoinedException ex) {
+ System.out.println(pID + "# Exception captured!: BackupJoinedException");
+ backupAvailable = true;
+ } finally {
+ gm.removeContext();
+ }
+ }
+ }
+
+ private boolean updateBackups() {
+ boolean flag = false;
+
+ for (Node n : nodeList) {
+ if (!n.isDead()) {
+ n.sendUpdate("Update " + upcount);
+ flag = true;
+ }
+ }
+ if (flag) {
+ upcount++;
+ }
+
+ return flag;
+ }
+
+ private void backupService() {
+ while (true) {
+
+ gm.enableContext(backupContext);
+
+ //blockingCheck();
+
+ try {
+ System.out.println(pID + "#Backup context: ");
+ sleep(pID + "#Sleeping at backup service", 4000);
+ gm.checkExceptionStatus();
+
+ applyUpdate();
+
+ if (forceAUFException) {
+ throw new ApplyUpdateFailureException();
+ }
+
+ } catch (ApplyUpdateFailureException ex) {
+ System.out.println(pID + "# Exception captured!: ApplyUpdateFailureException");
+ gm.gthrow(new BackupFailedException(), null);
+ } finally {
+ gm.removeContext();
+ }
+ }
+ }
+
+ public String getID() {
+ return gm.getParticipantIdentifier();
+ }
+
+ private void sleep(String msg, int millis) {
+ try {
+ System.out.println(msg);
+ Thread.sleep(millis);
+ } catch (InterruptedException ex) {
+ Logger.getLogger(NodeImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ private boolean isThereBackupAvailable() {
+ for (Node n : nodeList) {
+ if (!n.isDead()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void kill() {
+ isDead = true;
+ }
+
+ public boolean isDead() {
+ return isDead;
+ }
+
+ public void sendUpdate(String update) {
+ System.out.println(pID + "#Receiving updates from primary: " + update);
+ updates.offer(update);
+ }
+
+ public void applyUpdate() {
+ if (!updates.isEmpty()) {
+ System.out.println(pID + "#Applying the updates received from the primary: " + updates.poll());
+ }
+ }
+
+ public void forcePrimaryServiceFailureException() {
+ forcePSFException = true;
+ }
+
+ public void forceApplyUpdateFailureException() {
+ forceAUFException = true;
+ }
+}
+
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java
new file mode 100644
index 0000000000..5521caa550
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class PrimaryBackupFailedTogetherException extends GlobalException {
+
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java
new file mode 100644
index 0000000000..d6297a1012
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class PrimaryExistsException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java
new file mode 100644
index 0000000000..cc1715d077
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class PrimaryFailedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java
new file mode 100644
index 0000000000..0bcfb72bc8
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.implementation.guardian.common.GlobalException;
+
+public class PrimaryServiceFailureException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java
new file mode 100644
index 0000000000..7e7bd35cd2
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common;
+
+public interface TestInterface {
+
+ public void forcePrimaryServiceFailureException();
+
+ public void forceApplyUpdateFailureException();
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java
new file mode 100644
index 0000000000..ab0c21dba6
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.concurrentExceptions;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.TestInterface;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+public class Launch {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/" +
+ "implementation/guardian/itests/primaryBackup/" +
+ "concurrentExceptions/primaryBackup.composite");
+
+ System.out.println("Starting participat1...");
+ Node c = scaDomain.getService(Node.class, "Participant1");
+ c.execute();
+
+ System.in.read();
+
+ System.out.println("Starting participant2...");
+ Node c2 = scaDomain.getService(Node.class, "Participant2");
+ c2.execute();
+
+ System.in.read();
+
+ System.out.println("Starting participant3...");
+ Node c3 = scaDomain.getService(Node.class, "Participant3");
+ c3.execute();
+
+ System.in.read();
+
+ System.out.println("Starting participant4...");
+ Node c4 = scaDomain.getService(Node.class, "Participant4");
+ c4.execute();
+
+ System.in.read();
+
+ System.out.println("Forcing exception ocurrence at participant1...");
+ TestInterface t = scaDomain.getService(TestInterface.class, "Participant1");
+ t.forcePrimaryServiceFailureException();
+
+ System.out.println("Forcing exception ocurrence at participant2...");
+ TestInterface t2 = scaDomain.getService(TestInterface.class, "Participant2");
+ t2.forceApplyUpdateFailureException();
+
+ System.in.read();
+
+ scaDomain.close();
+ }
+}
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java
new file mode 100644
index 0000000000..86df9bc5f9
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.simple;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.TestInterface;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+public class Launch {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/" +
+ "implementation/guardian/itests/primaryBackup/" +
+ "simple/primaryBackup.composite");
+
+ System.out.println("Starting participat1...");
+ Node c = scaDomain.getService(Node.class, "Participant1");
+ c.execute();
+
+ System.in.read();
+
+ System.out.println("Starting participant2...");
+ Node c2 = scaDomain.getService(Node.class, "Participant2");
+ c2.execute();
+
+ System.in.read();
+
+ System.out.println("Forcing exception ocurrence at participant1...");
+ TestInterface t = scaDomain.getService(TestInterface.class, "Participant1");
+ t.forcePrimaryServiceFailureException();
+
+
+ System.in.read();
+
+ scaDomain.close();
+ }
+}
+
diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java
new file mode 100644
index 0000000000..1c5fd26745
--- /dev/null
+++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+package org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.simple;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.TestInterface;
+
+public class Launch2 {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/" +
+ "implementation/guardian/itests/primaryBackup/" +
+ "simple/primaryBackup.composite");
+
+ System.out.println("Starting participat1...");
+ Node c = scaDomain.getService(Node.class, "Participant1");
+ c.execute();
+
+ System.in.read();
+
+ System.out.println("Starting participant2...");
+ Node c2 = scaDomain.getService(Node.class, "Participant2");
+ c2.execute();
+
+ System.in.read();
+
+ System.out.println("Forcing exception ocurrence at participant2...");
+ TestInterface t = scaDomain.getService(TestInterface.class, "Participant2");
+ t.forceApplyUpdateFailureException();
+
+ System.in.read();
+
+ scaDomain.close();
+ }
+}
+