/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.cluster.execution;
import java.io.IOException;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.node.JsonNodeFactory;
import org.codehaus.jackson.node.ObjectNode;
import de.rcenvironment.components.cluster.common.ClusterComponentConstants;
import de.rcenvironment.core.component.update.api.PersistentComponentDescription;
import de.rcenvironment.core.component.update.api.PersistentComponentDescriptionUpdaterUtils;
import de.rcenvironment.core.component.update.api.PersistentDescriptionFormatVersion;
import de.rcenvironment.core.component.update.spi.PersistentComponentDescriptionUpdater;
import de.rcenvironment.core.utils.common.JsonUtils;
/**
* Implementation of {@link PersistentComponentDescriptionUpdater}.
*
* @author Sascha Zur
*/
public class ClusterPersistentComponentDescriptionUpdater implements PersistentComponentDescriptionUpdater {
private static final String CONFIGURATION = "configuration";
private static final String V3_0 = "3.0";
private static final String CURRENT_VERSION = "3.1";
@Override
public String[] getComponentIdentifiersAffectedByUpdate() {
return ClusterComponentConstants.COMPONENT_IDS;
}
@Override
public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) {
int versions = PersistentDescriptionFormatVersion.NONE;
// Version 0 to 3.0
if (!silent && ((persistentComponentDescriptionVersion == null
|| persistentComponentDescriptionVersion.compareTo(V3_0) < 0))) {
versions = versions | PersistentDescriptionFormatVersion.FOR_VERSION_THREE;
}
// Update 2 : 3.0 -> 3.1
if (!silent && persistentComponentDescriptionVersion != null
&& persistentComponentDescriptionVersion.compareTo(CURRENT_VERSION) < 0) {
versions = versions | PersistentDescriptionFormatVersion.AFTER_VERSION_THREE;
}
return versions;
}
@Override
public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion, PersistentComponentDescription description,
boolean silent) throws IOException {
if (!silent) {
PersistentComponentDescription updatedDescription = null;
if (formatVersion == PersistentDescriptionFormatVersion.FOR_VERSION_THREE) {
updatedDescription = firstUpdate(description);
updatedDescription.setComponentVersion(V3_0);
} else if (formatVersion == PersistentDescriptionFormatVersion.AFTER_VERSION_THREE) {
updatedDescription = uodateFrom30To31(description);
updatedDescription.setComponentVersion(CURRENT_VERSION);
}
return updatedDescription;
}
return description;
}
/**
* Updates the component from version 3.0 to 3.1.
* */
private PersistentComponentDescription uodateFrom30To31(PersistentComponentDescription description)
throws JsonParseException, IOException {
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
JsonNode node = mapper.readTree(description.getComponentDescriptionAsString());
ObjectNode objectNode = (ObjectNode) node.get(CONFIGURATION);
objectNode.put(ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS, "");
ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
return new PersistentComponentDescription(writer.writeValueAsString(node));
}
/**
* Updates the component from version 0 to 3.0.
* */
private PersistentComponentDescription firstUpdate(PersistentComponentDescription description) throws JsonParseException, IOException {
description =
PersistentComponentDescriptionUpdaterUtils.updateAllDynamicEndpointsToIdentifier("dynamicOutputs", "default", description);
description =
PersistentComponentDescriptionUpdaterUtils.updateAllDynamicEndpointsToIdentifier("dynamicInputs", "default", description);
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
JsonNode node = mapper.readTree(description.getComponentDescriptionAsString());
ObjectNode oldConfig = (ObjectNode) node.get(CONFIGURATION);
((ObjectNode) node).remove(CONFIGURATION);
ObjectNode newConfig = JsonNodeFactory.instance.objectNode();
checkConfig("host", oldConfig, newConfig);
checkConfig("port", oldConfig, newConfig);
checkConfig("queuingSystem", oldConfig, newConfig);
checkConfig("authUser", oldConfig, newConfig);
checkConfig("authPhrase", oldConfig, newConfig);
checkConfig("sandboxRoot", oldConfig, newConfig);
checkConfig("deleteSandbox", oldConfig, newConfig);
checkConfig("uploadFiles", oldConfig, newConfig);
checkConfig("uploadInputFiles", oldConfig, newConfig);
checkConfig("filesToUpload", oldConfig, newConfig);
checkConfig("inputsToUpload", oldConfig, newConfig);
checkConfig("usageOfScript", oldConfig, newConfig);
checkConfig("localScript", oldConfig, newConfig);
checkConfig("localScriptName", oldConfig, newConfig);
checkConfig("remotePathOfScript", oldConfig, newConfig);
checkConfig("remoteUploadPathOfNewScript", oldConfig, newConfig);
checkConfig("downloadFiles", oldConfig, newConfig);
checkConfig("downloadOutputFiles", oldConfig, newConfig);
checkConfig("filesToDownload", oldConfig, newConfig);
checkConfig("outputsToDownload", oldConfig, newConfig);
checkConfig("script", oldConfig, newConfig);
((ObjectNode) node).put(CONFIGURATION, newConfig);
ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
return new PersistentComponentDescription(writer.writeValueAsString(node));
}
private void checkConfig(String configKey, ObjectNode oldConfig, ObjectNode newConfig) {
if (!oldConfig.get(configKey).getTextValue().isEmpty()) {
newConfig.put(configKey, oldConfig.get(configKey));
}
}
}