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}