/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.doe.execution; import java.io.IOException; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.map.JsonMappingException; 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.doe.common.DOEConstants; 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 * @author Doreen Seider */ public class DOEPersistentComponentDescriptionUpdater implements PersistentComponentDescriptionUpdater { private static final String LOOP_ENDPOINT_TYPE = "loopEndpointType_5e0ed1cd"; private static final String METADATA = "metadata"; private static final String V3_0 = "3.0"; private static final String V3_1 = "3.1"; private static final String V3_2 = "3.2"; private static final String V3_3 = "3.3"; private static final String V3_4 = "3.4"; private static final String V4 = "4"; private static final String V4_1 = "4.1"; private static final String DYNAMIC_INPUTS = "dynamicInputs"; private static final String STATIC_OUTPUTS = "staticOutputs"; private static ObjectMapper mapper = JsonUtils.getDefaultObjectMapper(); @Override public String[] getComponentIdentifiersAffectedByUpdate() { return new String[] { DOEConstants.COMPONENT_ID }; } @Override public int getFormatVersionsAffectedByUpdate(String persistentComponentDescriptionVersion, boolean silent) { int versionsToUpdate = PersistentDescriptionFormatVersion.NONE; if (silent && persistentComponentDescriptionVersion != null && persistentComponentDescriptionVersion.compareTo(V3_4) < 0) { versionsToUpdate = versionsToUpdate | PersistentDescriptionFormatVersion.AFTER_VERSION_THREE; } if (!silent && persistentComponentDescriptionVersion != null && persistentComponentDescriptionVersion.compareTo(V4) < 0) { versionsToUpdate = versionsToUpdate | PersistentDescriptionFormatVersion.AFTER_VERSION_THREE; } if (!silent && persistentComponentDescriptionVersion != null && persistentComponentDescriptionVersion.compareTo(V4_1) < 0) { versionsToUpdate = versionsToUpdate | PersistentDescriptionFormatVersion.AFTER_VERSION_THREE; } return versionsToUpdate; } @Override public PersistentComponentDescription performComponentDescriptionUpdate(int formatVersion, PersistentComponentDescription description, boolean silent) throws IOException { if (silent) { // called first (before non-silent) if (formatVersion == PersistentDescriptionFormatVersion.AFTER_VERSION_THREE) { switch (description.getComponentVersion()) { case V3_0: description = updateToVersion31(description); case V3_1: description = updateToVersion32(description); case V3_2: description = updateToVersion33(description); case V3_3: description = updateToVersion34(description); default: // nothing to do here } } } else { // called after "silent" was called if (formatVersion == PersistentDescriptionFormatVersion.AFTER_VERSION_THREE) { switch (description.getComponentVersion()) { case V3_3: description = updateToVersion34(description); case V3_4: description = updatefrom34To4(description); case V4: description = updatefrom4To41(description); break; default: } } } return description; } private PersistentComponentDescription updatefrom4To41(PersistentComponentDescription description) throws JsonParseException, JsonGenerationException, JsonMappingException, IOException { description = PersistentComponentDescriptionUpdaterUtils.addStaticOutput(description, DOEConstants.OUTPUT_NAME_NUMBER_OF_SAMPLES, "Integer"); description.setComponentVersion(V4_1); return description; } private PersistentComponentDescription updatefrom34To4(PersistentComponentDescription description) throws JsonProcessingException, IOException { description = PersistentComponentDescriptionUpdaterUtils.removeOuterLoopDoneEndpoints(description); description = PersistentComponentDescriptionUpdaterUtils.removeEndpointCharacterInfoFromMetaData(description); description = PersistentComponentDescriptionUpdaterUtils.reassignEndpointIdentifiers(description, DYNAMIC_INPUTS, "toForward", "startToForward", "_start"); description.setComponentVersion(V4); return description; } private PersistentComponentDescription updateToVersion34(PersistentComponentDescription description) throws JsonProcessingException, IOException { PersistentComponentDescription updatedDesc = PersistentComponentDescriptionUpdaterUtils.updateFaultToleranceOfLoopDriver(description); updatedDesc.setComponentVersion(V3_4); return updatedDesc; } private PersistentComponentDescription updateToVersion33(PersistentComponentDescription description) throws JsonProcessingException, IOException { JsonNode node = mapper.readTree(description.getComponentDescriptionAsString()); JsonNode staticOutputs = node.get(STATIC_OUTPUTS); if (staticOutputs != null) { for (JsonNode outputEndpoint : staticOutputs) { ObjectNode metaData = (ObjectNode) outputEndpoint.get(METADATA); if (metaData == null) { metaData = JsonNodeFactory.instance.objectNode(); ((ObjectNode) outputEndpoint).put(METADATA, metaData); } if (outputEndpoint.get("name").getTextValue().equals("Outer loop done")) { metaData.put(LOOP_ENDPOINT_TYPE, "InnerLoopEndpoint"); } if (outputEndpoint.get("name").getTextValue().equals("Done")) { metaData.put(LOOP_ENDPOINT_TYPE, "OuterLoopEndpoint"); } } } JsonNode dynamicOutputs = node.get("dynamicOutputs"); if (dynamicOutputs != null) { for (JsonNode outputEndpoint : dynamicOutputs) { ObjectNode metaData = (ObjectNode) outputEndpoint.get(METADATA); metaData.put(LOOP_ENDPOINT_TYPE, "SelfLoopEndpoint"); } } JsonNode dynamicInputs = node.get(DYNAMIC_INPUTS); if (dynamicInputs != null) { for (JsonNode inputEndpoint : dynamicInputs) { ObjectNode metaData = (ObjectNode) inputEndpoint.get(METADATA); metaData.put(LOOP_ENDPOINT_TYPE, "SelfLoopEndpoint"); } } ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter(); PersistentComponentDescription newdesc = new PersistentComponentDescription(writer.writeValueAsString(node)); newdesc.setComponentVersion(V3_3); return newdesc; } private PersistentComponentDescription updateToVersion31(PersistentComponentDescription description) { description.setComponentVersion(V3_1); return description; } private PersistentComponentDescription updateToVersion32(PersistentComponentDescription description) { description.setComponentVersion(V3_2); return description; } }