/* Licensed 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.activiti.designer.eclipse.navigator.diagram;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Pool;
import org.activiti.bpmn.model.Process;
import org.activiti.designer.eclipse.navigator.TreeNode;
import org.activiti.designer.util.editor.Bpmn2MemoryModel;
import org.eclipse.core.resources.IFile;
/**
* @author Tiese Barrell
*/
public class FileDiagramTreeNode extends AbstractDiagramTreeNode<IFile> {
private Bpmn2MemoryModel model;
public FileDiagramTreeNode(final IFile parent) {
super(parent, null, "Diagram Root Node");
}
@Override
protected void extractChildren() {
if (isDiagramRoot()) {
model = buildModel((IFile) getParent());
if (hasPoolsOnly(model)) {
extractChildrenForPoolsOnly(model);
} else if (hasMainProcessOnly(model)) {
extractChildrenForMainProcessOnly(model);
} else if (hasMixedPoolsAndMainProcess(model)) {
extractChildrenForPoolsAndMainProcess(model);
}
}
}
@Override
protected boolean hasRootModel() {
return true;
}
@Override
protected Bpmn2MemoryModel getRootModel() {
return model;
}
private boolean isDiagramRoot() {
return getParent() instanceof IFile;
}
private boolean hasMainProcessOnly(final Bpmn2MemoryModel model) {
return hasMainProcess(model) && hasNoPools(model);
}
private boolean hasPoolsOnly(final Bpmn2MemoryModel model) {
return hasPools(model) && hasNoMainProcess(model);
}
private boolean hasMixedPoolsAndMainProcess(final Bpmn2MemoryModel model) {
return hasPools(model) && hasMainProcess(model);
}
private boolean hasMainProcess(final Bpmn2MemoryModel model) {
return model.getBpmnModel().getMainProcess() != null;
}
private boolean hasNoMainProcess(final Bpmn2MemoryModel model) {
return !hasMainProcess(model) || model.getBpmnModel().getMainProcess().getFlowElements().isEmpty();
}
private boolean hasNoPools(final Bpmn2MemoryModel model) {
return model.getBpmnModel().getPools() == null || model.getBpmnModel().getPools().isEmpty();
}
private boolean hasPools(final Bpmn2MemoryModel model) {
return model.getBpmnModel().getPools() != null && !model.getBpmnModel().getPools().isEmpty();
}
private void extractChildrenForMainProcessOnly(final Bpmn2MemoryModel model) {
extractTransparentProcess(this, model.getBpmnModel().getMainProcess());
}
private void extractProcess(final TreeNode parent, final Process mainProcess) {
addChildNode(DiagramTreeNodeFactory.createProcessNode(parent, mainProcess));
}
private void extractTransparentProcess(final TreeNode parent, final Process mainProcess) {
final TreeNode transparentProcessNode = DiagramTreeNodeFactory.createTransparentProcessNode(parent, mainProcess);
referenceChildNodesToOwnChildren(transparentProcessNode);
}
private void extractChildrenForPoolsOnly(final Bpmn2MemoryModel model) {
extractPools(model.getBpmnModel().getPools());
}
private void extractPools(final List<Pool> pools) {
for (final Pool pool : pools) {
addChildNode(DiagramTreeNodeFactory.createPoolNode(this, pool));
}
}
private void extractChildrenForPoolsAndMainProcess(final Bpmn2MemoryModel model) {
extractProcess(this, model.getBpmnModel().getMainProcess());
extractPools(model.getBpmnModel().getPools());
}
private Bpmn2MemoryModel buildModel(final IFile modelFile) {
final Bpmn2MemoryModel result = new Bpmn2MemoryModel(null, modelFile);
String filePath = modelFile.getLocationURI().getPath();
File bpmnFile = new File(filePath);
try {
if (bpmnFile.exists()) {
final FileInputStream fileStream = new FileInputStream(bpmnFile);
final XMLInputFactory xif = XMLInputFactory.newInstance();
final InputStreamReader in = new InputStreamReader(fileStream, "UTF-8");
final XMLStreamReader xtr = xif.createXMLStreamReader(in);
BpmnXMLConverter converter = new BpmnXMLConverter();
BpmnModel bpmnModel = converter.convertToBpmnModel(xtr);
result.setBpmnModel(bpmnModel);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}