blob: 5be388fb163dd5cae748a54be2bb084c897f4419 [file] [log] [blame]
/*
* 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.engine;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;
import org.apache.ode.bpel.common.ProcessState;
import org.apache.ode.bpel.dao.ScopeStateEnum;
import org.apache.ode.bpel.pmapi.ProcessingException;
import org.apache.ode.bpel.pmapi.TInstanceStatus;
import org.apache.ode.bpel.pmapi.TScopeStatus;
/**
* Class for converting status codes from external (PMAPI) to internal (DAO) representation.
*/
class ProcessStatusConverter {
/**
* A mapping from the interface status codes, to the internal ODE status codes.
*/
private final Map<TInstanceStatus.Enum, BitSet> __interfaceStatusCodeToInternalStatusCodeMap =
new HashMap<TInstanceStatus.Enum,BitSet>();
/**
* One-to-one map between internal/external representation of the scope
* status codes.
*/
private final Map<ScopeStateEnum, TScopeStatus.Enum> __scopeStateMap =
new HashMap<ScopeStateEnum, TScopeStatus.Enum>();
ProcessStatusConverter() {
for (int i = 0 ; i < ProcessState.ALL_STATES.length; ++i){
short pistate = ProcessState.ALL_STATES[i];
TInstanceStatus.Enum intstc = cvtInstanceStatus(pistate);
BitSet bset = __interfaceStatusCodeToInternalStatusCodeMap.get(intstc);
if (bset == null) {
bset = new BitSet();
__interfaceStatusCodeToInternalStatusCodeMap.put(intstc,bset);
}
bset.set(pistate);
}
__scopeStateMap.put(ScopeStateEnum.ACTIVE, TScopeStatus.ACTIVE);
__scopeStateMap.put(ScopeStateEnum.COMPLETED,TScopeStatus.COMPLETED);
__scopeStateMap.put(ScopeStateEnum.FAULT,TScopeStatus.FAULTED);
}
/**
* Convert instance status from the internal database representation to
* the process management API enumerations.
* @param instancestate internal database state code
* @return API-compliant enumeration
*/
TInstanceStatus.Enum cvtInstanceStatus(short instancestate) {
switch (instancestate) {
case ProcessState.STATE_NEW:
case ProcessState.STATE_READY:
case ProcessState.STATE_ACTIVE:
return TInstanceStatus.ACTIVE;
case ProcessState.STATE_COMPLETED_OK:
return TInstanceStatus.COMPLETED;
case ProcessState.STATE_COMPLETED_WITH_FAULT:
return TInstanceStatus.FAILED;
case ProcessState.STATE_SUSPENDED:
return TInstanceStatus.SUSPENDED;
case ProcessState.STATE_TERMINATED:
return TInstanceStatus.TERMINATED;
}
// TODO: How do we determine if the process is in an "ERROR" state.
// The above should have been exhaustive.
throw new ProcessingException("Encountered unexpected instance state: " + instancestate);
}
/**
* The inverse of the above function. The above is not one-to-one, so this
* functions returns a set.
* @param status instance status (interface representation)
* @return internal states corresponding to the requested interface representation.
*/
short[] cvtInstanceStatus(TInstanceStatus.Enum status) {
BitSet bset = __interfaceStatusCodeToInternalStatusCodeMap.get(status);
if (bset == null)
return new short[0];
short ret[] = new short[bset.cardinality()];
for (int i = 0; i < ret.length; ++i) {
ret[i] = (short)bset.nextSetBit(i==0?0:ret[i-1]+1);
}
return ret;
}
/**
* Convert the internal scope state to the external representation.
* @param status
* @return
*/
TScopeStatus.Enum cvtScopeStatus(ScopeStateEnum status) {
return __scopeStateMap.get(status);
}
}