package org.argeo.slc.repo.osgi; import java.io.ByteArrayInputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.jar.JarInputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.Session; import org.apache.commons.io.IOUtils; import org.argeo.api.cms.CmsLog; import org.argeo.jcr.JcrUtils; import org.argeo.slc.NameVersion; import org.argeo.slc.SlcException; import org.argeo.slc.repo.ArtifactIndexer; import org.argeo.slc.repo.JarFileIndexer; import org.argeo.slc.repo.RepoUtils; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; /** * Import all bundles in a zip file (typically an Eclipse distribution) into the * workspace. * * @deprecated Use {@link ArchiveWrapper} instead. */ @Deprecated public class ImportBundlesZip implements Runnable { private final static CmsLog log = CmsLog.getLog(ImportBundlesZip.class); private Repository repository; private String workspace; private String groupId; private String artifactBasePath = "/"; private ArtifactIndexer artifactIndexer = new ArtifactIndexer(); private JarFileIndexer jarFileIndexer = new JarFileIndexer(); private String zipFile; private List excludedBundles = new ArrayList(); public void run() { ZipInputStream zipIn = null; JarInputStream jarIn = null; Session session = null; try { URL url = new URL(zipFile); session = repository.login(workspace); // clear // String groupPath = MavenConventionsUtils.groupPath( // artifactBasePath, groupId); // if (session.itemExists(groupPath)) { // session.getNode(groupPath).remove(); // session.save(); // if (log.isDebugEnabled()) // log.debug("Cleared " + groupPath); // } zipIn = new ZipInputStream(url.openStream()); ZipEntry zipEntry = null; entries: while ((zipEntry = zipIn.getNextEntry()) != null) { String entryName = zipEntry.getName(); if (!entryName.endsWith(".jar") || entryName.contains("feature")) continue entries;// skip byte[] jarBytes = IOUtils.toByteArray(zipIn); zipIn.closeEntry(); jarIn = new JarInputStream(new ByteArrayInputStream(jarBytes)); Manifest manifest = jarIn.getManifest(); IOUtils.closeQuietly(jarIn); if (manifest == null) { log.warn(entryName + " has no MANIFEST"); continue entries; } NameVersion nv; try { nv = RepoUtils.readNameVersion(manifest); } catch (Exception e) { log.warn("Cannot read name version from " + entryName, e); continue entries; } String bundleName = RepoUtils.extractBundleNameFromSourceName(nv.getName()); // skip excluded bundles and their sources if (excludedBundles.contains(bundleName)) continue entries; // for(String excludedBundle:excludedBundles){ // if(bundleName.contains(excludedBundle)) // continue entries; // } Artifact artifact = new DefaultArtifact(groupId, nv.getName(), "jar", nv.getVersion()); Node artifactNode = RepoUtils.copyBytesAsArtifact(session.getNode(artifactBasePath), artifact, jarBytes); jarBytes = null;// superstition, in order to free memory // indexes artifactIndexer.index(artifactNode); jarFileIndexer.index(artifactNode); session.save(); if (log.isDebugEnabled()) log.debug("Imported " + entryName + " to " + artifactNode); } } catch (Exception e) { throw new SlcException("Cannot import zip " + zipFile + " to " + workspace, e); } finally { IOUtils.closeQuietly(zipIn); IOUtils.closeQuietly(jarIn); JcrUtils.logoutQuietly(session); } } public void setRepository(Repository repository) { this.repository = repository; } public void setWorkspace(String workspace) { this.workspace = workspace; } public void setGroupId(String groupId) { this.groupId = groupId; } public void setArtifactBasePath(String artifactBasePath) { this.artifactBasePath = artifactBasePath; } public void setZipFile(String zipFile) { this.zipFile = zipFile; } public void setExcludedBundles(List excludedBundles) { this.excludedBundles = excludedBundles; } }