]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/osgi/CmsOsgiLogger.java
Merge tag 'v2.3.28' into testing
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / osgi / CmsOsgiLogger.java
1 package org.argeo.cms.internal.osgi;
2
3 import java.security.SignatureException;
4 import java.util.Enumeration;
5
6 import org.argeo.api.cms.CmsConstants;
7 import org.argeo.api.cms.CmsLog;
8 import org.argeo.cms.runtime.DirectoryConf;
9 import org.osgi.framework.Bundle;
10 import org.osgi.framework.Constants;
11 import org.osgi.framework.ServiceReference;
12 import org.osgi.service.log.LogEntry;
13 import org.osgi.service.log.LogLevel;
14 import org.osgi.service.log.LogListener;
15 import org.osgi.service.log.LogReaderService;
16
17 /** Logs OSGi events. */
18 public class CmsOsgiLogger implements LogListener {
19 private final static String WHITEBOARD_PATTERN_PROP = "osgi.http.whiteboard.servlet.pattern";
20 private final static String CONTEXT_NAME_PROP = "contextName";
21
22 private LogReaderService logReaderService;
23
24 public void start() {
25 if (logReaderService != null) {
26 Enumeration<LogEntry> logEntries = logReaderService.getLog();
27 while (logEntries.hasMoreElements())
28 logged(logEntries.nextElement());
29 logReaderService.addLogListener(this);
30 }
31 }
32
33 public void stop() throws Exception {
34 logReaderService.removeLogListener(this);
35 }
36
37 public String toString() {
38 return "Node Logger";
39 }
40
41 //
42 // OSGi LOGGER
43 //
44 @Override
45 public void logged(LogEntry status) {
46 String loggerName = status.getBundle().getSymbolicName();
47 if (loggerName == null)
48 loggerName = "org.argeo.ext.osgi";
49 CmsLog pluginLog = CmsLog.getLog(loggerName);
50 LogLevel severity = status.getLogLevel();
51 if (severity.equals(LogLevel.ERROR) && pluginLog.isErrorEnabled()) {
52 // FIXME Fix Argeo TP
53 if (status.getException() instanceof SignatureException)
54 return;
55 pluginLog.error(msg(status), status.getException());
56 } else if (severity.equals(LogLevel.WARN) && pluginLog.isWarnEnabled()) {
57 if ("org.apache.felix.scr".equals(status.getBundle().getSymbolicName())
58 && (status.getException() != null && status.getException() instanceof InterruptedException)) {
59 // do not print stacktraces by Felix SCR shutdown
60 pluginLog.warn(msg(status));
61 } else {
62 pluginLog.warn(msg(status), status.getException());
63 }
64 } else if (severity.equals(LogLevel.INFO) && pluginLog.isDebugEnabled())
65 pluginLog.debug(msg(status), status.getException());
66 else if (severity.equals(LogLevel.DEBUG) && pluginLog.isTraceEnabled())
67 pluginLog.trace(msg(status), status.getException());
68 else if (severity.equals(LogLevel.TRACE) && pluginLog.isTraceEnabled())
69 pluginLog.trace(msg(status), status.getException());
70 }
71
72 private String msg(LogEntry status) {
73 StringBuilder sb = new StringBuilder();
74 sb.append(status.getMessage());
75 Bundle bundle = status.getBundle();
76 if (bundle != null) {
77 sb.append(" '" + bundle.getSymbolicName() + "'");
78 }
79 ServiceReference<?> sr = status.getServiceReference();
80 if (sr != null) {
81 sb.append(' ');
82 String[] objectClasses = (String[]) sr.getProperty(Constants.OBJECTCLASS);
83 if (isSpringApplicationContext(objectClasses)) {
84 sb.append("{org.springframework.context.ApplicationContext}");
85 Object symbolicName = sr.getProperty(Constants.BUNDLE_SYMBOLICNAME);
86 if (symbolicName != null)
87 sb.append(" " + Constants.BUNDLE_SYMBOLICNAME + ": " + symbolicName);
88 } else {
89 sb.append(arrayToString(objectClasses));
90 }
91 Object cn = sr.getProperty(CmsConstants.CN);
92 if (cn != null)
93 sb.append(" " + CmsConstants.CN + ": " + cn);
94 // Object factoryPid = sr.getProperty(ConfigurationAdmin.SERVICE_FACTORYPID);
95 // if (factoryPid != null)
96 // sb.append(" " + ConfigurationAdmin.SERVICE_FACTORYPID + ": " + factoryPid);
97 // else {
98 // Object servicePid = sr.getProperty(Constants.SERVICE_PID);
99 // if (servicePid != null)
100 // sb.append(" " + Constants.SERVICE_PID + ": " + servicePid);
101 // }
102 // servlets
103 Object whiteBoardPattern = sr.getProperty(WHITEBOARD_PATTERN_PROP);
104 if (whiteBoardPattern != null) {
105 if (whiteBoardPattern instanceof String) {
106 sb.append(" " + WHITEBOARD_PATTERN_PROP + ": " + whiteBoardPattern);
107 } else {
108 sb.append(" " + WHITEBOARD_PATTERN_PROP + ": " + arrayToString((String[]) whiteBoardPattern));
109 }
110 }
111 // RWT
112 Object contextName = sr.getProperty(CONTEXT_NAME_PROP);
113 if (contextName != null)
114 sb.append(" " + CONTEXT_NAME_PROP + ": " + contextName);
115
116 // user directories
117 Object baseDn = sr.getProperty(DirectoryConf.baseDn.name());
118 if (baseDn != null)
119 sb.append(" " + DirectoryConf.baseDn.name() + ": " + baseDn);
120
121 }
122 return sb.toString();
123 }
124
125 private String arrayToString(Object[] arr) {
126 StringBuilder sb = new StringBuilder();
127 sb.append('[');
128 for (int i = 0; i < arr.length; i++) {
129 if (i != 0)
130 sb.append(',');
131 sb.append(arr[i]);
132 }
133 sb.append(']');
134 return sb.toString();
135 }
136
137 private boolean isSpringApplicationContext(String[] objectClasses) {
138 for (String clss : objectClasses) {
139 if (clss.equals("org.eclipse.gemini.blueprint.context.DelegatedExecutionOsgiBundleApplicationContext")) {
140 return true;
141 }
142 }
143 return false;
144 }
145
146 public void setLogReaderService(LogReaderService logReaderService) {
147 this.logReaderService = logReaderService;
148 }
149
150 }