/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.excel.execution.validator;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.components.excel.common.ExcelAddress;
import de.rcenvironment.components.excel.common.ExcelComponentConstants;
import de.rcenvironment.components.excel.common.ExcelException;
import de.rcenvironment.components.excel.common.ExcelService;
import de.rcenvironment.components.excel.common.ExcelUtils;
import de.rcenvironment.components.excel.common.SimpleExcelService;
import de.rcenvironment.components.excel.execution.Messages;
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;
/**
* Validator for Excel Component that connects the standard Excel Validator with
* the Marco Validator.
*
* @author Jascha Riedel
*
*/
public class ExcelComponentValidator extends AbstractComponentValidator {
@Override
public String getIdentifier() {
return ExcelComponentConstants.COMPONENT_ID;
}
@Override
protected List<ComponentValidationMessage> validateComponentSpecific(ComponentDescription componentDescription) {
List<ComponentValidationMessage> messages = new ArrayList<ComponentValidationMessage>();
messages.addAll(validateExcelPart(componentDescription));
messages.addAll(validateMacroPart(componentDescription));
return messages;
}
@Override
protected List<ComponentValidationMessage> validateOnWorkflowStartComponentSpecific(
ComponentDescription componentDescription) {
return null;
}
private List<ComponentValidationMessage> validateExcelPart(ComponentDescription componentDescription) {
ExcelService excelService = new SimpleExcelService();
final List<ComponentValidationMessage> messages = new ArrayList<ComponentValidationMessage>();
// Get all relevant validation items
String excelFile = getProperty(componentDescription, ExcelComponentConstants.XL_FILENAME);
boolean driver = Boolean.valueOf(getProperty(componentDescription, ExcelComponentConstants.DRIVER));
// Check
File xlFile = ExcelUtils.getAbsoluteFile(excelFile);
if (xlFile == null || !xlFile.exists() || !excelService.isValidExcelFile(xlFile)) {
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.ERROR, ExcelComponentConstants.XL_FILENAME,
Messages.errorNoExcelFileRelative, Messages.bind(Messages.errorNoExcelFileRelative, null), true);
messages.add(validationMessage);
}
if (driver && getOutputs(componentDescription).isEmpty()) {
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.WARNING, ExcelComponentConstants.DRIVER,
Messages.errorNoOutputAsDriverRelative,
Messages.bind(Messages.errorNoOutputAsDriverAbsolute, ExcelComponentConstants.DRIVER));
messages.add(validationMessage);
}
// TODO Check of endpoints runs to long for execution in GUI-thread.
// Validation should be called in another thread on a higher level
/*
* for (final EndpointDescription inputName: getInputs()) {
* messages.addAll(testChannelMetaData(xlFile, inputName)); }
*
* for (final EndpointDescription outputName: getOutputs()) {
* messages.addAll(testChannelMetaData(xlFile, outputName)); }
*/
return messages;
}
private List<ComponentValidationMessage> testChannelMetaData(final File xlFile, EndpointDescription endpointDesc) {
final List<ComponentValidationMessage> messages = new LinkedList<ComponentValidationMessage>();
String address = endpointDesc.getMetaDataValue(ExcelComponentConstants.METADATA_ADDRESS);
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.ERROR, ExcelComponentConstants.METADATA_ADDRESS,
Messages.errorNoMetaDataAddressRelative,
Messages.bind(Messages.errorNoMetaDataAddressAbsolute, ExcelComponentConstants.METADATA_ADDRESS));
try {
new ExcelAddress(xlFile, address);
} catch (ExcelException e) {
messages.add(validationMessage);
}
return messages;
}
private List<ComponentValidationMessage> validateMacroPart(ComponentDescription componentDescription) {
ExcelService excelService = new SimpleExcelService();
final List<ComponentValidationMessage> messages = new ArrayList<ComponentValidationMessage>();
// Get all relevant validation items
String excelFile = getProperty(componentDescription, ExcelComponentConstants.XL_FILENAME);
String premacro = getProperty(componentDescription, ExcelComponentConstants.PRE_MACRO);
String runmacro = getProperty(componentDescription, ExcelComponentConstants.RUN_MACRO);
String postmacro = getProperty(componentDescription, ExcelComponentConstants.POST_MACRO);
// Check
File xlFile = ExcelUtils.getAbsoluteFile(excelFile);
try {
if (xlFile != null) {
String[] macros = null;
if (premacro != null && !premacro.isEmpty() || runmacro != null && !runmacro.isEmpty()
|| postmacro != null && !postmacro.isEmpty()) { // This
// if is
// just
// for
// speed
// issues.
macros = excelService.getMacros(xlFile);
}
if (premacro != null && !premacro.isEmpty()) {
if (!Arrays.asList(macros).contains(premacro)) {
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.WARNING, ExcelComponentConstants.PRE_MACRO,
Messages.errorWrongPreMacroRelative,
Messages.bind(Messages.errorWrongPreMacroAbsolute, ExcelComponentConstants.PRE_MACRO));
messages.add(validationMessage);
}
}
if (runmacro != null && !runmacro.isEmpty()) {
if (!Arrays.asList(macros).contains(runmacro)) {
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.WARNING, ExcelComponentConstants.RUN_MACRO,
Messages.errorWrongRunMacroRelative,
Messages.bind(Messages.errorWrongRunMacroAbsolute, ExcelComponentConstants.RUN_MACRO));
messages.add(validationMessage);
}
}
if (postmacro != null && !postmacro.isEmpty()) {
if (!Arrays.asList(macros).contains(postmacro)) {
final ComponentValidationMessage validationMessage = new ComponentValidationMessage(
ComponentValidationMessage.Type.WARNING, ExcelComponentConstants.POST_MACRO,
Messages.errorWrongPostMacroRelative, Messages.bind(
Messages.errorWrongPostMacroAbsolute, ExcelComponentConstants.POST_MACRO));
messages.add(validationMessage);
}
}
}
} catch (ExcelException e) {
// Just catching because ExcelException is not relevant at
// configuration validation time.
LogFactory.getLog(getClass()).debug("Excel Exception (not relevant at configuration validation time.)");
}
return messages;
}
}