/** * */ package org.activiti.designer.eclipse.extension.export; import java.util.ArrayList; import java.util.List; import org.activiti.designer.eclipse.extension.AbstractDiagramWorker; import org.activiti.designer.eclipse.extension.validation.ProcessValidator; import org.activiti.designer.eclipse.util.ExtensionPointUtil; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.graphiti.mm.pictograms.Diagram; /** * Base class for {@link ExportMarshaller} implementations. * * @author Tiese Barrell * @since 0.5.1 * @version 3 * */ public abstract class AbstractExportMarshaller extends AbstractDiagramWorker implements ExportMarshaller { private static final int WORK_INVOKE_VALIDATORS_VALIDATOR = 10; /** * Invokes validators marked by the provided validatorIds. If no validator is * registered by one of the validatorIds, that validator is skipped. Make sure * to provide a fresh {@link SubProgressMonitor} as a monitor to properly * incorporate progress reporting into that of the originating * ExportMarshaller. * * @param validatorIds * the list of ids of the validators to invoke * @return true if *all* of the validators completed successfully or false * otherwise */ protected boolean invokeValidators(final List<String> validatorIds, final Diagram diagram, final IProgressMonitor monitor) { final int totalWork = WORK_INVOKE_VALIDATORS_VALIDATOR * validatorIds.size(); final IProgressMonitor activeMonitor = monitor == null ? new NullProgressMonitor() : monitor; activeMonitor.beginTask("Invoking validators", totalWork); boolean overallResult = true; try { if (validatorIds.size() > 0) { for (final String validatorId : validatorIds) { // get validator, else skip final ProcessValidator processValidator = ExtensionPointUtil.getProcessValidator(validatorId); if (processValidator != null) { monitor.subTask("Invoking " + processValidator.getValidatorName()); if (!(processValidator.validateDiagram(diagram, new SubProgressMonitor(activeMonitor, WORK_INVOKE_VALIDATORS_VALIDATOR)))) { // don't break if one result is false: keep validating to get // all of the problems overallResult = false; } } } } } finally { monitor.done(); } return overallResult; } /** * Invokes validator marked by the provided validatorId. If no validator is * registered by the validatorId, that validator is skipped. Make sure to * provide a fresh {@link SubProgressMonitor} as a monitor to properly * incorporate progress reporting into that of the originating * ExportMarshaller. * * @param validatorId * the id of the validator to invoke * @return true if the validator completed successfully or false otherwise */ protected boolean invokeValidator(final String validatorId, final Diagram diagram, final IProgressMonitor monitor) { final List<String> validatorIds = new ArrayList<String>(); validatorIds.add(validatorId); return invokeValidators(validatorIds, diagram, monitor); } }