/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.cpacs.vampzeroinitializer.execution; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.LogFactory; import de.rcenvironment.components.cpacs.vampzeroinitializer.common.VampZeroInitializerComponentConstants; import de.rcenvironment.core.component.api.ComponentConstants; import de.rcenvironment.core.component.api.ComponentException; import de.rcenvironment.core.component.datamanagement.api.ComponentDataManagementService; import de.rcenvironment.core.component.execution.api.ComponentContext; import de.rcenvironment.core.component.model.spi.DefaultComponent; import de.rcenvironment.core.component.xml.XmlComponentHistoryDataItem; import de.rcenvironment.core.component.xml.api.EndpointXMLService; import de.rcenvironment.core.datamodel.api.DataTypeException; import de.rcenvironment.core.datamodel.api.TypedDatum; import de.rcenvironment.core.datamodel.types.api.FileReferenceTD; import de.rcenvironment.core.utils.common.LogUtils; import de.rcenvironment.core.utils.common.TempFileServiceAccess; /** * The "source" function based on aicraft predesign parameters. * * @author Arne Bachmann * @author Markus Litz * @author Markus Kunde */ public class VampZeroInitializerComponent extends DefaultComponent { private ComponentContext componentContext; private ComponentDataManagementService dataManagementService; /** XML Content from the configuration map (created by the view). */ private String vampZeroInputs; private XmlComponentHistoryDataItem historyDataItem = null; private EndpointXMLService endpointXmlUtils; @Override public void setComponentContext(ComponentContext componentContext) { this.componentContext = componentContext; } @Override public boolean treatStartAsComponentRun() { return componentContext.getInputs().isEmpty(); } @Override public void start() throws ComponentException { dataManagementService = componentContext.getService(ComponentDataManagementService.class); endpointXmlUtils = componentContext.getService(EndpointXMLService.class); vampZeroInputs = componentContext.getConfigurationValue(VampZeroInitializerComponentConstants.XMLCONTENT); if (vampZeroInputs == null || vampZeroInputs.isEmpty()) { throw new ComponentException("No initial CPACS for VAMPzero given. Did you forget to click the 'Create CPACS' button?"); } if (treatStartAsComponentRun()) { processInputs(); } } @Override public void processInputs() throws ComponentException { initializeNewHistoryDataItem(); File tempFile; try { tempFile = TempFileServiceAccess.getInstance().createTempFileFromPattern("VAMPZeroInitializer-*.xml"); FileUtils.writeStringToFile(tempFile, vampZeroInputs); } catch (IOException e) { throw new ComponentException("Failed to write initial CPACS into a temporary file " + "(that is required for VAMPzero Initializer)", e); } Map<String, TypedDatum> variableInputs = new HashMap<>(); for (String inputName : componentContext.getInputsWithDatum()) { if (componentContext.isDynamicInput(inputName)) { variableInputs.put(inputName, componentContext.readInput(inputName)); } } if (historyDataItem != null && !variableInputs.isEmpty()) { try { String plainVampZeroInputsFileRef = dataManagementService.createTaggedReferenceFromLocalFile(componentContext, tempFile, VampZeroInitializerComponentConstants.CPACS_FILENAME); historyDataItem.setPlainXMLFileReference(plainVampZeroInputsFileRef); storeHistoryDataItem(); } catch (IOException e) { String errorMessage = "Failed to store plain, initial CPACS file into the data management" + "; it will not be available in the workflow data browser"; String errorId = LogUtils.logExceptionWithStacktraceAndAssignUniqueMarker( LogFactory.getLog(VampZeroInitializerComponent.class), errorMessage, e); componentContext.getLog().componentError(errorMessage, e, errorId); } } try { endpointXmlUtils.updateXMLWithInputs(tempFile, variableInputs, componentContext); } catch (DataTypeException e) { throw new ComponentException("Failed to add dynamic input values to the initial CPACS", e); } FileReferenceTD fileReference; try { fileReference = dataManagementService.createFileReferenceTDFromLocalFile(componentContext, tempFile, VampZeroInitializerComponentConstants.CPACS_FILENAME); } catch (IOException e) { throw new ComponentException("Failed to store initial CPACS file in the data management - " + "if it is not stored in the data management, it can not be sent as output value", e); } componentContext.writeOutput(VampZeroInitializerComponentConstants.OUTPUT_NAME_CPACS, fileReference); try { endpointXmlUtils.updateOutputsFromXML(tempFile, componentContext); } catch (DataTypeException e) { throw new ComponentException("Failed to extract dynamic output values from the initial CPACS", e); } } @Override public void completeStartOrProcessInputsAfterFailure() throws ComponentException { storeHistoryDataItem(); } private void initializeNewHistoryDataItem() { if (Boolean.valueOf(componentContext.getConfigurationValue(ComponentConstants.CONFIG_KEY_STORE_DATA_ITEM))) { historyDataItem = new XmlComponentHistoryDataItem(VampZeroInitializerComponentConstants.COMPONENT_ID); } } private void storeHistoryDataItem() { if (Boolean.valueOf(componentContext.getConfigurationValue(ComponentConstants.CONFIG_KEY_STORE_DATA_ITEM))) { componentContext.writeFinalHistoryDataItem(historyDataItem); } } }