diff options
author | dougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68> | 2009-09-28 14:37:58 +0000 |
---|---|---|
committer | dougsleite <dougsleite@13f79535-47bb-0310-9956-ffa450edef68> | 2009-09-28 14:37:58 +0000 |
commit | f4f96f8c8ec04e4c1709d3037e57589145be12fa (patch) | |
tree | a8bf81061fdc2af53fae50eebf063bd1ecfdc854 /sandbox/dougsleite/implementation-guardian/src | |
parent | 215c005bde88752999978adce56b09d2a90a13b7 (diff) |
- Changing the guardian-model, policy-recoveryrules, policy-resolutiontrees to a new module: implementation-guardian;
- The new module creates a new kind of implementation (implementation.guardian)
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@819561 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sandbox/dougsleite/implementation-guardian/src')
58 files changed, 4080 insertions, 0 deletions
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java new file mode 100644 index 0000000000..1bb1066435 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/BlockingInterface.java @@ -0,0 +1,31 @@ +/* + * 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.implementation.guardian; + +@Deprecated +public interface BlockingInterface { + + //@OneWay + public void block(); + + //@OneWay + public void unblock(); + + public boolean isBlocked(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java new file mode 100644 index 0000000000..2775699843 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroup.java @@ -0,0 +1,29 @@ +/* + * 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.implementation.guardian; + +public interface GuardianGroup extends GuardianPrimitives { + + public static int NORMAL_PARTICIPANT_STATE = 0; + public static int SUSPENDED_PARTICIPANT_STATE = 1; + + public void addGuardianMember(GuardianMember guardianMember); + + public boolean removeGuardianMember(GuardianMember guardianMember); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java new file mode 100644 index 0000000000..cb7495f9e4 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementation.java @@ -0,0 +1,29 @@ +/* + * 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.implementation.guardian; + +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.Implementation; + +public interface GuardianGroupImplementation extends Implementation { + + public void setGuardianProperties(OMElement guardianProperties); + + public OMElement getGuardianProperties(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.java new file mode 100644 index 0000000000..d0758753b3 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianGroupImplementationFactory.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.implementation.guardian; + +public interface GuardianGroupImplementationFactory { + + public GuardianGroupImplementation createGuardianGroupImplementation(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java new file mode 100644 index 0000000000..b82bf082b1 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianMember.java @@ -0,0 +1,37 @@ +/* + * 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.implementation.guardian; + +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public interface GuardianMember extends GuardianPrimitives { + + public void addException(GlobalException ex); + + public Context getCurrentContext(); + + public String getParticipantIdentifier(); + + public void setUniqueParticipantID(int id); + + public int getParticipantState(); + + public void setParticipantState(int state); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java new file mode 100644 index 0000000000..c50e855d30 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/GuardianPrimitives.java @@ -0,0 +1,41 @@ +/* + * 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.implementation.guardian; + +import java.util.List; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface; + +//@Remotable +public interface GuardianPrimitives { + + //Methods to manage contexts + public void enableContext(Context context); + + public void removeContext(); + + //Methods to control the signaling of exceptions + public void gthrow(GlobalExceptionInterface ex, List<String> participantList); + + public boolean propagate(GlobalExceptionInterface ex); + + //Method to check pending global exceptions + public void checkExceptionStatus() throws GlobalException; +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java new file mode 100644 index 0000000000..4757615c21 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/RecoveryRules.java @@ -0,0 +1,32 @@ +/* + * 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.implementation.guardian; + +import java.util.Map; +import javax.xml.namespace.QName; +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.xml.Constants; + +public interface RecoveryRules { + + public static final QName RECOVERY_RULES_POLICY_QNAME = + new QName(Constants.SCA10_TUSCANY_NS, org.apache.tuscany.sca.implementation.guardian.common.Constants.RECOVERY_RULES); + + public Map<String, OMElement> getRuleElements(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java new file mode 100644 index 0000000000..d35deff75a --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/ResolutionTrees.java @@ -0,0 +1,32 @@ +/* + * 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.implementation.guardian; + +import java.util.Map; +import javax.xml.namespace.QName; +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.xml.Constants; + +public interface ResolutionTrees { + + public static final QName RESOLUTION_TREES_POLICY_QNAME = + new QName(Constants.SCA10_TUSCANY_NS, org.apache.tuscany.sca.implementation.guardian.common.Constants.RESOLUTION_TREES); + + public Map<String, OMElement> getResolutionTreeElements(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java new file mode 100644 index 0000000000..4bfe1320b4 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ConcurrentExceptionOcurrenceException.java @@ -0,0 +1,38 @@ +/* + * 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.implementation.guardian.common; + +public class ConcurrentExceptionOcurrenceException extends Exception { + + public ConcurrentExceptionOcurrenceException() { + super(); + } + + public ConcurrentExceptionOcurrenceException(String message) { + super(message); + } + + public ConcurrentExceptionOcurrenceException(String message, Throwable cause) { + super(message, cause); + } + + public ConcurrentExceptionOcurrenceException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java new file mode 100644 index 0000000000..cf5d56179d --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Constants.java @@ -0,0 +1,82 @@ +/* + * 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.implementation.guardian.common; + +import javax.xml.namespace.QName; + +public interface Constants { + + String RECOVERY_RULES = "recovery_rules"; + QName RECOVERY_RULES_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RECOVERY_RULES); + + String RULE = "rule"; + QName RULE_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RULE); + + String NAME = "name"; + QName NAME_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, NAME); + + String SIGNALED_EXCEPTION = "signaled_exception"; + QName SIGNALED_EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, SIGNALED_EXCEPTION); + + String PARTICIPANT = "participant"; + QName PARTICIPANT_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, PARTICIPANT); + + String MATCH = "match"; + QName MATCH_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MATCH); + + String THROW_EXCEPTION = "throw_exception"; + QName THROW_EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, THROW_EXCEPTION); + + String CLASS = "class"; + QName CLASS_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, CLASS); + + String TARGET_CONTEXT = "target_context"; + QName TARGET_CONTEXT_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, TARGET_CONTEXT); + + String MIN_PARTICIPANT_JOINED = "min_participant_joined"; + QName MIN_PARTICIPANT_JOINED_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MIN_PARTICIPANT_JOINED); + + String MAX_PARTICIPANT_JOINED = "max_participant_joined"; + QName MAX_PARTICIPANT_JOINED_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, MAX_PARTICIPANT_JOINED); + + String AFFECTED_PARTICIPANTS = "affected_participants"; + QName AFFECTED_PARTICIPANTS_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, AFFECTED_PARTICIPANTS); + + String FIRST = "FIRST"; + QName FIRST_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, FIRST); + + String LAST = "LAST"; + QName LAST_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, LAST); + + String ALL = "ALL"; + QName ALL_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, ALL); + + String RESOLUTION_TREE = "resolution_tree"; + QName RESOLUTION_TREE_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RESOLUTION_TREE); + + String RESOLUTION_TREES = "resolution_trees"; + QName RESOLUTION_TREES_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, RESOLUTION_TREES); + + String EXCEPTION_LEVEL = "exception_level"; + QName EXCEPTION_LEVEL_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, EXCEPTION_LEVEL); + + String EXCEPTION = "exception"; + QName EXCEPTION_QNAME = new QName(org.apache.tuscany.sca.assembly.xml.Constants.SCA10_TUSCANY_NS, EXCEPTION); + +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java new file mode 100644 index 0000000000..95c6f3bed6 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/Context.java @@ -0,0 +1,79 @@ +/* + * 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.implementation.guardian.common; + +import java.util.LinkedList; +import java.util.List; + +public class Context { + + public static Context CURRENT_CONTEXT = new Context("CURRENT_CONTEXT"); + public static Context INIT_CONTEXT = new Context("INIT_CONTEXT"); + public static Context GUARDIAN_CONTEXT = new Context("GUARDIAN_CONTEXT"); + + private String name; + private List<Class<? extends GlobalException>> exceptionList; + + public Context() { + this(null); + } + + public Context(String name) { + this(name, new LinkedList<Class<? extends GlobalException>>()); + } + + public Context(String name, List<Class<? extends GlobalException>> exceptionList) { + this.name = name; + this.exceptionList = exceptionList; + } + + public void addException(Class<? extends GlobalException> ex) { + this.exceptionList.add(ex); + } + + public void setExceptionList(List<Class<? extends GlobalException>> exceptionList) { + this.exceptionList = exceptionList; + } + + public List<Class<? extends GlobalException>> getExceptionList() { + return this.exceptionList; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object obj) { + return (obj instanceof Context && + (((Context) obj).getName().equals(this.getName()) || + this == Context.CURRENT_CONTEXT || + ((Context) obj) == Context.CURRENT_CONTEXT)); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java new file mode 100644 index 0000000000..022fe1a5f8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalException.java @@ -0,0 +1,85 @@ +/* + * 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.implementation.guardian.common; + +import java.util.LinkedList; +import java.util.List; + +public class GlobalException extends RuntimeException implements GlobalExceptionInterface { + + private List<String> signalingParticipants; + private Context signalingContext; + private Context targetContext; + + public GlobalException() { + super(); + signalingParticipants = new LinkedList<String>(); + } + + public GlobalException(String message) { + super(message); + signalingParticipants = new LinkedList<String>(); + } + + public GlobalException(String message, Throwable cause) { + super(message, cause); + signalingParticipants = new LinkedList<String>(); + } + + public GlobalException(Throwable cause) { + super(cause); + signalingParticipants = new LinkedList<String>(); + } + + /** + * @return the signalingContext + */ + public Context getSignalingContext() { + return signalingContext; + } + + /** + * @param signalingContext the signalingContext to set + */ + public void setSignalingContext(Context signalingContext) { + this.signalingContext = signalingContext; + } + + /** + * @return the targetContext + */ + public Context getTargetContext() { + return targetContext; + } + + /** + * @param targetContext the targetContext to set + */ + public void setTargetContext(Context targetContext) { + this.targetContext = targetContext; + } + + public void putSignalingParticipant(String participant) { + signalingParticipants.add(participant); + } + + public List<String> getSignalingParticipants() { + return signalingParticipants; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java new file mode 100644 index 0000000000..450d4ae18b --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/GlobalExceptionInterface.java @@ -0,0 +1,54 @@ +/* + * 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.implementation.guardian.common; + +import java.util.List; + +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 List<String> getSignalingParticipants(); + + /** + * @param signalingProcess the signalingProcess to set + */ + public void putSignalingParticipant(String participant); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java new file mode 100644 index 0000000000..ed85661dbf --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidNodeException.java @@ -0,0 +1,30 @@ +/* + * 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.implementation.guardian.common; + +public class InvalidNodeException extends RuntimeException { + + public InvalidNodeException() { + super(); + } + + public InvalidNodeException(String message) { + super(message); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java new file mode 100644 index 0000000000..99aa027fb8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/InvalidRegularExpressionException.java @@ -0,0 +1,30 @@ +/* + * 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.implementation.guardian.common; + +public class InvalidRegularExpressionException extends RuntimeException { + + public InvalidRegularExpressionException() { + super(); + } + + public InvalidRegularExpressionException(String message) { + super(message); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java new file mode 100644 index 0000000000..890b8704ee --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/JoinException.java @@ -0,0 +1,39 @@ +/* + * 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.implementation.guardian.common; + +public class JoinException extends GlobalException { + + public JoinException() { + super(); + } + + public JoinException(String message) { + super(message); + } + + public JoinException(String message, Throwable cause) { + super(message, cause); + } + + public JoinException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java new file mode 100644 index 0000000000..9684de22ad --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/LeaveException.java @@ -0,0 +1,38 @@ +/* + * 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.implementation.guardian.common; + +public class LeaveException extends GlobalException { + + public LeaveException() { + super(); + } + + public LeaveException(String message) { + super(message); + } + + public LeaveException(String message, Throwable cause) { + super(message, cause); + } + + public LeaveException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java new file mode 100644 index 0000000000..fbf147285e --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/ResolutionTreeUtils.java @@ -0,0 +1,153 @@ +/* + * 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.implementation.guardian.common; + +import java.util.Collections; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import org.apache.axiom.om.OMAttribute; +import org.apache.axiom.om.OMElement; + +public class ResolutionTreeUtils { + + //E: Euler tour of the tree obtained by listing the nodes visited in a depth first search of the tree starting from the root. Contains 2n-1 elements + private List<String> eulerTour; + //L: Array of level numbers such that L[i] contains the tree-depth of the node E[i]. Contains 2n-1 elements + private List<Integer> levels; + //R: Map of size n such that R<K> contains the index of the first ocurrence of node 'K' in E + private Map<String, Integer> rMap; + private OMElement root; + private int treeSize; + + public ResolutionTreeUtils() { + init(null); + } + + public ResolutionTreeUtils(OMElement root) { + init(root); + } + + public void setRoot(OMElement root) { + init(root); + } + + public List<String> getEulerTourDepthFirstSearch() { + + if (root == null) { + throw new NullPointerException("The root musn't be null"); + } + + if (eulerTour == null) { + eulerTour = new LinkedList<String>(); + levels = new LinkedList<Integer>(); + + eulerTourDFSRecursive(root, 0); + } + + return eulerTour; + } + + public String getLowestCommonAncestor(String node1, String node2) { + String lca = null; + Integer indexNode1, indexNode2; + + Map<String, Integer> r = getRMap(); + + indexNode1 = r.get(node1); + indexNode2 = r.get(node2); + + //Check nodes existence + if (indexNode1 == null && indexNode2 == null) { + throw new InvalidNodeException("Could not find the specified nodes: " + node1 + " and " + node2); + } else if (indexNode1 == null) { + throw new InvalidNodeException("Could not find the specified nodes: " + node1); + } else if (indexNode2 == null) { + throw new InvalidNodeException("Could not find the specified nodes: " + node2); + } + + int indexLCA; + if (indexNode1 < indexNode2) { + indexLCA = getRangeMinimumQuery(levels, indexNode1, indexNode2); + } else { + indexLCA = getRangeMinimumQuery(levels, indexNode2, indexNode1); + } + + lca = eulerTour.get(indexLCA); + + return lca; + } + + //Get the index of the smallest element between beginIndex and endIndex (both inclusive) in the list + private int getRangeMinimumQuery(List list, int beginIndex, int endIndex) { + + List sublist = list.subList(beginIndex, endIndex + 1); + + Object elem = Collections.min(sublist); + + return sublist.indexOf(elem) + beginIndex; + } + + private void init(OMElement root) { + this.root = root; + eulerTour = null; + levels = null; + rMap = null; + treeSize = 0; + } + + private void eulerTourDFSRecursive(OMElement node, int level) { + String classAttribute = ((OMAttribute) node.getAllAttributes().next()).getAttributeValue(); + eulerTour.add(classAttribute); + + levels.add(level); + treeSize++; + + Iterator children = node.getChildElements(); + + OMElement child; + while (children.hasNext()) { + child = (OMElement) children.next(); + eulerTourDFSRecursive(child, level + 1); + eulerTour.add(classAttribute); + levels.add(level); + } + } + + private Map<String, Integer> getRMap() { + if (rMap == null) { + rMap = new Hashtable<String, Integer>(); + + List<String> tour = getEulerTourDepthFirstSearch(); + for (int i = 0; i < tour.size(); i++) { + String key = tour.get(i); + if (!rMap.containsKey(key)) { + rMap.put(key, i); + } + + if (rMap.size() == treeSize) { + break; + } + } + } + return rMap; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java new file mode 100644 index 0000000000..5ce2f5afd9 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/SuspendException.java @@ -0,0 +1,38 @@ +/* + * 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.implementation.guardian.common; + +public class SuspendException extends GlobalException { + + public SuspendException() { + super(); + } + + public SuspendException(String message) { + super(message); + } + + public SuspendException(String message, Throwable cause) { + super(message, cause); + } + + public SuspendException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java new file mode 100644 index 0000000000..a8f9cdfad6 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/common/UnhandledException.java @@ -0,0 +1,38 @@ +/* + * 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.implementation.guardian.common; + +public class UnhandledException extends GlobalException { + + public UnhandledException() { + super(); + } + + public UnhandledException(String message) { + super(message); + } + + public UnhandledException(String message, Throwable cause) { + super(message, cause); + } + + public UnhandledException(Throwable cause) { + super(cause); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java new file mode 100644 index 0000000000..5a243560e3 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImpl.java @@ -0,0 +1,644 @@ +/* + * 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.implementation.guardian.impl; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +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.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.implementation.guardian.common.InvalidRegularExpressionException; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroup; +import org.apache.tuscany.sca.implementation.guardian.GuardianMember; +import org.apache.tuscany.sca.implementation.guardian.common.ConcurrentExceptionOcurrenceException; +import org.apache.tuscany.sca.implementation.guardian.common.Constants; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface; +import org.apache.tuscany.sca.implementation.guardian.common.InvalidNodeException; +import org.apache.tuscany.sca.implementation.guardian.common.ResolutionTreeUtils; +import org.apache.tuscany.sca.implementation.guardian.common.SuspendException; +import org.apache.tuscany.sca.implementation.guardian.xml.RecoveryRulesProcessor; +import org.apache.tuscany.sca.implementation.guardian.xml.ResolutionTreesProcessor; + +public class GuardianGroupImpl implements GuardianGroup { + + private List<GuardianMember> guardianList; + private InnerGuardianGroupThread innerThread; + private List<GlobalExceptionInterface> concurrentExList; + private Map<String, OMElement> resolutionTreeElements; + private ResolutionTreeUtils resolutionTreeUtils; + private Map<String, OMElement> ruleElements; + + public GuardianGroupImpl(String recoveryRules, String resolutionTrees) { + guardianList = new LinkedList<GuardianMember>(); + concurrentExList = new LinkedList<GlobalExceptionInterface>(); + innerThread = new InnerGuardianGroupThread(); + resolutionTreeUtils = new ResolutionTreeUtils(); + + setRecoveryRules(recoveryRules); + setResolutionTree(resolutionTrees); + } + + private void setRecoveryRules(String recoveryRules) { + try { + FileInputStream fileInputStream = new FileInputStream(recoveryRules); + XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream); + + RecoveryRulesProcessor processor = new RecoveryRulesProcessor(); + ruleElements = processor.read(xmlReader).getRuleElements(); + + } 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) { + Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void setResolutionTree(String resolutionTree) { + + try { + FileInputStream fileInputStream = new FileInputStream(resolutionTree); + XMLStreamReader resolutionTreeReader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream); + + ResolutionTreesProcessor processor = new ResolutionTreesProcessor(); + 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) { + Logger.getLogger(GuardianGroupImpl.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void addGuardianMember(GuardianMember guardianMember) { + guardianList.add(guardianMember); + guardianMember.setUniqueParticipantID(guardianList.size() - 1); + } + + public boolean removeGuardianMember(GuardianMember guardianMember) { + throw new UnsupportedOperationException("Not supported yet."); + } + + public void enableContext(Context context) { + throw new UnsupportedOperationException("Not supported yet."); + } + + public void removeContext() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public synchronized void gthrow(GlobalExceptionInterface ex, List<String> 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()) || + g.getParticipantIdentifier().equals(ex.getSignalingParticipants().get(0))) { + g.gthrow(suspendEx, null); + } + } + } + + if (!innerThread.isRunning()) { + innerThread.setGlobalException(ex); + new Thread(innerThread).start(); + } + + } + + public boolean propagate(GlobalExceptionInterface ex) { + throw new UnsupportedOperationException("Not supported yet."); + } + + public void checkExceptionStatus() { + throw new UnsupportedOperationException("Not supported yet."); + } + + private class InnerGuardianGroupThread implements Runnable { + + private boolean isRunning; + private GlobalExceptionInterface ex = null; + + public InnerGuardianGroupThread() { + isRunning = false; + } + + public void setGlobalException(GlobalExceptionInterface ex) { + this.ex = ex; + } + + public GlobalExceptionInterface getGlobalException() { + return ex; + } + + public void run() { + isRunning = true; + + if (ex != null) { + + //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); + } + } + } + isRunning = false; + } + + public boolean isRunning() { + return isRunning; + } + + private void applyRecoveryRules(GlobalExceptionInterface ex) throws ConcurrentExceptionOcurrenceException { + ruleTag(ex, ruleElements.values().iterator()); + } + + private void ruleTag(GlobalExceptionInterface ex, Iterator<OMElement> ruleElements) throws ConcurrentExceptionOcurrenceException { + String signaledException; + String exceptionName; + + OMElement rule; + while (ruleElements.hasNext()) { + + rule = ruleElements.next(); + signaledException = getAttributeValue(rule, Constants.SIGNALED_EXCEPTION); + exceptionName = ex.getClass().getName(); + + if (signaledException.equals(exceptionName)) { + participantExceptionTag(ex, rule.getChildElements()); + break; + } + } + } + + private void participantExceptionTag(GlobalExceptionInterface ex, Iterator<OMElement> participantElements) throws ConcurrentExceptionOcurrenceException { + String matchParticipant; + List<GuardianMember> gmList; + + OMElement participant; + while (participantElements.hasNext()) { + participant = participantElements.next(); + + matchParticipant = getAttributeValue(participant, Constants.MATCH); + gmList = getMatchingParticipants(matchParticipant, ex); + + if (!gmList.isEmpty()) { + throwExceptionTag(gmList, ex, participant.getChildElements()); + } + } + } + + private void throwExceptionTag(List<GuardianMember> gmList, GlobalExceptionInterface ex, Iterator<OMElement> throwExceptionElements) throws ConcurrentExceptionOcurrenceException { + String className; + String targetContextName; + Integer minParticipantJoined; + Integer maxParticipantJoined; + + OMElement throwException; + while (throwExceptionElements.hasNext()) { + + throwException = throwExceptionElements.next(); + + className = getAttributeValue(throwException, Constants.CLASS); + targetContextName = getAttributeValue(throwException, Constants.TARGET_CONTEXT); + + try { + minParticipantJoined = Integer.parseInt(getAttributeValue(throwException, Constants.MIN_PARTICIPANT_JOINED)); + } catch (NumberFormatException nex) { + minParticipantJoined = null; + } + + try { + maxParticipantJoined = Integer.parseInt(getAttributeValue(throwException, Constants.MAX_PARTICIPANT_JOINED)); + } catch (NumberFormatException nexc) { + maxParticipantJoined = null; + } + + //Test the min and max joined participants condition + if (minParticipantJoined != null && maxParticipantJoined != null) { + if (!(guardianList.size() >= minParticipantJoined && guardianList.size() < maxParticipantJoined)) { + break; + } + } else if (minParticipantJoined != null) { + if (!(guardianList.size() >= minParticipantJoined)) { + break; + } + } else if (minParticipantJoined != null) { + if (!(guardianList.size() >= minParticipantJoined)) { + break; + } + } + + //<affected_participants> + String affectedParticipants = affectedParticipantsTag(throwException.getChildElements()); + int index = -1; + + //Verify if the parameter is an index + try { + index = Integer.parseInt(affectedParticipants); + } catch (NumberFormatException nexc) { + index = -1; + } + + //Create the new exception instance + Class exceptionClass; + try { + exceptionClass = Class.forName(className); + + 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.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(Constants.FIRST)) { + gmList.get(0).addException(newException); + } else if (affectedParticipants.toUpperCase().equals(Constants.LAST)) { + gmList.get(gmList.size() - 1).addException(newException); + } else if (affectedParticipants.toUpperCase().equals(Constants.ALL)) { + for (GuardianMember gm : gmList) { + gm.addException(newException); + } + } + } else { + for (GuardianMember gm : gmList) { + gm.addException(newException); + } + } + + } 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(Iterator<OMElement> affectedParticipantElements) { + + String affectedParticipantValue = null; + + OMElement affectedParticipant; + while (affectedParticipantElements.hasNext()) { + + affectedParticipant = affectedParticipantElements.next(); + affectedParticipantValue = affectedParticipant.getText(); + } + + if (affectedParticipantValue != null && affectedParticipantValue.length() == 0) { + affectedParticipantValue = null; + } + + return affectedParticipantValue; + } + + private String getAttributeValue(OMElement element, String attributeName) { + OMAttribute at; + Iterator it = element.getAllAttributes(); + + while (it.hasNext()) { + at = (OMAttribute) it.next(); + if (at.getLocalName().equals(attributeName)) { + return at.getAttributeValue(); + } + } + + return null; + } + + 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; + OMElement root; + String exceptionLevel = null; + GlobalExceptionInterface resolvedEx = null; + + while (resolutionTreesElements.hasNext()) { + tree = (OMElement) resolutionTreesElements.next(); + exceptionLevel = tree.getAttributeValue(Constants.EXCEPTION_LEVEL_QNAME); + + root = (OMElement) tree.getChildElements().next(); + resolvedEx = checkExceptionResolutionTree(exceptionList, root); + + 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. + private GlobalExceptionInterface checkExceptionResolutionTree(List<GlobalExceptionInterface> exceptionList, OMElement rootTree) { + + resolutionTreeUtils.setRoot(rootTree); + String ex1, ex2; + GlobalExceptionInterface resolvedEx = null; + + ex1 = exceptionList.get(0).getClass().getName(); + for (int i = 1; i < exceptionList.size(); i++) { + ex2 = exceptionList.get(i).getClass().getName(); + + try { + ex1 = resolutionTreeUtils.getLowestCommonAncestor(ex1, ex2); + } catch (InvalidNodeException invalidNodeException) { + ex1 = null; + break; + } + } + + if (ex1 != null) { + Class exceptionClass; + + try { + exceptionClass = Class.forName(ex1); + 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; + + } else { + return null; + } + } + + private List<GuardianMember> getMatchingParticipants(String regularExpression, GlobalExceptionInterface signaledException) { + List<GuardianMember> matchingParticipants = new LinkedList(); + String[] splitByComma = regularExpression.split(","); + + //Invalid regular expression + if (splitByComma.length > 2) { + throw new InvalidRegularExpressionException("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); + } + } + } else if (regularExpression.toUpperCase().equals("!SIGNALER")) { + for (GuardianMember gm : guardianList) { + if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) { + 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); + } + } + } + + } //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; + } + } + } + + //Invalid expression + if (index == -1) { + throw new InvalidRegularExpressionException("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)) { + + //Test if the participant is Signaler + if (splitByComma[index].toUpperCase().equals("SIGNALER")) { + + if (signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) { + matchingParticipants.add(gm); + } + } //Test if the participant is not Signaler + else { + if (!signaledException.getSignalingParticipants().contains(gm.getParticipantIdentifier())) { + matchingParticipants.add(gm); + } + } + } + } + + } + + return matchingParticipants; + } + + /* Valid expressions: *, <Context>.*, <Context>, *.<Context>, *.<Context>.*, + * *.<Context>.*.<Context>.*, <REG_EXP> || <REG_EXP> + * + * Invalid expressions: *.*, **, + * + * Not supported yet: !<Context>, !<Context> || <Context>, !(<Context> || <Context>) + */ + private String createJavaRegularExpression(String regularExpression) throws InvalidRegularExpressionException { + StringBuffer re = new StringBuffer(); + + String[] splitByBar = regularExpression.split("\\|\\|"); + String[] splitByPeriod; + + for (int i = 0; i < splitByBar.length; i++) { + + splitByPeriod = splitByBar[i].split("\\."); + + if (i > 0) { + re.append("|"); + } + + re.append("^"); + for (int j = 0; j < splitByPeriod.length; j++) { + + //* + if (splitByPeriod[j].equals("*")) { + + //Validate the regular expression + if (j + 1 != splitByPeriod.length && splitByPeriod[j + 1].equals("*")) { + throw new InvalidRegularExpressionException(); + } + + //* + if (splitByPeriod.length == 1) { + re.append("(\\w+)"); + } //*.<CONTEXT> + + if (j == 0 && splitByPeriod.length != 1) { + re.append("(\\w+\\"); + re.append(".)*"); + } //<CONTEXT>.* + else { + re.append("(\\"); + re.append(".\\w+)*"); + } + } //<CONTEXT> + else { + +// //Validate the regular expression +// if (splitedByPeriod[j].matches("^(\\*)*$")) { +// throw new RuntimeException("Invalid name for a context"); +// } + + //<CONTEXT> || <CONTEXT>.<CONTEXT>.<CONTEXT> || *.<CONTEXT> + if (splitByPeriod.length == 1) { + re.append("(\\w+\\"); + re.append(".)*"); + } + + if (j == 0 || j - 1 == 0) { + re.append("(" + splitByPeriod[j] + ")"); + } else { + re.append("(\\." + splitByPeriod[j] + ")"); + } + } + } + re.append("$"); + } + return re.toString(); + } + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java new file mode 100644 index 0000000000..cf6b3245ce --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationFactoryImpl.java @@ -0,0 +1,43 @@ +/* + * 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.implementation.guardian.impl; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; + +public class GuardianGroupImplementationFactoryImpl implements GuardianGroupImplementationFactory { + + private AssemblyFactory assemblyFactory; + private JavaInterfaceFactory javaFactory; + + public GuardianGroupImplementationFactoryImpl(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory) { + this.assemblyFactory = assemblyFactory; + this.javaFactory = javaFactory; + } + + public GuardianGroupImplementation createGuardianGroupImplementation() { + return new GuardianGroupImplementationImpl(assemblyFactory, javaFactory); + } + +// public GuardianGroupImplementation createGuardianGroupImplementation() { +// return new GuardianGroupImplementationImpl(); +// } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java new file mode 100644 index 0000000000..7520846d55 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianGroupImplementationImpl.java @@ -0,0 +1,134 @@ +/* + * 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.implementation.guardian.impl; + +import org.apache.tuscany.sca.implementation.guardian.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.ConstrainingType; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; +import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; + +public class GuardianGroupImplementationImpl implements GuardianGroupImplementation { + + private AssemblyFactory assemblyFactory; + private JavaInterfaceFactory javaFactory; + private List<Service> services = new ArrayList<Service>(); + private OMElement guardianProperties; + + public GuardianGroupImplementationImpl(AssemblyFactory assemblyFactory, + JavaInterfaceFactory javaFactory) { + + this.assemblyFactory = assemblyFactory; + this.javaFactory = javaFactory; + this.guardianProperties = null; + } + + private void introspectServices(AssemblyFactory assemblyFactory, JavaInterfaceFactory javaFactory) { + + Service guardianService = assemblyFactory.createService(); + + guardianService.setName("GuardianGroup"); + + JavaInterface guardianInterface; + + try { + guardianInterface = javaFactory.createJavaInterface(GuardianGroup.class); + } catch (InvalidInterfaceException ex) { + throw new IllegalArgumentException(ex); + } + + JavaInterfaceContract guardianInterfaceContract = javaFactory.createJavaInterfaceContract(); + + guardianInterfaceContract.setInterface(guardianInterface); + + guardianService.setInterfaceContract(guardianInterfaceContract); + + services.add(guardianService); + } + + public void setGuardianProperties(OMElement guardianProperties) { + this.guardianProperties = guardianProperties; + } + + public OMElement getGuardianProperties() { + return this.guardianProperties; + } + + @Override + public String getURI() { + // The Guardian Model implementation does not have a URI + return null; + } + + @Override + public void setURI(String arg0) { + // The Guardian Model implementation does not have a URI + } + + @Override + public List<Service> getServices() { + if (services == null || services.size() == 0) { + introspectServices(assemblyFactory, javaFactory); + } + return services; + } + + @Override + public List<Reference> getReferences() { + // The Guardian Model implementation does not support references + return Collections.emptyList(); + } + + @Override + public List<Property> getProperties() { + // The sample DATA implementation does not support properties + return Collections.emptyList(); + } + + @Override + public ConstrainingType getConstrainingType() { + // The Guardian Model implementation does not support constrainingTypes + return null; + } + + @Override + public void setConstrainingType(ConstrainingType arg0) { + // The Guardian Model implementation does not support constrainingTypes + } + + @Override + public boolean isUnresolved() { + // The Guardian Model implementation is always resolved + return false; + } + + @Override + public void setUnresolved(boolean arg0) { + // The Guardian Model implementation is always resolved + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java new file mode 100644 index 0000000000..80b9321e79 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/GuardianMemberImpl.java @@ -0,0 +1,177 @@ +/* + * 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.implementation.guardian.impl; + +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import java.util.Stack; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroup; +import org.apache.tuscany.sca.implementation.guardian.GuardianMember; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; +import org.apache.tuscany.sca.implementation.guardian.common.JoinException; +import org.apache.tuscany.sca.implementation.guardian.common.SuspendException; +import org.osoa.sca.annotations.Destroy; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Reference; +import org.osoa.sca.annotations.Scope; +import org.osoa.sca.annotations.Service; + +@Service(GuardianMember.class) +@Scope("COMPOSITE") +public class GuardianMemberImpl implements GuardianMember { + + private int participantState; + private Stack<Context> contextList; + + private Queue<GlobalException> exceptionQueue; + @Reference(name = "guardian_group", required = true) + public GuardianGroup guardianGroup; + private int id; + //FIXME: Review the usage of this variable + private boolean exceptionThrown; + + public GuardianMemberImpl() { + contextList = new Stack<Context>(); + contextList.add(Context.INIT_CONTEXT); + exceptionQueue = new LinkedList<GlobalException>(); + participantState = GuardianGroup.NORMAL_PARTICIPANT_STATE; + exceptionThrown = false; + } + + @Init + public void init() { + guardianGroup.addGuardianMember(this); + } + + @Destroy + public void destroy() { + guardianGroup.removeGuardianMember(this); + } + + public void addException(GlobalException ex) { + exceptionQueue.add(ex); + } + + public Context getCurrentContext() { + return contextList.peek(); + } + + + public void enableContext(Context context) { + //Update the context list with the related set of exceptions + contextList.push(context); + + if (contextList.size() == 2) { + JoinException ex = new JoinException(); + ex.setSignalingContext(context); + ex.putSignalingParticipant(getParticipantIdentifier()); + gthrow(ex, null); + } + + } + + public void removeContext() { + if (!contextList.isEmpty()) { + contextList.pop(); + } + } + + //If participantList is null then signal to ALL participants + public void gthrow(GlobalExceptionInterface ex, List<String> participantList) { + //1)Block the participant until raise an exception + + if (!(ex instanceof SuspendException)) { + //Set the exception's parameters + ex.setSignalingContext(getCurrentContext()); + ex.putSignalingParticipant(getParticipantIdentifier()); + + guardianGroup.gthrow(ex, participantList); + exceptionThrown = true; + } else { + setParticipantState(GuardianGroup.SUSPENDED_PARTICIPANT_STATE); + } + } + + public boolean propagate(GlobalExceptionInterface ex) { + //1)Compares the current context with the exception's target context + return !getCurrentContext().equals(ex.getTargetContext()); + } + + public void checkExceptionStatus() throws GlobalException { + + //Blocks until the state be diferent the SUSPENDED_STATE + while (participantState == GuardianGroup.SUSPENDED_PARTICIPANT_STATE && exceptionThrown) { + System.out.println(getParticipantIdentifier() + ": I am blocked!"); + try { + Thread.sleep(5000); + } catch (InterruptedException ex) { + Logger.getLogger(GuardianMemberImpl.class.getName()).log(Level.SEVERE, null, ex); + } + } + exceptionThrown = false; + System.out.println(getParticipantIdentifier() + ": I am not blocked!"); + + GlobalException exc; + + if ((exc = exceptionQueue.peek()) == null) { + System.out.println(getParticipantIdentifier() + "#No exception on exception queue"); + return; + } + + //Check if ex.targetContext() matches the participant id + //Eg. ex.targetContext(): Main and participant id: Init.Main.Backup -> should thrown the exception + //Test if the exception should be thrown in the target context + for (Context c : contextList) { + if (exc.getTargetContext().equals(c) && (c.equals(Context.INIT_CONTEXT) || c.getExceptionList().contains(exc.getClass()))) { + System.out.println(getParticipantIdentifier() + "#Returning an exception"); + exceptionQueue.poll(); + throw exc; + } + } + + return; + } + + public String getParticipantIdentifier() { + //1) Return the participant identifier -> context list dot separated + StringBuffer participantIdentifier = new StringBuffer(); + participantIdentifier.append(this.id); + for (int i = 0; i < contextList.size(); i++) { + participantIdentifier.append("." + contextList.get(i).getName()); + } + return participantIdentifier.toString(); + } + + public void setUniqueParticipantID(int id) { + this.id = id; + } + + public int getParticipantState() { + return participantState; + } + + public void setParticipantState(int state) { + this.participantState = state; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java new file mode 100644 index 0000000000..e2fc2f8048 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/RecoveryRulesImpl.java @@ -0,0 +1,33 @@ +/* + * 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.implementation.guardian.impl; + +import org.apache.tuscany.sca.implementation.guardian.RecoveryRules; +import java.util.Hashtable; +import java.util.Map; +import org.apache.axiom.om.OMElement; + +public class RecoveryRulesImpl implements RecoveryRules { + + private Map<String, OMElement> ruleElements = new Hashtable<String, OMElement>(); + + public Map<String, OMElement> getRuleElements() { + return ruleElements; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java new file mode 100644 index 0000000000..669f06b1ef --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/impl/ResolutionTreesImpl.java @@ -0,0 +1,33 @@ +/* + * 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.implementation.guardian.impl; + +import java.util.Hashtable; +import java.util.Map; +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.implementation.guardian.ResolutionTrees; + +public class ResolutionTreesImpl implements ResolutionTrees { + + private Map<String, OMElement> resolutionTreeElements = new Hashtable<String, OMElement>(); + + public Map<String, OMElement> getResolutionTreeElements() { + return resolutionTreeElements; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java new file mode 100644 index 0000000000..2eb3dbdf58 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProvider.java @@ -0,0 +1,115 @@ +/* + * 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.implementation.guardian.provider; + +import org.apache.tuscany.sca.implementation.guardian.impl.*; +import java.util.Iterator; +import org.apache.axiom.om.OMAttribute; +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroup; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; +import org.apache.tuscany.sca.implementation.guardian.common.Constants; + +public class GuardianGroupImplementationProvider implements ImplementationProvider { + + private GuardianGroupImplementation implementation; + private GuardianGroupImpl guardian; + + public GuardianGroupImplementationProvider(RuntimeComponent component, GuardianGroupImplementation implementation) { + this.implementation = implementation; + this.guardian = createGuardian(implementation.getGuardianProperties()); + } + + private GuardianGroupImpl createGuardian(OMElement guardianProperties) { + GuardianGroupImpl guardian = null; + + String recoveryRules = null; + String resolutionTrees = null; + + OMAttribute at; + Iterator it = guardianProperties.getAllAttributes(); + while (it.hasNext()) { + at = (OMAttribute) it.next(); + + if (at.getLocalName().equals(Constants.RECOVERY_RULES)) { + recoveryRules = at.getAttributeValue(); + } else if (at.getLocalName().equals(Constants.RESOLUTION_TREES)) { + resolutionTrees = at.getAttributeValue(); + } + } + + if (recoveryRules != null && resolutionTrees != null) { + guardian = new GuardianGroupImpl(recoveryRules, resolutionTrees); + } + + return guardian; + } + + public void start() { + } + + public void stop() { + } + + public Invoker createInvoker(RuntimeComponentService service, Operation operation) { + String operationName = operation.getName(); + String interfaceFullName = operation.getInterface().toString(); + + //GuardianGroup interface + if (interfaceFullName.equals(GuardianGroup.class.getName())) { + + //Why is the createInvoker ivoked 'n' static inner class times? + //System.out.println("NAME: " + operationName); + + //public void addGuardianMember(GuardianMember guardianMember) + if (operationName.equals("addGuardianMember")) { + return new GuardianGroupInvoker.AddGuardianMemberInvoker(guardian); + } //public boolean removeGuardianMember(GuardianMember guardianMember) + else if (operationName.equals("removeGuardianMember")) { + return new GuardianGroupInvoker.RemoveGuardianMemberInvoker(guardian); + } //public void enableContext(Context context); + else if (operationName.equals("enableContext")) { + return new GuardianGroupInvoker.EnableContextInvoker(guardian); + } //public void removeContext(); + else if (operationName.equals("removeContext")) { + return new GuardianGroupInvoker.RemoveContextInvoker(guardian); + } //public void gthrow(GlobalExceptionInterface ex, List<String> participantList); + else if (operationName.equals("gthrow")) { + return new GuardianGroupInvoker.GthrowInvoker(guardian); + } //public boolean propagate(GlobalExceptionInterface ex); + else if (operationName.equals("propagate")) { + return new GuardianGroupInvoker.PropagateInvoker(guardian); + } //public void checkExceptionStatus() throws GlobalException; + else if (operationName.equals("checkExceptionStatus")) { + return new GuardianGroupInvoker.CheckExceptionStatusInvoker(guardian); + } + } + + return new GuardianGroupInvoker(null); + } + + public boolean supportsOneWayInvocation() { + return false; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java new file mode 100644 index 0000000000..a42c35506d --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupImplementationProviderFactory.java @@ -0,0 +1,38 @@ +/* + * 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.implementation.guardian.provider; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation; +import org.apache.tuscany.sca.provider.ImplementationProvider; +import org.apache.tuscany.sca.provider.ImplementationProviderFactory; +import org.apache.tuscany.sca.runtime.RuntimeComponent; + +public class GuardianGroupImplementationProviderFactory implements ImplementationProviderFactory<GuardianGroupImplementation> { + public GuardianGroupImplementationProviderFactory(ExtensionPointRegistry extensionPoints) { + } + + public ImplementationProvider createImplementationProvider(RuntimeComponent component, GuardianGroupImplementation implementation) { + return new GuardianGroupImplementationProvider(component, implementation); + } + + public Class<GuardianGroupImplementation> getModelType() { + return GuardianGroupImplementation.class; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java new file mode 100644 index 0000000000..8f393ebcb9 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/provider/GuardianGroupInvoker.java @@ -0,0 +1,163 @@ +/* + * 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.implementation.guardian.provider; + +import org.apache.tuscany.sca.implementation.guardian.impl.*; +import java.util.List; +import org.apache.tuscany.sca.implementation.guardian.GuardianMember; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalExceptionInterface; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.Message; + +public class GuardianGroupInvoker implements Invoker { + + protected final GuardianGroupImpl guardian; + + public GuardianGroupInvoker(GuardianGroupImpl guardian) { + this.guardian = guardian; + } + + public Message invoke(Message arg0) { + throw new UnsupportedOperationException("Not supported yet. 1"); + } + + //AddGuardianMember operation invoker + public static class AddGuardianMemberInvoker extends GuardianGroupInvoker { + + public AddGuardianMemberInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + GuardianMember guardianMember = (GuardianMember) ((Object[]) msg.getBody())[0]; + this.guardian.addGuardianMember(guardianMember); + + return msg; + } + } + + //RemoveGuardianMember operation invoker + public static class RemoveGuardianMemberInvoker extends GuardianGroupInvoker { + + public RemoveGuardianMemberInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + GuardianMember guardianMember = (GuardianMember) ((Object[]) msg.getBody())[0]; + boolean returnedValue = this.guardian.removeGuardianMember(guardianMember); + + msg.setBody(returnedValue); + return msg; + } + } + + //EnableContext operation invoker + public static class EnableContextInvoker extends GuardianGroupInvoker { + + public EnableContextInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + Context context = (Context) ((Object[]) msg.getBody())[0]; + + this.guardian.enableContext(context); + + return msg; + } + } + + //RemoveContext operation invoker + public static class RemoveContextInvoker extends GuardianGroupInvoker { + + public RemoveContextInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + this.guardian.removeContext(); + + return msg; + } + } + + //Gthrow operation invoker + public static class GthrowInvoker extends GuardianGroupInvoker { + + public GthrowInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + GlobalExceptionInterface ex = (GlobalExceptionInterface) ((Object[]) msg.getBody())[0]; + List<String> participantList = (List<String>) ((Object[]) msg.getBody())[1]; + + this.guardian.gthrow(ex, participantList); + + return msg; + } + } + + //Propagate operation invoker + public static class PropagateInvoker extends GuardianGroupInvoker { + + public PropagateInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + GlobalExceptionInterface ex = (GlobalExceptionInterface) ((Object[]) msg.getBody())[0]; + + boolean needPropagation = this.guardian.propagate(ex); + msg.setBody(needPropagation); + + return msg; + } + } + + //CheckExceptionStatus operation invoker + public static class CheckExceptionStatusInvoker extends GuardianGroupInvoker { + + public CheckExceptionStatusInvoker(GuardianGroupImpl guardian) { + super(guardian); + } + + @Override + public Message invoke(Message msg) { + + this.guardian.checkExceptionStatus(); + + return msg; + } + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java new file mode 100644 index 0000000000..048ef7b9c8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/GuardianGroupImplementationProcessor.java @@ -0,0 +1,144 @@ +/* + * 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.implementation.guardian.xml; + +import org.apache.tuscany.sca.implementation.guardian.*; +import java.util.Iterator; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMAttribute; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.contribution.service.ContributionResolveException; +import org.apache.tuscany.sca.contribution.service.ContributionWriteException; +import org.apache.tuscany.sca.assembly.xml.Constants; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.implementation.guardian.impl.GuardianGroupImplementationFactoryImpl; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; +import org.apache.tuscany.sca.monitor.Monitor; + +public class GuardianGroupImplementationProcessor implements StAXArtifactProcessor<GuardianGroupImplementation> { + + protected static final QName IMPLEMENTATION_GUARDIAN = new QName(Constants.SCA10_TUSCANY_NS, "implementation.guardian"); + protected static final QName GUARDIAN_PROPERTIES = new QName(Constants.SCA10_TUSCANY_NS, "guardianProperties"); + private GuardianGroupImplementationFactory guardianGroupImplementationFactory; + + private AssemblyFactory assemblyFactor; + private JavaInterfaceFactory javaFactory; + + //public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) { + //public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories) { + public GuardianGroupImplementationProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) { + + assemblyFactor = modelFactories.getFactory(AssemblyFactory.class); + javaFactory = modelFactories.getFactory(JavaInterfaceFactory.class); + + guardianGroupImplementationFactory = new GuardianGroupImplementationFactoryImpl(assemblyFactor, javaFactory); + //guardianGroupImplementationFactory = modelFactories.getFactory(GuardianGroupImplementationFactory.class); + } + + public GuardianGroupImplementation read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + assert IMPLEMENTATION_GUARDIAN.equals(reader.getName()); + + GuardianGroupImplementation implementation = guardianGroupImplementationFactory.createGuardianGroupImplementation(); + + while (reader.hasNext()) { + reader.next(); + + if (reader.isStartElement() && reader.getName().equals(GUARDIAN_PROPERTIES)) { + OMElement guardianPropertiesElement = readGuardianProperties(reader); + + //REVIEW + implementation.setGuardianProperties(guardianPropertiesElement); + + break; + } + } + + return implementation; + } + + private OMElement readGuardianProperties(XMLStreamReader reader) { + OMFactory fac = OMAbstractFactory.getOMFactory(); + OMElement element = fac.createOMElement(reader.getName()); + + for (int i = 0; i < reader.getAttributeCount(); i++) { + + String ns = reader.getAttributeNamespace(i); + String prefix = reader.getAttributePrefix(i); + String qname = reader.getAttributeLocalName(i); + String value = reader.getAttributeValue(i); + + if (ns != null) { + element.addAttribute(qname, value, fac.createOMNamespace(ns, prefix)); + element.declareNamespace(ns, prefix); + } else { + element.addAttribute(qname, value, null); + } + } + + return element; + } + + public void write(GuardianGroupImplementation implementation, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException { + writer.writeStartElement(IMPLEMENTATION_GUARDIAN.getNamespaceURI(), IMPLEMENTATION_GUARDIAN.getLocalPart()); + + OMElement guardianProperties = implementation.getGuardianProperties(); + if (guardianProperties != null) { + writeGuardianProperties(guardianProperties, writer); + } + + writer.writeEndElement(); + } + + private void writeGuardianProperties(OMElement guardianProperties, XMLStreamWriter writer) throws XMLStreamException { + + OMAttribute at; + + //write the element's name + writer.writeStartElement(guardianProperties.getLocalName()); + + //write the attributes + Iterator attributes = guardianProperties.getAllAttributes(); + while (attributes.hasNext()) { + at = (OMAttribute) attributes.next(); + writer.writeAttribute(at.getLocalName(), at.getAttributeValue()); + } + + writer.writeEndElement(); + } + + public QName getArtifactType() { + return IMPLEMENTATION_GUARDIAN; + } + + public void resolve(GuardianGroupImplementation arg0, ModelResolver arg1) throws ContributionResolveException { + } + + public Class<GuardianGroupImplementation> getModelType() { + return GuardianGroupImplementation.class; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java new file mode 100644 index 0000000000..7d82f356de --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/RecoveryRulesProcessor.java @@ -0,0 +1,158 @@ +/* + * 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.implementation.guardian.xml; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.contribution.service.ContributionResolveException; +import org.apache.tuscany.sca.contribution.service.ContributionWriteException; +import org.apache.tuscany.sca.implementation.guardian.common.Constants; +import org.apache.tuscany.sca.implementation.guardian.impl.RecoveryRulesImpl; +import org.apache.tuscany.sca.implementation.guardian.RecoveryRules; + +public class RecoveryRulesProcessor implements StAXArtifactProcessor<RecoveryRules>, Constants { + + private static final QName RECOVERY_RULES_POLICY_QNAME = RecoveryRules.RECOVERY_RULES_POLICY_QNAME; + + public RecoveryRulesProcessor() { + } + + public RecoveryRules read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + + RecoveryRules policy = new RecoveryRulesImpl(); + QName name = null; + String ruleName = null; + OMElement ruleElement = null; + while (reader.hasNext()) { + + if (reader.isStartElement()) { + + name = reader.getName(); + if (RULE.equals(name.getLocalPart())) { + + ruleName = reader.getAttributeValue(null, Constants.NAME); + ruleElement = loadElement(reader); + + policy.getRuleElements().put(ruleName, ruleElement); + } + } else if (reader.isEndElement()) { + if (RECOVERY_RULES_POLICY_QNAME.equals(reader.getName())) { + break; + } + } + + reader.next(); + } + + return policy; + } + + public void write(RecoveryRules policy, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException { + //throw new UnsupportedOperationException("Not supported yet."); + } + + public QName getArtifactType() { + return RECOVERY_RULES_POLICY_QNAME; + } + + public void resolve(RecoveryRules arg0, ModelResolver arg1) throws ContributionResolveException { + + } + + public Class<RecoveryRules> getModelType() { + return RecoveryRules.class; + } + + private OMElement loadElement(XMLStreamReader reader) throws XMLStreamException { + OMFactory fac = OMAbstractFactory.getOMFactory(); + OMElement head = fac.createOMElement(reader.getName()); + + //Load the attributes for the rule tag + loadAttributes(reader, head, fac); + + OMElement current = head; + while (true) { + + switch (reader.next()) { + case XMLStreamConstants.START_ELEMENT: + + QName name = new QName(reader.getName().getLocalPart()); + OMElement child = fac.createOMElement(name, current); + + int count = reader.getNamespaceCount(); + for (int i = 0; i < count; i++) { + String prefix = reader.getNamespacePrefix(i); + String ns = reader.getNamespaceURI(i); + child.declareNamespace(ns, prefix); + } + + if (!"".equals(name.getNamespaceURI())) { + child.declareNamespace(name.getNamespaceURI(), name.getPrefix()); + } + + // add the attributes for this element + loadAttributes(reader, child, fac); + current = child; + break; + case XMLStreamConstants.CDATA: + fac.createOMText(current, reader.getText()); + break; + case XMLStreamConstants.CHARACTERS: + String text = reader.getText().trim(); + if (text.length() != 0) { + fac.createOMText(current, reader.getText()); + } + break; + case XMLStreamConstants.END_ELEMENT: + if (current == head) { + return head; + } else { + current = (OMElement) current.getParent(); + } + } + } + } + + private void loadAttributes(XMLStreamReader reader, OMElement elem, OMFactory fac) { + int count = reader.getAttributeCount(); + for (int i = 0; i < count; i++) { + String ns = reader.getAttributeNamespace(i); + String prefix = reader.getAttributePrefix(i); + String qname = reader.getAttributeLocalName(i); + String value = reader.getAttributeValue(i); + + if (ns != null) { + elem.addAttribute(qname, value, fac.createOMNamespace(ns, prefix)); + elem.declareNamespace(ns, prefix); + } else { + elem.addAttribute(qname, value, null); + } + } + } + +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java new file mode 100644 index 0000000000..b9cfe647b4 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/java/org/apache/tuscany/sca/implementation/guardian/xml/ResolutionTreesProcessor.java @@ -0,0 +1,157 @@ +/* + * 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.implementation.guardian.xml; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import org.apache.axiom.om.OMAbstractFactory; +import org.apache.axiom.om.OMElement; +import org.apache.axiom.om.OMFactory; +import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.service.ContributionReadException; +import org.apache.tuscany.sca.contribution.service.ContributionResolveException; +import org.apache.tuscany.sca.contribution.service.ContributionWriteException; +import org.apache.tuscany.sca.implementation.guardian.common.Constants; +import org.apache.tuscany.sca.implementation.guardian.impl.ResolutionTreesImpl; +import org.apache.tuscany.sca.implementation.guardian.ResolutionTrees; + +public class ResolutionTreesProcessor implements StAXArtifactProcessor<ResolutionTrees>, Constants { + + private static final QName RESOLUTION_TREES_POLICY_QNAME = ResolutionTrees.RESOLUTION_TREES_POLICY_QNAME; + + public ResolutionTreesProcessor() { + } + + public ResolutionTrees read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + + ResolutionTrees policy = new ResolutionTreesImpl(); + QName name = null; + String ruleName = null; + OMElement ruleElement = null; + while (reader.hasNext()) { + + if (reader.isStartElement()) { + + name = reader.getName(); + if (RESOLUTION_TREE.equals(name.getLocalPart())) { + + ruleName = reader.getAttributeValue(null, Constants.EXCEPTION_LEVEL); + ruleElement = loadElement(reader); + + policy.getResolutionTreeElements().put(ruleName, ruleElement); + } + } else if (reader.isEndElement()) { + if (RESOLUTION_TREES_POLICY_QNAME.equals(reader.getName())) { + break; + } + } + + reader.next(); + } + + return policy; + } + + public void write(ResolutionTrees policy, XMLStreamWriter writer) throws ContributionWriteException, XMLStreamException { + //throw new UnsupportedOperationException("Not supported yet."); + } + + public QName getArtifactType() { + return RESOLUTION_TREES_POLICY_QNAME; + } + + public void resolve(ResolutionTrees arg0, ModelResolver arg1) throws ContributionResolveException { + //throw new UnsupportedOperationException("Not supported yet."); + } + + public Class<ResolutionTrees> getModelType() { + return ResolutionTrees.class; + } + + private OMElement loadElement(XMLStreamReader reader) throws XMLStreamException { + OMFactory fac = OMAbstractFactory.getOMFactory(); + OMElement head = fac.createOMElement(reader.getName()); + + //Load the attributes for the rule tag + loadAttributes(reader, head, fac); + + OMElement current = head; + while (true) { + + switch (reader.next()) { + case XMLStreamConstants.START_ELEMENT: + + QName name = new QName(reader.getName().getLocalPart()); + OMElement child = fac.createOMElement(name, current); + + int count = reader.getNamespaceCount(); + for (int i = 0; i < count; i++) { + String prefix = reader.getNamespacePrefix(i); + String ns = reader.getNamespaceURI(i); + child.declareNamespace(ns, prefix); + } + + if (!"".equals(name.getNamespaceURI())) { + child.declareNamespace(name.getNamespaceURI(), name.getPrefix()); + } + + // add the attributes for this element + loadAttributes(reader, child, fac); + current = child; + break; + case XMLStreamConstants.CDATA: + fac.createOMText(current, reader.getText()); + break; + case XMLStreamConstants.CHARACTERS: + String text = reader.getText().trim(); + if (text.length() != 0) { + fac.createOMText(current, reader.getText()); + } + break; + case XMLStreamConstants.END_ELEMENT: + if (current == head) { + return head; + } else { + current = (OMElement) current.getParent(); + } + } + } + } + + private void loadAttributes(XMLStreamReader reader, OMElement elem, OMFactory fac) { + int count = reader.getAttributeCount(); + for (int i = 0; i < count; i++) { + String ns = reader.getAttributeNamespace(i); + String prefix = reader.getAttributePrefix(i); + String qname = reader.getAttributeLocalName(i); + String value = reader.getAttributeValue(i); + + if (ns != null) { + elem.addAttribute(qname, value, fac.createOMNamespace(ns, prefix)); + elem.declareNamespace(ns, prefix); + } else { + elem.addAttribute(qname, value, null); + } + } + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor new file mode 100644 index 0000000000..b489bb90fc --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor @@ -0,0 +1,19 @@ +# 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. + +# Implementation class for the artifact processor extension +org.apache.tuscany.sca.implementation.guardian.xml.GuardianGroupImplementationProcessor;qname=http://tuscany.apache.org/xmlns/sca/1.0#implementation.guardian,model=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation,factory=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory new file mode 100644 index 0000000000..744815a572 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementationFactory @@ -0,0 +1,19 @@ +# 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. + +# Implementation class for implementation model factory +org.apache.tuscany.sca.implementation.guardian.impl.GuardianGroupImplementationFactoryImpl diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory new file mode 100644 index 0000000000..4ab8d2e6a3 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory @@ -0,0 +1,19 @@ +# 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.guardian.provider.GuardianGroupImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.guardian.GuardianGroupImplementation
diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite new file mode 100644 index 0000000000..d31485d67c --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/guardianTest.composite @@ -0,0 +1,36 @@ +<?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 (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. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace="http://guardianTest" + name="guardianTest"> + + <component name="GuardianComponent"> + <tuscany:implementation.guardian> + + <tuscany:guardianProperties + recovery_rules="src/main/resources/recoveryrules_nbackpus_concurrent.xml" + resolution_trees="src/main/resources/resolutionTree.xml"/> + + </tuscany:implementation.guardian> + </component> + +</composite> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite new file mode 100644 index 0000000000..fcb78e3879 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/primaryBackup.composite @@ -0,0 +1,81 @@ +<?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:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace="http://guardianTest" + name="guardianTest"> + + <component name="Participant1"> + <implementation.java class="org.apache.tuscany.sca.implementation.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.implementation.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.implementation.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.implementation.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.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianMember2"> + <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianMember3"> + <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianMember4"> + <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianComponent"> + <tuscany:implementation.guardian> + + <tuscany:guardianProperties + recovery_rules="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml" + resolution_trees="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml"/> + + </tuscany:implementation.guardian> + + </component> + +</composite> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml new file mode 100644 index 0000000000..b2eacf8b8a --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/recoveryRules.xml @@ -0,0 +1,82 @@ +<?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> + + <!-- A new participant joins in the group --> + <rule name="Rule1" signaled_exception="org.apache.tuscany.sca.implementation.guardian.common.JoinException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY"/> + </participant> + + <participant match="SIGNALER"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/> + </participant> + </rule> + + <!-- The Primary fails --> + <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/> + </participant> + + <participant match="*.BACKUP"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN"> + <affected_participants>FIRST</affected_participants> + </throw_exception> + </participant> + </rule> + + <!-- The Backup fails --> + <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/> + </participant> + + <participant match="SIGNALER"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/> + </participant> + </rule> + + <!-- The Primary and Backup fail together --> + <rule name="Rule4" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryBackupFailedTogetherException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/> + </participant> + + <!-- Backup signaler --> + <participant match="*.BACKUP,SIGNALER"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/> + </participant> + + <!-- Excluding the backup signaler --> + <participant match="*.BACKUP,!SIGNALER"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN"> + <affected_participants>FIRST</affected_participants> + </throw_exception> + </participant> + + </rule> + +</recovery_rules> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml new file mode 100644 index 0000000000..ca3fa1534c --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml @@ -0,0 +1,8 @@ +<resolution_trees> + <resolution_tree exception_level="1"> + <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryBackupFailedTogetherException"> + <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException"/> + <exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException"/> + </exception> + </resolution_tree> +</resolution_trees> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite new file mode 100644 index 0000000000..85af4efd48 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/primaryBackup.composite @@ -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. +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace="http://guardianTest" + name="guardianTest"> + + <component name="Participant1"> + <implementation.java class="org.apache.tuscany.sca.implementation.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.implementation.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.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianMember2"> + <implementation.java class="org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl"/> + <reference name="guardian_group" target="GuardianComponent"/> + </component> + + <component name="GuardianComponent"> + <tuscany:implementation.guardian> + + <tuscany:guardianProperties + recovery_rules="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml" + resolution_trees="src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/resolutionTrees.xml"/> + + </tuscany:implementation.guardian> + + </component> + +</composite> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml new file mode 100644 index 0000000000..0016fa4d9f --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/recoveryRules.xml @@ -0,0 +1,56 @@ +<?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.implementation.guardian.common.JoinException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupJoinedException" target_context="PRIMARY"/> + </participant> + + <participant match="SIGNALER"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryExistsException" target_context="MAIN" min_participant_joined="2"/> + </participant> + </rule> + + <rule name="Rule2" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="INIT_CONTEXT"/> + </participant> + + <participant match="*.BACKUP"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.PrimaryFailedException" target_context="MAIN"/> + </participant> + </rule> + + <rule name="Rule3" signaled_exception="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException"> + + <participant match="*.PRIMARY"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="PRIMARY"/> + </participant> + + <participant match="*.BACKUP"> + <throw_exception class="org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.BackupFailedException" target_context="INIT_CONTEXT"/> + </participant> + </rule> + +</recovery_rules> diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml new file mode 100644 index 0000000000..e528760ad8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/org/apache/tuscany/sca/implementation/guardian/lcaTest.xml @@ -0,0 +1,21 @@ +<resolution_trees> + <resolution_tree exception_level="1"> + <exception class="Exception1"> + <exception class="Exception2"> + <exception class="Exception4"/> + <exception class="Exception5"/> + </exception> + <exception class="Exception3"> + <exception class="Exception6"/> + <exception class="Exception7"/> + <exception class="Exception8"/> + </exception> + </exception> + </resolution_tree> +</resolution_trees> + + + + + + diff --git a/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz b/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz Binary files differnew file mode 100644 index 0000000000..8845a544fe --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/main/resources/resources.tar.gz diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java new file mode 100644 index 0000000000..ba4f6230d8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/GuardianImplementationTest.java @@ -0,0 +1,77 @@ +/* + * 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.implementation.guardian; + +import org.apache.tuscany.sca.implementation.guardian.*; +import org.apache.tuscany.sca.host.embedded.SCADomain; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; +import org.apache.tuscany.sca.implementation.guardian.impl.GuardianMemberImpl; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class GuardianImplementationTest { + +// private SCADomain scaDomain; +// private GuardianGroup guardian; +// +// @Before +// public void init() throws Exception { +// scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/implementation/guardian/guardianTest.composite"); +// guardian = scaDomain.getService(GuardianGroup.class, "GuardianComponent"); +// } +// +// @Test +// public void enabelContextTest() throws Exception { +// guardian.enableContext(Context.INIT_CONTEXT); +// } +// +// @After +// public void destroy() { +// scaDomain.close(); +// } + public static void main(String... args) { + + SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/implementation/guardian/guardianTest.composite"); + GuardianGroup guardian = scaDomain.getService(GuardianGroup.class, "GuardianComponent"); + + System.out.println("\n#EnableContext invocation"); + guardian.enableContext(Context.INIT_CONTEXT); + + System.out.println("\n#RemoveContext invocation"); + guardian.removeContext(); + + System.out.println("\n#CheckExceptionStatus invocation"); + guardian.checkExceptionStatus(); + + System.out.println("\n#CheckExceptionStatus invocation"); + boolean value = guardian.propagate(new GlobalException()); + System.out.println("returned value: " + value); + + System.out.println("\n#AddGuardianMember invocation"); + guardian.addGuardianMember(new GuardianMemberImpl()); + + System.out.println("\n#RemoveGuardianMember invocation"); + value = guardian.removeGuardianMember(new GuardianMemberImpl()); + System.out.println("returned value: " + value); + + } + +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java new file mode 100644 index 0000000000..3c5e6b1b19 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/LCATestCase.java @@ -0,0 +1,115 @@ +/* + * 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.implementation.guardian; + +import java.io.FileInputStream; +import org.apache.tuscany.sca.implementation.guardian.common.ResolutionTreeUtils; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; +import org.junit.Test; +import org.apache.axiom.om.OMElement; +import java.util.List; +import junit.framework.Assert; +import org.apache.tuscany.sca.implementation.guardian.xml.ResolutionTreesProcessor; +import org.junit.Before; + +public class LCATestCase { + + private ResolutionTreeUtils treeUtils; + + @Before + public void init() throws Exception { + ResolutionTreesProcessor processor = new ResolutionTreesProcessor(); + + FileInputStream fileInputStream = new FileInputStream("src/main/resources/org/apache/" + + "tuscany/sca/implementation/guardian/lcaTest.xml"); + XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream); + + + ResolutionTrees policy = processor.read(reader); + Map<String, OMElement> resolutionTrees = policy.getResolutionTreeElements(); + + List<OMElement> rootElements = getRootElements(resolutionTrees.values()); + + treeUtils = new ResolutionTreeUtils(); + treeUtils.setRoot(rootElements.get(0)); + } + + @Test + public void testLCAEx2Ex2() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception2"); + System.out.println("lca: " + lca); + Assert.assertEquals("Exception2", lca); + } + + @Test + public void testLCAEx2Ex3() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception3"); + Assert.assertEquals("Exception1", lca); + } + + @Test + public void testLCAEx2Ex8() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception8"); + Assert.assertEquals("Exception1", lca); + } + + @Test + public void testLCAEx4Ex3() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception4", "Exception3"); + Assert.assertEquals("Exception1", lca); + } + + @Test + public void testLCAEx4Ex5() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception4", "Exception5"); + Assert.assertEquals("Exception2", lca); + } + + @Test + public void testLCAEx6Ex7() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception6", "Exception7"); + Assert.assertEquals("Exception3", lca); + } + + @Test + public void testLCAEx1Ex8() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception1", "Exception8"); + Assert.assertEquals("Exception1", lca); + } + + @Test + public void testLCAEx2Ex5() throws Exception { + String lca = treeUtils.getLowestCommonAncestor("Exception2", "Exception5"); + Assert.assertEquals("Exception2", lca); + } + + private List<OMElement> getRootElements(Collection<OMElement> resolutionTrees) { + List<OMElement> rootElements = new LinkedList<OMElement>(); + + for (OMElement resolutionTree : resolutionTrees) { + rootElements.add(resolutionTree.getFirstElement()); + } + + return rootElements; + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/ApplyUpdateFailureException.java new file mode 100644 index 0000000000..b08b26942d --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +public class ApplyUpdateFailureException extends RuntimeException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupFailedException.java new file mode 100644 index 0000000000..25adf1d739 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class BackupFailedException extends GlobalException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/BackupJoinedException.java new file mode 100644 index 0000000000..f0d29f461f --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class BackupJoinedException extends GlobalException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java new file mode 100644 index 0000000000..6aa9456816 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/Node.java @@ -0,0 +1,37 @@ +/* + * 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.implementation.guardian.itests.primaryBackup.common; + +import org.osoa.sca.annotations.OneWay; + +public interface Node { + + @OneWay + public void execute(); + + public void sendUpdate(String s); + + public void applyUpdate(); + + public String getID(); + + public void kill(); + + public boolean isDead(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java new file mode 100644 index 0000000000..37f4f529f0 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/NodeImpl.java @@ -0,0 +1,282 @@ +/* + * 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.implementation.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.implementation.guardian.GuardianMember; +import org.apache.tuscany.sca.implementation.guardian.common.Context; +import org.osoa.sca.annotations.Init; +import org.osoa.sca.annotations.Reference; +import org.osoa.sca.annotations.Scope; +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 isDead; + 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; + private int upcount; + + 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(); + + isDead = true; + + nodeList = new LinkedList<Node>(); + + forcePSFException = false; + forceAUFException = false; + } + + @Init + public void init() { + pID = gm.getParticipantIdentifier(); + } + + @OneWay + public void execute() { + isDead = false; + gm.enableContext(mainContext); + role = PRIMARY; + + while (true) { + + //blockingCheck(); + + 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"); + 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.kill(); + 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.kill(); + ex.printStackTrace(); + return; + } + } + } + } + + private void primaryService() { + boolean backupAvailable = isThereBackupAvailable(); + + upcount = 1; + + while (true) { + + gm.enableContext(primaryContext); + + //blockingCheck(); + + 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) { + + if (!updateBackups()) { + backupAvailable = isThereBackupAvailable(); + } + + } 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 boolean updateBackups() { + boolean flag = false; + + for (Node n : nodeList) { + if (!n.isDead()) { + n.sendUpdate("Update " + upcount); + flag = true; + } + } + if (flag) { + upcount++; + } + + return flag; + } + + private void backupService() { + while (true) { + + gm.enableContext(backupContext); + + //blockingCheck(); + + 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(); + } + } + } + + 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.isDead()) { + return true; + } + } + return false; + } + + public void kill() { + isDead = true; + } + + public boolean isDead() { + return isDead; + } + + 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/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.java new file mode 100644 index 0000000000..5521caa550 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryBackupFailedTogetherException.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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class PrimaryBackupFailedTogetherException extends GlobalException { + +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryExistsException.java new file mode 100644 index 0000000000..d6297a1012 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class PrimaryExistsException extends GlobalException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryFailedException.java new file mode 100644 index 0000000000..cc1715d077 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class PrimaryFailedException extends GlobalException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/PrimaryServiceFailureException.java new file mode 100644 index 0000000000..0bcfb72bc8 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +import org.apache.tuscany.sca.implementation.guardian.common.GlobalException; + +public class PrimaryServiceFailureException extends GlobalException { +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/common/TestInterface.java new file mode 100644 index 0000000000..7e7bd35cd2 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/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.implementation.guardian.itests.primaryBackup.common; + +public interface TestInterface { + + public void forcePrimaryServiceFailureException(); + + public void forceApplyUpdateFailureException(); +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java new file mode 100644 index 0000000000..ab0c21dba6 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/concurrentExceptions/Launch.java @@ -0,0 +1,69 @@ +/* + * 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.implementation.guardian.itests.primaryBackup.concurrentExceptions; + +import java.io.IOException; +import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node; +import org.apache.tuscany.sca.implementation.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("org/apache/tuscany/sca/" + + "implementation/guardian/itests/primaryBackup/" + + "concurrentExceptions/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("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.out.println("Forcing exception ocurrence at participant2..."); + TestInterface t2 = scaDomain.getService(TestInterface.class, "Participant2"); + t2.forceApplyUpdateFailureException(); + + System.in.read(); + + scaDomain.close(); + } +} diff --git a/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java new file mode 100644 index 0000000000..86df9bc5f9 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch.java @@ -0,0 +1,55 @@ +/* + * 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.implementation.guardian.itests.primaryBackup.simple; + +import java.io.IOException; +import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node; +import org.apache.tuscany.sca.implementation.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("org/apache/tuscany/sca/" + + "implementation/guardian/itests/primaryBackup/" + + "simple/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/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java new file mode 100644 index 0000000000..1c5fd26745 --- /dev/null +++ b/sandbox/dougsleite/implementation-guardian/src/test/java/org/apache/tuscany/sca/implementation/guardian/itests/primaryBackup/simple/Launch2.java @@ -0,0 +1,54 @@ +/* + * 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.implementation.guardian.itests.primaryBackup.simple; + +import java.io.IOException; +import org.apache.tuscany.sca.host.embedded.SCADomain; +import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.Node; +import org.apache.tuscany.sca.implementation.guardian.itests.primaryBackup.common.TestInterface; + +public class Launch2 { + + public static void main(String... args) throws IOException { + SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/" + + "implementation/guardian/itests/primaryBackup/" + + "simple/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(); + } +} + |