001package jmri.jmrit.operations.rollingstock.cars;
002
003import java.io.File;
004
005import org.jdom2.Document;
006import org.jdom2.Element;
007import org.jdom2.ProcessingInstruction;
008import org.slf4j.Logger;
009import org.slf4j.LoggerFactory;
010
011import jmri.InstanceManager;
012import jmri.InstanceManagerAutoDefault;
013import jmri.InstanceManagerAutoInitialize;
014import jmri.jmrit.operations.OperationsXml;
015import jmri.jmrit.operations.locations.LocationManagerXml;
016import jmri.jmrit.operations.rollingstock.RollingStockLogger;
017import jmri.jmrit.operations.setup.OperationsSetupXml;
018import jmri.jmrit.operations.setup.Setup;
019
020/**
021 * Loads and stores cars using xml files. Also loads and stores car road names,
022 * car types, car colors, car lengths, car owners, and car kernels.
023 *
024 * @author Daniel Boudreau Copyright (C) 2008
025 */
026public class CarManagerXml extends OperationsXml implements InstanceManagerAutoDefault, InstanceManagerAutoInitialize {
027
028    public CarManagerXml() {
029    }
030
031    @Override
032    public void writeFile(String name) throws java.io.FileNotFoundException, java.io.IOException {
033        log.debug("writeFile {}", name);
034        // This is taken in large part from "Java and XML" page 368
035        File file = findFile(name);
036        if (file == null) {
037            file = new File(name);
038        }
039        // create root element
040        Element root = new Element("operations-config"); // NOI18N
041        Document doc = newDocument(root, dtdLocation + "operations-cars.dtd"); // NOI18N
042
043        // add XSLT processing instruction
044        java.util.Map<String, String> m = new java.util.HashMap<String, String>();
045        m.put("type", "text/xsl"); // NOI18N
046        m.put("href", xsltLocation + "operations-cars.xsl"); // NOI18N
047        ProcessingInstruction p = new ProcessingInstruction("xml-stylesheet", m); // NOI18N
048        doc.addContent(0, p);
049
050        // note all comments line feeds have been changed to processor directives
051        InstanceManager.getDefault(CarRoads.class).store(root);
052        InstanceManager.getDefault(CarTypes.class).store(root);
053        InstanceManager.getDefault(CarColors.class).store(root);
054        InstanceManager.getDefault(CarLengths.class).store(root);
055        InstanceManager.getDefault(CarOwners.class).store(root);
056        InstanceManager.getDefault(CarLoads.class).store(root);
057        InstanceManager.getDefault(KernelManager.class).store(root);
058        InstanceManager.getDefault(CarManager.class).store(root);
059
060        writeXML(file, doc);
061
062        // done - car file now stored, so can't be dirty
063        setDirty(false);
064    }
065
066    /**
067     * Read the contents of a roster XML file into this object. Note that this
068     * does not clear any existing entries.
069     */
070    @Override
071    public void readFile(String name) throws org.jdom2.JDOMException, java.io.IOException {
072        // suppress rootFromName(name) warning message by checking to see if file exists
073        if (findFile(name) == null) {
074            log.debug("{} file could not be found", name);
075            return;
076        }
077        // find root
078        Element root = rootFromName(name);
079        if (root == null) {
080            log.debug("{} file could not be read", name);
081            return;
082        }
083
084        InstanceManager.getDefault(CarRoads.class).load(root);
085        InstanceManager.getDefault(CarTypes.class).load(root);
086        InstanceManager.getDefault(CarColors.class).load(root);
087        InstanceManager.getDefault(CarLengths.class).load(root);
088        InstanceManager.getDefault(CarOwners.class).load(root);
089        InstanceManager.getDefault(CarLoads.class).load(root);
090        InstanceManager.getDefault(KernelManager.class).load(root);
091        InstanceManager.getDefault(CarManager.class).load(root);
092
093        log.debug("Cars have been loaded!");
094        InstanceManager.getDefault(RollingStockLogger.class).enableCarLogging(Setup.isCarLoggerEnabled());
095        // clear dirty bit
096        setDirty(false);
097        // clear location dirty flag, locations get modified during the loading of cars and locos
098        InstanceManager.getDefault(LocationManagerXml.class).setDirty(false);
099    }
100
101    @Override
102    public void setOperationsFileName(String name) {
103        operationsFileName = name;
104    }
105
106    @Override
107    public String getOperationsFileName() {
108        return operationsFileName;
109    }
110
111    private String operationsFileName = "OperationsCarRoster.xml"; // NOI18N
112
113    public void dispose() {
114    }
115
116    private final static Logger log = LoggerFactory.getLogger(CarManagerXml.class);
117
118    @Override
119    public void initialize() {
120        InstanceManager.getDefault(OperationsSetupXml.class); // load setup
121        InstanceManager.getDefault(LocationManagerXml.class); // load locations
122        CarManagerXml.this.load();
123    }
124}