diff options
Diffstat (limited to 'sandbox/dougsleite/guardian-model/src/main/java/org/apache')
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(); |