/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * All rights reserved. This program and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html. * */ package gov.redhawk.sca.model.provider.event.internal.listener; import gov.redhawk.model.sca.RefreshDepth; import gov.redhawk.model.sca.ScaDeviceManager; import gov.redhawk.model.sca.ScaDomainManager; import gov.redhawk.model.sca.ScaFactory; import gov.redhawk.model.sca.ScaWaveform; import gov.redhawk.model.sca.ScaWaveformFactory; import gov.redhawk.model.sca.commands.ScaModelCommand; import gov.redhawk.model.sca.commands.ScaModelCommandWithResult; import gov.redhawk.model.sca.services.IScaDataProvider; import gov.redhawk.sca.model.provider.event.AbstractEventChannelDataProvider; import gov.redhawk.sca.model.provider.event.internal.EventServiceDataProviderService; import gov.redhawk.sca.util.PluginUtil; import org.omg.CORBA.Any; import org.omg.CORBA.SystemException; import org.omg.CORBA.TypeCode; import CF.Application; import CF.ApplicationFactory; import CF.ApplicationFactoryHelper; import CF.ApplicationHelper; import CF.DeviceManager; import CF.DeviceManagerHelper; import StandardEvent.DomainManagementObjectAddedEventType; import StandardEvent.DomainManagementObjectAddedEventTypeHelper; import StandardEvent.DomainManagementObjectRemovedEventType; import StandardEvent.DomainManagementObjectRemovedEventTypeHelper; import StandardEvent.SourceCategoryType; /** * */ public class ScaDomainManagerEventServiceDataProvider extends AbstractEventChannelDataProvider<ScaDomainManager> implements IScaDataProvider { public ScaDomainManagerEventServiceDataProvider(final ScaDomainManager domain) { super(domain, domain); addChannel(domain.getLabel() + ".ODM_Channel"); } @Override public String getID() { return EventServiceDataProviderService.ID; } @Override public void handleEvent(final String channelName, final Any data) { final TypeCode type = data.type(); if (type.equal(DomainManagementObjectAddedEventTypeHelper.type())) { final DomainManagementObjectAddedEventType event = DomainManagementObjectAddedEventTypeHelper.extract(data); handleAddEvent(event); } else if (type.equal(DomainManagementObjectRemovedEventTypeHelper.type())) { final DomainManagementObjectRemovedEventType event = DomainManagementObjectRemovedEventTypeHelper.extract(data); handleRemoveEvent(event); } } private void handleRemoveEvent(final DomainManagementObjectRemovedEventType event) { switch (event.sourceCategory.value()) { case SourceCategoryType._APPLICATION: handleRemoveApplication(event); break; case SourceCategoryType._APPLICATION_FACTORY: handleRemoveApplicationFactory(event); break; case SourceCategoryType._DEVICE: handleRemoveDevice(event); break; case SourceCategoryType._DEVICE_MANAGER: handleRemoveDeviceManager(event); break; case SourceCategoryType._SERVICE: break; default: break; } } private void handleRemoveDevice(final DomainManagementObjectRemovedEventType event) { for (final ScaDeviceManager manager : getContainer().getDeviceManagers()) { manager.fetchDevices(null, RefreshDepth.SELF); } } private void handleRemoveDeviceManager(final DomainManagementObjectRemovedEventType event) { final String sourceId = event.sourceId; final ScaDomainManager domain = getContainer(); ScaModelCommand.execute(domain, new ScaModelCommand() { @Override public void execute() { for (final ScaDeviceManager deviceManager : domain.getDeviceManagers()) { if (deviceManager != null && PluginUtil.equals(deviceManager.identifier(), sourceId)) { domain.getDeviceManagers().remove(deviceManager); break; } } } }); } private void handleRemoveApplicationFactory(final DomainManagementObjectRemovedEventType event) { final String sourceId = event.sourceId; final ScaDomainManager domain = getContainer(); ScaModelCommand.execute(domain, new ScaModelCommand() { @Override public void execute() { for (final ScaWaveformFactory factory : domain.getWaveformFactories()) { if (factory != null && PluginUtil.equals(sourceId, factory.getIdentifier())) { domain.getWaveformFactories().remove(factory); break; } } } }); } private void handleRemoveApplication(final DomainManagementObjectRemovedEventType event) { final ScaDomainManager domain = getContainer(); ScaModelCommand.execute(domain, new ScaModelCommand() { @Override public void execute() { for (final ScaWaveform waveform : domain.getWaveforms()) { if (waveform != null && PluginUtil.equals(event.sourceId, waveform.getIdentifier())) { domain.getWaveforms().remove(waveform); break; } } } }); } private void handleAddEvent(final DomainManagementObjectAddedEventType event) { switch (event.sourceCategory.value()) { case SourceCategoryType._APPLICATION: handleAddApplicationEvent(event); break; case SourceCategoryType._APPLICATION_FACTORY: handleAddApplicationFactory(event); break; case SourceCategoryType._DEVICE: handleAddDeviceEvent(event); break; case SourceCategoryType._DEVICE_MANAGER: handleAddDeviceManager(event); break; case SourceCategoryType._SERVICE: break; default: break; } } private void handleAddDeviceEvent(final DomainManagementObjectAddedEventType event) { for (final ScaDeviceManager manager : getContainer().getDeviceManagers()) { manager.fetchDevices(null, RefreshDepth.SELF); } } private void handleAddDeviceManager(final DomainManagementObjectAddedEventType event) { try { final DeviceManager devMgr = DeviceManagerHelper.narrow(event.sourceIOR); final String ior = devMgr.toString(); final ScaDomainManager domain = getContainer(); final ScaDeviceManager newDeviceManager = ScaModelCommandWithResult.execute(domain, new ScaModelCommandWithResult<ScaDeviceManager>() { @Override public void execute() { for (final ScaDeviceManager deviceManager : domain.getDeviceManagers()) { if (deviceManager != null && PluginUtil.equals(ior, deviceManager.getIor())) { return; } } final ScaDeviceManager newScaDeviceManager = ScaFactory.eINSTANCE.createScaDeviceManager(); newScaDeviceManager.setCorbaObj(devMgr); domain.getDeviceManagers().add(newScaDeviceManager); setResult(newScaDeviceManager); } }); if (newDeviceManager != null) { newDeviceManager.refresh(null, RefreshDepth.SELF); } } catch (final org.omg.CORBA.OBJECT_NOT_EXIST e) { // PASS if the object does not exist ignore the add request } catch (final InterruptedException e) { // PASS } catch (final SystemException e) { // PASS } } private void handleAddApplicationFactory(final DomainManagementObjectAddedEventType event) { try { final ApplicationFactory appFactory = ApplicationFactoryHelper.narrow(event.sourceIOR); final String ior = appFactory.toString(); final ScaDomainManager domain = getContainer(); final ScaWaveformFactory newWaveformFactory = ScaModelCommandWithResult.execute(domain, new ScaModelCommandWithResult<ScaWaveformFactory>() { @Override public void execute() { for (final ScaWaveformFactory factory : domain.getWaveformFactories()) { if (factory != null && PluginUtil.equals(ior, factory.getIor())) { return; } } final ScaWaveformFactory newWaveformFactory = ScaFactory.eINSTANCE.createScaWaveformFactory(); newWaveformFactory.setCorbaObj(appFactory); domain.getWaveformFactories().add(newWaveformFactory); setResult(newWaveformFactory); } }); if (newWaveformFactory != null && !newWaveformFactory.isDisposed()) { newWaveformFactory.refresh(null, RefreshDepth.SELF); } } catch (final org.omg.CORBA.OBJECT_NOT_EXIST e) { // PASS if the object does not exist ignore the add request } catch (final InterruptedException e) { // PASS if the object does not exist ignore the add request } } private void handleAddApplicationEvent(final DomainManagementObjectAddedEventType event) { try { final Application app = ApplicationHelper.narrow(event.sourceIOR); final String ior = app.toString(); final ScaDomainManager domain = getContainer(); final ScaWaveform newWaveform = ScaModelCommandWithResult.execute(domain, new ScaModelCommandWithResult<ScaWaveform>() { @Override public void execute() { for (final ScaWaveform w : domain.getWaveforms()) { if (w != null && PluginUtil.equals(ior, w.getIor())) { return; } } final ScaWaveform newWaveform = ScaFactory.eINSTANCE.createScaWaveform(); newWaveform.setCorbaObj(app); domain.getWaveforms().add(newWaveform); setResult(newWaveform); } }); if (newWaveform != null) { newWaveform.refresh(null, RefreshDepth.SELF); } } catch (final org.omg.CORBA.OBJECT_NOT_EXIST e) { // PASS if the object does not exist ignore the add request } catch (final SystemException e) { // PASS } catch (final InterruptedException e) { // PASS } } }