+ this.isTest = isTest;
+ modelBpmn = ModelBpmn.create(modelBpmnText);
+ modelJson = new ObjectMapper().readTree(modelPropText);
+
+ instantiateMissingModelElements();
+ }
+
+ /**
+ * This method is meant to ensure that one ModelElement instance exists for
+ * each ModelElement class.
+ *
+ * As new ModelElement classes could have been registered after
+ * instantiation of this ModelProperties, we need to build the missing
+ * ModelElement instances.
+ */
+ private final void instantiateMissingModelElements() {
+ if (modelElementClasses.size() != modelElements.size()) {
+ Set<String> missingTypes = new HashSet<>(modelElementClasses.values());
+ missingTypes.removeAll(modelElements.keySet());
+ // Parse the list of base Model Elements and build up the
+ // ModelElements
+ modelElementClasses.entrySet().stream().parallel()
+ .filter(entry -> (AbstractModelElement.class.isAssignableFrom(entry.getKey())
+ && missingTypes.contains(entry.getValue())))
+ .forEach(entry -> {
+ try {
+ modelElements.put(entry.getValue(),
+ (entry.getKey()
+ .getConstructor(ModelProperties.class, ModelBpmn.class, JsonNode.class)
+ .newInstance(this, modelBpmn, modelJson)));
+ } catch (InstantiationException | NoSuchMethodException | IllegalAccessException
+ | InvocationTargetException e) {
+ logger.warn("Unable to instantiate a ModelElement, exception follows: ", e);
+ }
+ });
+ }