EMMA Coverage Report (generated Tue Apr 17 08:51:20 BST 2007)
[all classes][org.jtoolkit.essence.concurrency.impl]

COVERAGE SUMMARY FOR SOURCE FILE [CallbackSetImpl.java]

nameclass, %method, %block, %line, %
CallbackSetImpl.java100% (2/2)75%  (9/12)61%  (142/234)64%  (30.5/48)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CallbackSetImpl100% (1/1)73%  (8/11)58%  (125/215)64%  (30.6/48)
getCallbackArray (): Callback [] 0%   (0/1)0%   (0/3)0%   (0/1)
getThreadName (): String 0%   (0/1)0%   (0/3)0%   (0/1)
onException (Throwable): void 0%   (0/1)0%   (0/46)0%   (0/10)
dropCallback (Callback, Exception): void 100% (1/1)41%  (9/22)73%  (2.2/3)
addCallback (Callback): void 100% (1/1)66%  (25/38)71%  (6.4/9)
removeCallback (Callback): void 100% (1/1)67%  (14/21)67%  (3.4/5)
onCallback (Object): void 100% (1/1)88%  (37/42)96%  (8.7/9)
<static initializer> 100% (1/1)100% (7/7)100% (2/2)
CallbackSetImpl (CallbackSet$CallbackMode): void 100% (1/1)100% (14/14)100% (5/5)
isEmpty (): boolean 100% (1/1)100% (8/8)100% (1/1)
resetCallbackArray (): void 100% (1/1)100% (11/11)100% (2/2)
     
class CallbackSetImpl$1100% (1/1)100% (1/1)89%  (17/19)89%  (0.9/1)
<static initializer> 100% (1/1)89%  (17/19)89%  (0.9/1)

1package org.jtoolkit.essence.concurrency.impl;
2 
3import org.apache.commons.logging.Log;
4import org.apache.commons.logging.LogFactory;
5import org.jetbrains.annotations.NotNull;
6import org.jtoolkit.essence.concurrency.Callback;
7import org.jtoolkit.essence.concurrency.CallbackEx;
8import org.jtoolkit.essence.concurrency.CallbackSet;
9import org.jtoolkit.essence.concurrency.CallbackUtils;
10 
11import java.util.LinkedHashSet;
12import java.util.Set;
13 
14/*
15   Copyright 2006 Peter Lawrey
16 
17   Licensed under the Apache License, Version 2.0 (the "License");
18   you may not use this file except in compliance with the License.
19   You may obtain a copy of the License at
20 
21       http://www.apache.org/licenses/LICENSE-2.0
22 
23   Unless required by applicable law or agreed to in writing, software
24   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
25   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
26   See the License for the specific language governing permissions and
27   limitations under the License.
28*/
29 
30/**
31 * @author Peter Lawrey
32 */
33@Callback.Immediate
34public class CallbackSetImpl<T> implements CallbackSet<T> {
35    private static final Log LOG = LogFactory.getLog(CallbackSetImpl.class);
36    private static final Callback[] NO_CALLBACK = new Callback[0];
37    protected final Set<Callback<T>> callbacks = new LinkedHashSet<Callback<T>>();
38    @SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized", "unchecked"})
39    private Callback<T>[] callbackArray = NO_CALLBACK;
40    protected final CallbackMode callbackMode;
41 
42    public CallbackSetImpl(@NotNull CallbackMode callbackMode) {
43        this.callbackMode = callbackMode;
44    }
45 
46    protected Callback<T>[] getCallbackArray() {
47        return callbackArray;
48    }
49 
50    public void onCallback(@NotNull T value) {
51        Callback<T>[] callbackArray;
52        synchronized (callbacks) {
53            callbackArray = this.callbackArray;
54        }
55        for (Callback<T> callback : callbackArray)
56            try {
57                callback.onCallback(value);
58            } catch (Exception e) {
59                dropCallback(callback, e);
60            }
61    }
62 
63    protected void dropCallback(Callback<T> callback, Exception e) {
64        if (LOG.isDebugEnabled()) LOG.debug(getThreadName() + ": Dropping callback " + callback, e);
65        callbacks.remove(callback);
66    }
67 
68    private static String getThreadName() {
69        return Thread.currentThread().getName();
70    }
71 
72    public void onException(@NotNull Throwable t) throws IllegalStateException {
73        Callback<T>[] callbackArray;
74        synchronized (callbacks) {
75            callbackArray = this.callbackArray;
76        }
77        for (Callback<T> callback : callbackArray)
78            if (callback instanceof CallbackEx)
79                try {
80                    ((CallbackEx) callback).onException(t);
81                } catch (Exception e) {
82                    dropCallback(callback, e);
83                }
84    }
85 
86    public void addCallback(@NotNull Callback<T> callback) {
87            synchronized (callbacks) {
88                switch (callbackMode) {
89                    case SIMPLE:
90                        if (callbacks.add(callback))
91                            resetCallbackArray();
92                        break;
93                    case THREADED:
94                        CallbackEx<T> callback2 = CallbackUtils.makeThreaded(callback);
95                        if (callbacks.add(callback2))
96                            resetCallbackArray();
97                        break;
98                }
99            }
100    }
101 
102    public void removeCallback(@NotNull Callback<T> callback) {
103        synchronized (callbacks) {
104            if (callbacks.remove(callback))
105                resetCallbackArray();
106        }
107    }
108 
109    private void resetCallbackArray() {
110        callbackArray = callbacks.toArray(new Callback[callbacks.size()]);
111    }
112 
113    public boolean isEmpty() {
114        return callbackArray.length == 0;
115    }
116}

[all classes][org.jtoolkit.essence.concurrency.impl]
EMMA 2.0.5312 (C) Vladimir Roubtsov