Skip to content

Commit

Permalink
chore(element-templates): use existing moddle instance
Browse files Browse the repository at this point in the history
  • Loading branch information
marstamm committed Apr 4, 2022
1 parent ba57360 commit 628a98a
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 134 deletions.
12 changes: 7 additions & 5 deletions src/provider/cloud-element-templates/ElementTemplatesLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,18 @@ import { Validator } from './Validator';
import { default as TemplatesLoader } from '../element-templates/ElementTemplatesLoader';

export default class ElementTemplatesLoader extends TemplatesLoader {
constructor(loadTemplates, eventBus, elementTemplates) {
constructor(loadTemplates, eventBus, elementTemplates, moddle) {

super(loadTemplates, eventBus, elementTemplates);
super(loadTemplates, eventBus, elementTemplates, moddle);

this._elementTemplates = elementTemplates;
}

setTemplates(templates) {
const elementTemplates = this._elementTemplates;
const elementTemplates = this._elementTemplates,
moddle = this._moddle;

const validator = new Validator().addAll(templates);
const validator = new Validator(moddle).addAll(templates);

const errors = validator.getErrors(),
validTemplates = validator.getValidTemplates();
Expand All @@ -31,5 +32,6 @@ export default class ElementTemplatesLoader extends TemplatesLoader {
ElementTemplatesLoader.$inject = [
'config.elementTemplates',
'eventBus',
'elementTemplates'
'elementTemplates',
'moddle'
];
4 changes: 2 additions & 2 deletions src/provider/cloud-element-templates/Validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ const SUPPORTED_SCHEMA_PACKAGE = getTemplateSchemaPackage();
* A Camunda Cloud element template validator.
*/
export class Validator extends BaseValidator {
constructor() {
super();
constructor(moddle) {
super(moddle);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ import { ensureExtension } from '../CreateHelper';

export default class TemplateElementFactory {

constructor(bpmnFactory, elementFactory) {
constructor(bpmnFactory, elementFactory, moddle) {
this._bpmnFactory = bpmnFactory;
this._elementFactory = elementFactory;
this._moddle = moddle;

this._providers = {
[PROPERTY_TYPE]: PropertyBindingProvider,
Expand All @@ -54,10 +55,11 @@ export default class TemplateElementFactory {

const elementFactory = this._elementFactory;
const bpmnFactory = this._bpmnFactory;
const moddle = this._moddle;
const providers = this._providers;

// (0) make sure template is valid
const errors = validate([ template ]);
const errors = validate([ template ], moddle);

// todo(pinussilvestrus): return validation errors
if (errors && errors.length) {
Expand Down Expand Up @@ -153,7 +155,7 @@ export default class TemplateElementFactory {
}
}

TemplateElementFactory.$inject = [ 'bpmnFactory', 'elementFactory' ];
TemplateElementFactory.$inject = [ 'bpmnFactory', 'elementFactory', 'moddle' ];


// helper ////////////////
Expand Down
5 changes: 3 additions & 2 deletions src/provider/cloud-element-templates/util/validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ import { Validator } from '../Validator';
* return a list of errors.
*
* @param {Array<TemplateDescriptor>} descriptors
* @param {Moddle} moddle
*
* @return {Array<Error>}
*/
export default function validate(descriptors) {
return new Validator().addAll(descriptors).getErrors();
export default function validate(descriptors, moddle) {
return new Validator(moddle).addAll(descriptors).getErrors();
}
11 changes: 7 additions & 4 deletions src/provider/element-templates/ElementTemplatesLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ import { Validator } from './Validator';
* @param {ElementTemplates} elementTemplates
*/
export default class ElementTemplatesLoader {
constructor(loadTemplates, eventBus, elementTemplates) {
constructor(loadTemplates, eventBus, elementTemplates, moddle) {
this._loadTemplates = loadTemplates;
this._eventBus = eventBus;
this._elementTemplates = elementTemplates;
this._moddle = moddle;

eventBus.on('diagram.init', () => {
this.reload();
Expand Down Expand Up @@ -57,9 +58,10 @@ export default class ElementTemplatesLoader {
}

setTemplates(templates) {
const elementTemplates = this._elementTemplates;
const elementTemplates = this._elementTemplates,
moddle = this._moddle;

const validator = new Validator().addAll(templates);
const validator = new Validator(moddle).addAll(templates);

const errors = validator.getErrors(),
validTemplates = validator.getValidTemplates();
Expand Down Expand Up @@ -87,5 +89,6 @@ export default class ElementTemplatesLoader {
ElementTemplatesLoader.$inject = [
'config.elementTemplates',
'eventBus',
'elementTemplates'
'elementTemplates',
'moddle'
];
92 changes: 44 additions & 48 deletions src/provider/element-templates/Validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,24 @@ import {

import semverCompare from 'semver-compare';

import BpmnModdle from 'bpmn-moddle';

import {
validate as validateAgainstSchema,
getSchemaVersion as getTemplateSchemaVersion
} from '@bpmn-io/element-templates-validator';

const SUPPORTED_SCHEMA_VERSION = getTemplateSchemaVersion();

const MORPHABLE_TYPES = [ 'bpmn:Activity', 'bpmn:Event', 'bpmn:Gateway' ];

/**
* A element template validator.
*/
export class Validator {
constructor() {
constructor(moddle) {
this._templatesById = {};

this._validTemplates = [];
this._errors = [];
this._moddle = moddle;
}

/**
Expand Down Expand Up @@ -143,19 +142,58 @@ export class Validator {
appliesTo = template.appliesTo;

// (3.1) template can be applied to elementType
if (!appliesTo.find(type => isType(elementType, type))) {
// prevents cases where the elementType is not part of appliesTo
if (!appliesTo.find(type => this._isType(elementType, type))) {
return this._logError(`template does not apply to requested element type <${ elementType }>`, template);
}

// (3.2) template only applies to same type of element
// prevent elementTemplates to morph into incompatible types, e.g. Task -> SequenceFlow
for (const sourceType of appliesTo) {
if (!canMorph(sourceType, elementType)) {
if (!this._canMorph(sourceType, elementType)) {
return this._logError(`can not morph <${sourceType}> into <${elementType}>`, template);
}
}
}
}


/**
* Check if given type is a subtype of given base type.
*
* @param {String} type
* @param {String} baseType
* @returns {Boolean}
*/
_isType(type, baseType) {
const sourceInstance = this._moddle.create(type);

return this._moddle.hasType(sourceInstance, baseType);
}


/**
* Checks if a given type can be morphed into another type.
*
* @param {String} sourceType
* @param {String} targetType
* @returns {Boolean}
*/
_canMorph(sourceType, targetType) {

if (sourceType === targetType) {
return true;
}

const baseType = MORPHABLE_TYPES.find(type => this._isType(sourceType, type));

if (!baseType) {
return false;
}

return this._isType(targetType, baseType);
}

/**
* Log an error for the given template
*
Expand Down Expand Up @@ -245,46 +283,4 @@ export function filteredSchemaErrors(schemaErrors) {

return false;
});
}


// helpers ///////////////////////

const moddle = new BpmnModdle();
const MORPHABLE_TYPES = [ 'bpmn:Task', 'bpmn:Event', 'bpmn:Gateway' ];

/**
* Check if given type is a subtype of given base type.
*
* @param {String} type
* @param {String} baseType
* @returns {Boolean}
*/
function isType(type, baseType) {
const sourceInstance = moddle.create(type);

return sourceInstance.$instanceOf(baseType);
}


/**
* Checks if a given type can be morphed into another type.
*
* @param {String} sourceType
* @param {String} targetType
* @returns {Boolean}
*/
function canMorph(sourceType, targetType) {

if (sourceType === targetType) {
return true;
}

const baseType = MORPHABLE_TYPES.find(type => isType(sourceType, type));

if (!baseType) {
return false;
}

return isType(targetType, baseType);
}
5 changes: 3 additions & 2 deletions src/provider/element-templates/util/validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ import { Validator } from '../Validator';
* return a list of errors.
*
* @param {Array<TemplateDescriptor>} descriptors
* @param {Moddle} moddle
*
* @return {Array<Error>}
*/
export default function validate(descriptors) {
return new Validator().addAll(descriptors).getErrors();
export default function validate(descriptors, moddle) {
return new Validator(moddle).addAll(descriptors).getErrors();
}
Loading

0 comments on commit 628a98a

Please sign in to comment.