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