/* * 2012-3 Red Hat Inc. and/or its affiliates and other contributors. * * 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. */ package org.overlord.rtgov.internal.switchyard; import static javax.ejb.ConcurrencyManagementType.BEAN; import java.lang.management.ManagementFactory; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.ConcurrencyManagement; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.enterprise.context.ApplicationScoped; import javax.management.MBeanServer; import javax.management.ObjectName; import org.overlord.commons.services.ServiceListener; import org.overlord.commons.services.ServiceRegistryUtil; import org.overlord.rtgov.activity.collector.ActivityCollector; /** * This class is responsible for registering the configured set of * event processor implementations against the switchyard Event Manager. * */ @ApplicationScoped @Singleton @Startup @ConcurrencyManagement(BEAN) public class EventProcessorManager { private static final String SWITCHYARD_MANAGEMENT_LOCAL = "org.switchyard.admin:type=Management.Local"; private static final Logger LOG=Logger.getLogger(EventProcessorManager.class.getName()); private ActivityCollector _activityCollector=null; private java.util.List<EventProcessor> _eventProcessors=new java.util.ArrayList<EventProcessor>(); private static final String[] EVENT_PROCESSOR_CLASS_NAMES={ "org.overlord.rtgov.internal.switchyard.bpel.NewProcessInstanceEventProcessor", "org.overlord.rtgov.internal.switchyard.bpel.ProcessCompletionEventProcessor", "org.overlord.rtgov.internal.switchyard.bpel.ProcessTerminationEventProcessor", "org.overlord.rtgov.internal.switchyard.bpel.VariableModificationEventProcessor", "org.overlord.rtgov.internal.switchyard.bpm.ProcessCompletedEventProcessor", "org.overlord.rtgov.internal.switchyard.bpm.ProcessStartedEventProcessor", "org.overlord.rtgov.internal.switchyard.bpm.ProcessVariableChangedEventProcessor", "org.overlord.rtgov.internal.switchyard.exchange.ExchangeCompletionEventProcessor", "org.overlord.rtgov.internal.switchyard.exchange.ExchangeInitiatedEventProcessor" }; /** * This method sets the activity collector. * * @param ac The activity collector */ public void setActivityCollector(ActivityCollector ac) { _activityCollector = ac; } /** * This method returns the activity collector. * * @return The activity collector */ public ActivityCollector getActivityCollector() { return (_activityCollector); } /** * Initialize the event processors. */ @PostConstruct public void init() { if (_activityCollector == null) { if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager retrieving activity collector"); } ServiceRegistryUtil.addServiceListener(ActivityCollector.class, new ServiceListener<ActivityCollector>() { @Override public void registered(ActivityCollector service) { _activityCollector = service; if (LOG.isLoggable(Level.FINE)) { LOG.fine("Event processor manager: collector="+_activityCollector); } } @Override public void unregistered(ActivityCollector service) { _activityCollector = null; if (LOG.isLoggable(Level.FINE)) { LOG.fine("Event processor manager: collector unset"); } } }); } if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager Initialized with collector="+_activityCollector); } MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName objname=null; try { // Check if switchyard present - if not then will fail and not try to load beans String observerClassName=org.switchyard.event.EventObserver.class.getName(); objname = new ObjectName(SWITCHYARD_MANAGEMENT_LOCAL); for (String clsName : EVENT_PROCESSOR_CLASS_NAMES) { Class<?> cls=EventProcessorManager.class.getClassLoader().loadClass(clsName); EventProcessor ep=(EventProcessor)cls.newInstance(); _eventProcessors.add(ep); if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager register event processor="+ep); } // Initialize with the activity collector ep.init(_activityCollector); java.util.List<Class<?>> eventTypes=new java.util.ArrayList<Class<?>>(); eventTypes.add(ep.getEventType()); Object[] params={ep, eventTypes}; String[] types={observerClassName, java.util.List.class.getName()}; mbs.invoke(objname, "addObserver", params, types); } } catch (Throwable e) { if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Failed to register SwitchYard event processor", e); } } if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager Initialization Completed"); } } /** * Close the event processors. */ @PreDestroy public void close() { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName objname=null; try { objname = new ObjectName(SWITCHYARD_MANAGEMENT_LOCAL); for (EventProcessor ep : _eventProcessors) { if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager unregister event processor="+ep); } Object[] params={ep}; String[] types={org.switchyard.event.EventObserver.class.getName()}; if (mbs.isRegistered(objname)) { mbs.invoke(objname, "removeObserver", params, types); } } } catch (Throwable e) { if (LOG.isLoggable(Level.FINE)) { LOG.log(Level.FINE, "Failed to unregister SwitchYard event observer via MBean", e); } } if (LOG.isLoggable(Level.FINE)) { LOG.fine("SwitchYard EventProcessorManager Close Completed"); } } }