/*******************************************************************************
* Copyright (c) 2012 OpenLegacy Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* OpenLegacy Inc. - initial API and implementation
*******************************************************************************/
package org.openlegacy.terminal.persistance;
import org.openlegacy.terminal.Color;
import org.openlegacy.terminal.TerminalField;
import org.openlegacy.terminal.TerminalPosition;
import org.openlegacy.terminal.TerminalRow;
import org.openlegacy.terminal.TerminalSendAction;
import org.openlegacy.terminal.TerminalSnapshot;
import org.openlegacy.terminal.TerminalSnapshot.SnapshotType;
import org.openlegacy.terminal.support.SimpleTerminalOutgoingSnapshot;
import org.openlegacy.utils.ReflectionUtil;
import org.openlegacy.utils.StringUtil;
import java.util.List;
public class SnapshotPersistanceDTO {
public static TerminalPersistedSnapshot transformSnapshot(TerminalSnapshot snapshot) {
if (snapshot instanceof SimpleTerminalOutgoingSnapshot) {
return transformOutgoingSnapshot((SimpleTerminalOutgoingSnapshot)snapshot);
}
return transformIncomingSnapshot(snapshot);
}
public static TerminalPersistedSnapshot transformIncomingSnapshot(TerminalSnapshot snapshot) {
TerminalPersistedSnapshot persistedSnapshot = new TerminalPersistedSnapshot();
ReflectionUtil.copyProperties(persistedSnapshot, snapshot);
transformCommonSnapshot(persistedSnapshot, snapshot);
return persistedSnapshot;
}
private static TerminalPersistedSnapshot transformOutgoingSnapshot(SimpleTerminalOutgoingSnapshot snapshot) {
TerminalPersistedSnapshot persistedSnapshot = new TerminalPersistedSnapshot();
TerminalSnapshot terminalSnapshot = snapshot.getTerminalSnapshot();
transformCommonSnapshot(persistedSnapshot, terminalSnapshot);
persistedSnapshot.setSnapshotType(snapshot.getSnapshotType());
TerminalSendAction sendAction = snapshot.getTerminalSendAction();
persistedSnapshot.setCommand(sendAction.getCommand().toString());
List<TerminalField> fields = sendAction.getModifiedFields();
for (TerminalField terminalField : fields) {
TerminalPosition fieldPosition = terminalField.getPosition();
TerminalPersistedRow row = (TerminalPersistedRow)persistedSnapshot.getRow(fieldPosition.getRow());
TerminalPersistedField field = (TerminalPersistedField)row.getField(fieldPosition.getColumn());
String value = terminalField.getValue();
if (field.isPassword()) {
value = convertToAsteriks(terminalField.getValue());
}
field.setValue(value, false);
field.setModified(true);
}
return persistedSnapshot;
}
private static String convertToAsteriks(String value) {
StringBuilder sb = new StringBuilder(value.length());
for (int i = 0; i < value.length(); i++) {
sb.append("*");
}
return sb.toString();
}
private static TerminalSnapshot transformCommonSnapshot(TerminalPersistedSnapshot persistedSnapshot, TerminalSnapshot snapshot) {
ReflectionUtil.copyProperties(persistedSnapshot, snapshot);
List<TerminalRow> rows = snapshot.getRows();
List<TerminalPosition> fieldSeperators = snapshot.getFieldSeperators();
for (TerminalRow terminalRow : rows) {
TerminalPersistedRow persistedRow = new TerminalPersistedRow();
ReflectionUtil.copyProperties(persistedRow, terminalRow);
collectRowFields(fieldSeperators, terminalRow, persistedRow,
persistedSnapshot.getSnapshotType() == SnapshotType.INCOMING);
// don't copy empty rows
if (persistedRow.getFields().size() == 0) {
continue;
}
// don't copy row with single empty field
if (persistedRow.getFields().size() == 1 && StringUtil.isEmpty(persistedRow.getFields().get(0).getValue())) {
continue;
}
formatFieldsForCleanXml(persistedRow);
persistedSnapshot.getRows().add(persistedRow);
}
return persistedSnapshot;
}
private static void formatFieldsForCleanXml(TerminalPersistedRow persistedRow) {
List<TerminalField> fields = persistedRow.getFields();
for (TerminalField terminalField : fields) {
TerminalPersistedField persistedField = (TerminalPersistedField)terminalField;
// String value = StringUtil.rightTrim(terminalField.getValue());
String value = terminalField.getValue().replace((char)0, ' ');
persistedField.setValue(value, false);
// disable default colors from saved XML
if (persistedField.getColor() == Color.BLACK || persistedField.getColor() == Color.LIGHT_GREEN) {
persistedField.setColor(null);
}
}
}
private static void collectRowFields(List<TerminalPosition> fieldSeperators, TerminalRow terminalRow,
TerminalPersistedRow persistedRow, boolean isIncoming) {
List<TerminalField> fields = terminalRow.getFields();
for (TerminalField field : fields) {
TerminalPersistedField persistedField = new TerminalPersistedField();
ReflectionUtil.copyProperties(persistedField, field);
persistedField.setModified(false);
if (isIncoming) {
persistedField.setValue(field.getOriginalValue());
}
persistedRow.getFields().add(persistedField);
}
}
}