blob: d4df3c14fdfd7fe4ad4e95df7606d6bb41c03bdb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 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.jst.j2ee.application.internal.operations;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jem.util.emf.workbench.WorkbenchByteArrayOutputStream;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
public class BinaryProjectHelper {
public void importArchiveAsBinary(Archive archive, IProject project, IProgressMonitor monitor) {
try {
IJavaProject javaProject = JavaCore.create(project);
IFile savedModuleFile = saveFile(archive, project);
saveEnclosedFile(archive, project, ProjectUtilities.DOT_CLASSPATH);
saveEnclosedFile(archive, project, ProjectUtilities.DOT_PROJECT);
removeImportedClassesFromClasspathIfNecessary(project);
ensureBinary(javaProject, monitor);
IPath path = savedModuleFile.getFullPath();
IClasspathEntry newEntry = JavaCore.newLibraryEntry(path, path, null, true);
IClasspathEntry[] entries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];
System.arraycopy(entries, 0, newEntries, 1, entries.length);
newEntries[0] = newEntry;
javaProject.setRawClasspath(newEntries, monitor);
} catch (FileNotFoundException e) {
J2EEPlugin.logError(e);
} catch (IOException e) {
J2EEPlugin.logError(e);
} catch (JavaModelException e) {
J2EEPlugin.logError(e);
}
}
/**
*
*/
public static void removeImportedClassesFromClasspathIfNecessary(IProject project) {
IJavaProject javaProj = JavaCore.create(project);
if (javaProj != null) {
IClasspathEntry[] entries = javaProj.readRawClasspath();
if (entries != null) {
IClasspathEntry entryToRemove = null;
for (int i = 0; i < entries.length; i++) {
if (entries[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY && entries[i].getPath().toString().endsWith("imported_classes") && !project.getFolder("imported_classes").exists()) { //$NON-NLS-1$//$NON-NLS-2$
entryToRemove = entries[i];
break;
}
}
if (null != entryToRemove) {
IClasspathEntry[] newEntries = new IClasspathEntry[entries.length - 1];
for (int i = 0, j = 0; i < newEntries.length && j < entries.length; j++) {
if (entryToRemove != entries[j]) {
newEntries[i] = entries[j];
i++;
}
}
entries = newEntries;
IPath output = javaProj.readOutputLocation();
if (output != null)
try {
javaProj.setRawClasspath(entries, output, null);
} catch (JavaModelException e) {
}
}
}
}
}
protected IFile saveFile(File aFile, IProject p) throws IOException {
IFile iFile = p.getFile(aFile.getURI());
WorkbenchByteArrayOutputStream out = new WorkbenchByteArrayOutputStream(iFile);
ArchiveUtil.copy(aFile.getInputStream(), out);
return iFile;
}
protected void saveEnclosedFile(Archive anArchive, IProject p, String uri) throws IOException {
try {
File aFile = anArchive.getFile(uri);
saveFile(aFile, p);
} catch (FileNotFoundException ignore) {
}
}
protected void ensureBinary(IJavaProject javaProject, IProgressMonitor monitor) {
if (javaProject == null)
return;
List newCp = new ArrayList();
try {
IClasspathEntry[] entries = javaProject.getRawClasspath();
for (int i = 0; i < entries.length; i++) {
if (entries[i].getEntryKind() != IClasspathEntry.CPE_SOURCE)
newCp.add(entries[i]);
}
entries = (IClasspathEntry[]) newCp.toArray(new IClasspathEntry[newCp.size()]);
javaProject.setRawClasspath(entries, monitor);
} catch (JavaModelException ex) {
J2EEPlugin.logError(ex);
}
}
}