1 package cz.cuni.amis.pogamut.base.utils.logging;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.logging.Handler;
8 import java.util.logging.Level;
9
10 import com.google.inject.Inject;
11
12 import cz.cuni.amis.pogamut.base.agent.IAgentId;
13 import cz.cuni.amis.pogamut.base.component.IComponent;
14 import cz.cuni.amis.pogamut.base.utils.guice.AgentScoped;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 @AgentScoped
48 public abstract class AbstractAgentLogger implements IAgentLogger {
49
50 public static final String LOG_CATEGORY_NAME = "AgentLogger";
51
52 protected IAgentId agentId;
53
54 private List<Handler> defaultHandlers = new ArrayList<Handler>(4);
55
56 private Level globalLevel = Level.INFO;
57
58 private Handler consoleHandler = null;
59
60 private Handler networkHandler = null;
61
62 @Inject
63 public AbstractAgentLogger(IAgentId agentName) {
64 this.agentId = agentName;
65 }
66
67 @Override
68 public IAgentId getAgentId() {
69 return agentId;
70 }
71
72 @Override
73 public Integer getNetworkLoggerPort() {
74 return NetworkLogManager.getNetworkLogManager().getLoggerPort();
75 }
76
77 @Override
78 public String getNetworkLoggerHost() {
79 return NetworkLogManager.getNetworkLogManager().getLoggerHost();
80 }
81
82 @Override
83 public Map<String, LogCategory> getCategories() {
84 return getLogCategories().getCategories();
85 }
86
87 protected abstract ILogCategories getLogCategories();
88
89 @Override
90 public LogCategory getCategory(String name) {
91 if (getLogCategories().hasCategory(name)) return getLogCategories().getCategory(name);
92 LogCategory category = getLogCategories().getCategory(name);
93 synchronized(defaultHandlers) {
94 for (Handler handler : defaultHandlers) {
95 category.addHandler(handler);
96 }
97 }
98 category.setLevel(globalLevel);
99 return category;
100 }
101
102 @Override
103 public LogCategory getCategory(IComponent component) {
104 return getCategory(component.getComponentId().getToken());
105 }
106
107 @Override
108 public void setLevel(Level newLevel) {
109 globalLevel = newLevel;
110 getLogCategories().setLevel(newLevel);
111 }
112
113 @Override
114 public synchronized void addDefaultConsoleHandler() {
115 if (consoleHandler != null) return;
116 consoleHandler = addDefaultPublisher(new LogPublisher.ConsolePublisher(getAgentId()));
117 }
118
119 @Override
120 public Handler getDefaultConsoleHandler() {
121 return consoleHandler;
122 }
123
124 @Override
125 public synchronized void removeDefaultConsoleHandler() {
126 if (consoleHandler == null) return;
127 removeDefaultHandler(consoleHandler);
128 consoleHandler.flush();
129 consoleHandler = null;
130 }
131
132 @Override
133 public boolean isDefaultConsoleHandler() {
134 return consoleHandler != null;
135 }
136
137 @Override
138 public synchronized void addDefaultNetworkHandler() {
139 if (networkHandler != null) return;
140 networkHandler = addDefaultPublisher(new NetworkLogPublisher(getAgentId()));
141 }
142
143 @Override
144 public Handler getDefaultNetworkHandler() {
145 return networkHandler;
146 }
147
148 public synchronized void removeDefaultNetworkHandler() {
149 if (networkHandler == null) return;
150 removeDefaultHandler(networkHandler);
151 networkHandler.flush();
152 networkHandler = null;
153 NetworkLogManager.getNetworkLogManager().removeAgent(getAgentId());
154 }
155
156 @Override
157 public boolean isDefaultNetworkHandler() {
158 return networkHandler != null;
159 }
160
161 @Override
162 public Handler addDefaultFileHandler(File file) {
163 return addDefaultPublisher(new LogPublisher.FilePublisher(file, new LogFormatter(getAgentId(), true)));
164 }
165
166 @Override
167 public Handler addDefaultPublisher(ILogPublisher publisher) {
168 Handler defaultHandler = new LogHandler(publisher);
169 addDefaultHandler(defaultHandler);
170 return defaultHandler;
171 }
172
173 @Override
174 public void addDefaultHandler(Handler handler) {
175 synchronized(getCategories()) {
176 synchronized(defaultHandlers) {
177 defaultHandlers.add(handler);
178 }
179 addToAllCategories(handler);
180 }
181 }
182
183 @Override
184 public void removeDefaultHandler(Handler handler) {
185 synchronized(getCategories()) {
186 synchronized(defaultHandlers) {
187 if (!defaultHandlers.remove(handler)) {
188
189 return;
190 }
191 }
192 removeFromAllCategories(handler);
193 }
194 }
195
196 @Override
197 public void addToAllCategories(ILogPublisher logPublisher) {
198 synchronized(getCategories()) {
199 for (LogCategory category : getCategories().values()) {
200 category.addHandler(logPublisher);
201 }
202 }
203 }
204
205 @Override
206 public void addToAllCategories(Handler handler) {
207 synchronized(getCategories()) {
208 for (LogCategory category : getCategories().values()) {
209 category.addHandler(handler);
210 }
211 }
212 }
213
214 @Override
215 public void removeFromAllCategories(Handler handler) {
216 synchronized(getCategories()) {
217 for (LogCategory category : getCategories().values()) {
218 category.removeHandler(handler);
219 }
220 }
221 }
222
223 }