/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2014, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.webui.osgi; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTrackerCustomizer; import ru.codeinside.gws.api.ClientLog; import ru.codeinside.gws.api.ClientRequest; import ru.codeinside.gws.api.ClientResponse; import ru.codeinside.gws.api.LogService; import java.io.OutputStream; import java.util.Set; import java.util.logging.Logger; final public class LogCustomizer implements ServiceTrackerCustomizer { static BundleContext BUNDLE; static volatile ServiceReference REF; final Logger logger = Logger.getLogger(getClass().getName()); LogCustomizer(BundleContext bundleContext) { BUNDLE = bundleContext; } @Override public Object addingService(ServiceReference serviceReference) { if (REF == null) { REF = serviceReference; } else { logger.info("new logger: " + serviceReference.getBundle()); REF = serviceReference; } return null; } @Override public void modifiedService(ServiceReference serviceReference, Object o) { // изменения атрибутов нам не выжны } @Override public void removedService(ServiceReference serviceReference, Object o) { if (REF != serviceReference) { logger.info("removed other logger: " + serviceReference.getBundle()); } REF = null; } public static void setShouldWriteServerLog(boolean enabled) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { service.setServerLogEnabled(enabled); } finally { BUNDLE.ungetService(ref); } } } public static void setShouldWriteServerLogErrors(boolean enabled) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { service.setServerLogErrorsEnabled(enabled); } finally { BUNDLE.ungetService(ref); } } } public static void setServerLogStatus(String status) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { service.setServerLogStatus(status); } finally { BUNDLE.ungetService(ref); } } } public static Boolean isServerLogEnabled(String componentName) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { return service.isServerLogEnabled(componentName); } finally { BUNDLE.ungetService(ref); } } return null; } public static Boolean isServerLogEnabled() { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { return service.isServerLogEnabled(); } finally { BUNDLE.ungetService(ref); } } return null; } public static Boolean isServerLogErrorsEnabled() { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { return service.isServerLogErrorsEnabled(); } finally { BUNDLE.ungetService(ref); } } return null; } public static String getServerLogStatus() { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { return service.getServerLogStatus(); } finally { BUNDLE.ungetService(ref); } } return null; } public static void setServerLogEnabled(String componentName, boolean enabled) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { service.setServerLogEnabled(componentName, enabled); } finally { BUNDLE.ungetService(ref); } } } public static void setIgnoreSet(Set<String> set) { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { service.setIgnoreSet(set); } finally { BUNDLE.ungetService(ref); } } } public static String getStoragePath() { ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); try { return service.getPathInfo(); } finally { BUNDLE.ungetService(ref); } } return null; } public static ClientLog createClientLog(long bid, String componentName, String processInstanceId, boolean isLogEnabled, boolean logErrors, String status, Set<String> remote) { final ServiceReference ref = REF; if (ref != null) { LogService service = (LogService) BUNDLE.getService(ref); if (service != null) { ClientLog clientLog = service.createClientLog(bid, componentName, processInstanceId, isLogEnabled, logErrors, status, remote); if (clientLog != null) { return new ClientLogProxy(clientLog, ref); } } BUNDLE.ungetService(ref); } return null; } final static class ClientLogProxy implements ClientLog { final ClientLog log; final ServiceReference ref; public ClientLogProxy(ClientLog log, ServiceReference ref) { this.log = log; this.ref = ref; } @Override public void log(Throwable e) { log.log(e); } @Override public OutputStream getHttpOutStream() { return log.getHttpOutStream(); } @Override public OutputStream getHttpInStream() { return log.getHttpInStream(); } @Override public void logRequest(ClientRequest request) { log.logRequest(request); } @Override public void logResponse(ClientResponse response) { log.logResponse(response); } @Override public void close() { try { log.close(); } finally { BUNDLE.ungetService(ref); } } } }