summaryrefslogtreecommitdiffstats
path: root/sandbox/dougsleite/guardian-model
diff options
context:
space:
mode:
authordougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68>2009-07-06 12:41:48 +0000
committerdougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68>2009-07-06 12:41:48 +0000
commitf1dfba0cc9000fcf881267608c02b683dcf2f796 (patch)
treed7653d10bdec1ab0b404fd92092f8c8aef0c3b01 /sandbox/dougsleite/guardian-model
parent6c479469ad629e1bc05e1e2eb4114941b4405f5a (diff)
- Restructured the iTest package
- Added a new test scenario: Primary-Backup with N backups - Added a new tag element (<affected_participants>) into the recovery rules XML file git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@791465 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/dougsleite/guardian-model')
-rw-r--r--sandbox/dougsleite/guardian-model/.classpath8
-rw-r--r--sandbox/dougsleite/guardian-model/.project8
-rw-r--r--sandbox/dougsleite/guardian-model/.settings/org.eclipse.jdt.core.prefs5
-rw-r--r--sandbox/dougsleite/guardian-model/.settings/org.maven.ide.eclipse.prefs9
-rw-r--r--sandbox/dougsleite/guardian-model/pom.xml20
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/Context.java7
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalException.java2
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionAdapter.java34
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionInterface.java52
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java221
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberAdapter.java36
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberImpl.java22
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianPrimitives.java7
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/resources/primaryNbackups.composite74
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/resources/primarybackup-ws.composite63
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/resources/primarybackup.composite52
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules.xml16
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules_nbackpus.xml58
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java22
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupFailedException.java24
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupJoinedException.java24
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/Node.java34
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/NodeImpl.java288
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryExistsException.java24
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryFailedException.java24
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java24
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/TestInterface.java26
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch.java64
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch2.java70
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch3.java71
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch.java52
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch2.java52
-rw-r--r--sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch3.java63
33 files changed, 1507 insertions, 49 deletions
diff --git a/sandbox/dougsleite/guardian-model/.classpath b/sandbox/dougsleite/guardian-model/.classpath
index 8b0ba27bfa..554ad2954f 100644
--- a/sandbox/dougsleite/guardian-model/.classpath
+++ b/sandbox/dougsleite/guardian-model/.classpath
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry including="**/*.java" kind="src" output="target/test-classes" path="src/test/java"/>
- <classpathentry including="**/*.java" kind="src" path="src/main/java"/>
+ <classpathentry kind="src" output="target/classes" path="src/main/java"/>
+ <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.devzuz.q.maven.jdt.core.mavenClasspathContainer"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
diff --git a/sandbox/dougsleite/guardian-model/.project b/sandbox/dougsleite/guardian-model/.project
index 2383adb712..a5f54ef1d3 100644
--- a/sandbox/dougsleite/guardian-model/.project
+++ b/sandbox/dougsleite/guardian-model/.project
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>guardian-model</name>
+ <name>tuscany-guardian-model</name>
<comment></comment>
<projects>
</projects>
@@ -15,8 +15,14 @@
<arguments>
</arguments>
</buildCommand>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
</buildSpec>
<natures>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.devzuz.q.maven.jdt.core.mavenNature</nature>
</natures>
diff --git a/sandbox/dougsleite/guardian-model/.settings/org.eclipse.jdt.core.prefs b/sandbox/dougsleite/guardian-model/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000000..2f04a7646c
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+#Tue Jun 23 15:59:15 BRT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/sandbox/dougsleite/guardian-model/.settings/org.maven.ide.eclipse.prefs b/sandbox/dougsleite/guardian-model/.settings/org.maven.ide.eclipse.prefs
new file mode 100644
index 0000000000..c8dabf2f86
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/.settings/org.maven.ide.eclipse.prefs
@@ -0,0 +1,9 @@
+#Tue Jun 23 15:58:52 BRT 2009
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+skipCompilerPlugin=true
+version=1
diff --git a/sandbox/dougsleite/guardian-model/pom.xml b/sandbox/dougsleite/guardian-model/pom.xml
index cf7bda80b6..ac4d37db06 100644
--- a/sandbox/dougsleite/guardian-model/pom.xml
+++ b/sandbox/dougsleite/guardian-model/pom.xml
@@ -21,7 +21,7 @@
<parent>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-sca</artifactId>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>tuscany-guardian-model</artifactId>
@@ -34,39 +34,39 @@
</repository>
</repositories>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-node-impl</artifactId>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-embedded</artifactId>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-java-runtime</artifactId>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-ws-axis2</artifactId>
- <version>1.5-SNAPSHOT</version>
- <scope>runtime</scope>
+ <version>1.6-SNAPSHOT</version>
+ <scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-tomcat</artifactId>
- <version>1.5-SNAPSHOT</version>
+ <version>1.6-SNAPSHOT</version>
<scope>runtime</scope>
</dependency>
@@ -88,7 +88,9 @@
<artifactId>axis2</artifactId>
<version>1.2</version>
<type>pom</type>
- </dependency>
+ </dependency>
+
+
</dependencies>
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/Context.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/Context.java
index e803f52ebe..9385ade12a 100644
--- a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/Context.java
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/Context.java
@@ -28,9 +28,12 @@ public class Context {
private String name;
private List<Class<? extends GlobalException>> exceptionList;
+ public Context() {
+ this(null);
+ }
+
public Context(String name) {
- this.name = name;
- this.exceptionList = new LinkedList<Class<? extends GlobalException>>();
+ this(name, new LinkedList<Class<? extends GlobalException>>());
}
public Context(String name, List<Class<? extends GlobalException>> exceptionList) {
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalException.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalException.java
index f80e44ef40..c2e999a8ed 100644
--- a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalException.java
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalException.java
@@ -18,7 +18,7 @@
*/
package org.apache.tuscany.sca.guardian;
-public class GlobalException extends RuntimeException {
+public class GlobalException extends RuntimeException implements GlobalExceptionInterface {
private Context signalingContext;
private Context targetContext; //Assigned by the recovery rules
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionAdapter.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionAdapter.java
new file mode 100644
index 0000000000..afbf4ee35e
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionAdapter.java
@@ -0,0 +1,34 @@
+/*
+ * 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.guardian;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+public class GlobalExceptionAdapter extends XmlAdapter<GlobalException, GlobalExceptionInterface> {
+
+ @Override
+ public GlobalExceptionInterface unmarshal(GlobalException v) {
+ return v;
+ }
+
+ @Override
+ public GlobalException marshal(GlobalExceptionInterface v) {
+ return (GlobalException) v;
+ }
+}
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionInterface.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionInterface.java
new file mode 100644
index 0000000000..35e8a1d236
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GlobalExceptionInterface.java
@@ -0,0 +1,52 @@
+/*
+ * 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.guardian;
+
+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 String getSignalingParticipant();
+
+ /**
+ * @param signalingProcess the signalingProcess to set
+ */
+ public void setSignalingParticipant(String signalingProcess);
+}
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java
index a54ffe71b7..e21016b3f5 100644
--- a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java
@@ -47,8 +47,7 @@ public class GuardianGroupImpl implements GuardianGroup {
@Property(name = "recovery_rules", required = true)
public void setRecoveryRules(String recoveryRules) {
try {
- //FileInputStream fileInputStream = new FileInputStream("src/main/resources/recoveryrules.xml");
- FileInputStream fileInputStream = new FileInputStream("src/main/resources/recoveryrules.xml");
+ FileInputStream fileInputStream = new FileInputStream(recoveryRules);
XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
reader = new ResettableReader(xmlReader);
} catch (XMLStreamException ex) {
@@ -64,14 +63,15 @@ public class GuardianGroupImpl implements GuardianGroup {
}
public void enableContext(Context context) {
- throw new UnsupportedOperationException("Not supported yet.");
+ System.out.println("Enable Context.. nothing to do!");
+ //throw new UnsupportedOperationException("Not supported yet.");
}
public void removeContext() {
throw new UnsupportedOperationException("Not supported yet.");
}
- public void gthrow(GlobalException ex, List<String> participantList) {
+ public void gthrow(GlobalExceptionInterface ex, List<String> participantList) {
//1)Ivoked by a GuardianMember instance through the gthrow method
//2)Notify all participants about the exception (FIFO atomic broadcast model) - it will cause the suspension of all participants
@@ -190,7 +190,177 @@ public class GuardianGroupImpl implements GuardianGroup {
}
- private void applyRecoveryRules(GlobalException ex) {
+ private void applyRecoveryRules(GlobalExceptionInterface ex) {
+ reader.reset();
+ ruleTag(ex);
+ }
+
+ private void ruleTag(GlobalExceptionInterface ex) {
+ try {
+ while (reader.hasNext()) {
+ reader.next();
+ //<rule name="" signaled_exception="">
+ if (reader.isStartElement() && reader.getLocalName().equals("rule")) {
+ for (int i = 0; i < reader.getAttributeCount(); i++) {
+ //ex == signaled_exception
+ if (reader.getAttributeLocalName(i).equals("signaled_exception") && ex.getClass().getName().equals(reader.getAttributeValue(i))) {
+ participantExceptionTag(ex);
+ break;
+ }
+ }
+ }
+ }
+ } catch (XMLStreamException exc) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ private void participantExceptionTag(GlobalExceptionInterface ex) {
+ List<GuardianMember> gmList;
+ try {
+ while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("rule"))) {
+ reader.next();
+ //<participant match="<REG_EXP> | SIGNALER">
+ if (reader.isStartElement() && reader.getLocalName().equals("participant")) {
+ String participantMatch = reader.getAttributeValue(0).trim();
+
+ gmList = getMatchingParticipants(participantMatch, ex);
+
+ if (!gmList.isEmpty()) {
+ throwExceptionTag(gmList, ex);
+ }
+ }
+ }
+ } catch (XMLStreamException exc) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, exc);
+ }
+ }
+
+ private void throwExceptionTag(List<GuardianMember> gmList, GlobalExceptionInterface ex) {
+
+ String exceptionClassName;
+ String targetContextName;
+ Integer min_participant_joined;
+ Integer max_participant_joined;
+
+ try {
+
+ while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("participant"))) {
+ reader.next();
+
+ //<throw_exception class="<Exception>" target_context="<Context>"/>
+ if (reader.isStartElement() && reader.getLocalName().equals("throw_exception")) {
+
+ exceptionClassName = null;
+ targetContextName = null;
+ min_participant_joined = null;
+ max_participant_joined = null;
+ for (int j = 0; j < reader.getAttributeCount(); j++) {
+ if (reader.getAttributeLocalName(j).equals("class")) {
+ //class value
+ exceptionClassName = reader.getAttributeValue(j);
+ } else if (reader.getAttributeLocalName(j).equals("target_context")) {
+ //target_context value
+ targetContextName = reader.getAttributeValue(j);
+ } else if (reader.getAttributeLocalName(j).equals("min_participant_joined")) {
+ //min_participant_joined value
+ min_participant_joined = Integer.parseInt(reader.getAttributeValue(j));
+ } else {
+ //max_participant_joined value
+ max_participant_joined = Integer.parseInt(reader.getAttributeValue(j));
+ }
+ }
+
+ //Test the min and max joined participants condition
+ if (min_participant_joined != null && max_participant_joined != null) {
+ if (!(guardianList.size() >= min_participant_joined && guardianList.size() < max_participant_joined)) {
+ break;
+ }
+ } else if (min_participant_joined != null) {
+ if (!(guardianList.size() >= min_participant_joined)) {
+ break;
+ }
+ } else if (max_participant_joined != null) {
+ if (!(guardianList.size() >= min_participant_joined)) {
+ break;
+ }
+ }
+
+ //<affected_participants>
+ String affectedParticipants = affectedParticipantsTag();
+ int index = -1;
+
+ //Verify if the parameter is an index
+ try {
+ index = Integer.parseInt(affectedParticipants);
+ } catch (NumberFormatException nexc) {
+ index = -1;
+ }
+
+ Class exceptionClass = Class.forName(exceptionClassName);
+ 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.setSignalingParticipant(ex.getSignalingParticipant());
+
+ //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("FIRST")) {
+ gmList.get(0).addException(newException);
+ } else if (affectedParticipants.toUpperCase().equals("LAST")) {
+ gmList.get(gmList.size() - 1).addException(newException);
+ } else if (affectedParticipants.toUpperCase().equals("ALL")) {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
+ }
+ } else {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
+ }
+ }
+ }
+ } catch (XMLStreamException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ } 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() {
+ String affectedParticipants = null;
+ try {
+ while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("throw_exception"))) {
+ reader.next();
+ //<affected_participants>
+ if (reader.isStartElement() && reader.getLocalName().equals("affected_participants")) {
+ affectedParticipants = reader.getElementText();
+ }
+ }
+ } catch (XMLStreamException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+
+ return affectedParticipants;
+ }
+
+ private void applyRecoveryRulesOriginal(GlobalExceptionInterface ex) {
String exceptionClassName;
String targetContextName;
@@ -265,6 +435,24 @@ public class GuardianGroupImpl implements GuardianGroup {
//match value
gmList = getMatchingParticipants(participant_match, ex);
+ String affectedParticipants = null;
+ int index = -1;
+ while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("throw_exception"))) {
+ reader.next();
+
+ //<affected_participants>
+ if (reader.isStartElement() && reader.getLocalName().equals("affected_participants")) {
+ affectedParticipants = reader.getElementText();
+
+ //Verify if the parameter is an index
+ try {
+ index = Integer.parseInt(affectedParticipants);
+ } catch (NumberFormatException nexc) {
+ index = -1;
+ }
+ }
+ }
+
Class exceptionClass = Class.forName(exceptionClassName);
Context targetContext;
@@ -280,8 +468,23 @@ public class GuardianGroupImpl implements GuardianGroup {
newException.setTargetContext(targetContext);
//Add the exception to the participants matched
- for (GuardianMember gm : gmList) {
- gm.addException(newException);
+ if (index != -1) {
+ gmList.get(index).addException(newException);
+ } else if (affectedParticipants != null && affectedParticipants.length() != 0) {
+ if (affectedParticipants.toUpperCase().equals("FIRST")) {
+ gmList.get(0).addException(newException);
+
+ } else if (affectedParticipants.toUpperCase().equals("LAST")) {
+ gmList.get(gmList.size() - 1).addException(newException);
+ } else if (affectedParticipants.toUpperCase().equals("ALL")) {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
+ }
+ } else {
+ for (GuardianMember gm : gmList) {
+ gm.addException(newException);
+ }
}
}
}
@@ -299,7 +502,7 @@ public class GuardianGroupImpl implements GuardianGroup {
}
}
- private List<GuardianMember> getMatchingParticipants(String regularExpression, GlobalException signaledException) {
+ private List<GuardianMember> getMatchingParticipants(String regularExpression, GlobalExceptionInterface signaledException) {
List<GuardianMember> matchingParticipants = new LinkedList();
if (regularExpression.toUpperCase().equals("SIGNALER")) {
@@ -401,7 +604,7 @@ public class GuardianGroupImpl implements GuardianGroup {
return re.toString();
}
- public boolean propagate(GlobalException ex) {
+ public boolean propagate(GlobalExceptionInterface ex) {
throw new UnsupportedOperationException("Not supported yet.");
}
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberAdapter.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberAdapter.java
new file mode 100644
index 0000000000..8c0fd92b6e
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberAdapter.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009 douglas.
+ *
+ * Licensed 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.
+ * under the License.
+ */
+package org.apache.tuscany.sca.guardian;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+/**
+ *
+ * @author douglas
+ */
+public class GuardianMemberAdapter extends XmlAdapter<GuardianMemberImpl, GuardianMember> {
+
+ @Override
+ public GuardianMember unmarshal(GuardianMemberImpl v) throws Exception {
+ return v;
+ }
+
+ @Override
+ public GuardianMemberImpl marshal(GuardianMember v) throws Exception {
+ return (GuardianMemberImpl) v;
+ }
+}
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberImpl.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberImpl.java
index 220325b1f0..682a6d8e1b 100644
--- a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberImpl.java
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianMemberImpl.java
@@ -28,7 +28,9 @@ import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Reference;
import org.osoa.sca.annotations.Scope;
import org.osoa.sca.annotations.Destroy;
+import org.osoa.sca.annotations.Service;
+@Service(GuardianMember.class)
@Scope("COMPOSITE")
public class GuardianMemberImpl implements GuardianMember {
@@ -89,7 +91,7 @@ public class GuardianMemberImpl implements GuardianMember {
//Adapt to allow a regular expression
//If participantList is null then signal to ALL participants
- public void gthrow(GlobalException ex, List<String> participantList) {
+ public void gthrow(GlobalExceptionInterface ex, List<String> participantList) {
//1)Block the participant until raise an exception
if (!service.isBlocked()) {
service.block();
@@ -101,14 +103,6 @@ public class GuardianMemberImpl implements GuardianMember {
guardianGroup.gthrow(ex, participantList);
}
-
- //if (participantList == null || !participantList.contains(getParticipantIdentifier())) {
-// if (getParticipantIdentifier().equals(ex.getSignalingParticipant())) {
-// //2A)Call the gthrow of the GuardianGroup - communicate with other guardian members
-// System.out.println("HERE AT " + getParticipantIdentifier());
-// guardianGroup.gthrow(ex, participantList);
-// }
-
}
@@ -126,7 +120,7 @@ public class GuardianMemberImpl implements GuardianMember {
}
- public boolean propagate(GlobalException ex) {
+ public boolean propagate(GlobalExceptionInterface ex) {
//1)Compares the current context with the exception's target context
return !getCurrentContext().equals(ex.getTargetContext());
}
@@ -197,13 +191,13 @@ public class GuardianMemberImpl implements GuardianMember {
public String getParticipantIdentifier() {
//1) Return the participant identifier -> context list dot separated
- StringBuffer id = new StringBuffer();
+ StringBuffer participantIdentifier = new StringBuffer();
//id.append(this.id + "." + Context.INIT_CONTEXT.getName());
- id.append(this.id);
+ participantIdentifier.append(this.id);
for (int i = 0; i < contextList.size(); i++) {
- id.append("." + contextList.get(i).getName());
+ participantIdentifier.append("." + contextList.get(i).getName());
}
- return id.toString();
+ return participantIdentifier.toString();
}
public void setUniqueParticipantID(int id) {
diff --git a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianPrimitives.java b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianPrimitives.java
index a7710f811e..3d441a6c0c 100644
--- a/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianPrimitives.java
+++ b/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianPrimitives.java
@@ -19,7 +19,10 @@
package org.apache.tuscany.sca.guardian;
import java.util.List;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.osoa.sca.annotations.Remotable;
+//@Remotable
public interface GuardianPrimitives {
//Methods to manage contexts
@@ -28,9 +31,9 @@ public interface GuardianPrimitives {
public void removeContext();
//Methods to control the signaling of exceptions
- public void gthrow(GlobalException ex, List<String> participantList);
+ public void gthrow(@XmlJavaTypeAdapter(GlobalExceptionAdapter.class) GlobalExceptionInterface ex, List<String> participantList);
- public boolean propagate(GlobalException ex);
+ public boolean propagate(@XmlJavaTypeAdapter(GlobalExceptionAdapter.class) GlobalExceptionInterface ex);
//Method to check pending global exceptions
public void checkExceptionStatus();
diff --git a/sandbox/dougsleite/guardian-model/src/main/resources/primaryNbackups.composite b/sandbox/dougsleite/guardian-model/src/main/resources/primaryNbackups.composite
new file mode 100644
index 0000000000..ecb12079f5
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/resources/primaryNbackups.composite
@@ -0,0 +1,74 @@
+<?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:t="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://serverbackup"
+ name="serverbackup">
+
+ <component name="Participant1">
+ <implementation.java class="org.apache.tuscany.sca.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.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.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.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.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianMember2">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianMember3">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianMember4">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianGroup">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianGroupImpl"/>
+ <property name="recovery_rules">src/main/resources/recoveryrules_nbackpus.xml</property>
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup-ws.composite b/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup-ws.composite
new file mode 100644
index 0000000000..3de5d87fa2
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup-ws.composite
@@ -0,0 +1,63 @@
+<?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:t="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://serverbackup"
+ name="serverbackup">
+<!--
+ <component name="Participant1">
+ <implementation.java class="org.apache.tuscany.sca.guardian.itests.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember1"/>
+ <reference name="node" target="Participant2"/>
+ </component>
+
+ <component name="Participant2">
+ <implementation.java class="org.apache.tuscany.sca.guardian.itests.NodeImpl"/>
+ <reference name="guardian_member" target="GuardianMember2"/>
+ <reference name="node" target="Participant1"/>
+ </component>
+
+ <component name="GuardianMember1">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group">
+ <interface.java interface="org.apache.tuscany.sca.guardian.GuardianGroup"/>
+ <binding.ws uri="http://localhost:8085/GuardianGroup" requires="MTOM"/>
+ </reference>
+ </component>
+
+ <component name="GuardianMember2">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group">
+ <interface.java interface="org.apache.tuscany.sca.guardian.GuardianGroup"/>
+ <binding.ws uri="http://localhost:8085/GuardianGroup" requires="MTOM"/>
+ </reference>
+ </component>
+-->
+
+ <component name="GuardianGroupComponent">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianGroupImpl"/>
+ <property name="recovery_rules">src/main/resources/recoveryrules.xml</property>
+ <service name="GuardianGroup">
+ <interface.java interface="org.apache.tuscany.sca.guardian.GuardianGroup"/>
+ <binding.ws uri="http://localhost:8085/GuardianGroup" requires="MTOM"/>
+ </service>
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup.composite b/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup.composite
new file mode 100644
index 0000000000..9160a070c8
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/resources/primarybackup.composite
@@ -0,0 +1,52 @@
+<?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:t="http://tuscany.apache.org/xmlns/sca/1.0"
+ targetNamespace="http://primarybackup"
+ name="primarybackup">
+
+ <component name="Participant1">
+ <implementation.java class="org.apache.tuscany.sca.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.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.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianMember2">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianMemberImpl"/>
+ <reference name="guardian_group" target="GuardianGroup"/>
+ </component>
+
+ <component name="GuardianGroup">
+ <implementation.java class="org.apache.tuscany.sca.guardian.GuardianGroupImpl"/>
+ <property name="recovery_rules">src/main/resources/recoveryrules.xml</property>
+ </component>
+
+</composite>
diff --git a/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules.xml b/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules.xml
index b0db8cbd9a..5df6a321e6 100644
--- a/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules.xml
+++ b/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules.xml
@@ -23,33 +23,33 @@
<rule name="Rule1" signaled_exception="org.apache.tuscany.sca.guardian.JoinException">
<participant match="SIGNALER">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/>
</participant>
<participant match="!SIGNALER">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.BackupJoinedException" target_context="PRIMARY" min_participant_joined="2"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY" min_participant_joined="2"/>
</participant>
</rule>
- <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.guardian.itests.PrimaryFailedException">
+ <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException">
<participant match="*.PRIMARY">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.PrimaryFailedException" target_context="INIT_CONTEXT"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/>
</participant>
<participant match="*.BACKUP">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.PrimaryFailedException" target_context="MAIN"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN"/>
</participant>
</rule>
- <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.guardian.itests.BackupFailedException">
+ <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException">
<participant match="*.PRIMARY">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.BackupFailedException" target_context="PRIMARY"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/>
</participant>
<participant match="*.BACKUP">
- <throw_exception class="org.apache.tuscany.sca.guardian.itests.BackupFailedException" target_context="INIT_CONTEXT"/>
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/>
</participant>
</rule>
diff --git a/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules_nbackpus.xml b/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules_nbackpus.xml
new file mode 100644
index 0000000000..468fe5fc3a
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/main/resources/recoveryrules_nbackpus.xml
@@ -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.
+-->
+
+<recovery_rules>
+
+ <rule name="Rule1" signaled_exception="org.apache.tuscany.sca.guardian.JoinException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/>
+ </participant>
+ </rule>
+
+ <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+
+ <participant match="*.BACKUP">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN">
+ <affected_participants>FIRST</affected_participants>
+ </throw_exception>
+ </participant>
+ </rule>
+
+ <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException">
+
+ <participant match="*.PRIMARY">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/>
+ </participant>
+
+ <participant match="SIGNALER">
+ <throw_exception class="org.apache.tuscany.sca.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/>
+ </participant>
+ </rule>
+
+</recovery_rules>
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java
new file mode 100644
index 0000000000..d7f0f763e2
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+public class ApplyUpdateFailureException extends RuntimeException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupFailedException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupFailedException.java
new file mode 100644
index 0000000000..6660d6b42f
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.*;
+
+public class BackupFailedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupJoinedException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/BackupJoinedException.java
new file mode 100644
index 0000000000..6d81d1933e
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.GlobalException;
+
+public class BackupJoinedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/Node.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/Node.java
new file mode 100644
index 0000000000..9fb6a27a45
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/Node.java
@@ -0,0 +1,34 @@
+/*
+ * 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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.BlockingInterface;
+import org.osoa.sca.annotations.OneWay;
+
+public interface Node extends BlockingInterface {
+
+ @OneWay
+ public void execute();
+
+ public void sendUpdate(String s);
+
+ public void applyUpdate();
+
+ public String getID();
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/NodeImpl.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/NodeImpl.java
new file mode 100644
index 0000000000..5ff80e3472
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/NodeImpl.java
@@ -0,0 +1,288 @@
+/*
+ * 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.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.guardian.Context;
+import org.apache.tuscany.sca.guardian.GuardianMember;
+import org.osoa.sca.annotations.Init;
+import org.osoa.sca.annotations.Reference;
+import org.osoa.sca.annotations.Scope;
+import org.osoa.sca.annotations.Destroy;
+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 isBlocked;
+ 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;
+
+ 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();
+
+ isBlocked = true;
+
+ nodeList = new LinkedList<Node>();
+
+ forcePSFException = false;
+ forceAUFException = false;
+ }
+
+ @Init
+ public void init() {
+ gm.setService(this);
+ pID = gm.getParticipantIdentifier();
+ }
+
+ @Destroy
+ public void destroy() {
+ gm.removeService();
+ }
+
+ @OneWay
+ public void execute() {
+ isBlocked = false;
+ gm.enableContext(mainContext);
+ role = PRIMARY;
+
+ while (true) {
+ 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");
+ System.out.println(pID + "#Needs propagation?: " + gm.propagate(ex));
+
+ if (gm.propagate(ex)) {
+ throw ex;
+ }
+
+ 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.block();
+ 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.block();
+ ex.printStackTrace();
+ return;
+ }
+ }
+ }
+ }
+
+ 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.isBlocked()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void primaryService() {
+ boolean backupAvailable = isThereBackupAvailable();
+ System.out.println("Backup available?: " + backupAvailable);
+ int upcount = 1;
+
+ while (true) {
+
+ gm.enableContext(primaryContext);
+
+ 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) {
+ for (Node n : nodeList) {
+ if (!n.isBlocked()) {
+ n.sendUpdate("Update " + upcount);
+ }
+ }
+ upcount++;
+ } 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 void backupService() {
+ while (true) {
+
+ gm.enableContext(backupContext);
+
+ 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();
+ }
+ }
+ }
+
+ //FIXME - It is not working asynchronously
+ //@OneWay
+ public void block() {
+ System.out.println(pID + "#Participant blocked!");
+ isBlocked = true;
+
+// while (isBlocked) {
+// try {
+// Thread.sleep(5000);
+// } catch (InterruptedException ex) {
+// Logger.getLogger(ComponentImpl.class.getName()).log(Level.SEVERE, null, ex);
+// }
+// }
+ }
+
+ public boolean isBlocked() {
+ return isBlocked;
+ }
+
+ //@OneWay
+ public void unblock() {
+ System.out.println(pID + "#Participant unblocked!");
+ isBlocked = false;
+ }
+
+ 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/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryExistsException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryExistsException.java
new file mode 100644
index 0000000000..935c97966e
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.GlobalException;
+
+public class PrimaryExistsException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryFailedException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryFailedException.java
new file mode 100644
index 0000000000..086e255e94
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.*;
+
+public class PrimaryFailedException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java
new file mode 100644
index 0000000000..46f52ea198
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+import org.apache.tuscany.sca.guardian.GlobalException;
+
+public class PrimaryServiceFailureException extends GlobalException {
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/TestInterface.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/common/TestInterface.java
new file mode 100644
index 0000000000..f659a15530
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/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.guardian.itests.primaryBackup.common;
+
+public interface TestInterface {
+
+ public void forcePrimaryServiceFailureException();
+
+ public void forceApplyUpdateFailureException();
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch.java
new file mode 100644
index 0000000000..333f231e59
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch.java
@@ -0,0 +1,64 @@
+/*
+ * 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.guardian.itests.primaryBackup.nbackups;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.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("primaryNbackups.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.in.read();
+
+ scaDomain.close();
+ }
+}
+
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch2.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch2.java
new file mode 100644
index 0000000000..94767c85dd
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch2.java
@@ -0,0 +1,70 @@
+/*
+ * 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.guardian.itests.primaryBackup.nbackups;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.TestInterface;
+
+public class Launch2 {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("primaryNbackups.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 participant2...");
+ TestInterface t = scaDomain.getService(TestInterface.class, "Participant2");
+ t.forceApplyUpdateFailureException();
+
+ System.in.read();
+
+ System.out.println("Forcing exception ocurrence at participant3...");
+ TestInterface t2 = scaDomain.getService(TestInterface.class, "Participant3");
+ t2.forceApplyUpdateFailureException();
+
+ System.in.read();
+
+ scaDomain.close();
+ }
+}
+
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch3.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch3.java
new file mode 100644
index 0000000000..83d8c90d79
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/nbackups/Launch3.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2009 douglas.
+ *
+ * Licensed 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.
+ * under the License.
+ */
+
+package org.apache.tuscany.sca.guardian.itests.primaryBackup.nbackups;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.TestInterface;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+/**
+ *
+ * @author douglas
+ */
+public class Launch3 {
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("primaryNbackups.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 participant2...");
+ TestInterface t = scaDomain.getService(TestInterface.class, "Participant2");
+ t.forceApplyUpdateFailureException();
+
+ System.in.read();
+
+ System.out.println("Forcing exception ocurrence at participant1...");
+ TestInterface t2 = scaDomain.getService(TestInterface.class, "Participant1");
+ t2.forcePrimaryServiceFailureException();
+
+ System.in.read();
+
+ scaDomain.close();
+ }
+}
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch.java
new file mode 100644
index 0000000000..66b7d0a18d
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch.java
@@ -0,0 +1,52 @@
+/*
+ * 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.guardian.itests.primaryBackup.simple;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.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("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/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch2.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch2.java
new file mode 100644
index 0000000000..34eedcaa13
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch2.java
@@ -0,0 +1,52 @@
+/*
+ * 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.guardian.itests.primaryBackup.simple;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.Node;
+import org.apache.tuscany.sca.guardian.itests.primaryBackup.common.TestInterface;
+
+public class Launch2 {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("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();
+ }
+}
+
diff --git a/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch3.java b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch3.java
new file mode 100644
index 0000000000..780a8df464
--- /dev/null
+++ b/sandbox/dougsleite/guardian-model/src/test/java/org/apache/tuscany/sca/guardian/itests/primaryBackup/simple/Launch3.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2009 douglas.
+ *
+ * Licensed 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.
+ * under the License.
+ */
+package org.apache.tuscany.sca.guardian.itests.primaryBackup.simple;
+
+import java.io.IOException;
+import org.apache.tuscany.sca.guardian.GuardianGroup;
+import org.apache.tuscany.sca.guardian.GuardianMember;
+import org.apache.tuscany.sca.guardian.GuardianMemberImpl;
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+/**
+ *
+ * @author douglas
+ */
+public class Launch3 {
+
+ public static void main(String... args) throws IOException {
+ SCADomain scaDomain = SCADomain.newInstance("primarybackup-ws.composite");
+
+ System.out.println("Testing...");
+ GuardianGroup c = scaDomain.getService(GuardianGroup.class, "GuardianGroupComponent");
+
+ GuardianMember gm = new GuardianMemberImpl();
+ c.addGuardianMember(gm);
+ //c.enableContext(Context.INIT_CONTEXT);
+
+ System.in.read();
+
+// 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();
+ }
+}