@Override public String toString() { return baseElement.getId(); }
@Override public int hashCode() { return baseElement.getId().hashCode(); }
/** * @param baseElements * Collection of baseelements * @param graphBuilder * graphBuilder * @param processdefinition * bpmn file * @return Collection of BpmnElements */ public static Collection<BpmnElement> getBpmnElements(final File processdefinition, final Collection<BaseElement> baseElements, final ElementGraphBuilder graphBuilder) { final List<BpmnElement> elements = new ArrayList<>(); for (final BaseElement baseElement : baseElements) { BpmnElement element = graphBuilder.getElement(baseElement.getId()); if (element == null) { // if element is not in the data flow graph, create it. element = new BpmnElement(processdefinition.getPath(), baseElement); } elements.add(element); } return elements; }
for (final String variableName : variableNames) { if (ur(variableName)) { anomalies.add(new AnomalyContainer(variableName, Anomaly.UR, baseElement.getId(), processVariables.get(variableName))); anomalies.add(new AnomalyContainer(variableName, Anomaly.DU, baseElement.getId(), processVariables.get(variableName))); anomalies.add(new AnomalyContainer(variableName, Anomaly.DD, baseElement.getId(), processVariables.get(variableName)));
/** * Check for redundant edges between common elements (double or more flows instead of one) * * @return issues */ @Override public Collection<CheckerIssue> check(BpmnElement element) { final Collection<CheckerIssue> issues = new ArrayList<CheckerIssue>(); final BaseElement bpmnElement = element.getBaseElement(); if (bpmnElement instanceof SequenceFlow) { final ArrayList<String> sequenceFlowDef = bpmnScanner.getSequenceFlowDef(bpmnElement.getId()); if (getSequenceFlowList().isEmpty()) { addToSequenceFlowList(bpmnElement.getId(), sequenceFlowDef); } for (Map.Entry<String, ArrayList<String>> entry : getSequenceFlowList().entrySet()) { // Check whether targetRef & sourceRef of current item exist in global list if (sequenceFlowDef.equals(entry.getValue()) && !bpmnElement.getId().equals(entry.getKey())) { issues.addAll(IssueWriter.createIssue(rule, CriticalityEnum.ERROR, element, String.format( Messages.getString("OverlapChecker.0"), //$NON-NLS-1$ CheckName.checkName(bpmnElement)))); return issues; } } if (!getSequenceFlowList().containsKey(bpmnElement.getId())) { addToSequenceFlowList(bpmnElement.getId(), sequenceFlowDef); } } return issues; }
/** * Prepares an issue for class after check * * @param javaReference * @param element * @param issues */ private void prepareClassWarning(final String javaReference, final BpmnElement element, final Collection<CheckerIssue> issues) { if (javaReference != null) { if (!resourcesNewestVersions.contains(javaReference)) { if (element.getBaseElement().getId() == null) { issues.add(IssueWriter.createIssueWithJavaRef(rule, CriticalityEnum.WARNING, element, javaReference, String.format(Messages.getString("VersioningChecker.14"), javaReference))); //$NON-NLS-1$ } else { issues.add(IssueWriter.createIssueWithJavaRef(rule, CriticalityEnum.WARNING, element, javaReference, String.format(Messages.getString("VersioningChecker.14"), javaReference))); //$NON-NLS-1$ } } } }
/** * * @param processdefinition * Holds the path to the BPMN model * @param baseElements * List of baseElements * @param graphBuilder * ElementGraphBuilder used for data flow of a BPMN Model * @param issues * List of issues * @param checkerInstances * ElementCheckers from ruleSet */ private void executeCheckers(final File processdefinition, final Collection<BaseElement> baseElements, final ElementGraphBuilder graphBuilder, final Collection<CheckerIssue> issues, Collection<ElementChecker> checkerInstances) { // execute element checkers for (final BaseElement baseElement : baseElements) { BpmnElement element = graphBuilder.getElement(baseElement.getId()); if (element == null) { // if element is not in the data flow graph, create it. element = new BpmnElement(processdefinition.getPath(), baseElement); } for (final ElementChecker checker : checkerInstances) { issues.addAll(checker.check(element)); } } }
@Override public Collection<CheckerIssue> check(BpmnElement element) { final Collection<CheckerIssue> issues = new ArrayList<CheckerIssue>(); final BaseElement bpmnElement = element.getBaseElement(); final Map<String, Setting> settings = rule.getSettings(); final ArrayList<String> whiteList = rule.getWhiteList(); final Map<String, String> keyPairs = new HashMap<String, String>(); final ArrayList<Setting> optionalSettings = new ArrayList<Setting>(); final ArrayList<Setting> mandatorySettings = new ArrayList<Setting>(); // Retrieve extension key pair from bpmn model keyPairs.putAll(bpmnScanner.getKeyPairs(bpmnElement.getId())); // Create ArrayList for easier manipulation for (Map.Entry<String, Setting> settingsEntry : settings.entrySet()) { if (settingsEntry.getValue().getRequired()) { mandatorySettings.add(settingsEntry.getValue()); } else { optionalSettings.add(settingsEntry.getValue()); } } if (whiteList.contains(bpmnElement.getElementType().getInstanceType().getSimpleName())) { // Check for all mandatory extension pairs according to ruleset issues.addAll(checkManExtension(whiteList, mandatorySettings, keyPairs, bpmnElement, element)); // Check for all optional extension pairs issues.addAll(checkOptExtension(whiteList, optionalSettings, keyPairs, bpmnElement, element)); } checkMisconfiguration(); return issues; }
private static JsonObject transformElementToJsonIncludingProcessVariables(BpmnElement element) { final JsonObject obj = new JsonObject(); if (!element.getProcessVariables().isEmpty()) { // elementID obj.addProperty("elementId", element.getBaseElement().getId()); // bpmnFile obj.addProperty(BpmnConstants.VPAV_BPMN_FILE, replace(File.separator, "\\", element.getProcessdefinition())); // element Name if (element.getBaseElement().getAttributeValue("name") != null) obj.addProperty("elementName", element.getBaseElement().getAttributeValue(BpmnConstants.ATTR_NAME)); Function<ProcessVariableOperation, JsonObject> processVariableToJson = o -> { final JsonObject jsonOperation = new JsonObject(); jsonOperation.addProperty("name", o.getName()); jsonOperation.addProperty("fieldType", o.getFieldType().getDescription()); jsonOperation.addProperty("elementChapter", o.getChapter().toString()); return jsonOperation; }; obj.add("read", element.getProcessVariables().values().stream() .filter(o -> o.getOperation() == VariableOperation.READ) .map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); obj.add("write", element.getProcessVariables().values().stream() .filter(o -> o.getOperation() == VariableOperation.WRITE) .map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); obj.add("delete", element.getProcessVariables().values().stream() .filter(o -> o.getOperation() == VariableOperation.DELETE) .map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); } return obj; }
/** * Transforms a process variable to a json object * * @param processVariable * @return */ private static JsonObject transformProcessVariablesToJson(final ProcessVariable processVariable) { final JsonObject obj = new JsonObject(); obj.addProperty("name", processVariable.getName()); if (processVariable.getOperations().size() > 0) { String bpmnFile = processVariable.getOperations().get(0).getElement().getProcessdefinition(); obj.addProperty(BpmnConstants.VPAV_BPMN_FILE, replace(File.separator, "\\", bpmnFile)); } Function<ProcessVariableOperation, JsonObject> processVariableToJson = o -> { final JsonObject jsonOperation = new JsonObject(); jsonOperation.addProperty("elementId", o.getElement().getBaseElement().getId()); jsonOperation.addProperty("elementName", o.getElement().getBaseElement().getAttributeValue("name")); jsonOperation.addProperty("fieldType", o.getFieldType().getDescription()); jsonOperation.addProperty("elementChapter", o.getChapter().toString()); return jsonOperation; }; obj.add("read", processVariable.getReads().stream().map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); obj.add("write", processVariable.getWrites().stream().map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); obj.add("delete", processVariable.getDeletes().stream().map(processVariableToJson).collect(JsonArray::new, JsonArray::add, JsonArray::addAll)); return obj; }
if (bpmnElement instanceof BusinessRuleTask) { final String implementationAttr = bpmnScanner.getImplementation(bpmnElement.getId());
public String toString() { return name + " [" + element.getProcessdefinition() + ", " + element.getBaseElement().getId() + ", Scope: " + scopeId + ", " + chapter.name() + ", " + fieldType.getDescription() + ", " + resourceFilePath + "]"; }
throw new ProcessingException( "el expression " + expression + " in " + element.getProcessdefinition() + ", element ID: " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + element.getBaseElement().getId() + " couldn't be parsed", //$NON-NLS-1$ e);
+ ", element ID: " + element.getBaseElement().getId() + ", Type: " + KnownElementFieldType.Expression + " couldn't be parsed", e);
/** * Check for dataflow anomaly between current and previous variable operation * * @param element * Current BpmnElement * @param curr * current operation * @param last * previous operation */ private void checkAnomaly(final BpmnElement element, ProcessVariableOperation curr, ProcessVariableOperation last) { if (urSourceCode(last, curr)) { element.addSourceCodeAnomaly( new AnomalyContainer(curr.getName(), Anomaly.UR, element.getBaseElement().getId(), curr)); } if (ddSourceCode(last, curr)) { element.addSourceCodeAnomaly( new AnomalyContainer(curr.getName(), Anomaly.DD, element.getBaseElement().getId(), curr)); } if (duSourceCode(last, curr)) { element.addSourceCodeAnomaly( new AnomalyContainer(curr.getName(), Anomaly.DU, element.getBaseElement().getId(), curr)); } }
/** * * @param rule * Rule * @param classification * CriticalityEnum * @param var * Variable * @param paths * List of paths * @param anomaly * Anomaly * @param message * Errormessage * @return Issues */ public static Collection<CheckerIssue> createIssue(final Rule rule, final CriticalityEnum classification, final ProcessVariableOperation var, final List<Path> paths, final AnomalyContainer anomaly, final String message) { final Collection<CheckerIssue> issues = new ArrayList<CheckerIssue>(); issues.add(new CheckerIssue(rule.getName(), rule.getRuleDescription(), classification, var.getElement().getProcessdefinition(), var.getResourceFilePath(), var.getElement().getBaseElement().getId(), var.getElement().getBaseElement().getAttributeValue(BpmnModelConstants.BPMN_ATTRIBUTE_NAME), var.getName(), anomaly.getAnomaly(), paths, message)); return issues; }
pathElements.add(new XmlPathElement(element.getBaseElement().getId(), elementName));
initialOperations.put(name, new ProcessVariableOperation(expr.getArg(0).toString(), element, ElementChapter.Code, KnownElementFieldType.Initial, resourceFilePath, type, element.getBaseElement().getId()));