Package org.osgi.service.indexer.impl

Source Code of org.osgi.service.indexer.impl.OSGiFrameworkAnalyzer

package org.osgi.service.indexer.impl;

import java.util.List;

import org.osgi.framework.Version;
import org.osgi.service.indexer.Builder;
import org.osgi.service.indexer.Capability;
import org.osgi.service.indexer.Namespaces;
import org.osgi.service.indexer.Requirement;
import org.osgi.service.indexer.Resource;
import org.osgi.service.indexer.ResourceAnalyzer;
import org.osgi.service.log.LogService;

/**
* Detects JARs that are OSGi Frameworks, using the presence of META-INF/services/org.osgi.framework.launch.FrameworkFactory
*/
public class OSGiFrameworkAnalyzer implements ResourceAnalyzer {
 
  private static final String SERVICE_FRAMEWORK_FACTORY = "META-INF/services/org.osgi.framework.launch.FrameworkFactory";
  private static final String FRAMEWORK_PACKAGE = "org.osgi.framework";
 
  private final LogService log;
 
  public OSGiFrameworkAnalyzer(LogService log) {
    this.log = log;
  }

  public void analyzeResource(Resource resource, List<Capability> caps, List<Requirement> reqs) throws Exception {
    Resource fwkFactorySvc = resource.getChild(SERVICE_FRAMEWORK_FACTORY);
    if (fwkFactorySvc != null) {
      Builder builder = new Builder().setNamespace(Namespaces.NS_CONTRACT).addAttribute(Namespaces.NS_CONTRACT, Namespaces.CONTRACT_OSGI_FRAMEWORK);

      Version specVersion = null;
      StringBuilder uses = new StringBuilder();
      boolean firstPkg = true;
     
      for (Capability cap : caps) {
        if (Namespaces.NS_WIRING_PACKAGE.equals(cap.getNamespace())) {
          // Add to the uses directive
          if (!firstPkg)
            uses.append(',');
          String pkgName = (String) cap.getAttributes().get(Namespaces.NS_WIRING_PACKAGE);
          uses.append(pkgName);
          firstPkg = false;
         
          // If it's org.osgi.framework, get the package version and map to OSGi spec version
          if (FRAMEWORK_PACKAGE.equals(pkgName)) {
            Version frameworkPkgVersion = (Version) cap.getAttributes().get(Namespaces.ATTR_VERSION);
            specVersion = mapFrameworkPackageVersion(frameworkPkgVersion);
          }
        }
      }
     
      if (specVersion != null)
        builder.addAttribute(Namespaces.ATTR_VERSION, specVersion);
     
      builder.addDirective(Namespaces.DIRECTIVE_USES, uses.toString());
      caps.add(builder.buildCapability());
    }
  }

  /**
   * Map the version of package {@code org.osgi.framework} to an OSGi
   * specification release version
   *
   * @param pv
   *            Version of the {@code org.osgi.framework} packge
   * @return The OSGi specification release version, or {@code null} if not
   *         known.
   */
  private Version mapFrameworkPackageVersion(Version pv) {
    if (pv.getMajor() != 1)
      return null;

    Version version;
    switch (pv.getMinor()) {
    case 7:
      version = new Version(5, 0, 0);
      break;
    case 6:
      version = new Version(4, 3, 0);
      break;
    case 5:
      version = new Version(4, 2, 0);
      break;
    case 4:
      version = new Version(4, 1, 0);
      break;
    case 3:
      version = new Version(4, 0, 0);
      break;
    case 2:
      version = new Version(3, 0, 0);
      break;
    case 1:
      version = new Version(2, 0, 0);
      break;
    case 0:
      version = new Version(1, 0, 0);
      break;
    default:
      version = null;
      break;
    }

    return version;
  }

}
TOP

Related Classes of org.osgi.service.indexer.impl.OSGiFrameworkAnalyzer

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.