public void commitChanges(VariableInstance var, ScopeFrame scopeFrame, Node value) throws ExternalVariableModuleException { if (var.declaration.extVar != null) /* external variable */ { if (__log.isDebugEnabled()) __log.debug( "Write external variable: name=" + var.declaration + " value=" + DOMUtils.domToString(value)); VariableInstance related = scopeFrame.resolve(var.declaration.extVar.related); Node reference = null; try { reference = fetchVariableData(var, scopeFrame, true); } catch (FaultException fe) { // In this context this is not necessarily a problem, since the assignment may re-init the // related var } VariableContext.ValueReferencePair vrp = _brc.writeExtVar(var, reference, value); commitChanges(related, scopeFrame, vrp.reference); } else /* normal variable */ { if (__log.isDebugEnabled()) __log.debug( "Write variable: name=" + var.declaration + " value=" + DOMUtils.domToString(value)); _brc.commitChanges(var, value); } writeProperties(var, value); }
/** * Proxy to {@link OdeRTInstanceContext#initializeVariable(Variable, Node)} then write properties. */ public Node initializeVariable(VariableInstance var, ScopeFrame scopeFrame, Node val) throws ExternalVariableModuleException { try { if (var.declaration.extVar != null) /* external variable */ { if (__log.isDebugEnabled()) __log.debug( "Initialize external variable: name=" + var.declaration + " value=" + DOMUtils.domToString(val)); Node reference = null; try { reference = fetchVariableData(var, scopeFrame, true); } catch (FaultException fe) { // In this context this is not necessarily a problem, since the assignment may re-init the // related var } if (reference != null) val = _brc.readExtVar(var, reference); return val; } else /* normal variable */ { if (__log.isDebugEnabled()) __log.debug( "Initialize variable: name=" + var.declaration + " value=" + DOMUtils.domToString(val)); return _brc.initializeVariable(var, val); } } finally { writeProperties(var, val); } }
public Node fetchVariableData( VariableInstance variable, ScopeFrame scopeFrame, boolean forWriting) throws FaultException { if (variable.declaration.extVar != null) { // Note, that when using external variables, the database will not contain the value of the // variable, instead we need to go the external variable subsystems. Element reference = (Element) _brc.fetchVariableData( scopeFrame.resolve(variable.declaration.extVar.related), false); try { Node ret = _brc.readExtVar(variable, reference); if (ret == null) { throw new FaultException( _runtime._oprocess.constants.qnUninitializedVariable, "The external variable \"" + variable.declaration.name + "\" has not been initialized."); } return ret; } catch (IncompleteKeyException ike) { // This indicates that the external variable needed to be written do, put has not been. __log.error( "External variable could not be read due to incomplete key; the following key " + "components were missing: " + ike.getMissing()); throw new FaultException( _runtime._oprocess.constants.qnUninitializedVariable, "The extenral variable \"" + variable.declaration.name + "\" has not been properly initialized;" + "the following key compoenents were missing:" + ike.getMissing()); } catch (ExternalVariableModuleException e) { throw new BpelEngineException(e); } } else /* not external */ { Node data = _brc.fetchVariableData(variable, forWriting); if (data == null) { // Special case of messageType variables with no part if (variable.declaration.type instanceof OMessageVarType) { OMessageVarType msgType = (OMessageVarType) variable.declaration.type; if (msgType.parts.size() == 0) { Document doc = DOMUtils.newDocument(); Element root = doc.createElement("message"); doc.appendChild(root); return root; } } throw new FaultException( _runtime._oprocess.constants.qnUninitializedVariable, "The variable " + variable.declaration.name + " isn't properly initialized."); } return data; } }
/** Record all values of properties of a 'MessageType' variable for efficient lookup. */ private void writeProperties(VariableInstance variable, Node value) { if (variable.declaration.type instanceof OMessageVarType) { for (OProcess.OProperty property : variable.declaration.getOwner().properties) { OProcess.OPropertyAlias alias = property.getAlias(variable.declaration.type); if (alias != null) { try { String val = extractProperty((Element) value, alias, variable.declaration.getDescription()); if (val != null) _brc.writeVariableProperty(variable, property.name, val); } catch (UninitializedVariableException uve) { // This really should not happen, since we are writing to a variable that we just // modified. __log.fatal( "Couldn't extract property '" + property.toString() + "' in property pre-extraction: " + uve); throw new RuntimeException(uve); } catch (FaultException e) { // This will fail as we're basically trying to extract properties on all received // messages // for optimization purposes. if (__log.isDebugEnabled()) __log.debug( "Couldn't extract property '" + property.toString() + "' in property pre-extraction: " + e.toString()); } } } } }
/** Called when the process completes to clean up any outstanding message exchanges. */ private void cleanupOutstandingMyRoleExchanges(FaultInfo optionalFaultData) { // TODO: all this should be moved into the engine. We don't really need the ORM to find // these mexs, we can just scan the database String[] mexRefs = getORM().releaseAll(); for (String mexId : mexRefs) { _brc.noreply(mexId, optionalFaultData); } }
/** Proxy to {@link VariableContext#readVariableProperty(Variable, QName)}. */ public String readProperty(VariableInstance variable, OProcess.OProperty property) throws FaultException { try { return _brc.readVariableProperty(variable, property.name); } catch (UninitializedVariableException e) { throw new FaultException(_runtime._oprocess.constants.qnUninitializedVariable); } }
public Node fetchPartnerRoleEndpointReferenceData(PartnerLinkInstance link) throws FaultException { Element epr = _brc.fetchPartnerRoleEndpointReferenceData(link); if (epr == null) { throw new FaultException(_runtime._oprocess.constants.qnUninitializedPartnerRole); } return epr; }
/** * Proxy to {@link RecoveryContext#registerActivityForRecovery(String, long, String, Date, * Element, String[], int)}. */ public void registerActivityForRecovery( ActivityRecoveryChannel recoveryChannel, long id, String reason, Date dateTime, Element details, String[] actions, int retryCount) { _brc.registerActivityForRecovery( recoveryChannel.export(), id, reason, dateTime, details, actions, retryCount); }
public void writeCorrelation(CorrelationSetInstance cset, CorrelationKey ckeyVal) throws FaultException { OScope.CorrelationSet csetdef = cset.declaration; QName[] propNames = new QName[csetdef.properties.size()]; for (int m = 0; m < csetdef.properties.size(); m++) { OProcess.OProperty oProperty = csetdef.properties.get(m); propNames[m] = oProperty.name; } ckeyVal.setUnique(cset.declaration.isUnique()); _brc.writeCorrelation(cset, propNames, ckeyVal); }
/** * @param instance * @param operation * @param outboundMsg * @param object */ public String invoke( String invokeId, PartnerLinkInstance instance, Operation operation, Element outboundMsg, Object object) throws FaultException { try { return _brc.invoke(invokeId, instance, operation, outboundMsg); } catch (UninitializedPartnerEPR e) { throw new FaultException(_runtime._oprocess.constants.qnUninitializedPartnerRole); } }
/** Proxy to {@link IOContext#reply(PartnerLink, String, String, Element, QName) }. */ public void reply( PartnerLinkInstance plink, String opName, String bpelmex, Element element, QName fault) throws FaultException { String mexid = getORM().release(plink, opName, bpelmex); if (mexid == null) throw new FaultException(_runtime._oprocess.constants.qnMissingRequest); try { _brc.reply(mexid, plink, opName, element, fault); } catch (NoSuchOperationException e) { // reply to operation that is either not defined or one-way. Perhaps this should be detected // at compile time? throw new FaultException( _runtime._oprocess.constants.qnMissingRequest, "Undefined two-way operation \"" + opName + "\"."); } }
/** Proxy to {@link BpelRuntimeContext# }. */ public void cancel(PickResponseChannel responseChannel) { final String id = responseChannel.export(); _brc.cancelSelect(id); getORM().cancel(id); _vpu.inject( new JacobRunnable() { private static final long serialVersionUID = 6157913683737696396L; public void run() { TimerResponseChannel responseChannel = importChannel(id, TimerResponseChannel.class); responseChannel.onCancel(); } }); }
public void select( PickResponseChannel pickResponseChannel, Date timeout, boolean createInstance, Selector[] selectors) throws FaultException { final String pickResponseChannelStr = pickResponseChannel.export(); int conflict = getORM().findConflict(selectors); if (conflict != -1) throw new FaultException( _runtime._oprocess.constants.qnConflictingReceive, selectors[conflict].toString()); getORM().register(pickResponseChannelStr, selectors); _brc.select(pickResponseChannelStr, timeout, selectors); }
public boolean isVariableInitialized(VariableInstance var) { return _brc.isVariableInitialized(var); }
public boolean isPartnerRoleEndpointInitialized(PartnerLinkInstance pLink) { return _brc.isPartnerRoleEndpointInitialized(pLink); }
public void setAtomicScope(boolean atomicScope) { _brc.setAtomicScope(atomicScope); }
public Node getProcessProperty(QName propertyName) { return _brc.getProcessProperty(propertyName); }
public void setRetriesDone() { _brc.setAtomicScopeRetriesDone(); }
public boolean isCorrelationInitialized(CorrelationSetInstance correlationSet) { return _brc.isCorrelationInitialized(correlationSet); }
public boolean isRetryable() { return _brc.isAtomicScopeRetryable(); }
/** Proxy to {@link ProcessControlContext#terminate()}. */ public void terminate() { cleanupOutstandingMyRoleExchanges(null); _brc.terminate(); }
public int getRetryDelay() { return _brc.getAtomicScopeRetryDelay(); }
public boolean isFirstTry() { return _brc.isAtomicScopeFirstTry(); }
/** Proxy to {@link IOContext#getPartnerFaultExplanation(String) }. */ public String getPartnerFaultExplanation(String mexId) { return _brc.getPartnerFaultExplanation(mexId); }
/** * Proxy to {@link OdeRTInstanceContext#sendEvent(org.apache.ode.bpel.evt.ProcessInstanceEvent) }. */ public void sendEvent(ProcessInstanceStartedEvent evt) { _brc.sendEvent(evt); }
/** Proxy to {@link ProcessControlContext#forceFlush() }. */ public void forceFlush() { _brc.forceFlush(); }
public void completedFault(FaultData faultData) { cleanupOutstandingMyRoleExchanges(faultData); _brc.completedFault(faultData); }
public void setRetriedOnce() { _brc.setAtomicScopeRetriedOnce(); }
public void completedOk() { cleanupOutstandingMyRoleExchanges(null); _brc.completedOk(); }
/** Proxy to {@link ProcessControlContext#forceRollback() }. */ public void forceRollback() { _brc.forceRollback(); }