summaryrefslogtreecommitdiffstats
path: root/sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java')
-rw-r--r--sandbox/dougsleite/guardian-model/src/main/java/org/apache/tuscany/sca/guardian/GuardianGroupImpl.java507
1 files changed, 412 insertions, 95 deletions
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 1168f7406c..c8964f2b98 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
@@ -18,15 +18,22 @@
*/
package org.apache.tuscany.sca.guardian;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.policy.resolutiontrees.ResolutionTreesPolicyProcessor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.lang.annotation.Annotation;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
import org.apache.axis2.jaxws.message.util.ResettableReader;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Scope;
@@ -37,9 +44,10 @@ import org.osoa.sca.annotations.Service;
public class GuardianGroupImpl implements GuardianGroup {
private List<GuardianMember> guardianList;
- private ResettableReader reader;
+ private ResettableReader recoveryRulesReader;
private InnerGuardianGroupThread innerThread;
private List<GlobalExceptionInterface> concurrentExList;
+ private Map<String, OMElement> resolutionTreeElements;
public GuardianGroupImpl() {
guardianList = new LinkedList<GuardianMember>();
@@ -52,7 +60,26 @@ public class GuardianGroupImpl implements GuardianGroup {
try {
FileInputStream fileInputStream = new FileInputStream(recoveryRules);
XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
- reader = new ResettableReader(xmlReader);
+ recoveryRulesReader = new ResettableReader(xmlReader);
+ } catch (XMLStreamException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (FileNotFoundException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+
+ @Property(name = "resolution_tree", required = false)
+ public void setResolutionTree(String resolutionTree) {
+
+ try {
+ FileInputStream fileInputStream = new FileInputStream(resolutionTree);
+ XMLStreamReader resolutionTreeReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
+
+ ResolutionTreesPolicyProcessor processor = new ResolutionTreesPolicyProcessor(null, null);
+ resolutionTreeElements = processor.read(resolutionTreeReader).getResolutionTreeElements();
+
+ } catch (ContributionReadException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (XMLStreamException ex) {
Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
} catch (FileNotFoundException ex) {
@@ -76,40 +103,26 @@ public class GuardianGroupImpl implements GuardianGroup {
public synchronized 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
- // 2.1)Invoke the gthrow of the guardian members associated with the participants on participantList
-
concurrentExList.add(ex);
//Sends a message representing the exception to the other guardian members
SuspendException suspendEx = new SuspendException();
+ suspendEx.putSignalingParticipant(ex.getSignalingParticipants().get(0));
+
if (participantList == null) {
for (GuardianMember g : guardianList) {
g.gthrow(suspendEx, null);
}
} else {
for (GuardianMember g : guardianList) {
- if (participantList.contains(g.getParticipantIdentifier())) {
+ if (participantList.contains(g.getParticipantIdentifier()) ||
+ g.getParticipantIdentifier().equals(ex.getSignalingParticipants().get(0))) {
g.gthrow(suspendEx, null);
- //g.gthrow(suspendEx,null); -> g is the signler
}
}
}
-// //3)Once ALL required participants are SUSPENDED (suspended point), invoke the defined Recovery Rules
-// for (GuardianMember g : guardianList) {
-// g.addException(new SuspendException());
-// }
- // 3.1) recovery_rules < signaled exceptions + context information of all participant > target context + exception to raise
-
- //Simpleste Recovery Rule: broadcast the exception for all participants - FIXME: hardcoded
-// for (GuardianMemberImpl g : guardianMembers) {
-// ex.setTargetContext(Context.CURRENT_CONTEXT);
-// g.addException(ex);
-// }
-
- if (!innerThread.isRunning) {
+ if (!innerThread.isRunning()) {
innerThread.setGlobalException(ex);
new Thread(innerThread).start();
}
@@ -145,10 +158,27 @@ public class GuardianGroupImpl implements GuardianGroup {
}
public void run() {
+ isRunning = true;
+
if (ex != null) {
- isRunning = true;
- applyRecoveryRules(ex);
+ //Time window of 10 seconds just for tests
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ }
+
+ try {
+ applyRecoveryRules(ex);
+ } catch (ConcurrentExceptionOcurrenceException ce) {
+ applyConcurrentRecoveryRules();
+ }
+
+ //Clear the concurrent exception list
+ concurrentExList.clear();
+
+ //Set up the participant state to NORMAL
for (GuardianMember gm : guardianList) {
if (gm.getParticipantState() == SUSPENDED_PARTICIPANT_STATE) {
gm.setParticipantState(NORMAL_PARTICIPANT_STATE);
@@ -162,20 +192,20 @@ public class GuardianGroupImpl implements GuardianGroup {
return isRunning;
}
- private void applyRecoveryRules(GlobalExceptionInterface ex) {
- reader.reset();
+ private void applyRecoveryRules(GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException {
+ recoveryRulesReader.reset();
ruleTag(ex);
}
- private void ruleTag(GlobalExceptionInterface ex) {
+ private void ruleTag(GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException {
try {
- while (reader.hasNext()) {
- reader.next();
+ while (recoveryRulesReader.hasNext()) {
+ recoveryRulesReader.next();
//<rule name="" signaled_exception="">
- if (reader.isStartElement() && reader.getLocalName().equals("rule")) {
- for (int i = 0; i < reader.getAttributeCount(); i++) {
+ if (recoveryRulesReader.isStartElement() && recoveryRulesReader.getLocalName().equals(Constants.RULE)) {
+ for (int i = 0; i < recoveryRulesReader.getAttributeCount(); i++) {
//ex == signaled_exception
- if (reader.getAttributeLocalName(i).equals("signaled_exception") && ex.getClass().getName().equals(reader.getAttributeValue(i))) {
+ if (recoveryRulesReader.getAttributeLocalName(i).equals(Constants.SIGNALED_EXCEPTION) && ex.getClass().getName().equals(recoveryRulesReader.getAttributeValue(i))) {
participantExceptionTag(ex);
break;
}
@@ -187,17 +217,23 @@ public class GuardianGroupImpl implements GuardianGroup {
}
}
- private void participantExceptionTag(GlobalExceptionInterface ex) {
+ private void participantExceptionTag(GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException {
List<GuardianMember> gmList;
try {
- while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("rule"))) {
- reader.next();
+ while (recoveryRulesReader.hasNext() && !(recoveryRulesReader.isEndElement() && recoveryRulesReader.getLocalName().equals(Constants.RULE))) {
+ recoveryRulesReader.next();
//<participant match="<REG_EXP> | SIGNALER">
- if (reader.isStartElement() && reader.getLocalName().equals("participant")) {
- String participantMatch = reader.getAttributeValue(0).trim();
+ if (recoveryRulesReader.isStartElement() && recoveryRulesReader.getLocalName().equals(Constants.PARTICIPANT)) {
+ String participantMatch = recoveryRulesReader.getAttributeValue(0).trim();
gmList = getMatchingParticipants(participantMatch, ex);
+ //TESTING--------------------------------------------
+ for (GuardianMember gm : gmList) {
+ System.out.println(gm.getParticipantIdentifier());
+ }
+ //---------------------------------------------------
+
if (!gmList.isEmpty()) {
throwExceptionTag(gmList, ex);
}
@@ -208,7 +244,7 @@ public class GuardianGroupImpl implements GuardianGroup {
}
}
- private void throwExceptionTag(List<GuardianMember> gmList, GlobalExceptionInterface ex) {
+ private void throwExceptionTag(List<GuardianMember> gmList, GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException {
String exceptionClassName;
String targetContextName;
@@ -217,29 +253,29 @@ public class GuardianGroupImpl implements GuardianGroup {
try {
- while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("participant"))) {
- reader.next();
+ while (recoveryRulesReader.hasNext() && !(recoveryRulesReader.isEndElement() && recoveryRulesReader.getLocalName().equals(Constants.PARTICIPANT))) {
+ recoveryRulesReader.next();
//<throw_exception class="<Exception>" target_context="<Context>"/>
- if (reader.isStartElement() && reader.getLocalName().equals("throw_exception")) {
+ if (recoveryRulesReader.isStartElement() && recoveryRulesReader.getLocalName().equals(Constants.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")) {
+ for (int j = 0; j < recoveryRulesReader.getAttributeCount(); j++) {
+ if (recoveryRulesReader.getAttributeLocalName(j).equals(Constants.CLASS)) {
//class value
- exceptionClassName = reader.getAttributeValue(j);
- } else if (reader.getAttributeLocalName(j).equals("target_context")) {
+ exceptionClassName = recoveryRulesReader.getAttributeValue(j);
+ } else if (recoveryRulesReader.getAttributeLocalName(j).equals(Constants.TARGET_CONTEXT)) {
//target_context value
- targetContextName = reader.getAttributeValue(j);
- } else if (reader.getAttributeLocalName(j).equals("min_participant_joined")) {
+ targetContextName = recoveryRulesReader.getAttributeValue(j);
+ } else if (recoveryRulesReader.getAttributeLocalName(j).equals(Constants.MIN_PARTICIPANT_JOINED)) {
//min_participant_joined value
- min_participant_joined = Integer.parseInt(reader.getAttributeValue(j));
+ min_participant_joined = Integer.parseInt(recoveryRulesReader.getAttributeValue(j));
} else {
//max_participant_joined value
- max_participant_joined = Integer.parseInt(reader.getAttributeValue(j));
+ max_participant_joined = Integer.parseInt(recoveryRulesReader.getAttributeValue(j));
}
}
@@ -282,28 +318,22 @@ public class GuardianGroupImpl implements GuardianGroup {
newException.setTargetContext(targetContext);
newException.setSignalingContext(ex.getSignalingContext());
- newException.setSignalingParticipant(ex.getSignalingParticipant());
-
-// //Time window of 10 seconds
-// try {
-// Thread.sleep(10000);
-// } catch (InterruptedException ex1) {
-// Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
-// }
-// //Check concurrent exception existence
-// if (concurrentExList.size() != 1) {
-// applyConcurrentRecoveryRules(concurrentExList);
-// }
+ newException.putSignalingParticipant(ex.getSignalingParticipants().toString());
+
+ //Check concurrent exception existence
+ if (concurrentExList.size() > 1) {
+ throw new ConcurrentExceptionOcurrenceException(concurrentExList.toString());
+ }
//Add the exception to the participants matched
if (index != -1) {
gmList.get(index).addException(newException);
} else if (affectedParticipants != null && affectedParticipants.length() != 0) {
- if (affectedParticipants.toUpperCase().equals("FIRST")) {
+ if (affectedParticipants.toUpperCase().equals(Constants.FIRST)) {
gmList.get(0).addException(newException);
- } else if (affectedParticipants.toUpperCase().equals("LAST")) {
+ } else if (affectedParticipants.toUpperCase().equals(Constants.LAST)) {
gmList.get(gmList.size() - 1).addException(newException);
- } else if (affectedParticipants.toUpperCase().equals("ALL")) {
+ } else if (affectedParticipants.toUpperCase().equals(Constants.ALL)) {
for (GuardianMember gm : gmList) {
gm.addException(newException);
}
@@ -329,11 +359,11 @@ public class GuardianGroupImpl implements GuardianGroup {
private String affectedParticipantsTag() {
String affectedParticipants = null;
try {
- while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName().equals("throw_exception"))) {
- reader.next();
+ while (recoveryRulesReader.hasNext() && !(recoveryRulesReader.isEndElement() && recoveryRulesReader.getLocalName().equals(Constants.THROW_EXCEPTION))) {
+ recoveryRulesReader.next();
//<affected_participants>
- if (reader.isStartElement() && reader.getLocalName().equals("affected_participants")) {
- affectedParticipants = reader.getElementText();
+ if (recoveryRulesReader.isStartElement() && recoveryRulesReader.getLocalName().equals(Constants.AFFECTED_PARTICIPANTS)) {
+ affectedParticipants = recoveryRulesReader.getElementText();
}
}
} catch (XMLStreamException ex) {
@@ -343,43 +373,289 @@ public class GuardianGroupImpl implements GuardianGroup {
return affectedParticipants;
}
- private void applyConcurrentRecoveryRules(List<GlobalExceptionInterface> exceptionList) {
- System.out.println("CONCURRENT RECOVERY RULES!");
- System.out.println("exceptions: "+exceptionList);
- exceptionList.clear();
+ private void applyConcurrentRecoveryRules() {
+
+ boolean concurrentExOcurrence = false;
+ List<GlobalExceptionInterface> copyConcurrentExList;
+ GlobalExceptionInterface resolvedEx;
+
+ do {
+ System.out.println("Concurrent exceptions: " + concurrentExList);
+
+ copyConcurrentExList = new LinkedList(concurrentExList);
+
+ resolvedEx = checkExceptionResolutionTrees(copyConcurrentExList, resolutionTreeElements.values().iterator());
+
+ concurrentExList.clear();
+
+ System.out.println("Resolved Exception: " + resolvedEx);
+ if (resolvedEx != null) {
+ System.out.println("List of participants: " + resolvedEx.getSignalingParticipants());
+ }
+
+ try {
+ //Process the exception list sequentially
+ if (resolvedEx == null) {
+ for (GlobalExceptionInterface ex : copyConcurrentExList) {
+ applyRecoveryRules(ex);
+ }
+ } else {
+ applyRecoveryRules(resolvedEx);
+ }
+
+ } catch (ConcurrentExceptionOcurrenceException exc) {
+ concurrentExOcurrence = true;
+ break;
+ }
+ } while (concurrentExOcurrence);
+ }
+
+ //FIXME: Need to check the exception level
+ private GlobalExceptionInterface checkExceptionResolutionTrees(List<GlobalExceptionInterface> exceptionList, Iterator resolutionTreesElements) {
+
+ OMElement tree;
+ String exceptionLevel = null;
+ GlobalExceptionInterface resolvedEx = null;
+
+ while (resolutionTreesElements.hasNext()) {
+ tree = (OMElement) resolutionTreesElements.next();
+ exceptionLevel = tree.getAttributeValue(Constants.EXCEPTION_LEVEL_QNAME);
+
+ resolvedEx = checkExceptionResolutionTree(exceptionList, tree.getChildElements(), new WrapperInteger(exceptionList.size()));
+
+ if (resolvedEx != null) {
+ break;
+ }
+ }
+
+ return resolvedEx;
+ }
+
+ //Search for the root of the smallest subtree that contains all the concurrently signaled exceptions. If not found, return null.
+ //FIXME: Check for equal exception classes on the tree
+ //FIXME: Implement the Lowest common ancestor algorithm
+ private GlobalExceptionInterface checkExceptionResolutionTree(List<GlobalExceptionInterface> exceptionList, Iterator elements, WrapperInteger currentListSize) {
+
+ OMElement el;
+ OMAttribute at;
+ String exClass = null;
+ GlobalExceptionInterface resolvedEx = null;
+ boolean isLeaf = false;
+
+ while (elements.hasNext()) {
+ el = (OMElement) elements.next();
+
+ //<exception class="">
+ if (el.getLocalName().equals(Constants.EXCEPTION)) {
+
+ Iterator it = el.getAllAttributes();
+ while (it.hasNext()) {
+ at = (OMAttribute) it.next();
+ if (at.getLocalName().equals(Constants.CLASS)) {
+ exClass = at.getAttributeValue();
+ }
+ }
+
+ try {
+ for (GlobalExceptionInterface ex : exceptionList) {
+ if (Class.forName(exClass).equals(ex.getClass())) {
+ currentListSize.decrement();
+ break;
+ }
+ }
+
+ } catch (ClassNotFoundException ex1) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex1);
+ }
+
+ Iterator children = el.getChildElements();
+ if (children.hasNext()) {
+ resolvedEx = checkExceptionResolutionTree(exceptionList, children, currentListSize);
+ } else {
+ isLeaf = true;
+ }
+ }
+ }
+
+ if (resolvedEx == null && currentListSize.getValue() == 0 && !isLeaf) {
+ Class exceptionClass;
+
+ try {
+ exceptionClass = Class.forName(exClass);
+ resolvedEx = (GlobalException) exceptionClass.newInstance();
+
+ for (GlobalExceptionInterface ex : exceptionList) {
+ resolvedEx.putSignalingParticipant(ex.getSignalingParticipants().get(0));
+ }
+
+ } catch (InstantiationException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (IllegalAccessException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (ClassNotFoundException ex) {
+ Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ return resolvedEx;
}
private List<GuardianMember> getMatchingParticipants(String regularExpression, GlobalExceptionInterface signaledException) {
List<GuardianMember> matchingParticipants = new LinkedList();
+ String[] splitByComma = regularExpression.split(",");
- if (regularExpression.toUpperCase().equals("SIGNALER")) {
- for (GuardianMember gm : guardianList) {
- if (gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
- matchingParticipants.add(gm);
+ //Invalid regular expression
+ if (splitByComma.length > 2) {
+ throw new InvalidRegularExpression("The comma ',' operator can only be applied for two expressions");
+ }
+
+ //There is no comma on the regular expression
+ if (splitByComma.length == 1) {
+
+ if (regularExpression.toUpperCase().equals("SIGNALER")) {
+ for (GuardianMember gm : guardianList) {
+ if (signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+
+ /*//All concurrent signaler were found
+ if (matchingParticipants.size() == signaledException.getSignalingParticipants().size()) {
break;
+ }*/
+ }
+ } else if (regularExpression.toUpperCase().equals("!SIGNALER")) {
+ for (GuardianMember gm : guardianList) {
+ if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ //if (!gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
+ matchingParticipants.add(gm);
+ }
+ }
+
+ } else {
+ //Create an java regular expression
+ String re = createJavaRegularExpression(regularExpression);
+
+ for (GuardianMember gm : guardianList) {
+ if (gm.getParticipantIdentifier().matches(re)) {
+ matchingParticipants.add(gm);
+ }
}
}
- } else if (regularExpression.toUpperCase().equals("!SIGNALER")) {
- for (GuardianMember gm : guardianList) {
- if (!gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
- matchingParticipants.add(gm);
+
+ } //There is comma on the regular expression
+ else {
+
+ String element;
+ int index = -1;
+ for (int i = 0; i < splitByComma.length; i++) {
+ element = splitByComma[i].toUpperCase();
+ if (element.equals("SIGNALER") || element.equals("!SIGNALER")) {
+ if (index == -1) {
+ index = i;
+ } else {
+ index = -1;
+ }
}
}
- } else {
- //Create an java regular expression
- String re = createJavaRegularExpression(regularExpression);
+ //Invalid expression
+ if (index == -1) {
+ throw new InvalidRegularExpression("The comma ',' requires a SIGNALER or !SIGNALER element in one side of the expression");
+ }
+
+ String re = createJavaRegularExpression(splitByComma[1 - index]);
for (GuardianMember gm : guardianList) {
+
+ //Test if the participant matches with the regular expression
if (gm.getParticipantIdentifier().matches(re)) {
- matchingParticipants.add(gm);
+
+ //Test if the participant is Signaler
+ if (splitByComma[index].toUpperCase().equals("SIGNALER")) {
+
+ if (signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+
+ /*//All concurrent signaler were found
+ if (matchingParticipants.size() == signaledException.getSignalingParticipants().size()) {
+ break;
+ }*/
+
+// //ConcurrentGlobalException: there are more than one signaler
+// if (signaledException instanceof ConcurrentGlobalException) {
+// List<String> signalingPartcipants = ((ConcurrentGlobalException) signaledException).getSignalingParticipants();
+//
+// if (signalingPartcipants.contains(gm.getParticipantIdentifier())) {
+// matchingParticipants.add(gm);
+// count++;
+// }
+//
+// //All concurrent signaler were found
+// if (count == signalingPartcipants.size()) {
+// break;
+// }
+//
+// } else if (gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
+// matchingParticipants.add(gm);
+// break;
+// }
+ } //Test if the participant is not Signaler
+ else {
+ if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) {
+ matchingParticipants.add(gm);
+ }
+
+// //ConcurrentGlobalException: there are more than one signaler
+// if (signaledException instanceof ConcurrentGlobalException) {
+// List<String> signalingPartcipants = ((ConcurrentGlobalException) signaledException).getSignalingParticipants();
+//
+// if (!(signalingPartcipants.contains(gm.getParticipantIdentifier()))) {
+// matchingParticipants.add(gm);
+// }
+//
+// } else if (!gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
+// matchingParticipants.add(gm);
+// }
+ }
}
}
+
}
return matchingParticipants;
}
+// private List<GuardianMember> getMatchingParticipantsOriginal(String regularExpression, GlobalExceptionInterface signaledException) {
+// List<GuardianMember> matchingParticipants = new LinkedList();
+//
+// if (regularExpression.toUpperCase().equals("SIGNALER")) {
+// for (GuardianMember gm : guardianList) {
+// if (gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
+// matchingParticipants.add(gm);
+// break;
+// }
+// }
+// } else if (regularExpression.toUpperCase().equals("!SIGNALER")) {
+// for (GuardianMember gm : guardianList) {
+// if (!gm.getParticipantIdentifier().equals(signaledException.getSignalingParticipant())) {
+// matchingParticipants.add(gm);
+// }
+// }
+//
+// } else {
+// //Create an java regular expression
+// String re = createJavaRegularExpression(regularExpression);
+//
+// for (GuardianMember gm : guardianList) {
+// if (gm.getParticipantIdentifier().matches(re)) {
+// matchingParticipants.add(gm);
+// }
+// }
+// }
+//
+// return matchingParticipants;
+// }
+
/* Valid expressions: *, <Context>.*, <Context>, *.<Context>, *.<Context>.*,
* *.<Context>.*.<Context>.*, <REG_EXP> || <REG_EXP>
*
@@ -390,34 +666,34 @@ public class GuardianGroupImpl implements GuardianGroup {
private String createJavaRegularExpression(String regularExpression) throws InvalidRegularExpression {
StringBuffer re = new StringBuffer();
- String[] splitedByBar = regularExpression.split("\\|\\|");
- String[] splitedByPeriod;
+ String[] splitByBar = regularExpression.split("\\|\\|");
+ String[] splitByPeriod;
- for (int i = 0; i < splitedByBar.length; i++) {
+ for (int i = 0; i < splitByBar.length; i++) {
- splitedByPeriod = splitedByBar[i].split("\\.");
+ splitByPeriod = splitByBar[i].split("\\.");
if (i > 0) {
re.append("|");
}
re.append("^");
- for (int j = 0; j < splitedByPeriod.length; j++) {
+ for (int j = 0; j < splitByPeriod.length; j++) {
//*
- if (splitedByPeriod[j].equals("*")) {
+ if (splitByPeriod[j].equals("*")) {
//Validate the regular expression
- if (j + 1 != splitedByPeriod.length && splitedByPeriod[j + 1].equals("*")) {
+ if (j + 1 != splitByPeriod.length && splitByPeriod[j + 1].equals("*")) {
throw new InvalidRegularExpression();
}
//*
- if (splitedByPeriod.length == 1) {
+ if (splitByPeriod.length == 1) {
re.append("(\\w+)");
} //*.<CONTEXT>
- if (j == 0 && splitedByPeriod.length != 1) {
+ if (j == 0 && splitByPeriod.length != 1) {
re.append("(\\w+\\");
re.append(".)*");
} //<CONTEXT>.*
@@ -434,15 +710,15 @@ public class GuardianGroupImpl implements GuardianGroup {
// }
//<CONTEXT> || <CONTEXT>.<CONTEXT>.<CONTEXT> || *.<CONTEXT>
- if (splitedByPeriod.length == 1) {
+ if (splitByPeriod.length == 1) {
re.append("(\\w+\\");
re.append(".)*");
}
if (j == 0 || j - 1 == 0) {
- re.append("(" + splitedByPeriod[j] + ")");
+ re.append("(" + splitByPeriod[j] + ")");
} else {
- re.append("(\\." + splitedByPeriod[j] + ")");
+ re.append("(\\." + splitByPeriod[j] + ")");
}
}
}
@@ -451,4 +727,45 @@ public class GuardianGroupImpl implements GuardianGroup {
return re.toString();
}
}
+
+ private class WrapperInteger {
+
+ private int value;
+
+ public WrapperInteger() {
+ }
+
+ public WrapperInteger(int value) {
+ this.value = value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return this.value;
+ }
+
+ public int increment() {
+ return ++value;
+ }
+
+ public int increment(int amount) {
+ return value += amount;
+ }
+
+ public int decrement() {
+ return --value;
+ }
+
+ public int decrement(int amount) {
+ return value -= value;
+ }
+
+ @Override
+ public String toString() {
+ return Integer.toString(value);
+ }
+ }
}