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}