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}