001package jmri.jmrit.operations.rollingstock.cars; 002 003import java.util.List; 004 005import org.jdom2.Attribute; 006import org.jdom2.Element; 007import org.slf4j.Logger; 008import org.slf4j.LoggerFactory; 009 010import jmri.InstanceManager; 011import jmri.InstanceManagerAutoDefault; 012import jmri.jmrit.operations.rollingstock.RollingStockGroupManager; 013 014/** 015 * Manages Kernels. 016 * 017 * @author Daniel Boudreau Copyright (C) 2021 018 */ 019public class KernelManager extends RollingStockGroupManager implements InstanceManagerAutoDefault { 020 021 public KernelManager() { 022 } 023 024 /** 025 * Create a new Kernel 026 * 027 * @param name string name for this Kernel 028 * 029 * @return Kernel 030 */ 031 public Kernel newKernel(String name) { 032 Kernel kernel = getKernelByName(name); 033 if (kernel == null && !name.equals(NONE)) { 034 kernel = new Kernel(name); 035 int oldSize = _groupHashTable.size(); 036 _groupHashTable.put(name, kernel); 037 setDirtyAndFirePropertyChange(LISTLENGTH_CHANGED_PROPERTY, oldSize, _groupHashTable 038 .size()); 039 } 040 return kernel; 041 } 042 043 /** 044 * Delete a Kernel by name 045 * 046 * @param name string name for the Kernel 047 * 048 */ 049 public void deleteKernel(String name) { 050 Kernel kernel = getKernelByName(name); 051 if (kernel != null) { 052 kernel.dispose(); 053 int oldSize = _groupHashTable.size(); 054 _groupHashTable.remove(name); 055 setDirtyAndFirePropertyChange(LISTLENGTH_CHANGED_PROPERTY, oldSize, _groupHashTable.size()); 056 } 057 } 058 059 /** 060 * Get a Kernel by name 061 * 062 * @param name string name for the Kernel 063 * 064 * @return named Kernel 065 */ 066 public Kernel getKernelByName(String name) { 067 return (Kernel) _groupHashTable.get(name); 068 } 069 070 public void replaceKernelName(String oldName, String newName) { 071 Kernel oldKernel = getKernelByName(oldName); 072 if (oldKernel != null) { 073 Kernel newKernel = newKernel(newName); 074 // keep the lead car 075 Car leadCar = oldKernel.getLead(); 076 if (leadCar != null) { 077 leadCar.setKernel(newKernel); 078 } 079 for (Car car : oldKernel.getCars()) { 080 car.setKernel(newKernel); 081 } 082 } 083 } 084 085 086 public void load(Element root) { 087 // new format using elements starting version 3.3.1 088 if (root.getChild(Xml.NEW_KERNELS) != null) { 089 List<Element> eKernels = root.getChild(Xml.NEW_KERNELS).getChildren(Xml.KERNEL); 090 log.debug("Kernel manager sees {} kernels", eKernels.size()); 091 Attribute a; 092 for (Element eKernel : eKernels) { 093 if ((a = eKernel.getAttribute(Xml.NAME)) != null) { 094 newKernel(a.getValue()); 095 } 096 } 097 } // old format 098 else if (root.getChild(Xml.KERNELS) != null) { 099 String names = root.getChildText(Xml.KERNELS); 100 if (!names.isEmpty()) { 101 String[] kernelNames = names.split("%%"); // NOI18N 102 log.debug("kernels: {}", names); 103 for (String name : kernelNames) { 104 newKernel(name); 105 } 106 } 107 } 108 } 109 110 /** 111 * Create an XML element to represent this Entry. This member has to remain 112 * synchronized with the detailed DTD in operations-cars.dtd. 113 * 114 * @param root The common Element for operations-cars.dtd. 115 */ 116 public void store(Element root) { 117 List<String> names = getNameList(); 118 Element kernels = new Element(Xml.NEW_KERNELS); 119 for (String name : names) { 120 Element kernel = new Element(Xml.KERNEL); 121 kernel.setAttribute(new Attribute(Xml.NAME, name)); 122 kernels.addContent(kernel); 123 } 124 root.addContent(kernels); 125 } 126 127 protected void setDirtyAndFirePropertyChange(String p, Object old, Object n) { 128 // Set dirty 129 InstanceManager.getDefault(CarManagerXml.class).setDirty(true); 130 super.firePropertyChange(p, old, n); 131 } 132 133 private static final Logger log = LoggerFactory.getLogger(KernelManager.class); 134}