/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.http.service.internal.event; import com.liferay.portal.http.service.internal.servlet.BundleServletContext; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.StringPool; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Map; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.event.Event; import org.osgi.service.event.EventAdmin; import org.osgi.service.event.EventConstants; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; /** * @author Raymond Augé * @author Miguel Pastor */ public class EventUtil implements ServiceTrackerCustomizer<EventAdmin, EventAdmin> { public static final String DEPLOYED = "org/osgi/service/web/DEPLOYED"; public static final String DEPLOYING = "org/osgi/service/web/DEPLOYING"; public static final String FAILED = "org/osgi/service/web/FAILED"; public static final String UNDEPLOYED = "org/osgi/service/web/UNDEPLOYED"; public static final String UNDEPLOYING = "org/osgi/service/web/UNDEPLOYING"; public static void close() { _instance._close(); _instance = null; } public static void sendEvent( Bundle bundle, String eventTopic, Exception exception, boolean collision) { _instance._sendEvent(bundle, eventTopic, exception, collision); } public static void start(BundleContext bundleContext) { if (_instance != null) { return; } _instance = new EventUtil(); _instance._start(bundleContext); } public void _close() { _eventAdminServiceTracker.close(); _bundleContext = null; _eventAdminServiceTracker = null; _webExtenderBundle = null; } public EventAdmin addingService( ServiceReference<EventAdmin> serviceReference) { _eventAdmin = _bundleContext.getService(serviceReference); return _eventAdmin; } public void modifiedService( ServiceReference<EventAdmin> serviceReference, EventAdmin eventAdmin) { } public void removedService( ServiceReference<EventAdmin> serviceReference, EventAdmin eventAdmin) { _eventAdmin = null; } private EventUtil() { } private void _sendEvent( Bundle bundle, String eventTopic, Exception exception, boolean collision) { Map<String, Object> properties = new Hashtable<String, Object>(); properties.put("bundle", bundle); properties.put("bundle.id", bundle.getBundleId()); properties.put("bundle.symbolicName", bundle.getSymbolicName()); properties.put("bundle.version", bundle.getVersion()); String servletContextName = BundleServletContext.getServletContextName( bundle, true); String contextPath = StringPool.SLASH.concat(servletContextName); if (collision) { properties.put("collision", contextPath); List<String> collidedBundleIds = new ArrayList<String>(); BundleContext bundleContext = bundle.getBundleContext(); for (Bundle curBundle : bundleContext.getBundles()) { if (curBundle.equals(bundle) || (curBundle.getState() != Bundle.ACTIVE)) { continue; } String curServletContextName = BundleServletContext.getServletContextName(curBundle); if ((curServletContextName != null) && curServletContextName.equals(servletContextName)) { collidedBundleIds.add( String.valueOf(curBundle.getBundleId())); } } properties.put("collision.bundles", collidedBundleIds); } properties.put("context.path", contextPath); if (exception != null) { properties.put("exception", exception); } properties.put("extender.bundle", _webExtenderBundle); properties.put("extender.bundle.id", _webExtenderBundle.getBundleId()); properties.put( "extender.bundle.symbolicName", _webExtenderBundle.getSymbolicName()); properties.put( "extender.bundle.version", _webExtenderBundle.getVersion()); properties.put("servlet.context.name", servletContextName); properties.put("timestamp", System.currentTimeMillis()); Event event = new Event(eventTopic, properties); if (_log.isInfoEnabled()) { _log.info(event); } if (_eventAdmin == null) { return; } _eventAdmin.sendEvent(event); } private void _start(BundleContext bundleContext) { _bundleContext = bundleContext; _webExtenderBundle = _bundleContext.getBundle(); Map<String, Object> properties = new Hashtable<String, Object>(); properties.put(EventConstants.EVENT_TOPIC, _EVENT_TOPICS); _eventAdminServiceTracker = new ServiceTracker<EventAdmin, EventAdmin>( _bundleContext, EventAdmin.class.getName(), this); _eventAdminServiceTracker.open(); } private static final String[] _EVENT_TOPICS = new String[] { DEPLOYED, DEPLOYING, FAILED, UNDEPLOYED, UNDEPLOYING }; private static Log _log = LogFactoryUtil.getLog(EventUtil.class); private static EventUtil _instance; private BundleContext _bundleContext; private EventAdmin _eventAdmin; private ServiceTracker<EventAdmin, EventAdmin> _eventAdminServiceTracker; private Bundle _webExtenderBundle; }