Add support to enable/disable Table Tree sorting

This commit is contained in:
Dale Schultz 2022-05-10 20:10:54 -04:00
parent 8ab2733fc0
commit 82b0eb35be
No known key found for this signature in database
GPG Key ID: EA2C8AD6CB5C2AF2
8 changed files with 171 additions and 132 deletions

View File

@ -59,3 +59,5 @@ BGCOLOR = Background Color
WARNCOLOR = Warning Color
LOCALEMSG = The Editor has been set to use the {0} number format.\n\nExit and restart the Editor to apply the new setting.
LOCALETITLE = Editor Number Format Change
STLABEL = Sort ROM table tree alphabetically
STLABELTT = Unchecked will order tables as per the definition file. Close and reopen ROM after changing.

View File

@ -204,6 +204,7 @@ public class Settings implements Serializable {
private Color warningColor = new Color(255, 0, 0);
private int tableClickCount = 1; // number of clicks to open table
private int tableClickBehavior = 0; // TableTreeNode click behavior. 0=open/close frame, 1=open/focus frame
private boolean sortTableTree = false; // false - Table Tree is in definition order, true - alphabetical
private boolean colorAxis = false;
private String loggerPort;
@ -571,11 +572,11 @@ public class Settings implements Serializable {
public void setAutoConnectOnStartup(boolean value) {
autoConnectOnStartup = value;
}
public boolean getAutoConnectOnStartup() {
return autoConnectOnStartup;
}
public void setLoggerProtocol(String protocol) {
Settings.loggerProtocol = protocol;
}
@ -991,5 +992,11 @@ public class Settings implements Serializable {
this.searchElm327 = value;
}
public void setTableTreeSorted(Boolean value) {
this.sortTableTree = value;
}
public boolean isTableTreeSorted() {
return this.sortTableTree;
}
}

View File

@ -37,6 +37,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ResourceBundle;
@ -80,38 +81,41 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
private boolean isAbstract = false;
private final HashMap<String, TableTreeNode> tableNodes = new HashMap<String, TableTreeNode>();
private final LinkedHashMap<String, TableTreeNode> tableNodes = new LinkedHashMap<String, TableTreeNode>();
private LinkedList<ChecksumManager> checksumManagers = new LinkedList<ChecksumManager>();
private final Settings settings = SettingsManager.getSettings();
public Rom(RomID romID) {
this.romID = romID;
this.romID = romID;
}
//This makes sure we automatically sort the tables by name
public void sortedAdd(DefaultMutableTreeNode currentParent, DefaultMutableTreeNode newNode) {
boolean found = false;
for(int k = 0; k < currentParent.getChildCount(); k++){
TreeNode n = currentParent.getChildAt(k);
TreeNode n = currentParent.getChildAt(k);
//Category nodes should be placed at the top
if(newNode instanceof CategoryTreeNode && !(n instanceof CategoryTreeNode)) {
found = true;
}
else if(!(newNode instanceof CategoryTreeNode) && n instanceof CategoryTreeNode) {
continue;
}
else if(n.toString().compareToIgnoreCase(newNode.toString()) >= 0) {
found = true;
}
//Category nodes should be placed at the top
if(newNode instanceof CategoryTreeNode && !(n instanceof CategoryTreeNode)) {
found = true;
}
else if(!(newNode instanceof CategoryTreeNode) && n instanceof CategoryTreeNode) {
continue;
}
else if(settings.isTableTreeSorted() &&
(n.toString().compareToIgnoreCase(newNode.toString()) >= 0)) {
found = true;
}
if(found) {
currentParent.insert(newNode, k);
break;
}
if(found) {
currentParent.insert(newNode, k);
break;
}
}
if(!found) {
currentParent.add(newNode);
currentParent.add(newNode);
}
}
@ -134,23 +138,23 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
for(int i=0; i < categories.length; i++) {
boolean categoryExists = false;
for (int j = 0; j < currentParent.getChildCount(); j++) {
if (currentParent.getChildAt(j).toString().equalsIgnoreCase(categories[i])) {
categoryExists = true;
currentParent = (DefaultMutableTreeNode) currentParent.getChildAt(j);
break;
}
}
for (int j = 0; j < currentParent.getChildCount(); j++) {
if (currentParent.getChildAt(j).toString().equalsIgnoreCase(categories[i])) {
categoryExists = true;
currentParent = (DefaultMutableTreeNode) currentParent.getChildAt(j);
break;
}
}
if(!categoryExists) {
CategoryTreeNode categoryNode = new CategoryTreeNode(categories[i]);
sortedAdd(currentParent,categoryNode);
currentParent = categoryNode;
}
if(!categoryExists) {
CategoryTreeNode categoryNode = new CategoryTreeNode(categories[i]);
sortedAdd(currentParent,categoryNode);
currentParent = categoryNode;
}
if(i == categories.length - 1){
sortedAdd(currentParent, tableTreeNode);
}
if(i == categories.length - 1){
sortedAdd(currentParent, tableTreeNode);
}
}
}
}
@ -162,17 +166,17 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
public void removeTableByName(Table table) {
if(tableNodes.containsKey(table.getName().toLowerCase())) {
tableNodes.remove(table.getName().toLowerCase());
}
if(tableNodes.containsKey(table.getName().toLowerCase())) {
tableNodes.remove(table.getName().toLowerCase());
}
}
public Table getTableByName(String tableName) {
TableTreeNode node = getTableNodeByName(tableName);
TableTreeNode node = getTableNodeByName(tableName);
if(node != null)
return node.getTable();
return null;
if(node != null)
return node.getTable();
return null;
}
public TableTreeNode getTableNodeByName(String tableName) {
@ -180,7 +184,7 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
return null;
}
else {
return tableNodes.get(tableName.toLowerCase());
return tableNodes.get(tableName.toLowerCase());
}
}
@ -236,28 +240,28 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
i++;
} catch (ArrayIndexOutOfBoundsException ex) {
showBadTablePopup(table, ex);
badKeys.add(table.getName());
size--;
showBadTablePopup(table, ex);
badKeys.add(table.getName());
size--;
} catch (IndexOutOfBoundsException iex) {
showBadTablePopup(table, iex);
badKeys.add(table.getName());
size--;
showBadTablePopup(table, iex);
badKeys.add(table.getName());
size--;
}
} else {
tableNodes.remove(table.getName().toLowerCase());
size--;
tableNodes.remove(table.getName().toLowerCase());
size--;
}
} catch (NullPointerException ex) {
showNullExceptionPopup(table, ex);
badKeys.add(table.getName());
size--;
showNullExceptionPopup(table, ex);
badKeys.add(table.getName());
size--;
}
}
for(String s: badKeys) {
tableNodes.remove(s.toLowerCase());
tableNodes.remove(s.toLowerCase());
}
}
@ -292,22 +296,22 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
public byte[] getBinary() {
return binData;
return binData;
}
public void setDocument(Document d) {
this.doc = d;
this.doc = d;
}
public Document getDocument() {
return this.doc;
return this.doc;
}
public void setDefinitionPath(File s) {
definitionPath = s;
definitionPath = s;
}
public File getDefinitionPath() {
return definitionPath;
return definitionPath;
}
@Override
@ -344,7 +348,7 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
private void showChecksumFixPopup(TableTreeNode checksum) {
Object[] options = {rb.getString("YES"), rb.getString("NO")};
Object[] options = {rb.getString("YES"), rb.getString("NO")};
final String message = rb.getString("CHKSUMINVALID");
int answer = showOptionDialog(
@ -372,7 +376,7 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
final List<TableTreeNode> checksumTables = new ArrayList<TableTreeNode>();
if(tableNodes.containsKey("checksum fix")) {
checksumTables.add(tableNodes.get("checksum fix"));
checksumTables.add(tableNodes.get("checksum fix"));
}
if (checksumTables.size() == 1) {
@ -407,7 +411,7 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
else if (checksum.getTable().isLocked() &&
!checksum.getTable().isButtonSelected()) {
showChecksumFixPopup(checksum);
showChecksumFixPopup(checksum);
}
}
@ -431,21 +435,21 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
if(frame != null) {
frame.setVisible(false);
frame.setVisible(false);
try {
frame.setClosed(true);
} catch (PropertyVetoException e) {
// Do nothing.
}
frame.dispose();
try {
frame.setClosed(true);
} catch (PropertyVetoException e) {
// Do nothing.
}
frame.dispose();
if(frame.getTableView() != null) {
frame.getTableView().setVisible(false);
frame.getTableView().setData(null);
frame.getTableView().setTable(null);
frame.setTableView(null);
}
if(frame.getTableView() != null) {
frame.getTableView().setVisible(false);
frame.getTableView().setData(null);
frame.getTableView().setTable(null);
frame.setTableView(null);
}
}
tableTreeNode.setUserObject(null);
@ -459,10 +463,10 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
public void clearByteMapping() {
for(List<?> l: byteCellMapping.values())l.clear();
for(List<?> l: byteCellMapping.values())l.clear();
byteCellMapping.clear();
byteCellMapping = null;
byteCellMapping.clear();
byteCellMapping = null;
}
public int getRealFileSize() {
@ -492,11 +496,11 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
public void addChecksumManager(ChecksumManager checksumManager) {
this.checksumManagers.add(checksumManager);
this.checksumManagers.add(checksumManager);
}
public int getNumChecksumsManagers() {
return checksumManagers.size();
return checksumManagers.size();
}
public int validateChecksum() {
@ -505,20 +509,20 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
if (!checksumManagers.isEmpty()) {
for(ChecksumManager cm: checksumManagers) {
int localCorrectCs = cm.validate(binData);
int localCorrectCs = cm.validate(binData);
if (cm == null || cm.getNumberOfChecksums() != localCorrectCs) {
valid = false;
}
else {
correctChecksums += localCorrectCs;
}
if (cm == null || cm.getNumberOfChecksums() != localCorrectCs) {
valid = false;
}
else {
correctChecksums += localCorrectCs;
}
}
}
if(!valid) {
showMessageDialog(null,
rb.getString("INVLAIDCHKSUM"),
showMessageDialog(null,
rb.getString("INVLAIDCHKSUM"),
rb.getString("CHKSUMFAIL"),
WARNING_MESSAGE);
}
@ -527,25 +531,25 @@ public class Rom extends DefaultMutableTreeNode implements Serializable {
}
public int updateChecksum() {
int updatedCs = 0;
int updatedCs = 0;
for(ChecksumManager cm: checksumManagers) {
updatedCs += cm.update(binData);
}
for(ChecksumManager cm: checksumManagers) {
updatedCs += cm.update(binData);
}
ECUEditorManager.getECUEditor().getStatusPanel().setStatus(
String.format(rb.getString("CHECKSUMFIXED"), updatedCs, getTotalAmountOfChecksums()));
ECUEditorManager.getECUEditor().getStatusPanel().setStatus(
String.format(rb.getString("CHECKSUMFIXED"), updatedCs, getTotalAmountOfChecksums()));
return updatedCs;
return updatedCs;
}
public int getTotalAmountOfChecksums() {
int cs = 0;
int cs = 0;
for(ChecksumManager cm: checksumManagers) {
cs += cm.getNumberOfChecksums();
}
for(ChecksumManager cm: checksumManagers) {
cs += cm.getNumberOfChecksums();
}
return cs;
return cs;
}
}

View File

@ -37,10 +37,12 @@ import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import com.romraider.Settings;
import com.romraider.editor.ecu.ECUEditorManager;
import com.romraider.maps.Rom;
import com.romraider.maps.Table;
import com.romraider.util.ResourceUtil;
import com.romraider.util.SettingsManager;
public class JTableChooser extends JOptionPane implements MouseListener {
@ -53,6 +55,7 @@ public class JTableChooser extends JOptionPane implements MouseListener {
final JTree displayTree = new JTree(rootNode);
final JButton compareButton = new JButton(rb.getString("COMPARE"));
JScrollPane displayScrollPane;
private final Settings settings = SettingsManager.getSettings();
public JTableChooser() {
}
@ -94,10 +97,11 @@ public class JTableChooser extends JOptionPane implements MouseListener {
}
}
rootNode = sortTableChooser(rootNode);
if (settings.isTableTreeSorted())
rootNode = sortTableChooser(rootNode);
displayTree.setPreferredSize(new Dimension(nameLength*9, 400));
displayTree.setMinimumSize(new Dimension(nameLength*9, 400));
displayTree.setPreferredSize(new Dimension(nameLength * 9, 400));
displayTree.setMinimumSize(new Dimension(nameLength * 9, 400));
displayTree.expandPath(new TreePath(rootNode.getPath()));

View File

@ -125,6 +125,7 @@ public class SettingsForm extends JFrame implements MouseListener {
} else { // open/close
tableClickBehavior.setSelectedIndex(0);
}
chckbxSortTree.setSelected(settings.isTableTreeSorted());
valueLimitWarning.setSelected(settings.isValueLimitWarning());
warningColor.setBackground(settings.getWarningColor());
@ -213,6 +214,7 @@ public class SettingsForm extends JFrame implements MouseListener {
tableClickBehavior = new javax.swing.JComboBox();
labelTableClick = new javax.swing.JLabel();
tableClickCount = new javax.swing.JComboBox();
chckbxSortTree = new javax.swing.JCheckBox();
defaultScale = new javax.swing.JTextField();
comboBoxDefaultScale = new javax.swing.JComboBox();
cbScaleHeaderAndData = new javax.swing.JCheckBox();
@ -559,7 +561,7 @@ public class SettingsForm extends JFrame implements MouseListener {
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(debug)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(panelUISettings, GroupLayout.PREFERRED_SIZE, 173, GroupLayout.PREFERRED_SIZE)
.addComponent(panelUISettings, GroupLayout.PREFERRED_SIZE, 190, GroupLayout.PREFERRED_SIZE)
.addContainerGap(267, Short.MAX_VALUE))
);
chckbxOpenRomNode = new JCheckBox(rb.getString("ORNE"));
@ -593,7 +595,7 @@ public class SettingsForm extends JFrame implements MouseListener {
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(chckbxOpenTablesAt)
.addPreferredGap(ComponentPlacement.RELATED, 12, Short.MAX_VALUE)
.addComponent(panelTreeSettings, GroupLayout.PREFERRED_SIZE, 69, GroupLayout.PREFERRED_SIZE))
.addComponent(panelTreeSettings, GroupLayout.PREFERRED_SIZE, 94, GroupLayout.PREFERRED_SIZE))
);
labelTableClick.setText(rb.getString("CTOT"));
@ -601,6 +603,8 @@ public class SettingsForm extends JFrame implements MouseListener {
new String[]{rb.getString("SINGLE"), rb.getString("DOUBLE")}));
tableClickBehavior.setModel(new DefaultComboBoxModel(
new String[] {rb.getString("OPENCLOSE"), rb.getString("OPENFOCUS")}));
chckbxSortTree.setText(rb.getString("STLABEL"));
chckbxSortTree.setToolTipText(rb.getString("STLABELTT"));
lblClickBehavior = new JLabel(rb.getString("TCB"));
GroupLayout gl_panelTreeSettings = new GroupLayout(panelTreeSettings);
@ -609,24 +613,32 @@ public class SettingsForm extends JFrame implements MouseListener {
.addGroup(gl_panelTreeSettings.createSequentialGroup()
.addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.LEADING)
.addComponent(tableClickCount, 0, 72, Short.MAX_VALUE)
.addComponent(tableClickBehavior, 0, 86, Short.MAX_VALUE))
.addComponent(tableClickBehavior, 0, 86, Short.MAX_VALUE)
)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.LEADING)
.addComponent(labelTableClick)
.addComponent(lblClickBehavior))
.addGap(200))
);
.addComponent(lblClickBehavior)
.addGap(200)
)
).addComponent(chckbxSortTree, 0, 100, Short.MAX_VALUE)
);
gl_panelTreeSettings.setVerticalGroup(
gl_panelTreeSettings.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panelTreeSettings.createSequentialGroup()
.addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.BASELINE)
.addComponent(labelTableClick)
.addComponent(tableClickCount, GroupLayout.PREFERRED_SIZE, 18, GroupLayout.PREFERRED_SIZE))
.addComponent(tableClickCount, GroupLayout.PREFERRED_SIZE, 18, GroupLayout.PREFERRED_SIZE)
)
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(gl_panelTreeSettings.createParallelGroup(Alignment.BASELINE)
.addComponent(lblClickBehavior)
.addComponent(tableClickBehavior, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addContainerGap(23, Short.MAX_VALUE))
.addComponent(tableClickBehavior, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
)
.addContainerGap(23, Short.MAX_VALUE)
.addComponent(chckbxSortTree, GroupLayout.PREFERRED_SIZE, 18, GroupLayout.PREFERRED_SIZE)
)
);
panelTreeSettings.setLayout(gl_panelTreeSettings);
panelUISettings.setLayout(gl_panelUISettings);
@ -988,6 +1000,7 @@ public class SettingsForm extends JFrame implements MouseListener {
} else { // open/focus frame
getSettings().setTableClickBehavior(0);
}
getSettings().setTableTreeSorted(chckbxSortTree.isSelected());
getSettings().setValueLimitWarning(valueLimitWarning.isSelected());
getSettings().setWarningColor(warningColor.getBackground());
@ -1136,4 +1149,5 @@ public class SettingsForm extends JFrame implements MouseListener {
private javax.swing.JCheckBox cbScaleHeaderAndData;
private javax.swing.JCheckBox localeFormatCheckBox;
private String oldLocale;
private javax.swing.JCheckBox chckbxSortTree;
}

