/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.database.common;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
import de.rcenvironment.core.component.datamanagement.api.CommonComponentHistoryDataItem;
import de.rcenvironment.core.datamodel.api.TypedDatumSerializer;
import de.rcenvironment.core.utils.common.JsonUtils;
/**
* History data item.
*
* @author Oliver Seebach
*/
public class DatabaseComponentHistoryDataItem extends CommonComponentHistoryDataItem {
private static final long serialVersionUID = -8675762321318573550L;
private static final String STATEMENT_PATTERN = "statementPattern";
private static final String STATEMENT_EFFECTIVE = "statementEffective";
private static final String STATEMENT_NAME = "statementName";
private static final String STATEMENT_ID = "statementId";
private static final String STATEMENT_ROOT = "statementRoot";
private List<DatabaseStatementHistoryData> databaseStatementHistoryDataList = new ArrayList<>();
private String identifier;
public DatabaseComponentHistoryDataItem(String identifier) {
this.identifier = identifier;
}
@Override
public String serialize(TypedDatumSerializer serializer) throws IOException {
String data = super.serialize(serializer);
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
JsonNode rootNode;
try {
rootNode = mapper.readTree(data);
} catch (JsonProcessingException e) {
throw new IOException(e);
}
ArrayNode statementsArrayNode = ((ObjectNode) rootNode).putArray(STATEMENT_ROOT);
for (DatabaseStatementHistoryData historyDatum : databaseStatementHistoryDataList) {
ObjectNode statementObjectNode = statementsArrayNode.addObject();
statementObjectNode.put(STATEMENT_ID, historyDatum.getStatementIndex());
statementObjectNode.put(STATEMENT_NAME, historyDatum.getStatementName());
statementObjectNode.put(STATEMENT_PATTERN, historyDatum.getStatementPattern());
statementObjectNode.put(STATEMENT_EFFECTIVE, historyDatum.getStatementEffective());
}
return rootNode.toString();
}
private static void readReferenceFromString(String historyData, DatabaseComponentHistoryDataItem historyDataItem) throws IOException {
ObjectMapper mapper = JsonUtils.getDefaultObjectMapper();
JsonNode rootNode;
try {
rootNode = mapper.readTree(historyData);
} catch (JsonProcessingException e) {
throw new IOException(e);
}
JsonNode statementsNode = ((ObjectNode) rootNode).get(STATEMENT_ROOT);
Iterator<JsonNode> statementNodeElements = statementsNode.getElements();
while (statementNodeElements.hasNext()) {
JsonNode node = statementNodeElements.next();
int index = node.get(STATEMENT_ID).asInt();
String statementName = node.get(STATEMENT_NAME).asText();
String statementPattern = node.get(STATEMENT_PATTERN).asText();
String statementEffective = node.get(STATEMENT_EFFECTIVE).asText();
historyDataItem.addDatabaseStatementHistoryData(index, statementName, statementPattern, statementEffective);
}
}
/**
* Creates a history data item from a string.
*
* @param historyData The history data
* @param serializer The serializer
* @param identifier The identifier
* @return The created history data item
* @throws IOException Thrown when serialization failed.
*/
public static DatabaseComponentHistoryDataItem fromString(String historyData, TypedDatumSerializer serializer, String identifier)
throws IOException {
DatabaseComponentHistoryDataItem historyDataItem = new DatabaseComponentHistoryDataItem(identifier);
CommonComponentHistoryDataItem.initializeCommonHistoryDataFromString(historyDataItem, historyData, serializer);
readReferenceFromString(historyData, historyDataItem);
return historyDataItem;
}
/**
* Add new database statement history data.
*
* @param index the index
* @param statementName the statement name
* @param statementPattern the statement pattern
* @param effectiveStatement the effective statement
*/
public void addDatabaseStatementHistoryData(int index, String statementName, String statementPattern, String effectiveStatement) {
databaseStatementHistoryDataList.add(new DatabaseStatementHistoryData(index, statementName, statementPattern, effectiveStatement));
}
public List<DatabaseStatementHistoryData> getDatabaseStatementHistoryDataList() {
return databaseStatementHistoryDataList;
}
}