Package org.apache.felix.mosgi.managedelements.obrprobe

Source Code of org.apache.felix.mosgi.managedelements.obrprobe.ObrProbe

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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.apache.felix.mosgi.managedelements.obrprobe;

/**
* TODO : Should listen to Agent Service lifecycle
*        Need to change ObjectName
*        Should listen to serviceLifecycle
**/

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.NotificationBroadcasterSupport;
import javax.management.AttributeChangeNotification;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;

//import org.apache.felix.bundlerepository.BundleRepository;
import org.osgi.service.obr.RepositoryAdmin;
import org.osgi.service.obr.Resolver;
import org.osgi.service.obr.Resource;
import org.osgi.framework.Version;

import org.osgi.service.log.LogService;

public class ObrProbe implements BundleActivator, ObrProbeMBean {

  private String version = null;
  private static final String TAB_NAME_STRING = "TabUI:name=ObrProbe";

  private MBeanServer server = null;
  private BundleContext bc = null;
  private ServiceRegistration sr = null;


  ////////////////////////////////////////////////////////
  //     TabIfc (from ObrProbeMBean)                  //
  ////////////////////////////////////////////////////////
  public String getBundleName() {
    return this.bc.getProperty("mosgi.jmxconsole.tab.url.obrprobetab");
  }


  ////////////////////////////////////////////////////////
  //       BundleActivator                              //
  ////////////////////////////////////////////////////////
  public void start(BundleContext context) throws Exception  {
    this.bc=context;
    this.version=(String)bc.getBundle().getHeaders().get(Constants.BUNDLE_VERSION);
    this.log(LogService.LOG_INFO, "Starting obrProbe MBean " + this.version,null);
    java.util.Properties p = new java.util.Properties();
    p.put(org.apache.felix.mosgi.jmx.agent.Constants.OBJECTNAME, TAB_NAME_STRING);
    this.sr = this.bc.registerService(ObrProbeMBean.class.getName(), this, p);
    this.log(LogService.LOG_INFO, "ObrProbe MBean "+this.version+" started", null);
  }

  public void stop(BundleContext context) {
    this.log(LogService.LOG_INFO, "Stopping obrprobe MBean "+this.version, null);
    this.sr.unregister();
    this.sr=null;
    this.log(LogService.LOG_INFO, "obrProbe MBean "+this.version+" stopped", null);
    this.bc=null;
  }

  ////////////////////////////////////////////////////////
  //       ObrProbeMBean                              //
  ////////////////////////////////////////////////////////
  public void deploy(String location,String version){
    ServiceReference sref=this.bc.getServiceReference(RepositoryAdmin.class.getName());

    System.out.println("Starting "+location+" "+version);
    if (sref!=null){
      RepositoryAdmin brs=(RepositoryAdmin)this.bc.getService(sref);
      Resolver resolver=brs.resolver();
      Resource ressource = selectNewestVersion(searchRepository(brs, location, version));
      if (ressource!=null){
  resolver.add(ressource);
      }
      if ((resolver.getAddedResources() != null) &&
            (resolver.getAddedResources().length > 0)) {
        if (resolver.resolve()) {
          try{
            resolver.deploy(true); //Bundles are started
          }catch (IllegalStateException ex) {
            System.out.println(ex);
          }
        }
      }
    }else{
      this.log(LogService.LOG_ERROR, "No BundleRepository Service", null);
    }
  }

  private void log(int prio, String message, Throwable t){
    if (this.bc!=null){
      ServiceReference logSR=this.bc.getServiceReference(LogService.class.getName());
      if (logSR!=null){
        ((LogService)this.bc.getService(logSR)).log(prio, message, t);
      }else{
        System.out.println("No Log Service");
      }
    }else{
      System.out.println(this.getClass().getName()+".log: No bundleContext");
    }
  }

  private Resource[] searchRepository(RepositoryAdmin brs, String targetId, String targetVersion)
  {
        // Try to see if the targetId is a bundle ID.
        try
        {
            Bundle bundle = bc.getBundle(Long.parseLong(targetId));
            targetId = bundle.getSymbolicName();
        }
        catch (NumberFormatException ex)
        {
            // It was not a number, so ignore.
        }

        // The targetId may be a bundle name or a bundle symbolic name,
        // so create the appropriate LDAP query.
        StringBuffer sb = new StringBuffer("(|(presentationname=");
        sb.append(targetId);
        sb.append(")(symbolicname=");
        sb.append(targetId);
        sb.append("))");
        if (targetVersion != null)
        {
            sb.insert(0, "(&");
            sb.append("(version=");
            sb.append(targetVersion);
            sb.append("))");
        }
        return brs.discoverResources(sb.toString());
    }

    private Resource selectNewestVersion(Resource[] resources)
    {
        int idx = -1;
        Version v = null;
        for (int i = 0; (resources != null) && (i < resources.length); i++)
        {
            if (i == 0)
            {
                idx = 0;
                v = resources[i].getVersion();
            }
            else
            {
                Version vtmp = resources[i].getVersion();
                if (vtmp.compareTo(v) > 0)
                {
                    idx = i;
                    v = vtmp;
                }
            }
        }

        return (idx < 0) ? null : resources[idx];
    }


}
TOP

Related Classes of org.apache.felix.mosgi.managedelements.obrprobe.ObrProbe

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.