/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.felix.ipojo.extender.internal.queue.debug; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.felix.ipojo.extender.queue.JobInfo; import org.apache.felix.ipojo.extender.queue.QueueListener; import org.apache.felix.ipojo.extender.queue.debug.QueueEventProxy; /** * User: guillaume * Date: 02/10/13 * Time: 10:51 */ public class ReplayQueueEventProxy implements QueueEventProxy, QueueListener { /** * Store QueueListeners. */ private final List<QueueListener> m_listeners = new ArrayList<QueueListener>(); /** * Store QueueEvent to be replayed. */ private List<QueueEvent> m_events = new CopyOnWriteArrayList<QueueEvent>(); public void addQueueListener(final QueueListener listener) { m_listeners.add(listener); // replay all the existing events to the new listener replay(listener); } public void removeQueueListener(final QueueListener listener) { m_listeners.remove(listener); } public void enlisted(final JobInfo info) { EnlistedQueueEvent event = new EnlistedQueueEvent(info); m_events.add(event); forward(event); } public void started(final JobInfo info) { StartedQueueEvent event = new StartedQueueEvent(info); m_events.add(event); forward(event); } public void executed(final JobInfo info, final Object result) { ExecutedQueueEvent event = new ExecutedQueueEvent(info, result); m_events.add(event); forward(event); } public void failed(final JobInfo info, final Throwable throwable) { FailedQueueEvent event = new FailedQueueEvent(info, throwable); m_events.add(event); forward(event); } /** * Replay all stored events to the given QueueListener. */ private void replay(final QueueListener listener) { for (QueueEvent event : m_events) { event.replay(listener); } } /** * Forward the given QueueEvent to all the registered listeners. */ private void forward(final QueueEvent event) { for (QueueListener listener : m_listeners) { event.replay(listener); } } /** * Encapsulate event forwarding logic. */ private interface QueueEvent { void replay(QueueListener listener); } private class EnlistedQueueEvent implements QueueEvent { private final JobInfo m_info; public EnlistedQueueEvent(final JobInfo info) { m_info = info; } public void replay(final QueueListener listener) { listener.enlisted(m_info); } } private class StartedQueueEvent implements QueueEvent { private final JobInfo m_info; public StartedQueueEvent(final JobInfo info) { m_info = info; } public void replay(final QueueListener listener) { listener.started(m_info); } } private class ExecutedQueueEvent implements QueueEvent { private final JobInfo m_info; private final Object m_result; public ExecutedQueueEvent(final JobInfo info, final Object result) { m_info = info; m_result = result; } public void replay(final QueueListener listener) { listener.executed(m_info, m_result); } } private class FailedQueueEvent implements QueueEvent { private final JobInfo m_info; private final Throwable m_throwable; public FailedQueueEvent(final JobInfo info, final Throwable throwable) { m_info = info; m_throwable = throwable; } public void replay(final QueueListener listener) { listener.failed(m_info, m_throwable); } } }