EMMA Coverage Report (generated Wed Feb 26 21:48:09 GMT 2014)
[all classes][uk.org.simonsite.log4j.appender.concurrent]

COVERAGE SUMMARY FOR SOURCE FILE [AppenderAttachments.java]

nameclass, %method, %block, %line, %
AppenderAttachments.java100% (2/2)100% (12/12)100% (241/242)98%  (60/61)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class AppenderAttachments100% (1/1)100% (9/9)100% (223/224)98%  (58/59)
removeAppender (String): void 100% (1/1)96%  (26/27)89%  (8/9)
AppenderAttachments (): void 100% (1/1)100% (8/8)100% (3/3)
addAppender (Appender): void 100% (1/1)100% (59/59)100% (12/12)
execute (AppenderCommand, LoggingEvent): void 100% (1/1)100% (34/34)100% (7/7)
getAllAppenders (): Enumeration 100% (1/1)100% (10/10)100% (2/2)
getAppender (String): Appender 100% (1/1)100% (25/25)100% (7/7)
isAttached (Appender): boolean 100% (1/1)100% (35/35)100% (10/10)
removeAllAppenders (): void 100% (1/1)100% (18/18)100% (5/5)
removeAppender (Appender): void 100% (1/1)100% (8/8)100% (4/4)
     
class AppenderAttachments$1100% (1/1)100% (3/3)100% (18/18)100% (3/3)
AppenderAttachments$1 (AppenderAttachments, Iterator): void 100% (1/1)100% (9/9)100% (1/1)
hasMoreElements (): boolean 100% (1/1)100% (4/4)100% (1/1)
nextElement (): Appender 100% (1/1)100% (5/5)100% (1/1)

1/*
2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
5 * 
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * 
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14package uk.org.simonsite.log4j.appender.concurrent;
15 
16import java.util.Enumeration;
17import java.util.Iterator;
18import java.util.concurrent.CopyOnWriteArrayList;
19 
20import org.apache.log4j.Appender;
21import org.apache.log4j.helpers.LogLog;
22import org.apache.log4j.spi.LoggingEvent;
23 
24import uk.org.simonsite.log4j.appender.AppenderCommand;
25import uk.org.simonsite.log4j.appender.ExecutingAppenderAttachable;
26 
27/**
28 * @author <a href="mailto:simon_park_mail AT yahoo DOT co DOT uk">Simon
29 *         Park</a>
30 * @version 1.6
31 */
32public final class AppenderAttachments implements ExecutingAppenderAttachable {
33 
34  private final CopyOnWriteArrayList<Appender> attachments;
35 
36  public AppenderAttachments() {
37    super();
38    this.attachments = new CopyOnWriteArrayList<Appender>();
39  }
40 
41  public final void addAppender(final Appender newAppender) {
42    if (newAppender == null) {
43      return;
44    }
45    if ((newAppender.getName() == null) || "".equals(newAppender.getName())) {
46      LogLog.warn("Unnamed Appender cannot be attached: "
47          + newAppender.getClass());
48      return;
49    }
50    for (Appender appender : this.attachments) {
51      if (appender.getName().equals(newAppender.getName())) {
52        LogLog.warn("Appender named '" + newAppender.getName()
53            + "' already attached");
54        return;
55      }
56    }
57    this.attachments.add(newAppender);
58  }
59 
60  public final Enumeration<Appender> getAllAppenders() {
61    final Iterator<Appender> iter = this.attachments.iterator();
62    return new Enumeration<Appender>() {
63 
64      public final boolean hasMoreElements() {
65        return iter.hasNext();
66      }
67 
68      public final Appender nextElement() {
69        return iter.next();
70      }
71    };
72  }
73 
74  public final Appender getAppender(final String name) {
75    if (name == null) {
76      return null;
77    }
78    for (Appender appender : this.attachments) {
79      if (appender.getName().equals(name)) {
80        return appender;
81      }
82    }
83    return null;
84  }
85 
86  public final boolean isAttached(final Appender appender) {
87    if (appender == null) {
88      return false;
89    }
90    if (appender.getName() == null) {
91      return false;
92    }
93    for (Appender attachedAppender : this.attachments) {
94      if (attachedAppender.getName().equals(appender.getName())) {
95        if (attachedAppender.equals(appender)) {
96          return true;
97        }
98      }
99    }
100    return false;
101  }
102 
103  public final void removeAllAppenders() {
104    for (Appender appender : this.attachments) {
105      appender.close();
106    }
107    this.attachments.clear();
108  }
109 
110  public final void removeAppender(final Appender appender) {
111    if (appender == null) {
112      return;
113    }
114    this.removeAppender(appender.getName());
115  }
116 
117  public final void removeAppender(final String name) {
118    if (name == null) {
119      return;
120    }
121    for (Iterator<Appender> iter = this.attachments.iterator(); iter.hasNext();) {
122      final Appender appender = iter.next();
123      if (appender.getName().equals(name)) {
124        this.attachments.remove(appender);
125        break;
126      }
127    }
128    // don't close removed appender in this case
129  }
130 
131  public final void execute(final AppenderCommand appenderCommand,
132      final LoggingEvent event) {
133    for (final Appender appender : this.attachments) {
134      appenderCommand.execute(appender, event);
135      if (appenderCommand.hasErrors()) {
136        LogLog.warn(appenderCommand + " errored for appender "
137            + appender.getName());
138        appenderCommand.resetErrors();
139      }
140    }
141  }
142 
143}

[all classes][uk.org.simonsite.log4j.appender.concurrent]
EMMA 2.0.5312 (C) Vladimir Roubtsov