1 /*
2 * This file is part of AceLogger.
3 *
4 * AceLogger is free software: you can redistribute it and/or modify it under the terms of the GNU
5 * Lesser General Public License as published by the Free Software Foundation, either version 3 of
6 * the License, or (at your option) any later version.
7 *
8 * AceLogger is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
9 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public License along with AceLogger.
13 * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
14 */
15 package net.sourceforge.acelogger.appender;
16
17 import java.util.ArrayList;
18 import java.util.Collection;
19 import java.util.Collections;
20 import java.util.List;
21
22 import net.sourceforge.acelogger.LogEvent;
23
24 /**
25 * An implementation of Appender used as a Multiplexer. This class should be used to append a log
26 * call to various appenders.
27 *
28 * @author Zardi (https://sourceforge.net/users/daniel_zardi)
29 * @version 1.0.0
30 * @since 1.0.0
31 */
32 public class MultipleAppender extends BaseAppender {
33
34 /**
35 * The list of appenders where log calls will be multiplexed to.
36 */
37 private List<Appender> appenders;
38
39 /**
40 * Constructs a new MultipleAppender with the supplied identifier that will multiplex its calls
41 * to nowhere.
42 *
43 * @param identifier
44 * A string that identifies this appender.
45 * @since 1.0.0
46 */
47 public MultipleAppender(String identifier) {
48 this(identifier, Collections.<Appender>emptyList());
49 }
50
51 /**
52 * Constructs a new MultipleAppender with the supplied identifier that will multiplex its calls
53 * to each appender in the supplied collection.
54 *
55 * @param identifier
56 * A string that identifies this appender.
57 * @param appenders
58 * The appenders where log calls will be multiplexed to.
59 * @since 1.0.0
60 */
61 public MultipleAppender(String identifier, Collection<Appender> appenders) {
62 super(identifier);
63 setAppenders(appenders);
64 }
65
66 /**
67 * Gets the appenders registered in this multiple appender.
68 *
69 * @return An unmodifiable list containing the appenders currently registered.
70 * @since 1.0.0
71 */
72 public final List<Appender> getAppenders() {
73 return Collections.unmodifiableList(appenders);
74 }
75
76 /**
77 * Sets the appenders registered in this multiple appender.
78 *
79 * @param appenders
80 * A collection of appenders that will be registered in this multiple appender.
81 * @since 1.0.0
82 */
83 public final void setAppenders(Collection<Appender> appenders) {
84 this.appenders = new ArrayList<Appender>(appenders);
85 }
86
87 /**
88 * Adds an appender to this multiplexer.
89 *
90 * @param appender
91 * The appender that should be added to the multiplexer.
92 * @return True if the appender was added successfully; false otherwise.
93 * @since 1.0.0
94 */
95 public final boolean addAppender(Appender appender) {
96 return appenders.add(appender);
97 }
98
99 /**
100 * Adds each appender in a collection to this multiplexer.
101 *
102 * @param appenders
103 * The appender collection that should be added to the multiplexer.
104 * @return True if the appender list was modified; false otherwise.
105 * @since 1.0.0
106 */
107 public final boolean addAllAppenders(Collection<Appender> appenders) {
108 return this.appenders.addAll(appenders);
109 }
110
111 /**
112 * Removes an appender from this multiplexer.
113 *
114 * @param appender
115 * The appender that should be removed from this multiplexer.
116 * @return True if the element was removed; false otherwise.
117 * @since 1.0.0
118 */
119 public final boolean removeAppender(Appender appender) {
120 return appenders.remove(appender);
121 }
122
123 /** {@inheritDoc} */
124 protected Runnable appendLogProcess(final LogEvent call) {
125 Runnable process = new Runnable() {
126 /**
127 * Appends the log event in every appender registered.
128 */
129 public void run() {
130 for (Appender currentAppender : appenders) {
131 currentAppender.appendLog(call);
132 }
133 }
134 };
135 return process;
136 }
137
138 }