/*******************************************************************************
 * 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);
		}
	}

}

