parent
86f66bc534
commit
05b044e64d
|
@ -6,6 +6,20 @@ var Refs = require('object-refs');
|
||||||
|
|
||||||
var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' });
|
var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' });
|
||||||
|
|
||||||
|
function elementToString(e) {
|
||||||
|
return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a suitable display candidate for definitions where the DI does not
|
||||||
|
* correctly specify one.
|
||||||
|
*/
|
||||||
|
function findDisplayCandidate(definitions) {
|
||||||
|
return _.find(definitions.rootElements, function(e) {
|
||||||
|
return e.$instanceOf('bpmn:Process') || e.$instanceOf('bpmn:Collaboration');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function BpmnTreeWalker(handler) {
|
function BpmnTreeWalker(handler) {
|
||||||
|
|
||||||
|
@ -34,7 +48,7 @@ function BpmnTreeWalker(handler) {
|
||||||
|
|
||||||
// avoid multiple rendering of elements
|
// avoid multiple rendering of elements
|
||||||
if (gfx) {
|
if (gfx) {
|
||||||
throw new Error('already rendered <' + element.id + '>');
|
throw new Error('already rendered ' + elementToString(element));
|
||||||
}
|
}
|
||||||
|
|
||||||
// call handler
|
// call handler
|
||||||
|
@ -68,7 +82,7 @@ function BpmnTreeWalker(handler) {
|
||||||
diRefs.bind(bpmnElement, 'di');
|
diRefs.bind(bpmnElement, 'di');
|
||||||
bpmnElement.di = di;
|
bpmnElement.di = di;
|
||||||
} else {
|
} else {
|
||||||
logError('no bpmnElement for <' + di.$type + '#' + di.id + '>', { element: di });
|
logError('no bpmnElement referenced in ' + elementToString(di), { element: di });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,11 +124,31 @@ function BpmnTreeWalker(handler) {
|
||||||
// load DI from selected diagram only
|
// load DI from selected diagram only
|
||||||
handleDiagram(diagram);
|
handleDiagram(diagram);
|
||||||
|
|
||||||
var plane = diagram.plane,
|
|
||||||
rootElement = plane.bpmnElement;
|
var plane = diagram.plane;
|
||||||
|
|
||||||
|
if (!plane) {
|
||||||
|
throw new Error('no plane for ' + elementToString(diagram));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var rootElement = plane.bpmnElement;
|
||||||
|
|
||||||
|
// ensure we default to a suitable display candidate (process or collaboration),
|
||||||
|
// even if non is specified in DI
|
||||||
|
if (!rootElement) {
|
||||||
|
rootElement = findDisplayCandidate(definitions);
|
||||||
|
|
||||||
if (!rootElement) {
|
if (!rootElement) {
|
||||||
throw new Error('no rootElement referenced in BPMNPlane <' + diagram.plane.id + '>');
|
throw new Error('do not know what to display');
|
||||||
|
} else {
|
||||||
|
|
||||||
|
logError('correcting missing bpmnElement on ' + elementToString(plane) + ' to ' + elementToString(rootElement));
|
||||||
|
|
||||||
|
// correct DI on the fly
|
||||||
|
plane.bpmnElement = rootElement;
|
||||||
|
registerDi(plane);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,7 +162,7 @@ function BpmnTreeWalker(handler) {
|
||||||
// force drawing of everything not yet drawn that is part of the target DI
|
// force drawing of everything not yet drawn that is part of the target DI
|
||||||
handleUnhandledProcesses(definitions.rootElements, ctx);
|
handleUnhandledProcesses(definitions.rootElements, ctx);
|
||||||
} else {
|
} else {
|
||||||
throw new Error('unsupported root element for bpmndi:Diagram <' + rootElement.$type + '>');
|
throw new Error('unsupported bpmnElement for ' + elementToString(plane) + ' : ' + elementToString(rootElement));
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle all deferred elements
|
// handle all deferred elements
|
||||||
|
@ -166,10 +200,8 @@ function BpmnTreeWalker(handler) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMessageFlows(messageFlows, context) {
|
function handleMessageFlows(messageFlows, context) {
|
||||||
if (messageFlows) {
|
|
||||||
_.forEach(messageFlows, contextual(handleMessageFlow, context));
|
_.forEach(messageFlows, contextual(handleMessageFlow, context));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function handleDataAssociation(association, context) {
|
function handleDataAssociation(association, context) {
|
||||||
visitIfDi(association, context);
|
visitIfDi(association, context);
|
||||||
|
@ -313,7 +345,8 @@ function BpmnTreeWalker(handler) {
|
||||||
handleDataElement(e, context);
|
handleDataElement(e, context);
|
||||||
} else {
|
} else {
|
||||||
logError(
|
logError(
|
||||||
'unrecognized flowElement <' + e.$type + '> in context ' + (context ? context.id : null),
|
'unrecognized flowElement ' + elementToString(e) + ' in context ' +
|
||||||
|
(context ? elementToString(context) : null),
|
||||||
{ element: e, context: context });
|
{ element: e, context: context });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -26,8 +26,8 @@ describe('viewer', function() {
|
||||||
function createViewer(xml, done) {
|
function createViewer(xml, done) {
|
||||||
var viewer = new Viewer({ container: container });
|
var viewer = new Viewer({ container: container });
|
||||||
|
|
||||||
viewer.importXML(xml, function(err) {
|
viewer.importXML(xml, function(err, warnings) {
|
||||||
done(err, viewer);
|
done(err, warnings, viewer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ describe('viewer', function() {
|
||||||
|
|
||||||
var xml = fs.readFileSync('test/fixtures/bpmn/simple.bpmn', 'utf8');
|
var xml = fs.readFileSync('test/fixtures/bpmn/simple.bpmn', 'utf8');
|
||||||
|
|
||||||
createViewer(xml, function(err, viewer) {
|
createViewer(xml, function(err, warnings, viewer) {
|
||||||
|
|
||||||
// when
|
// when
|
||||||
var overlays = viewer.get('overlays'),
|
var overlays = viewer.get('overlays'),
|
||||||
|
@ -145,9 +145,13 @@ describe('viewer', function() {
|
||||||
|
|
||||||
var xml = fs.readFileSync('test/fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn', 'utf8');
|
var xml = fs.readFileSync('test/fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn', 'utf8');
|
||||||
|
|
||||||
createViewer(xml, function(err) {
|
createViewer(xml, function(err, warnings) {
|
||||||
expect(err).toBeDefined();
|
|
||||||
expect(err.message).toEqual('no rootElement referenced in BPMNPlane <BPMNPlane_1>');
|
expect(err).not.toBeDefined();
|
||||||
|
expect(warnings.length).toBe(2);
|
||||||
|
|
||||||
|
expect(warnings[0].message).toEqual('no bpmnElement referenced in <bpmndi:BPMNPlane id="BPMNPlane_1" />');
|
||||||
|
expect(warnings[1].message).toEqual('correcting missing bpmnElement on <bpmndi:BPMNPlane id="BPMNPlane_1" /> to <bpmn:Process id="Process_1" />');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -179,7 +183,7 @@ describe('viewer', function() {
|
||||||
|
|
||||||
var xml = fs.readFileSync('test/fixtures/bpmn/simple.bpmn', 'utf8');
|
var xml = fs.readFileSync('test/fixtures/bpmn/simple.bpmn', 'utf8');
|
||||||
|
|
||||||
createViewer(xml, function(err, viewer) {
|
createViewer(xml, function(err, warnings, viewer) {
|
||||||
|
|
||||||
expect(viewer.get('bpmnjs')).toBe(viewer);
|
expect(viewer.get('bpmnjs')).toBe(viewer);
|
||||||
|
|
||||||
|
@ -220,7 +224,7 @@ describe('viewer', function() {
|
||||||
// given
|
// given
|
||||||
var xml = fs.readFileSync('test/fixtures/bpmn/empty-definitions.bpmn', 'utf8');
|
var xml = fs.readFileSync('test/fixtures/bpmn/empty-definitions.bpmn', 'utf8');
|
||||||
|
|
||||||
createViewer(xml, function(err, viewer) {
|
createViewer(xml, function(err, warnings, viewer) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return done(err);
|
return done(err);
|
||||||
|
@ -247,7 +251,7 @@ describe('viewer', function() {
|
||||||
// given
|
// given
|
||||||
var xml = fs.readFileSync('test/fixtures/bpmn/complex.bpmn', 'utf8');
|
var xml = fs.readFileSync('test/fixtures/bpmn/complex.bpmn', 'utf8');
|
||||||
|
|
||||||
createViewer(xml, function(err, viewer) {
|
createViewer(xml, function(err, warnings, viewer) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return done(err);
|
return done(err);
|
||||||
|
@ -287,7 +291,7 @@ describe('viewer', function() {
|
||||||
svgDoc.appendChild(rect);
|
svgDoc.appendChild(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
createViewer(xml, function(err, viewer) {
|
createViewer(xml, function(err, warnings, viewer) {
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return done(err);
|
return done(err);
|
||||||
|
|
Loading…
Reference in New Issue