blob: 0cddb4d1c4f4d197aec6ccf52bc4016e6f0041b6 [file] [log] [blame]
/**
*
*/
package uk.org.taverna.scufl2.validation.structural;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import uk.org.taverna.scufl2.api.common.WorkflowBean;
import uk.org.taverna.scufl2.api.core.DataLink;
import uk.org.taverna.scufl2.api.core.Processor;
import uk.org.taverna.scufl2.api.core.Workflow;
import uk.org.taverna.scufl2.api.iterationstrategy.CrossProduct;
import uk.org.taverna.scufl2.api.iterationstrategy.DotProduct;
import uk.org.taverna.scufl2.api.iterationstrategy.IterationStrategyNode;
import uk.org.taverna.scufl2.api.port.OutputWorkflowPort;
import uk.org.taverna.scufl2.api.port.ReceiverPort;
import uk.org.taverna.scufl2.api.port.SenderPort;
import uk.org.taverna.scufl2.validation.ValidationException;
/**
* @author alanrw
*
*/
public class ReportStructuralValidationListener extends
DefaultStructuralValidationListener {
private Map<SenderPort, List<DataLink>> senderDataLinkMap = new HashMap<SenderPort, List<DataLink>>();
private Map<ReceiverPort, List<DataLink>> receiverDataLinkMap = new HashMap<ReceiverPort, List<DataLink>>();
private Map<WorkflowBean, Integer> resolvedDepthMap = new HashMap<WorkflowBean, Integer> ();
private Set<DotProduct> dotProductIterationMismatches = new HashSet<DotProduct>();
private Set<CrossProduct> emptyCrossProducts = new HashSet<CrossProduct>();
private Set<DotProduct> emptyDotProducts = new HashSet<DotProduct>();
private Set<Processor> failedProcessors = new HashSet<Processor>();
private Set<Workflow> incompleteWorkflows = new HashSet<Workflow>();
private Set<Processor> missingIterationStrategyStacks = new HashSet<Processor>();
private Set<ReceiverPort> missingMainIncomingDataLinks = new HashSet<ReceiverPort> ();
private Set<Processor> passedProcessors = new HashSet<Processor>();
private Set<IterationStrategyNode> unrecognizedIterationStrategyNodes = new HashSet<IterationStrategyNode>();
private Set<OutputWorkflowPort> unresolvedOutputs = new HashSet<OutputWorkflowPort>();
private Set<Processor> unresolvedProcessors = new HashSet<Processor>();
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#dataLinkReceiver(uk.org.taverna.scufl2.api.core.DataLink)
*/
@Override
public void dataLinkReceiver(DataLink dl) {
ReceiverPort receiver = dl.getSendsTo();
if (receiver != null) {
if (!receiverDataLinkMap.containsKey(receiver)) {
receiverDataLinkMap.put(receiver, new ArrayList<DataLink>());
}
receiverDataLinkMap.get(receiver).add(dl);
}
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#dataLinkSender(uk.org.taverna.scufl2.api.core.DataLink)
*/
@Override
public void dataLinkSender(DataLink dl) {
SenderPort sender = dl.getReceivesFrom();
if (sender != null) {
if (!senderDataLinkMap.containsKey(sender)) {
senderDataLinkMap.put(sender, new ArrayList<DataLink>());
}
senderDataLinkMap.get(sender).add(dl);
}
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#depthResolution(uk.org.taverna.scufl2.api.common.WorkflowBean, java.lang.Integer)
*/
@Override
public void depthResolution(WorkflowBean owp, Integer portResolvedDepth) {
resolvedDepthMap.put(owp, portResolvedDepth);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#dotProductIterationMismatch(uk.org.taverna.scufl2.api.iterationstrategy.DotProduct)
*/
@Override
public void dotProductIterationMismatch(DotProduct dotProduct) {
dotProductIterationMismatches.add(dotProduct);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#emptyCrossProduct(uk.org.taverna.scufl2.api.iterationstrategy.CrossProduct)
*/
@Override
public void emptyCrossProduct(CrossProduct crossProduct) {
emptyCrossProducts.add(crossProduct);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#emptyDotProduct(uk.org.taverna.scufl2.api.iterationstrategy.DotProduct)
*/
@Override
public void emptyDotProduct(DotProduct dotProduct) {
emptyDotProducts.add(dotProduct);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#failedProcessorAdded(uk.org.taverna.scufl2.api.core.Processor)
*/
@Override
public void failedProcessorAdded(Processor p) {
failedProcessors.add(p);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#incompleteWorkflow(uk.org.taverna.scufl2.api.core.Workflow)
*/
@Override
public void incompleteWorkflow(Workflow w) {
incompleteWorkflows.add(w);
}
/**
* @return
*/
public Set<Workflow> getIncompleteWorkflows() {
return incompleteWorkflows;
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#missingIterationStrategyStack(uk.org.taverna.scufl2.api.core.Processor)
*/
@Override
public void missingIterationStrategyStack(Processor p) {
missingIterationStrategyStacks.add(p);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#missingMainIncomingLink(uk.org.taverna.scufl2.api.port.ReceiverPort)
*/
@Override
public void missingMainIncomingLink(ReceiverPort owp) {
missingMainIncomingDataLinks.add(owp);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#passedProcessorAdded(uk.org.taverna.scufl2.api.core.Processor)
*/
@Override
public void passedProcessor(Processor p) {
passedProcessors.add(p);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#unrecognizedIterationStrategyNode(uk.org.taverna.scufl2.api.iterationstrategy.IterationStrategyNode)
*/
@Override
public void unrecognizedIterationStrategyNode(
IterationStrategyNode iterationStrategyNode) {
unrecognizedIterationStrategyNodes.add(iterationStrategyNode);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#unresolvedOutput(uk.org.taverna.scufl2.api.port.OutputWorkflowPort)
*/
@Override
public void unresolvedOutput(OutputWorkflowPort owp) {
unresolvedOutputs.add(owp);
}
/* (non-Javadoc)
* @see uk.org.taverna.scufl2.validation.structural.StructuralValidationEventListener#unresolvedProcessorAdded(uk.org.taverna.scufl2.api.core.Processor)
*/
@Override
public void unresolvedProcessorAdded(Processor p) {
unresolvedProcessors.add(p);
}
/**
* @return the dotProductIterationMismatches
*/
public Set<DotProduct> getDotProductIterationMismatches() {
return dotProductIterationMismatches;
}
/**
* @return the emptyCrossProducts
*/
public Set<CrossProduct> getEmptyCrossProducts() {
return emptyCrossProducts;
}
/**
* @return the emptyDotProducts
*/
public Set<DotProduct> getEmptyDotProducts() {
return emptyDotProducts;
}
/**
* @return the failedProcessors
*/
public Set<Processor> getFailedProcessors() {
return failedProcessors;
}
/**
* @return the missingIterationStrategyStacks
*/
public Set<Processor> getMissingIterationStrategyStacks() {
return missingIterationStrategyStacks;
}
/**
* @return the missingMainIncomingDataLinks
*/
public Set<ReceiverPort> getMissingMainIncomingDataLinks() {
return missingMainIncomingDataLinks;
}
/**
* @return the unrecognizedIterationStrategyNodes
*/
public Set<IterationStrategyNode> getUnrecognizedIterationStrategyNodes() {
return unrecognizedIterationStrategyNodes;
}
/**
* @return the unresolvedOutputs
*/
public Set<OutputWorkflowPort> getUnresolvedOutputs() {
return unresolvedOutputs;
}
/**
* @return the unresolvedProcessors
*/
public Set<Processor> getUnresolvedProcessors() {
return unresolvedProcessors;
}
@Override
public boolean detectedProblems() {
return (!
(Collections.EMPTY_SET.equals(getDotProductIterationMismatches()) &&
Collections.EMPTY_SET.equals(getEmptyCrossProducts()) &&
Collections.EMPTY_SET.equals(getEmptyDotProducts()) &&
Collections.EMPTY_SET.equals(getFailedProcessors()) &&
Collections.EMPTY_SET.equals(getIncompleteWorkflows()) &&
Collections.EMPTY_SET.equals(getMissingIterationStrategyStacks()) &&
Collections.EMPTY_SET.equals(getMissingMainIncomingDataLinks()) &&
Collections.EMPTY_SET.equals(getUnrecognizedIterationStrategyNodes()) &&
Collections.EMPTY_SET.equals(getUnresolvedOutputs()) &&
Collections.EMPTY_SET.equals(getUnresolvedProcessors())));
}
@Override
public ValidationException getException() {
// TODO Needs to be improved;
if (detectedProblems()) {
return new ValidationException(this.toString());
} else {
return null;
}
}
}