| /******************************************************************************* |
| * Copyright (c) 2005, 2006 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.core.runtime.internal.adaptor; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.jar.Manifest; |
| import org.eclipse.osgi.baseadaptor.BaseData; |
| import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry; |
| import org.eclipse.osgi.baseadaptor.loader.*; |
| import org.eclipse.osgi.framework.util.KeyedElement; |
| |
| public class ClasspathManifest implements KeyedElement { |
| public static final Object KEY = new Object(); |
| public static final int HASHCODE = KEY.hashCode(); |
| |
| private Manifest manifest; |
| private boolean initialized = false; |
| |
| public int getKeyHashCode() { |
| return HASHCODE; |
| } |
| |
| public boolean compare(KeyedElement other) { |
| return other.getKey() == KEY; |
| } |
| |
| public Object getKey() { |
| return KEY; |
| } |
| |
| public Manifest getManifest(ClasspathEntry cpEntry, ClasspathManager loader) { |
| if (initialized) |
| return manifest; |
| if (!hasPackageInfo(cpEntry, loader)) { |
| initialized = true; |
| manifest = null; |
| return manifest; |
| } |
| BundleEntry mfEntry = cpEntry.getBundleFile().getEntry(org.eclipse.osgi.framework.internal.core.Constants.OSGI_BUNDLE_MANIFEST); |
| if (mfEntry != null) |
| try { |
| InputStream manIn = mfEntry.getInputStream(); |
| manifest = new Manifest(manIn); |
| manIn.close(); |
| } catch (IOException e) { |
| // do nothing |
| } |
| initialized = true; |
| return manifest; |
| } |
| |
| private boolean hasPackageInfo(ClasspathEntry cpEntry, ClasspathManager loader) { |
| BaseData bundledata = null; |
| if (cpEntry.getBundleFile() == loader.getBaseData().getBundleFile()) |
| bundledata = loader.getBaseData(); |
| if (bundledata == null) { |
| FragmentClasspath[] fragCPs = loader.getFragmentClasspaths(); |
| if (fragCPs != null) |
| for (int i = 0; i < fragCPs.length; i++) |
| if (cpEntry.getBundleFile() == fragCPs[i].getBundleData().getBundleFile()) { |
| bundledata = fragCPs[i].getBundleData(); |
| break; |
| } |
| } |
| if (bundledata == null) |
| return true; |
| EclipseStorageHook storageHook = (EclipseStorageHook) bundledata.getStorageHook(EclipseStorageHook.KEY); |
| return storageHook == null ? true : storageHook.hasPackageInfo(); |
| } |
| |
| } |