View Javadoc

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   * All logging apis are fine ... but we don't want to have 
18   * loggers for classes but for instances - therefore we've created
19   * our wrapper allowing you to do two things quickly:
20   * <ol>
21   * <li>log things</li>
22   * <li>create new logger categories</li>
23   * </ol>
24   * 1) that's obvious - it should be easy
25   * <p>
26   * 2) this may prove crucial for your debugging to have own logger
27   * for planner and another for emotions of your agents, etc.
28   * <p><p>
29   * Simply - every Agent instance (starting with the first abstract class
30   * AbstractAgent) has instance of this class (which is java.logging.Logger(s) wrapper).
31   * <p>
32   * Every agent's component has own {@link LogCategory} and you may obtain your own via getCategory() method.
33   * <p><p>
34   * {@link LogCategory} serves as a gateway for your log messages, it contains methods as you
35   * know them from java.logging API (things like fine(), info(), severe(), log(Level, msg), etc.).
36   * <p><p>
37   * Plus it allows you to obtain new {@link LogHandler} instances for that category (if you need to 
38   * publish log messages from that category somewhere else).
39   * <p>
40   * Every {@link LogHandler} serves for filtering messages for one category and publishing them
41   * into one end (console, file, memory, whatever...).
42   * <p><p>
43   * Additionally every {@link LogCategory} has {@link AgentLogger} as its parent.
44   * 
45   * @author Jimmy
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 					// it is not a default handler
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 }