summaryrefslogtreecommitdiffstats
path: root/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian')
-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
8 files changed, 353 insertions, 28 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();