package org.apache.aries.subsystem.itests; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.Version; import org.osgi.service.subsystem.Subsystem.State; import org.osgi.service.subsystem.SubsystemConstants; public class SubsystemEventHandler implements ServiceListener { static class ServiceEventInfo { private final ServiceEvent event; private final long id; private final State state; private final String symbolicName; private final String type; private final Version version; public ServiceEventInfo(ServiceEvent event) { id = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY); state = (State)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_STATE_PROPERTY); symbolicName = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY); type = (String)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY); version = (Version)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_VERSION_PROPERTY); this.event = event; } public int getEventType() { return event.getType(); } public long getId() { return id; } public State getState() { return state; } public String getSymbolicName() { return symbolicName; } public String getType() { return type; } public Version getVersion() { return version; } } private final Map<Long, List<SubsystemEventHandler.ServiceEventInfo>> subsystemIdToEvents = new HashMap<Long, List<SubsystemEventHandler.ServiceEventInfo>>(); public void clear() { synchronized (subsystemIdToEvents) { subsystemIdToEvents.clear(); } } public SubsystemEventHandler.ServiceEventInfo poll(long subsystemId) throws InterruptedException { return poll(subsystemId, 0); } public SubsystemEventHandler.ServiceEventInfo poll(long subsystemId, long timeout) throws InterruptedException { List<SubsystemEventHandler.ServiceEventInfo> events; synchronized (subsystemIdToEvents) { events = subsystemIdToEvents.get(subsystemId); if (events == null) { events = new ArrayList<SubsystemEventHandler.ServiceEventInfo>(); subsystemIdToEvents.put(subsystemId, events); } } synchronized (events) { if (events.isEmpty()) { events.wait(timeout); if (events.isEmpty()) { return null; } } return events.remove(0); } } public void serviceChanged(ServiceEvent event) { Long subsystemId = (Long)event.getServiceReference().getProperty(SubsystemConstants.SUBSYSTEM_ID_PROPERTY); synchronized (subsystemIdToEvents) { List<SubsystemEventHandler.ServiceEventInfo> events = subsystemIdToEvents.get(subsystemId); if (events == null) { events = new ArrayList<SubsystemEventHandler.ServiceEventInfo>(); subsystemIdToEvents.put(subsystemId, events); } synchronized (events) { events.add(new ServiceEventInfo(event)); events.notify(); } } } public int size() { synchronized (subsystemIdToEvents) { return subsystemIdToEvents.size(); } } }