package no.playtrd.ui; import java.util.logging.Level; import java.util.logging.Logger; import no.playtrd.services.IPositionService; import no.playtrd.v10.playtrd.PositionService; import no.playtrd.v10.playtrd.UoD; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.e4.tm.builder.IBuilder; import org.eclipse.e4.tm.ui.editor.IPostProcessor; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceEvent; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; public class PositionServicePostProcessor implements IPostProcessor { private Logger log = Logger.getLogger(Activator.getDefault().getBundle().getSymbolicName()); private <T> T getEObject(TreeIterator<Object> allContents, Class<T> clazz, Level severity) { while (allContents.hasNext()) { Object o = allContents.next(); if (clazz.isInstance(o)) { return (T)o; } } if (severity != null) { log.log(severity, "Didn't find object of " + clazz); } return null; } public void postBuildModel(EObject model, IBuilder builder, final IAdaptable adaptable) { final BundleContext context = Activator.getDefault().getBundle().getBundleContext(); UoD uod = getEObject(EcoreUtil.getAllContents(model.eResource().getResourceSet(), false), UoD.class, Level.FINE); if (uod == null) { return; } final PositionService positionServiceData = getEObject(EcoreUtil.getAllContents(uod, false), PositionService.class, Level.WARNING); if (positionServiceData == null) { return; } ServiceListener serviceListener = new ServiceListener() { public void serviceChanged(ServiceEvent event) { switch (event.getType()) { case ServiceEvent.REGISTERED: { handlePositionService(context, positionServiceData, (IEditingDomainProvider)adaptable.getAdapter(IEditingDomainProvider.class)); break; } } } }; String filter = "(objectclass=" + IPositionService.class.getName() + ")"; try { context.addServiceListener(serviceListener, filter); ServiceReference[] serviceReferences = context.getServiceReferences(null, filter); for(int i = 0; serviceReferences != null && i < serviceReferences.length; i++) { serviceListener.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, serviceReferences[i])); } } catch (InvalidSyntaxException e) { } } private boolean handlePositionService(final BundleContext context, PositionService positionServiceData,IEditingDomainProvider editingDomainProvider) { ServiceReference serviceReference = context.getServiceReference(IPositionService.class.getName()); if (serviceReference != null) { IPositionService positionServiceImpl = (IPositionService)context.getService(serviceReference); if (positionServiceImpl != null) { positionServiceImpl.handlePositionService(positionServiceData, editingDomainProvider); // log.log(Level.INFO, "Using IPositionService of " + positionServiceImpl.getClass()); return true; } } return false; } public void postLoadModel(IAdaptable adaptable) { } public Object getAdapter(Class adapter) { return null; } }