158 lines
6.1 KiB
Java
158 lines
6.1 KiB
Java
package jmri.util;
|
|
|
|
import java.util.List;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import jmri.InstanceManager;
|
|
import jmri.jmrit.decoderdefn.DecoderFile;
|
|
import jmri.jmrit.decoderdefn.DecoderIndexFile;
|
|
import jmri.jmrit.roster.Roster;
|
|
import jmri.jmrit.roster.RosterConfigManager;
|
|
import jmri.jmrit.roster.RosterEntry;
|
|
import jmri.jmrit.symbolicprog.CvTableModel;
|
|
import jmri.jmrit.symbolicprog.VariableTableModel;
|
|
import jmri.profile.ProfileManager;
|
|
import org.jdom2.Element;
|
|
import org.jdom2.JDOMException;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
/**
|
|
* <p>
|
|
* Utility functions for build rosters and RosterEntries during tests.
|
|
* </p>
|
|
*
|
|
* @author Bob Jacobsen Copyright (C) 2001, 2002, 2012
|
|
* @author Paul Bender Copyright (C) 2019
|
|
*/
|
|
public class RosterTestUtil {
|
|
|
|
// originally copied from RosterTest
|
|
/**
|
|
* create a test roster with known contents.
|
|
*
|
|
* @param rosterDir location of the roster.
|
|
* @param rosterFileName name of the roster file.
|
|
* @return a roster with entries.
|
|
* @throws java.io.IOException if unable to create a test roster
|
|
*/
|
|
public static Roster createTestRoster(File rosterDir, String rosterFileName) throws IOException {
|
|
FileUtil.createDirectory(rosterDir);
|
|
|
|
// create a roster with known contents
|
|
Roster r = new Roster(rosterDir.getAbsolutePath() + File.separator + rosterFileName);
|
|
r.setRosterLocation(rosterDir.getAbsolutePath());
|
|
r.setRosterIndexFileName(rosterFileName);
|
|
|
|
RosterEntry e1 = new RosterEntry("SP123");
|
|
e1.setId("SP123");
|
|
e1.setDccAddress("123");
|
|
e1.setRoadNumber("123");
|
|
e1.setRoadName("SP");
|
|
e1.ensureFilenameExists();
|
|
e1.putAttribute("key a", "value a");
|
|
e1.putAttribute("key b", "value b");
|
|
CvTableModel cvTable = new CvTableModel(null, null);
|
|
VariableTableModel varTable = new VariableTableModel(null, new String[]{"Name", "Value"}, cvTable);
|
|
loadDecoderFromLoco(e1, varTable);
|
|
e1.writeFile(cvTable, varTable);
|
|
r.addEntry(e1);
|
|
|
|
RosterEntry e2 = new RosterEntry("ATSF123");
|
|
e2.setId("ATSF123");
|
|
e2.setDccAddress("456");
|
|
e2.setLongAddress(true);
|
|
e2.setRoadNumber("123");
|
|
e2.setRoadName("ATSF");
|
|
e2.setDecoderModel("Silver");
|
|
e2.setDecoderFamily("Lenz Silver with 6th gen BEMF");
|
|
e2.ensureFilenameExists();
|
|
e2.putAttribute("key a", "value a");
|
|
cvTable = new CvTableModel(null, null);
|
|
varTable = new VariableTableModel(null, new String[]{"Name", "Value"}, cvTable);
|
|
loadDecoderFromLoco(e2, varTable);
|
|
e2.writeFile(cvTable, varTable);
|
|
r.addEntry(e2);
|
|
|
|
RosterEntry e3 = new RosterEntry("UP123");
|
|
e3.setId("UP123");
|
|
e3.setRoadNumber("123");
|
|
e3.setRoadName("UP");
|
|
e3.ensureFilenameExists();
|
|
e3.putAttribute("key b", "value b");
|
|
e3.setProductID("123");
|
|
e3.setDeveloperID("23");
|
|
e3.setManufacturerID("100");
|
|
e3.setProgrammingModes("A,B");
|
|
cvTable = new CvTableModel(null, null);
|
|
varTable = new VariableTableModel(null, new String[]{"Name", "Value"}, cvTable);
|
|
loadDecoderFromLoco(e2, varTable);
|
|
e3.writeFile(cvTable, varTable);
|
|
r.addEntry(e3);
|
|
|
|
InstanceManager.getDefault(RosterConfigManager.class).setRoster(ProfileManager.getDefault().getActiveProfile(), r);
|
|
return r;
|
|
}
|
|
|
|
/**
|
|
* Load the variable model for a particular roster entry into memory. This
|
|
* was originally copied from PaneProgFrame
|
|
*
|
|
* @param r the roster entry to load.
|
|
* @param varTable the variable table to load.
|
|
*/
|
|
public static void loadDecoderFromLoco(RosterEntry r, VariableTableModel varTable) {
|
|
// get a DecoderFile from the locomotive xml
|
|
String decoderModel = r.getDecoderModel();
|
|
String decoderFamily = r.getDecoderFamily();
|
|
log.debug("selected loco uses decoder {} {}", decoderFamily, decoderModel);
|
|
// locate a decoder like that.
|
|
List<DecoderFile> l = InstanceManager.getDefault(DecoderIndexFile.class).matchingDecoderList(null, decoderFamily, null, null, null, decoderModel);
|
|
log.debug("found {} matches", l.size());
|
|
if (l.isEmpty()) {
|
|
log.debug("Loco uses {} {} decoder, but no such decoder defined", decoderFamily, decoderModel);
|
|
// fall back to use just the decoder name, not family
|
|
l = InstanceManager.getDefault(DecoderIndexFile.class).matchingDecoderList(null, null, null, null, null, decoderModel);
|
|
log.debug("found {} matches without family key", l.size());
|
|
}
|
|
if (!l.isEmpty()) {
|
|
DecoderFile d = l.get(0);
|
|
loadDecoderFile(d, r, varTable);
|
|
} else {
|
|
if (decoderModel.equals("")) {
|
|
log.debug("blank decoderModel requested, so nothing loaded");
|
|
} else {
|
|
log.warn("no matching \"{}\" decoder found for loco, no decoder info loaded", decoderModel);
|
|
}
|
|
}
|
|
}
|
|
|
|
// This was originally copied from PaneProgFrame
|
|
private static void loadDecoderFile(DecoderFile df, RosterEntry re, VariableTableModel variableModel) {
|
|
if (df == null) {
|
|
log.warn("loadDecoder file invoked with null object");
|
|
return;
|
|
}
|
|
log.debug("loadDecoderFile from {} {}", DecoderFile.fileLocation, df.getFileName());
|
|
|
|
Element decoderRoot = null;
|
|
|
|
try {
|
|
decoderRoot = df.rootFromName(DecoderFile.fileLocation + df.getFileName());
|
|
} catch (JDOMException | IOException e) {
|
|
log.error("Exception while loading decoder XML file: {}", df.getFileName(), e);
|
|
}
|
|
df.getProductID();
|
|
if (decoderRoot != null) {
|
|
// load variables from decoder tree
|
|
df.loadVariableModel(decoderRoot.getChild("decoder"), variableModel);
|
|
|
|
// load function names
|
|
re.loadFunctions(decoderRoot.getChild("decoder").getChild("family").getChild("functionlabels"));
|
|
}
|
|
}
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(RosterTestUtil.class);
|
|
|
|
}
|