Package org.eclipse.corona.management.osgi

Source Code of org.eclipse.corona.management.osgi.ContributionManager

package org.eclipse.corona.management.osgi;

import java.util.HashMap;
import java.util.Iterator;

import org.apache.muse.management.binding.Binding;
import org.apache.muse.management.common.BindingProvider;
import org.apache.muse.management.common.Contribution;
import org.apache.muse.management.common.util.BundleUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleListener;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;

public class ContributionManager implements BundleListener, ServiceListener {
 
  private BundleContext context;
  private BindingProvider bindingProvider;
  private HashMap contributionToBundleMap = new HashMap();
  private HashMap contributionToServiceMap = new HashMap();
  private HashMap serviceToBundleMap = new HashMap();
 
 
  public void initialize(BundleContext context, BindingProvider bindingProvider){
    this.context = context;
    this.bindingProvider = bindingProvider;
    context.addBundleListener(this);
    context.addServiceListener(this);
   
    initializeBundles();
    initializeServices();
  }
 
  private void initializeBundles(){
    Bundle[] bundles = context.getBundles();
    for(int i=0;i<bundles.length;i++){
      //create initial resources
      contributionToBundleMap.put(bundles[i],createBundleContribution(bundles[i]));
    }
    Iterator j = bindingProvider.getBindings().iterator();
    while(j.hasNext()){
      Binding binding = (Binding)context.getService((ServiceReference)j.next());
      Iterator k = contributionToBundleMap.values().iterator();
      while(k.hasNext()){
        binding.bindContribution((Contribution)k.next());
      }
    }
  }
 
  private Contribution createBundleContribution(Bundle bundle){
    Contribution contribution = new BundleContribution(bundle);
    try {
      BundleUtils.registerContributionForBundle(bundle, contribution);
    } catch(Exception e){
      //TODO deal
    }
    return contribution;
  }
 


  public void bundleChanged(BundleEvent event) {
    Bundle bundle = event.getBundle();
    Contribution contribution = (Contribution)contributionToBundleMap.get(bundle);
    if(contribution instanceof BundleContribution == false) return;
    switch(event.getType()){
    case BundleEvent.INSTALLED:
      break;
    case BundleEvent.RESOLVED:
      break;
    case BundleEvent.STARTED:
      break;
    case BundleEvent.STARTING:
      break;
    case BundleEvent.STOPPED:
      Iterator j = bindingProvider.getBindings().iterator();
      while(j.hasNext()){
        Binding binding = (Binding)context.getService((ServiceReference)j.next());
        binding.unbindContribution(contribution);
      }
      break;
    case BundleEvent.STOPPING:     
      break;
    case BundleEvent.UNINSTALLED:
      break;
    case BundleEvent.UNRESOLVED:
      break;
    case BundleEvent.UPDATED:
      break;     
    }   
  }
 
  private void initializeServices(){
    ServiceReference[] services = null;
    try {
      services = context.getAllServiceReferences(null,null);
    } catch (InvalidSyntaxException e) {
      //This should never happen, since we don't provide a filter
    }
    if(services == null) return;
    for(int i=0;i<services.length;i++){
      //create initial resources
      contributionToServiceMap.put(services[i],createServiceContribution(services[i]));
    }
    Iterator j = bindingProvider.getBindings().iterator();
    while(j.hasNext()){
      Binding binding = (Binding)context.getService((ServiceReference)j.next());
      Iterator k = contributionToServiceMap.values().iterator();
      while(k.hasNext()){
        binding.bindContribution((Contribution)k.next());
      }
    }
  }
 
  private Contribution createServiceContribution(ServiceReference service){
    Contribution contribution = new ServiceContribution(service);
    return contribution;
  }

 
  public void serviceChanged(ServiceEvent event) {
    switch(event.getType()){
    case ServiceEvent.REGISTERED:
    case ServiceEvent.MODIFIED:
    case ServiceEvent.UNREGISTERING:
      break;
    }
   
  }
 
  public void bind(Binding binding){
    Iterator iter = contributionToBundleMap.values().iterator();
    while(iter.hasNext()){
      binding.bindContribution((Contribution)iter.next());
    }
    iter = contributionToServiceMap.values().iterator();
    while(iter.hasNext()){
      binding.bindContribution((Contribution)iter.next());
    }
  }

}
TOP

Related Classes of org.eclipse.corona.management.osgi.ContributionManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.