Package org.eclipse.osgi.internal.baseadaptor

Source Code of org.eclipse.osgi.internal.baseadaptor.SystemBundleData

/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation and others.
* 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
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

package org.eclipse.osgi.internal.baseadaptor;

import java.io.*;
import java.net.URL;
import java.util.Enumeration;
import org.eclipse.osgi.baseadaptor.BaseAdaptor;
import org.eclipse.osgi.baseadaptor.BaseData;
import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
import org.eclipse.osgi.baseadaptor.hooks.StorageHook;
import org.eclipse.osgi.framework.adaptor.*;
import org.eclipse.osgi.framework.debug.Debug;
import org.eclipse.osgi.framework.internal.core.Constants;
import org.eclipse.osgi.framework.internal.core.FrameworkProperties;
import org.eclipse.osgi.framework.util.Headers;
import org.osgi.framework.BundleException;

public class SystemBundleData extends BaseData {
  private static final String OSGI_FRAMEWORK = "osgi.framework"; //$NON-NLS-1$

  public SystemBundleData(BaseAdaptor adaptor) throws BundleException {
    super(0, adaptor);
    File osgiBase = getOsgiBase();
    createBundleFile(osgiBase);
    manifest = createManifest(osgiBase);
    setMetaData();
    setLastModified(System.currentTimeMillis()); // just set the lastModified to the current time
    StorageHook[] hooks = adaptor.getHookRegistry().getStorageHooks();
    StorageHook[] instanceHooks = new StorageHook[hooks.length];
    for (int i = 0; i < hooks.length; i++)
      instanceHooks[i] = hooks[i].create(this);
    setStorageHooks(instanceHooks);
  }

  private File getOsgiBase() {
    String frameworkLocation = FrameworkProperties.getProperty(SystemBundleData.OSGI_FRAMEWORK);
    if (frameworkLocation != null)
      // TODO assumes the location is a file URL
      return new File(frameworkLocation.substring(5));
    try {
      URL url = getClass().getProtectionDomain().getCodeSource().getLocation();
      // assumes file URL
      return new File(url.getPath());
    } catch (Throwable e) {
      // do nothing
    }
    frameworkLocation = FrameworkProperties.getProperty("user.dir"); //$NON-NLS-1$
    if (frameworkLocation != null)
      return new File(frameworkLocation);
    return null;
  }

  private Headers createManifest(File osgiBase) throws BundleException {
    InputStream in = null;

    if (osgiBase != null && osgiBase.exists())
      try {
        BundleEntry entry = getBundleFile().getEntry(Constants.OSGI_BUNDLE_MANIFEST);
        if (entry != null)
          in = entry.getInputStream();
      } catch (IOException e) {
        // do nothing here.  in == null
      }

    // If we cannot find the Manifest file from the baseBundleFile then
    // search for the manifest as a classloader resource
    // This allows an adaptor to package the SYSTEMBUNDLE.MF file in a jar.
    if (in == null)
      in = getManifestAsResource();
    if (Debug.DEBUG && Debug.DEBUG_GENERAL)
      if (in == null)
        Debug.println("Unable to find system bundle manifest " + Constants.OSGI_BUNDLE_MANIFEST); //$NON-NLS-1$

    if (in == null)
      throw new BundleException(AdaptorMsg.SYSTEMBUNDLE_MISSING_MANIFEST, BundleException.MANIFEST_ERROR);
    return Headers.parseManifest(in);
  }

  private InputStream getManifestAsResource() {
    ClassLoader cl = getClass().getClassLoader();
    try {
      // get all manifests in your classloader delegation
      Enumeration manifests = cl != null ? cl.getResources(Constants.OSGI_BUNDLE_MANIFEST) : ClassLoader.getSystemResources(Constants.OSGI_BUNDLE_MANIFEST);
      while (manifests.hasMoreElements()) {
        URL url = (URL) manifests.nextElement();
        try {
          // check each manifest until we find one with the Eclipse-SystemBundle: true header
          Headers headers = Headers.parseManifest(url.openStream());
          if ("true".equals(headers.get(Constants.ECLIPSE_SYSTEMBUNDLE))) //$NON-NLS-1$
            return url.openStream();
        } catch (BundleException e) {
          // ignore and continue to next URL
        }
      }
    } catch (IOException e) {
      // ignore and return null
    }
    return null;
  }

  private void createBundleFile(File osgiBase) {
    if (osgiBase != null)
      try {
        bundleFile = getAdaptor().createBundleFile(osgiBase, this);
      } catch (IOException e) {
        // should not happen
      }
    else
      bundleFile = new BundleFile(osgiBase) {
        public File getFile(String path, boolean nativeCode) {
          return null;
        }

        public BundleEntry getEntry(String path) {
          return null;
        }

        public Enumeration getEntryPaths(String path) {
          return null;
        }

        public void close() {
          // do nothing
        }

        public void open() {
          // do nothing
        }

        public boolean containsDir(String dir) {
          return false;
        }
      };
  }

  private void setMetaData() throws BundleException {
    setLocation(Constants.SYSTEM_BUNDLE_LOCATION);
    BaseStorageHook.loadManifest(this, manifest);
  }

  public BundleClassLoader createClassLoader(ClassLoaderDelegate delegate, BundleProtectionDomain domain, String[] bundleclasspath) {
    return null;
  }

  public File createGenerationDir() {
    return null;
  }

  public String findLibrary(String libname) {
    return null;
  }

  public void installNativeCode(String[] nativepaths) throws BundleException {
    // do nothing
  }

  public int getStartLevel() {
    return 0;
  }

  public int getStatus() {
    return Constants.BUNDLE_STARTED;
  }

  public void save() {
    // do nothing
  }

}
TOP

Related Classes of org.eclipse.osgi.internal.baseadaptor.SystemBundleData

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.