/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.inputprovider.execution.validator;
import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import de.rcenvironment.components.inputprovider.common.InputProviderComponentConstants;
import de.rcenvironment.core.component.model.api.ComponentDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.validation.api.ComponentValidationMessage;
import de.rcenvironment.core.component.validation.spi.AbstractComponentValidator;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.remoteaccess.common.RemoteAccessConstants;
import de.rcenvironment.core.utils.common.StringUtils;
/**
*
* Validator for Input Provider component.
*
* @author Marc Stammerjohann
* @author Jascha Riedel
*/
public class InputProviderComponentValidator extends AbstractComponentValidator {
@Override
public String getIdentifier() {
return InputProviderComponentConstants.COMPONENT_ID;
}
@Override
protected List<ComponentValidationMessage> validateComponentSpecific(ComponentDescription componentDescription) {
List<ComponentValidationMessage> messages = new ArrayList<ComponentValidationMessage>();
validateExistingEndpoints(componentDescription, messages, DataType.FileReference);
validateExistingEndpoints(componentDescription, messages, DataType.DirectoryReference);
return messages;
}
@Override
protected List<ComponentValidationMessage> validateOnWorkflowStartComponentSpecific(
ComponentDescription componentDescription) {
return null;
}
private void validateExistingEndpoints(ComponentDescription componentDescription,
List<ComponentValidationMessage> messages, DataType dataType) {
Set<EndpointDescription> outputs = getOutputs(componentDescription, dataType);
for (EndpointDescription outputDescription : outputs) {
Map<String, String> metaData = outputDescription.getMetaData();
String name = metaData.get(InputProviderComponentConstants.META_VALUE);
Collection<String> values = metaData.values();
if (dataType.equals(DataType.FileReference)) {
validateExistingFiles(messages, outputDescription.getName(), values, name);
} else if (dataType.equals(DataType.DirectoryReference)) {
validateExistingDirectories(messages, outputDescription.getName(), values, name);
}
}
}
/**
* Validate the input provider, if selected files exists.
*
* @param fileName
* of the file
* @param values
* of the {@link EndpointDescription}
*/
private void validateExistingFiles(List<ComponentValidationMessage> messages, String outputName,
Collection<String> values, String fileName) {
if (!values.contains(InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) {
if (Paths.get(fileName).isAbsolute()) {
validateFileFromFileSystem(messages, outputName, fileName);
} else {
validateFileFromProject(messages, outputName, fileName);
}
}
}
private void validateFileFromProject(List<ComponentValidationMessage> messages, String outputName,
String fileName) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot workspaceRoot = workspace.getRoot();
IResource member = workspaceRoot.findMember(fileName);
if (member == null || !member.exists()) {
createFileDoesNotExistMessage(messages, outputName, fileName);
} else {
if (!(member instanceof IFile)) {
String text = StringUtils.format("'%s': '%s' is not a file", outputName, fileName);
messages.add(
new ComponentValidationMessage(ComponentValidationMessage.Type.ERROR, "", text, text, true));
}
}
}
private void validateFileFromFileSystem(List<ComponentValidationMessage> messages, String outputName,
String fileName) {
File newFile = new File(fileName);
if (!newFile.isFile()) {
createFileDoesNotExistMessage(messages, outputName, fileName);
}
}
private void createFileDoesNotExistMessage(List<ComponentValidationMessage> messages, String outputName,
String fileName) {
String text = StringUtils.format("'%s': missing file '%s'", outputName, fileName);
messages.add(new ComponentValidationMessage(ComponentValidationMessage.Type.ERROR, "", text, text, true));
}
/**
* Validate the input provider, if a selected directory exists.
*
* @param name
* of the directory
* @param values
* of the {@link EndpointDescription}
*/
private void validateExistingDirectories(List<ComponentValidationMessage> messages, String outputName,
Collection<String> values, String pathName) {
if (pathName.equals(RemoteAccessConstants.WF_PLACEHOLDER_INPUT_DIR)) {
String text = StringUtils.format("'%s': '%s' only valid if used via remote access", outputName, pathName);
messages.add(
new ComponentValidationMessage(ComponentValidationMessage.Type.WARNING, "", text, text, false));
return;
}
if (!values.contains(InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) {
if (Paths.get(pathName).isAbsolute()) {
validateDirFromFileSystem(messages, outputName, pathName);
} else {
validateDirFromProject(messages, outputName, pathName);
}
}
}
private void validateDirFromProject(List<ComponentValidationMessage> messages, String outputName, String pathName) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot workspaceRoot = workspace.getRoot();
IResource member = workspaceRoot.findMember(pathName);
if (member == null || !member.exists()) {
createDirDoesNotExistMessage(messages, outputName, pathName);
} else {
if (!(member instanceof IFolder)) {
String text = StringUtils.format("'%s': '%s' is not a directory", outputName, pathName);
messages.add(
new ComponentValidationMessage(ComponentValidationMessage.Type.ERROR, "", text, text, true));
}
}
}
private void validateDirFromFileSystem(List<ComponentValidationMessage> messages, String outputName,
String pathName) {
File newFile = new File(pathName);
if (!newFile.isDirectory()) {
createDirDoesNotExistMessage(messages, outputName, pathName);
}
}
private void createDirDoesNotExistMessage(List<ComponentValidationMessage> messages, String outputName,
String pathName) {
String text = StringUtils.format("'%s': missing directory '%s'", outputName, pathName);
messages.add(new ComponentValidationMessage(ComponentValidationMessage.Type.ERROR, "", text, text, true));
}
}