/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.examples.decrypter.execution; import java.io.IOException; import de.rcenvironment.components.examples.decrypter.common.DecrypterComponentConstants; import de.rcenvironment.core.communication.common.CommunicationException; 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.datamodel.api.TypedDatumFactory; import de.rcenvironment.core.datamodel.api.TypedDatumService; import de.rcenvironment.core.datamodel.types.api.FileReferenceTD; import de.rcenvironment.core.datamodel.types.api.ShortTextTD; import de.rcenvironment.core.utils.common.StringUtils; import de.rcenvironment.core.utils.encryption.EncryptionFactory; import de.rcenvironment.core.utils.encryption.PassphraseBasedEncryption; /** * * Main class for the component logic. In this class the component lifecycle is done. Most of the methods have a default implementation * which is done in the {@link DefaultComponent} class. If the component should have an individual behavior, the appropriate methods must be * overridden. * * * @author Sascha Zur */ public class DecrypterComponent extends DefaultComponent { private ComponentContext componentContext; private ComponentDataManagementService dataManagementService; private TypedDatumFactory typedDatumFactory; private boolean useDefaultPassphrase; private String decryptionAlgorithm; private PassphraseBasedEncryption encryption; @Override public void setComponentContext(ComponentContext componentContext) { this.componentContext = componentContext; } @Override public void start() throws ComponentException { dataManagementService = componentContext.getService(ComponentDataManagementService.class); typedDatumFactory = componentContext.getService(TypedDatumService.class).getFactory(); // {@link ComponentContext} is interface to the workflow engine // Reading the configuration of a component is done via the {@link ComponentContext} useDefaultPassphrase = Boolean.parseBoolean(componentContext.getConfigurationValue( DecrypterComponentConstants.CONFIG_KEY_USEDEFAULTPASSWORD)); decryptionAlgorithm = componentContext.getConfigurationValue(DecrypterComponentConstants.CONFIG_KEY_ALGORITHM); // Create factory for encryption algorithms and create encryption instance EncryptionFactory factory = new EncryptionFactory(); // Find the correct algorithm encryption = factory.createPassphraseBasedEncryption(EncryptionFactory.PassphraseBasedEncryptionAlgorithm.valueOf(decryptionAlgorithm)); } @Override public void processInputs() throws ComponentException { FileReferenceTD incEncryptedFileReference = (FileReferenceTD) componentContext.readInput(DecrypterComponentConstants.INPUT_NAME_FILE); // The incoming value is just a reference to a file in the data management. // So, get the content of the file String encryptedString; try { encryptedString = dataManagementService.retrieveStringFromReference(incEncryptedFileReference.getFileReference(), componentContext.getDefaultStorageNodeId()); } catch (IOException e) { encryptedString = null; } catch (CommunicationException e) { throw new RuntimeException(StringUtils.format("Failed to retrieve string from data reference from remote node @%s: ", componentContext.getNodeId()) + e.getMessage(), e); } // Now decrypt the String if (encryptedString != null) { String passphrase; if (useDefaultPassphrase) { passphrase = DecrypterComponentConstants.DEFAULT_PASSWORD; } else { passphrase = componentContext.getConfigurationValue( DecrypterComponentConstants.CONIG_KEY_DECRYPTING_PASSPHRASE); } String decryptedString = encryption.decrypt(encryptedString, passphrase); if (decryptedString != null) { // To send the decrpypted String to the next workflow component, it must be // sent as a {@link TypedDatum} object, in this case a {@link ShortTextTD} is // appropriate. // For creating {@link TypedDatum} object, the {@link TypedDatumFactoy} must always // be used. ShortTextTD outputText = typedDatumFactory.createShortText(decryptedString); // A {@link TypedDatum} object is sent to the next workflow component by writing it // to an output. // An output is identified by its unique name // Note: Closing an output means that no more values will be sent. componentContext.writeOutput(DecrypterComponentConstants.OUTPUT_NAME_RESULT, outputText); // After sending the result to the output, it also should appear on the workflow // console componentContext.getLog().componentInfo(decryptedString); } else { throw new ComponentException("Could not decrypt file! Wrong password or decrypting algorithm?"); } } } }