View File

@ -67,8 +67,8 @@ public final class DOMRomUnmarshaller {
// Unmarshall scales first
tableScaleHandler.unmarshallBaseScales(rootNode);
Rom rom = new Rom(new RomID());
rom.setDefinitionPath(definition);
Rom rom = new Rom(new RomID());
rom.setDefinitionPath(definition);
Rom output = unmarshallRom(romNode, rom);
//Set ram offset
@ -80,7 +80,7 @@ public final class DOMRomUnmarshaller {
}
public static Node findFirstRomNode(Node rootNode) {
Node n;
Node n;
NodeList nodes = rootNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
@ -99,7 +99,7 @@ public final class DOMRomUnmarshaller {
if(xmlID == null && input == null) return null;
if(xmlID != null && input != null) return null;
Node n;
Node n;
NodeList nodes = rootNode.getChildNodes();
for (int i = 0; i < nodes.getLength(); i++) {
@ -116,17 +116,17 @@ public final class DOMRomUnmarshaller {
if (n2.getNodeType() == ELEMENT_NODE
&& n2.getNodeName().equalsIgnoreCase("romid")) {
RomID romId = new RomID();
romId = unmarshallRomID(n2, romId);
RomID romId = new RomID();
romId = unmarshallRomID(n2, romId);
//Check if bytes match in file
if(input != null && romId.checkMatch(input)) {
return n;
return n;
}
//Check if the ID matches
else if(xmlID != null && romId.getXmlid().equalsIgnoreCase(xmlID)) {
return n;
return n;
}
break;
@ -200,13 +200,13 @@ public final class DOMRomUnmarshaller {
throws XMLParseException, RomNotFoundException, StackOverflowError,
Exception {
Node n = findRomNodeMatch(rootNode, xmlID, null);
Node n = findRomNodeMatch(rootNode, xmlID, null);
if(n != null) {
Rom returnrom = unmarshallRom(n, rom);
returnrom.getRomID().setObsolete(false);
return returnrom;
}
if(n != null) {
Rom returnrom = unmarshallRom(n, rom);
returnrom.getRomID().setObsolete(false);
return returnrom;
}
throw new RomNotFoundException();
}
@ -219,7 +219,7 @@ public final class DOMRomUnmarshaller {
n = nodes.item(i);
if (n.getNodeType() == ELEMENT_NODE) {
String nodeName = n.getNodeName();
String nodeName = n.getNodeName();
if (nodeName.equalsIgnoreCase("xmlid")) {
romID.setXmlid(unmarshallText(n));

View File

@ -181,6 +181,11 @@ public final class DOMSettingsBuilder {
tableClickBehavior.setAttribute("value", String.valueOf(settings.getTableClickBehavior()));
options.appendChild(tableClickBehavior);
// table tree sorting
IIOMetadataNode tableTreeSorted = new IIOMetadataNode("tabletreesorted");
tableTreeSorted.setAttribute("value", String.valueOf(settings.isTableTreeSorted()));
options.appendChild(tableTreeSorted);
// last version used
IIOMetadataNode version = new IIOMetadataNode("version");
version.setAttribute("value", versionNumber);
@ -326,7 +331,7 @@ public final class DOMSettingsBuilder {
IIOMetadataNode autoConnect = new IIOMetadataNode("autoConnectOnStartup");
autoConnect.setAttribute("value", "" + settings.getAutoConnectOnStartup());
loggerSettings.appendChild(autoConnect);
// serial connection
IIOMetadataNode serial = new IIOMetadataNode("serial");
serial.setAttribute("port", validateAttr(settings.getLoggerPortDefault()));

View File

@ -1,6 +1,6 @@
/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2021 RomRaider.com
* Copyright (C) 2006-2022 RomRaider.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -146,6 +146,9 @@ public final class DOMSettingsUnmarshaller {
} else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tableclickbehavior")) {
settings.setTableClickBehavior(unmarshallAttribute(n, "value", 0));
} else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("tabletreesorted")) {
settings.setTableTreeSorted(Boolean.parseBoolean(unmarshallAttribute(n, "value", "false")));
} else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("version")) {
settings.setRecentVersion(unmarshallAttribute(n, "value", ""));
@ -261,7 +264,7 @@ public final class DOMSettingsUnmarshaller {
settings.setLoggerPortDefault(unmarshallAttribute(n, "port", ""));
settings.setRefreshMode(unmarshallAttribute(n, "refresh", false));
} else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("autoConnectOnStartup")) {
settings.setAutoConnectOnStartup(unmarshallAttribute(n, "value", true));
settings.setAutoConnectOnStartup(unmarshallAttribute(n, "value", true));
} else if (n.getNodeType() == ELEMENT_NODE && n.getNodeName().equalsIgnoreCase("protocol")) {
settings.setLoggerProtocol(unmarshallAttribute(n, "name", "SSM"));
settings.setTransportProtocol(unmarshallAttribute(n, "transport", "ISO9141"));