1 package org
.argeo
.cms
.internal
.osgi
;
3 import java
.security
.SignatureException
;
4 import java
.util
.Enumeration
;
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
;
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";
22 private LogReaderService logReaderService
;
25 if (logReaderService
!= null) {
26 Enumeration
<LogEntry
> logEntries
= logReaderService
.getLog();
27 while (logEntries
.hasMoreElements())
28 logged(logEntries
.nextElement());
29 logReaderService
.addLogListener(this);
33 public void stop() throws Exception
{
34 logReaderService
.removeLogListener(this);
37 public String
toString() {
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()) {
53 if (status
.getException() instanceof SignatureException
)
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
));
62 pluginLog
.warn(msg(status
), status
.getException());
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());
72 private String
msg(LogEntry status
) {
73 StringBuilder sb
= new StringBuilder();
74 sb
.append(status
.getMessage());
75 Bundle bundle
= status
.getBundle();
77 sb
.append(" '" + bundle
.getSymbolicName() + "'");
79 ServiceReference
<?
> sr
= status
.getServiceReference();
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
);
89 sb
.append(arrayToString(objectClasses
));
91 Object cn
= sr
.getProperty(CmsConstants
.CN
);
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);
98 // Object servicePid = sr.getProperty(Constants.SERVICE_PID);
99 // if (servicePid != null)
100 // sb.append(" " + Constants.SERVICE_PID + ": " + servicePid);
103 Object whiteBoardPattern
= sr
.getProperty(WHITEBOARD_PATTERN_PROP
);
104 if (whiteBoardPattern
!= null) {
105 if (whiteBoardPattern
instanceof String
) {
106 sb
.append(" " + WHITEBOARD_PATTERN_PROP
+ ": " + whiteBoardPattern
);
108 sb
.append(" " + WHITEBOARD_PATTERN_PROP
+ ": " + arrayToString((String
[]) whiteBoardPattern
));
112 Object contextName
= sr
.getProperty(CONTEXT_NAME_PROP
);
113 if (contextName
!= null)
114 sb
.append(" " + CONTEXT_NAME_PROP
+ ": " + contextName
);
117 Object baseDn
= sr
.getProperty(DirectoryConf
.baseDn
.name());
119 sb
.append(" " + DirectoryConf
.baseDn
.name() + ": " + baseDn
);
122 return sb
.toString();
125 private String
arrayToString(Object
[] arr
) {
126 StringBuilder sb
= new StringBuilder();
128 for (int i
= 0; i
< arr
.length
; i
++) {
134 return sb
.toString();
137 private boolean isSpringApplicationContext(String
[] objectClasses
) {
138 for (String clss
: objectClasses
) {
139 if (clss
.equals("org.eclipse.gemini.blueprint.context.DelegatedExecutionOsgiBundleApplicationContext")) {
146 public void setLogReaderService(LogReaderService logReaderService
) {
147 this.logReaderService
= logReaderService
;