package org.jactr.eclipse.runtime.visual; /* * default logging */ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.commonreality.identifier.IIdentifier; import org.jactr.eclipse.runtime.session.ISession; import org.jactr.tools.tracer.transformer.visual.TransformedVisualEvent; public class VisualDescriptor { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(VisualDescriptor.class); private Map<IIdentifier, Map<String, Object>> _objects; // what object was found private IIdentifier _searchResult; // what object was encoded private IIdentifier _encoded; private String _commonName; private String _modelName; private Collection<IVisualDescriptorListener> _listeners; private double[] _resolution; private double[] _fov; final private ISession _session; public VisualDescriptor(String commonName, String modelName, ISession session) { _commonName = commonName; _modelName = modelName; _objects = new HashMap<IIdentifier, Map<String, Object>>(); _listeners = new ArrayList<IVisualDescriptorListener>(); _session = session; } public ISession getSession() { return _session; } public void setModelName(String modelName) { _modelName = modelName; } public void add(IVisualDescriptorListener listener) { _listeners.add(listener); } public void remove(IVisualDescriptorListener listener) { _listeners.remove(listener); } public double[] getResolution() { return _resolution; } public double[] getFOV() { return _fov; } public Collection<IIdentifier> getIdentifiers() { synchronized (_objects) { return new ArrayList<IIdentifier>(_objects.keySet()); } } /** * should synchronize when iterating * * @param identifier * @return */ public Map<String, Object> getData(IIdentifier identifier) { synchronized (_objects) { Map<String, Object> data = _objects.get(identifier); if (data == null) return Collections.emptyMap(); return Collections.unmodifiableMap(data); } } public String getModelName() { return _modelName; } public void process(TransformedVisualEvent event) { _fov = event.getFOV(); _resolution = event.getResolution(); switch (event.getType()) { case ADDED: added(event); break; case ENCODED: encoded(event); break; case FOUND: found(event); break; case REMOVED: removed(event); break; case UPDATED: updated(event); break; } } private void added(TransformedVisualEvent event) { synchronized (_objects) { _objects.put(event.getIdentifier(), event.getData()); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Added " + event.getIdentifier() + " with " + event.getData()); for (IVisualDescriptorListener listener : _listeners) listener.added(this, event.getIdentifier()); } private void encoded(TransformedVisualEvent event) { _encoded = event.getIdentifier(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Encoded " + event.getIdentifier()); for (IVisualDescriptorListener listener : _listeners) listener.encoded(this, _encoded); } private void found(TransformedVisualEvent event) { _searchResult = event.getIdentifier(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Found " + _searchResult); for (IVisualDescriptorListener listener : _listeners) listener.found(this, _searchResult); } private void removed(TransformedVisualEvent event) { synchronized (_objects) { _objects.remove(event.getIdentifier()); } if (LOGGER.isDebugEnabled()) LOGGER.debug("Removed " + event.getIdentifier()); for (IVisualDescriptorListener listener : _listeners) listener.removed(this, event.getIdentifier()); } private void updated(TransformedVisualEvent event) { Map<String, Object> data = null; synchronized (_objects) { data = _objects.get(event.getIdentifier()); } if (data == null) { added(event); return; } if (LOGGER.isDebugEnabled()) LOGGER.debug("Updated " + event.getIdentifier() + " with " + event.getData()); synchronized (data) { data.putAll(event.getData()); } for (IVisualDescriptorListener listener : _listeners) listener.updated(this, event.getIdentifier()); } }