diff options
author | dougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68> | 2009-07-06 12:41:48 +0000 |
---|---|---|
committer | dougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68> | 2009-07-06 12:41:48 +0000 |
commit | f1dfba0cc9000fcf881267608c02b683dcf2f796 (patch) | |
tree | d7653d10bdec1ab0b404fd92092f8c8aef0c3b01 /sandbox/dougsleite/guardian-model/src | |
parent | 6c479469ad629e1bc05e1e2eb4114941b4405f5a (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/src')
28 files changed, 1470 insertions, 36 deletions
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(); + } +} |