/*******************************************************************************
* Copyright (c) 2006 Mountainminds GmbH & Co. KG
* This software is provided under the terms of the Eclipse Public License v1.0
* See http://www.eclipse.org/legal/epl-v10.html.
*
* $Id: SourceLocation.java 84 2006-09-14 20:00:01Z mho $
******************************************************************************/
package com.mountainminds.eclemma.internal.core.instr;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.osgi.util.NLS;
import com.mountainminds.eclemma.core.EclEmmaStatus;
import com.mountainminds.eclemma.core.ISourceLocation;
import com.mountainminds.eclemma.internal.core.CoreMessages;
import com.mountainminds.eclemma.internal.core.EclEmmaCorePlugin;
/**
* Implementation of {@link ISourceLocation}.
*
* @author Marc R. Hoffmann
* @version $Revision: 84 $
*/
public class SourceLocation implements ISourceLocation {
private static final String JAVA_EXT = ".java"; //$NON-NLS-1$
public static ISourceLocation findLocation(IPackageFragmentRoot root)
throws JavaModelException {
if (root.getKind() == IPackageFragmentRoot.K_SOURCE) {
IPath path = EclEmmaCorePlugin.getAbsolutePath(root.getPath());
return new SourceLocation(path, new Path(
IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH));
} else {
IPath path = root.getSourceAttachmentPath();
if (path != null) {
path = EclEmmaCorePlugin.getAbsolutePath(path);
return new SourceLocation(path, root.getSourceAttachmentRootPath());
} else {
return null;
}
}
}
public static ISourceLocation[] findLocations(IPackageFragmentRoot[] roots)
throws JavaModelException {
List l = new ArrayList();
for (int i = 0; i < roots.length; i++) {
ISourceLocation loc = findLocation(roots[i]);
if (loc != null) {
l.add(loc);
}
}
return (ISourceLocation[]) l.toArray(new ISourceLocation[l.size()]);
}
private IPath path;
private IPath rootpath;
/**
* Creates a source location for the given path and root path.
*
* @param path
* @param rootpath
*/
public SourceLocation(IPath path, IPath rootpath) {
this.path = path;
this.rootpath = rootpath;
}
public IPath getPath() {
return path;
}
public IPath getRootPath() {
return rootpath;
}
public boolean isArchive() {
return path.toFile().isFile();
}
public void extract(IProgressMonitor monitor) throws CoreException {
if (isArchive()) {
monitor.beginTask(NLS.bind(CoreMessages.ExtractingSourceArchive_task, path), 1);
String prefix = rootpath == null ? "" : rootpath.toString(); //$NON-NLS-1$
byte[] buffer = new byte[0x1000];
IPath srcfolder = EclEmmaCorePlugin.getInstance().getStateFiles().getSourceFolder(path);
if (!srcfolder.toFile().exists()) {
try {
ZipInputStream zip = new ZipInputStream(new FileInputStream(path.toFile()));
while (true) {
ZipEntry entry = zip.getNextEntry();
if (entry == null) break;
if (!entry.isDirectory() && entry.getName().startsWith(prefix) && entry.getName().endsWith(JAVA_EXT)) {
IPath path = srcfolder.append(entry.getName().substring(prefix.length()));
path.removeLastSegments(1).toFile().mkdirs();
OutputStream out = new FileOutputStream(path.toFile());
int len;
while ((len = zip.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
}
zip.closeEntry();
}
zip.close();
} catch (IOException e) {
throw new CoreException(EclEmmaStatus.SOURCE_EXTRACTION_ERROR.getStatus(path, e));
}
}
path = srcfolder;
rootpath = null;
}
monitor.done();
}
}