/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation。
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses. *
*/
package org.fireflow.pdl.bpel.enginemodules;
import java.util.ArrayList;
import java.util.List;
import org.fireflow.engine.context.RuntimeContext;
import org.fireflow.engine.entity.repository.ProcessKey;
import org.fireflow.engine.entity.repository.ProcessRepository;
import org.fireflow.engine.exception.EngineException;
import org.fireflow.engine.exception.WorkflowProcessNotFoundException;
import org.fireflow.engine.modules.persistence.PersistenceService;
import org.fireflow.engine.modules.persistence.ProcessPersister;
import org.fireflow.model.InvalidModelException;
import org.fireflow.pdl.bpel.BpelActivity;
import org.fireflow.pdl.bpel.BpelProcess;
import org.fireflow.pdl.bpel.structure.Child;
import org.fireflow.pdl.bpel.structure.StructureActivity;
import org.fireflow.pvm.kernel.PObject;
import org.fireflow.pvm.kernel.PObjectKey;
import org.fireflow.pvm.kernel.impl.NetInstanceImpl;
import org.fireflow.pvm.kernel.impl.NodeInstanceImpl;
import org.fireflow.pvm.translate.Process2PObjectTranslator;
/**
* @author 非也
* @version 2.0
*/
public class Process2PObjectTranslatorBpelImpl implements
Process2PObjectTranslator {
RuntimeContext runtimeContext = null;
private void translateActivity(BpelActivity activity ,List<PObject> result,ProcessKey pk){
PObjectKey key = new PObjectKey(pk.getProcessId(),
pk.getVersion(), pk
.getProcessType(), activity.getId());
PObject pObject = new NodeInstanceImpl(key);
pObject.setWorkflowBehavior(activity);
pObject.setWorkflowElement(activity);
result.add(pObject);
if (activity instanceof StructureActivity){
List<Child> children = ((StructureActivity)activity).getChildren();
if (children!=null){
for (Child child : children){
translateActivity(child.getChildBpelActivity(),result,pk);
}
}
}
}
/* (non-Javadoc)
* @see org.fireflow.pvm.translate.Process2PObjectTranslator#translateProcess(org.fireflow.engine.entity.repository.ProcessKey, java.lang.Object)
*/
public List<PObject> translateProcess(ProcessKey processKey, Object process) {
BpelProcess bpelProcess = (BpelProcess)process;
PObjectKey key = new PObjectKey(processKey.getProcessId(),
processKey.getVersion(), processKey
.getProcessType(), bpelProcess.getId());
PObject pObject = new NetInstanceImpl(key);
pObject.setWorkflowBehavior(bpelProcess);
pObject.setWorkflowElement(bpelProcess);
List<PObject> pobjectList = new ArrayList<PObject>();
pobjectList.add(pObject);
ProcessKey pk = ProcessKey.valueOf(key);
translateActivity(bpelProcess.getStartActivity(),pobjectList,pk);
return pobjectList;
}
/* (non-Javadoc)
* @see org.fireflow.pvm.translate.Process2PObjectTranslator#translateProcess(org.fireflow.engine.entity.repository.ProcessKey)
*/
public List<PObject> translateProcess(ProcessKey processKey) throws InvalidModelException,WorkflowProcessNotFoundException{
PersistenceService persistenceService = runtimeContext.getEngineModule(PersistenceService.class, processKey.getProcessType());
ProcessPersister processPersister = persistenceService.getProcessPersister();
ProcessRepository repository = processPersister.findProcessRepositoryByProcessKey(processKey);
if (repository==null){
throw new WorkflowProcessNotFoundException("The process is not found, id="+processKey.getProcessId()+", version="+processKey.getVersion()+", processType="+processKey.getProcessType());
}else{
return this.translateProcess(processKey, repository.getProcessObject());
}
}
/* (non-Javadoc)
* @see org.fireflow.engine.context.RuntimeContextAware#getRuntimeContext()
*/
public RuntimeContext getRuntimeContext() {
return runtimeContext;
}
/* (non-Javadoc)
* @see org.fireflow.engine.context.RuntimeContextAware#setRuntimeContext(org.fireflow.engine.context.RuntimeContext)
*/
public void setRuntimeContext(RuntimeContext ctx) {
this.runtimeContext = ctx;
}
/* (non-Javadoc)
* @see org.fireflow.engine.context.EngineModule#init(org.fireflow.engine.context.RuntimeContext)
*/
public void init(RuntimeContext runtimeContext) throws EngineException {
// TODO Auto-generated method stub
}
}