blob: b65da688480882fc7cace80c2c5cd40c8ae0c424 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2009 Hajo Nils Krabbenhoeft, INB, University of Luebeck
*
* Modifications to the initial code base are copyright of their
* respective authors, or their employers as appropriate.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
******************************************************************************/
package net.sf.taverna.t2.activities.externaltool;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroup;
import net.sf.taverna.t2.activities.externaltool.manager.InvocationGroupManager;
import net.sf.taverna.t2.activities.externaltool.manager.InvocationMechanism;
import net.sf.taverna.t2.visit.VisitReport;
import net.sf.taverna.t2.visit.VisitReport.Status;
import net.sf.taverna.t2.workflowmodel.health.HealthCheck;
import net.sf.taverna.t2.workflowmodel.health.HealthChecker;
import net.sf.taverna.t2.workflowmodel.utils.Tools;
public class ExternalToolActivityHealthChecker implements HealthChecker<ExternalToolActivity> {
private InvocationGroupManager invocationGroupManager;
private ExternalToolActivity activity;
public boolean canVisit(Object subject) {
return subject != null && subject instanceof ExternalToolActivity;
}
public VisitReport visit(ExternalToolActivity activity, List<Object> ancestry) {
this.activity = activity;
ExternalToolActivityConfigurationBean configuration = activity.getConfigurationNoConversion();
List<VisitReport> reports = new ArrayList<VisitReport>();
VisitReport locationReport = checkLocation(configuration);
if (locationReport != null) {
reports.add(locationReport);
}
VisitReport report = new VisitReport(HealthCheck.getInstance(), activity, "External tool service", HealthCheck.NO_PROBLEM, reports);
return report;
}
private VisitReport checkLocation(
ExternalToolActivityConfigurationBean configuration) {
if (!updateLocation(configuration)) {
return new VisitReport(HealthCheck.getInstance(), activity, "Unmanaged invocation mechanism", HealthCheck.UNMANAGED_LOCATION, Status.WARNING);
} else {
return null;
}
}
public boolean updateLocation(ExternalToolActivityConfigurationBean configuration) {
InvocationGroup invocationGroup = configuration.getInvocationGroup();
String invocationGroupSpecification = null;
String invocationMechanismSpecification = null;
if (invocationGroup != null) {
if (invocationGroupManager.containsGroup(invocationGroup)) {
return true;
}
InvocationGroup replacementGroup = invocationGroupManager.getGroupReplacement(invocationGroup);
if (replacementGroup != null) {
configuration.setInvocationGroup(replacementGroup);
return true;
}
invocationGroupSpecification = invocationGroup.getName() + ":" + invocationGroup.getMechanismXML();
InvocationGroup importedGroup = invocationGroupManager.getImportedGroup(invocationGroupSpecification);
if (importedGroup != null) {
configuration.setInvocationGroup(importedGroup);
return true;
}
}
InvocationMechanism invocationMechanism = configuration.getMechanism();
if (invocationMechanism != null) {
if (invocationGroupManager.containsMechanism(invocationMechanism)) {
return true;
}
}
String mechanismXML = null;
String mechanismName = null;
if (invocationGroup != null) {
mechanismXML = invocationGroup.getMechanismXML();
mechanismName = invocationGroup.getMechanismName();
} else {
mechanismXML = configuration.getMechanismXML();
mechanismName = configuration.getMechanismName();
}
invocationMechanismSpecification = mechanismName + ":" + mechanismXML;
InvocationMechanism foundMechanism = null;
HashSet<String> mechanismNames = new HashSet<String>();
for (InvocationMechanism mechanism : invocationGroupManager.getMechanisms()) {
mechanismNames.add(mechanism.getName());
if (mechanism.getName().equals(mechanismName) && (mechanism.getXML().equals(mechanismXML))) {
if (invocationMechanism != mechanism) {
foundMechanism = mechanism;
}
}
}
if (foundMechanism == null) {
foundMechanism = invocationGroupManager.getMechanismReplacement(invocationMechanismSpecification);
if (foundMechanism == null) {
foundMechanism = invocationGroupManager.getImportedMechanism(invocationMechanismSpecification);
}
}
if (foundMechanism != null) {
if (invocationGroup != null) {
invocationGroup.setMechanism(foundMechanism);
// Cannot return because invocationGroup is still unknown
} else {
configuration.setMechanism(foundMechanism);
return true;
}
}
if (foundMechanism == null) {
InvocationMechanism createdMechanism;
if (invocationGroup != null) {
invocationGroup.convertDetailsToMechanism();
createdMechanism = invocationGroup.getMechanism();
} else {
configuration.convertDetailsToMechanism();
createdMechanism = configuration.getMechanism();
}
String chosenMechanismName = Tools.uniqueObjectName(mechanismName,
mechanismNames);
createdMechanism.setName(chosenMechanismName);
if (invocationGroup != null) {
invocationGroup.setMechanism(createdMechanism);
} else {
configuration.setMechanism(createdMechanism);
}
invocationGroupManager.importMechanism(invocationMechanismSpecification, createdMechanism);
if (invocationGroup == null) {
return true;
}
}
InvocationGroup foundGroup = null;
HashSet<String> groupNames = new HashSet<String>();
for (InvocationGroup group : invocationGroupManager.getInvocationGroups()) {
groupNames.add(group.getName());
if (group.getName().equals(invocationGroup.getName()) && (group.getMechanism() == invocationGroup.getMechanism())) {
foundGroup = group;
}
}
if (foundGroup != null) {
configuration.setInvocationGroup(foundGroup);
return true;
}
invocationGroup.setName(Tools.uniqueObjectName(invocationGroup.getName(), groupNames));
invocationGroupManager.importInvocationGroup(invocationGroupSpecification, invocationGroup);
return true;
}
public boolean isTimeConsuming() {
return false;
}
/**
* Sets the invocationGroupManager.
*
* @param invocationGroupManager the new value of invocationGroupManager
*/
public void setInvocationGroupManager(InvocationGroupManager invocationGroupManager) {
this.invocationGroupManager = invocationGroupManager;
}
}