001package jmri.jmrit.tracker;
002
003import jmri.*;
004
005/**
006 * Tracks train into memory object
007 *
008 * @author Bob Jacobsen Copyright (C) 2006
009 */
010public class MemoryTracker {
011
012    /**
013     * Create a Tracker object, providing a list of blocks to watch
014     * @param b block to track.
015     * @param namePrefix system name prefix.
016     * @throws IllegalArgumentException when needed
017     */
018    public MemoryTracker(Block b, String namePrefix) throws IllegalArgumentException {
019        block = b;
020
021        // make sure Memory objects exist & remember it
022        Memory m = jmri.InstanceManager.memoryManagerInstance()
023                .provideMemory(namePrefix + block.getSystemName());
024        namedMemory = jmri.InstanceManager.getDefault(jmri.NamedBeanHandleManager.class)
025            .getNamedBeanHandle(namePrefix + block.getSystemName(), m);
026        // set listener in the block
027        block.addPropertyChangeListener( e -> handleChange());
028
029        // first update
030        handleChange();
031    }
032
033    private void handleChange() {
034        if (log.isDebugEnabled() && (block.getValue() != null)) {
035            log.debug("set value {} in block {}", block.getValue(), block.getSystemName());
036        }
037        Object o = block.getValue();
038        if (o != null) {
039            o = o.toString();
040        }
041        namedMemory.getBean().setValue(o);
042    }
043
044    private final NamedBeanHandle<Memory> namedMemory;
045    private final Block block;
046
047    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MemoryTracker.class);
048}