/* * 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.ode.bpel.obj; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.ode.bpel.obj.OProcess.OProperty; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; /** * Compiled representation of a BPEL scope. Instances of this class * are generated by the BPEL compiler. */ public class OScope extends OActivity implements Serializable{ public static final long serialVersionUID = -1L; /** * Change log of class version * initial 1 * current 2 * * 1->2: * added isolatedScope attribute * */ public static final int CURRENT_CLASS_VERSION = 2; /** Name of the scope. */ private static final String NAME = "name"; /** ScopeLikeConstructImpl's fault handler. */ private static final String FAULTHANDLER = "faultHandler"; /** The activity that gets executed within this scope. */ private static final String ACTIVITY = "activity"; /** ScopeLikeConstructImpl's compensation handler. */ private static final String COMPENSATIONHANDLER = "compensationHandler"; /** ScopeLikeConstructImpl's termination handler. */ private static final String TERMINATIONHANDLER = "terminationHandler"; /** ScopeLikeConstructImpl's event handler. */ private static final String EVENTHANDLER = "eventHandler"; /** Variables declared within the scope. */ private static final String VARIABLES = "variables"; /** OCorrelation sets declared within the scope. */ private static final String CORRELATIONSETS = "correlationSets"; private static final String PARTNERLINKS = "partnerLinks"; /** The descendants of this scope that can be compensated from the FH/CH of this scope. */ private static final String COMPENSATABLE = "compensatable"; private static final String IMPLICITSCOPE = "implicitScope"; /** Is this scope <em>atomic</em> i.e. meant to execute in a single transaction. */ private static final String ATOMICSCOPE = "atomicScope"; /** Is this scope <em>isolated</em> i.e. protected against concurrent access to its variables. */ private static final String ISOLATEDSCOPE = "isolatedScope"; @JsonCreator public OScope(){ initPrimitive(); } public OScope(OProcess owner, OActivity parent) { super(owner, parent); setVariables(new HashMap<String, Variable>()); setCorrelationSets(new HashMap<String, CorrelationSet>()); setPartnerLinks(new HashMap<String, OPartnerLink>()); setCompensatable(new HashSet<OScope>()); initPrimitive(); } private void initPrimitive(){ setAtomicScope(false); setImplicitScope(false); setIsolatedScope(false); } public void addCorrelationSet(CorrelationSet ocset) { getCorrelationSets().put(ocset.getName(), ocset); } public void addLocalVariable(Variable variable) { getVariables().put(variable.getName(), variable); } @Override public void dehydrate() { super.dehydrate(); setActivity(null); if (getCompensatable() != null) { getCompensatable().clear(); } if (getCompensationHandler() != null) { getCompensationHandler().dehydrate(); setCompensationHandler(null); } if (getTerminationHandler() != null) { getTerminationHandler().dehydrate(); setTerminationHandler(null); } if (getEventHandler() != null) { getEventHandler().dehydrate(); setEventHandler(null); } if (getVariables() != null) { getVariables().clear(); } if (getCorrelationSets() != null) { getCorrelationSets().clear(); } if (getPartnerLinks() != null) { getPartnerLinks().clear(); } } @JsonIgnore public OActivity getActivity() { Object o = fieldContainer.get(ACTIVITY); return o == null ? null : (OActivity)o; } @JsonIgnore public boolean isAtomicScope() { Object o = fieldContainer.get(ATOMICSCOPE); return o == null ? false : (Boolean)o; } @SuppressWarnings("unchecked") @JsonIgnore public Set<OScope> getCompensatable() { Object o = fieldContainer.get(COMPENSATABLE); return o == null ? null : (Set<OScope>)o; } @JsonIgnore public OCompensationHandler getCompensationHandler() { Object o = fieldContainer.get(COMPENSATIONHANDLER); return o == null ? null : (OCompensationHandler)o; } /** * Obtains the correlation set visible in current scope or parent scope. * * @param corrName correlation set name * * @return */ public CorrelationSet getCorrelationSet(String corrName) { return getCorrelationSets().get(corrName); } @SuppressWarnings("unchecked") @JsonIgnore public Map<String, CorrelationSet> getCorrelationSets() { return (Map<String, CorrelationSet>) fieldContainer .get(CORRELATIONSETS); } @JsonIgnore public OEventHandler getEventHandler() { Object o = fieldContainer.get(EVENTHANDLER); return o == null ? null : (OEventHandler)o; } @JsonIgnore public OFaultHandler getFaultHandler() { Object o = fieldContainer.get(FAULTHANDLER); return o == null ? null : (OFaultHandler)o; } @JsonIgnore public boolean isImplicitScope() { Object o = fieldContainer.get(IMPLICITSCOPE); return o == null ? false : (Boolean)o; } @JsonIgnore public boolean isIsolatedScope() { Object o = fieldContainer.get(ISOLATEDSCOPE); return o == null ? false : (Boolean)o; } public OPartnerLink getLocalPartnerLink(String name) { return getPartnerLinks().get(name); } /** * * Get a localy-defined variable by name. * @param varName name of variable * * @return */ public Variable getLocalVariable(final String varName) { return getVariables().get(varName); } @JsonIgnore public String getName() { Object o = fieldContainer.get(NAME); return o == null ? null : (String)o; } @SuppressWarnings("unchecked") @JsonIgnore public Map<String, OPartnerLink> getPartnerLinks() { Object o = fieldContainer.get(PARTNERLINKS); return o == null ? null : (Map<String, OPartnerLink>)o; } @JsonIgnore public OTerminationHandler getTerminationHandler() { Object o = fieldContainer.get(TERMINATIONHANDLER); return o == null ? null : (OTerminationHandler)o; } @SuppressWarnings("unchecked") @JsonIgnore public HashMap<String, Variable> getVariables() { Object o = fieldContainer.get(VARIABLES); return o == null ? null : (HashMap<String, Variable>)o; } public OPartnerLink getVisiblePartnerLink(String name) { OActivity current = this; OPartnerLink plink; while (current != null) { if (current instanceof OScope) { plink = ((OScope) current).getLocalPartnerLink(name); if (plink != null) return plink; } current = current.getParent(); } return null; } public Variable getVisibleVariable(String varName) { OActivity current = this; Variable variable; while (current != null) { if (current instanceof OScope) { variable = ((OScope) current).getLocalVariable(varName); if (variable != null) return variable; } current = current.getParent(); } return null; } @JsonIgnore public boolean isInAtomicScope() { OActivity current = this; while (current != null) { if (current instanceof OScope && ((OScope)current).isAtomicScope()) return true; current = current.getParent(); } return false; } public void setActivity(OActivity activity) { fieldContainer.put(ACTIVITY, activity); } public void setAtomicScope(boolean atomicScope) { fieldContainer.put(ATOMICSCOPE, atomicScope); } public void setCompensatable(Set<OScope> compensatable) { if (getCompensatable() == null) { fieldContainer.put(COMPENSATABLE, compensatable); } } public void setCompensationHandler(OCompensationHandler compensationHandler) { fieldContainer.put(COMPENSATIONHANDLER, compensationHandler); } public void setCorrelationSets(Map<String, CorrelationSet> correlationSets) { if (getCorrelationSets() == null) { fieldContainer.put(CORRELATIONSETS, correlationSets); } } public void setEventHandler(OEventHandler eventHandler) { fieldContainer.put(EVENTHANDLER, eventHandler); } public void setFaultHandler(OFaultHandler faultHandler) { fieldContainer.put(FAULTHANDLER, faultHandler); } public void setImplicitScope(boolean implicitScope) { fieldContainer.put(IMPLICITSCOPE, implicitScope); } public void setIsolatedScope(boolean isolatedScope) { fieldContainer.put(ISOLATEDSCOPE, isolatedScope); } public void setName(String name) { fieldContainer.put(NAME, name); } public void setPartnerLinks(Map<String, OPartnerLink> partnerLinks) { if (getPartnerLinks() == null) { fieldContainer.put(PARTNERLINKS, partnerLinks); } } public void setTerminationHandler(OTerminationHandler terminationHandler) { fieldContainer.put(TERMINATIONHANDLER, terminationHandler); } public void setVariables(HashMap<String, Variable> variables) { if (getVariables() == null) { fieldContainer.put(VARIABLES, variables); } } public String toString() { return "{OScope '" + getName() + "' id=" + getId() + "}"; } public static final class CorrelationSet extends OBase implements Serializable{ public static final long serialVersionUID = -1L; private static final String NAME = "name"; private static final String DECLARINGSCOPE = "declaringScope"; private static final String PROPERTIES = "properties"; /** * Indicates that this correlation set has a join use case in the scope. */ private static final String HASJOINUSECASES = "hasJoinUseCases"; @JsonCreator public CorrelationSet(){ setHasJoinUseCases(false); } public CorrelationSet(OProcess owner) { super(owner); setProperties(new ArrayList<OProcess.OProperty>()); setHasJoinUseCases(false); } @JsonIgnore public OScope getDeclaringScope() { Object o = fieldContainer.get(DECLARINGSCOPE); return o == null ? null : (OScope)o; } @JsonIgnore public boolean isHasJoinUseCases() { Object o = fieldContainer.get(HASJOINUSECASES); return o == null ? false : (Boolean)o; } @JsonIgnore public String getName() { Object o = fieldContainer.get(NAME); return o == null ? null : (String)o; } @SuppressWarnings("unchecked") @JsonIgnore public List<OProperty> getProperties() { Object o = fieldContainer.get(PROPERTIES); return o == null ? null : (List<OProperty>)o; } public void setDeclaringScope(OScope declaringScope) { fieldContainer.put(DECLARINGSCOPE, declaringScope); } public void setHasJoinUseCases(boolean hasJoinUseCases) { fieldContainer.put(HASJOINUSECASES, hasJoinUseCases); } public void setName(String name) { fieldContainer.put(NAME, name); } public void setProperties(List<OProperty> properties) { fieldContainer.put(PROPERTIES, properties); } public String toString() { return "{CSet " + getName() + " " + getProperties() + "}"; } } public static final class Variable extends OBase implements Serializable{ public static final long serialVersionUID = -1L; private static final String NAME = "name"; private static final String DECLARINGSCOPE = "declaringScope"; private static final String TYPE = "type"; /** If not-null indicates that this variable has an external representation. */ private static final String EXTVAR = "extVar"; @JsonCreator public Variable(){} public Variable(OProcess owner, OVarType type) { super(owner); setType(type); } @JsonIgnore public OScope getDeclaringScope() { Object o = fieldContainer.get(DECLARINGSCOPE); return o == null ? null : (OScope)o; } @JsonIgnore public String getDescription() { StringBuffer buf = new StringBuffer(getDeclaringScope().getName()); buf.append('.'); buf.append(getName()); return buf.toString(); } @JsonIgnore public OExtVar getExtVar() { Object o = fieldContainer.get(EXTVAR); return o == null ? null : (OExtVar)o; } @JsonIgnore public String getName() { Object o = fieldContainer.get(NAME); return o == null ? null : (String)o; } @JsonIgnore public OVarType getType() { Object o = fieldContainer.get(TYPE); return o == null ? null : (OVarType)o; } public void setDeclaringScope(OScope declaringScope) { fieldContainer.put(DECLARINGSCOPE, declaringScope); } public void setExtVar(OExtVar extVar) { fieldContainer.put(EXTVAR, extVar); } public void setName(String name) { fieldContainer.put(NAME, name); } public void setType(OVarType type) { fieldContainer.put(TYPE, type); } public String toString() { return "{Variable " + getDescription() + ":" + getType() + "}"; } } }