package org.jactr.tools.marker.markerof; /* * default logging */ import java.util.HashMap; import java.util.Map; import javolution.util.FastList; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.buffer.IActivationBuffer; import org.jactr.core.buffer.event.ActivationBufferEvent; import org.jactr.core.buffer.event.ActivationBufferListenerAdaptor; import org.jactr.core.buffer.event.IActivationBufferListener; import org.jactr.core.chunk.IChunk; import org.jactr.tools.marker.IMarker; import org.jactr.tools.marker.impl.DefaultMarker; /** * listener for buffers that marks state changes and contents * * @author harrison */ public class MarkerOfBuffers implements IMarkerOf<IActivationBuffer> { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(MarkerOfBuffers.class); private Map<IActivationBuffer, IMarker> _stateMarkers = new HashMap<IActivationBuffer, IMarker>(); private Map<IActivationBuffer, IMarker> _contentMarkers = new HashMap<IActivationBuffer, IMarker>(); private IActivationBufferListener _bufferListener = new ActivationBufferListenerAdaptor() { @Override public void statusSlotChanged( ActivationBufferEvent abe) { if (abe .getSlotName() .equals( "state")) stateHasChanged( abe.getSource(), abe.getNewSlotValue(), abe.getSimulationTime()); } @Override public void sourceChunkAdded( ActivationBufferEvent abe) { updateContents( abe.getSource(), abe.getSimulationTime()); } @Override public void sourceChunkRemoved( ActivationBufferEvent abe) { updateContents( abe.getSource(), abe.getSimulationTime()); } @Override public void sourceChunksCleared( ActivationBufferEvent abe) { updateContents( abe.getSource(), abe.getSimulationTime()); } }; public void install(IActivationBuffer element) { _stateMarkers.put(element, null); _contentMarkers.put(element, null); // inline element.addListener(_bufferListener, null); } protected void stateHasChanged(IActivationBuffer buffer, Object stateValue, double when) { IMarker marker = _stateMarkers.remove(buffer); if (marker != null) marker.close(when); marker = new DefaultMarker(buffer.getModel(), String.format("%s.%s", buffer.getName(), stateValue), "buffer.state"); _stateMarkers.put(buffer, marker); marker.open(when); } protected void updateContents(IActivationBuffer buffer, double when) { IMarker marker = _contentMarkers.remove(buffer); if (marker != null) marker.close(when); FastList<IChunk> sourceChunks = FastList.newInstance(); buffer.getSourceChunks(sourceChunks); if (sourceChunks.size() != 0) { marker = new DefaultMarker(buffer.getModel(), String.format("%s.%d", buffer.getName(), sourceChunks.size()), "buffer.content"); StringBuilder sb = new StringBuilder(); for (IChunk chunk : sourceChunks) { if (sb.length() != 0) sb.append(", "); sb.append(chunk); } ((DefaultMarker) marker).setDescription(sb.toString()); _contentMarkers.put(buffer, marker); marker.open(when); } FastList.recycle(sourceChunks); } }