package org.bndtools.api; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.eclipse.core.internal.runtime.InternalPlatform; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.osgi.framework.Bundle; import org.osgi.framework.FrameworkUtil; public class Logger implements ILogger { private static final Logger NULL_BUNDLE_LOGGER = new Logger(null); private static final Map<Bundle,Logger> CACHE = new HashMap<Bundle,Logger>(); public synchronized static ILogger getLogger(Class< ? > clazz) { Bundle bundle = FrameworkUtil.getBundle(clazz); if (bundle == null) return NULL_BUNDLE_LOGGER; Logger result = CACHE.get(bundle); if (result != null) return result; result = new Logger(bundle); CACHE.put(bundle, result); return result; } private final Bundle bundle; private Logger(Bundle bundle) { this.bundle = bundle; } private String getStackTrace(Throwable t) { if (t == null) { return "No exception trace is available"; } final Writer sw = new StringWriter(); final PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); return sw.toString(); } private String constructSysErrString(IStatus status) { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss.SSS"); String formattedDate = formatter.format(new Date()); return String.format("%s - %s - %s - %s%n%s", formattedDate, status.getSeverity(), status.getPlugin(), status.getMessage(), getStackTrace(status.getException())); } private Status constructStatus(int status, String message, Throwable exception) { return new Status(status, bundle.getSymbolicName(), 0, message, exception); } private void log(int status, String message, Throwable exception) { logStatus(constructStatus(status, message, exception)); } public void logError(String message, Throwable exception) { log(IStatus.ERROR, message, exception); } public void logWarning(String message, Throwable exception) { log(IStatus.WARNING, message, exception); } public void logInfo(String message, Throwable exception) { log(IStatus.INFO, message, exception); } public void logStatus(IStatus status) { if (bundle != null) InternalPlatform.getDefault().getLog(bundle).log(status); else System.err.println(constructSysErrString(status)); } }