blob: 8dca04306ff0703e7485a9575f5767725ad54c83 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
 *
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.wtp.releng.tools.component.ui.internal;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.jar.JarInputStream;
import java.util.zip.ZipEntry;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.ManifestElement;
import org.eclipse.wtp.releng.tools.component.IClazz;
import org.eclipse.wtp.releng.tools.component.IClazzVisitor;
import org.eclipse.wtp.releng.tools.component.ILibrary;
import org.osgi.framework.Bundle;
public class BundleLibrary implements ILibrary
{
private Bundle bundle;
private ManifestElement manifestElement;
private Map types;
public BundleLibrary(Bundle bundle, ManifestElement manifestElement)
{
this.bundle = bundle;
this.manifestElement = manifestElement;
}
/**
* Answers a mapping of (qualified) type names to <code>Type</code> objects
* which are found in this library.
*
* @return Map a mapping of type names to <code>Type</code> objects.
*/
public Map getTypes()
{
if (types == null)
{
types = new HashMap(1);
URL libURL = Platform.find(bundle, new Path(manifestElement.getValue()));
if (libURL != null)
{
try
{
JarInputStream jis = new JarInputStream(libURL.openStream());
ZipEntry entry = jis.getNextEntry();
while (entry != null)
{
if (!entry.isDirectory() && entry.getName().endsWith(EXT_CLASS))
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[2048];
int read = jis.read(b);
while (read != -1)
{
baos.write(b, 0, read);
read = jis.read(b);
}
BundleClazz clazz = new BundleClazz(baos.toByteArray());
types.put(clazz.getName(), clazz);
clazz.resetClazz();
}
entry = jis.getNextEntry();
}
jis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return types;
}
public void resetTypes()
{
types = null;
}
public void accept(IClazzVisitor visitor)
{
for (Iterator it = getTypes().values().iterator(); it.hasNext();)
{
IClazz clazz = (IClazz)it.next();
visitor.visit(clazz);
clazz.resetClazz();
}
}
}