/* * #%L * STS :: Config * %% * Copyright (C) 2011 - 2012 Talend Inc. * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ package org.talend.esb.sts.config; import java.util.Collection; import java.util.Dictionary; import java.util.Hashtable; import org.apache.cxf.Bus; import org.apache.cxf.feature.Feature; import org.apache.cxf.feature.LoggingFeature; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.interceptor.Interceptor; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceRegistration; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedService; public class StsConfigurator implements ManagedService { private static final String SERVICE_PID = "org.talend.esb.sts.server"; private static final String LOGGING_PROPERTY = "useMessageLogging"; private Bus bus; private BundleContext bundleContext; private ServiceRegistration stsConfiguratorServiceRegistration; StsConfigurator(Bus bus) { this.bus = bus; bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); stsConfiguratorServiceRegistration = registerManagedService(bundleContext, ManagedService.class, this, SERVICE_PID); //System.out.println("\nCXF bus = " + bus.getId()); //System.out.println("\nBundle Context = " + bundleContext); } public void shutDown() { if (stsConfiguratorServiceRegistration != null) { stsConfiguratorServiceRegistration.unregister(); } } @Override public void updated(Dictionary props) throws ConfigurationException { if (props != null) { Dictionary<String, String> properties = CastUtils.cast(props); String useMessageLogging = properties .get(LOGGING_PROPERTY); //System.out.println("\nUse Logging = " + useMessageLogging); setMessageLogging(useMessageLogging != null && useMessageLogging.equalsIgnoreCase("true")); } else setMessageLogging(false); } private ServiceRegistration registerManagedService( BundleContext context, Class<?> serviceClass, Object service, String servicePid) { Dictionary<String, Object> properties = new Hashtable<String, Object>(); properties.put(Constants.SERVICE_PID, servicePid); return context.registerService(serviceClass.getName(), service, properties); } private void setMessageLogging(boolean logMessages) { setMessageLogging(logMessages, bus); } private void setMessageLogging(boolean logMessages, Bus bus) { if (logMessages) { if (!hasLoggingFeature(bus)) addMessageLogging(bus); } else { if (hasLoggingFeature(bus)) removeMessageLogging(bus); } } private boolean hasLoggingFeature(Bus bus) { Collection<Feature> features = bus.getFeatures(); for (Feature feature: features) { if (feature instanceof LoggingFeature) return true; } return false; } private void addMessageLogging(Bus bus) { LoggingFeature logFeature = new LoggingFeature(); logFeature.initialize(bus); bus.getFeatures().add(logFeature); } private void removeMessageLogging(Bus bus) { Collection<Feature> features = bus.getFeatures(); Feature logFeature = null; Interceptor inLogInterceptor = null; Interceptor outLogInterceptor = null; for (Feature feature: features) { if (feature instanceof LoggingFeature) { logFeature = feature; break; } } if (logFeature != null) { features.remove(logFeature); } for (Interceptor interceptor: bus.getInInterceptors()) { if (interceptor instanceof LoggingInInterceptor) { inLogInterceptor = interceptor; break; } } for (Interceptor interceptor: bus.getOutInterceptors()) { if (interceptor instanceof LoggingOutInterceptor) { outLogInterceptor = interceptor; break; } } if (inLogInterceptor != null) { bus.getInInterceptors().remove(inLogInterceptor); //System.out.println("\nRemove in Interceptor = " + inLogInterceptor.getClass().getName()); } if (outLogInterceptor != null) { bus.getOutInterceptors().remove(outLogInterceptor); //System.out.println("\nRemove out Interceptor = " + inLogInterceptor.getClass().getName()); } } }