/*******************************************************************************
 * Copyright (c) 2010 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.internal.common.exportmodel;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveLoadAdapter;
import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
import org.eclipse.jst.j2ee.internal.archive.operations.AppClientArchiveOpsResourceHandler;
import org.eclipse.jst.j2ee.internal.archive.operations.FlatComponentArchiver.ComponentExportCallback;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.jee.archive.ArchiveException;
import org.eclipse.jst.jee.archive.ArchiveSaveFailureException;
import org.eclipse.jst.jee.archive.IArchive;
import org.eclipse.jst.jee.archive.IArchiveLoadAdapter;
import org.eclipse.jst.jee.archive.IArchiveResource;
import org.eclipse.jst.jee.archive.internal.ArchiveUtil;
import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent;
import org.eclipse.wst.common.componentcore.internal.flat.IFlatResource;
import org.eclipse.wst.common.componentcore.internal.flat.IFlatVirtualComponent;
import org.eclipse.wst.common.componentcore.internal.flat.IFlattenParticipant;
import org.eclipse.wst.common.componentcore.internal.flat.VirtualComponentFlattenUtility;
import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;

public class JavaEEComponentExportCallback implements ComponentExportCallback {

	private boolean isExportSource;
	private List<IPath> zipEntries;

	public JavaEEComponentExportCallback(boolean exportSource) {
		isExportSource = exportSource;
	}
	
	public boolean canSave(IVirtualComponent component) {
		if (JavaEEProjectUtilities.isJCAComponent(component)) {
			return true;
		}
		return false;
	}

	public IFlatVirtualComponent saveComponent(IVirtualComponent component, ZipOutputStream zipOutputStream, List<IPath> entries) throws ArchiveException {
		IArchive archiveToSave = null;
		zipEntries = entries;
		try {
			archiveToSave = JavaEEArchiveUtilities.INSTANCE.openArchive(component);
			IArchiveLoadAdapter loadAdapter = archiveToSave.getLoadAdapter();
			if (loadAdapter instanceof ComponentArchiveLoadAdapter) {
				ComponentArchiveLoadAdapter cLoadAdapter = (ComponentArchiveLoadAdapter)loadAdapter;
				cLoadAdapter.setExportSource(isExportSource());
			}
			List<IArchiveResource> files = archiveToSave.getArchiveResources();
			saveManifest(archiveToSave, zipOutputStream);
			for (IArchiveResource file : files) {
				if (!isManifest(file.getPath())) {
					addZipEntry(zipOutputStream, file);
				}
			}
			
		} catch (Exception e) {
			throw new ArchiveException(AppClientArchiveOpsResourceHandler.ARCHIVE_OPERATION_OpeningArchive, e);
		} finally {
			if (archiveToSave != null){
				JavaEEArchiveUtilities.INSTANCE.closeArchive(archiveToSave);
			}
		}
		return getFlatComponent(component);
	}

	private boolean isManifest(IPath path) {
		if (path.equals(new Path(J2EEConstants.MANIFEST_URI))) {
			return true;
		}
		return false;
	}
	
	private void saveManifest(IArchive archiveToSave, ZipOutputStream zipOutputStream) throws FileNotFoundException, ArchiveSaveFailureException {
		IArchiveResource manifest = null;
		
		if (archiveToSave.containsArchiveResource(new Path(J2EEConstants.MANIFEST_URI))) {
			manifest = archiveToSave.getArchiveResource(new Path(J2EEConstants.MANIFEST_URI));
			addZipEntry(zipOutputStream, manifest);
		}
	}
	
	protected void addZipEntry(ZipOutputStream zipOutputStream, IArchiveResource resource) throws ArchiveSaveFailureException {
		try {
			IPath path = resource.getPath();
			if (resource.getType() == IArchiveResource.DIRECTORY_TYPE && !path.hasTrailingSeparator()){
				path = path.addTrailingSeparator();
			}
			ZipEntry entry = new ZipEntry(path.toString());
			if (resource.getLastModified() > 0)
				entry.setTime(resource.getLastModified());
			zipOutputStream.putNextEntry(entry);
			zipEntries.add(path);
			if (resource.getType() != IArchiveResource.DIRECTORY_TYPE) {
				ArchiveUtil.copy(resource.getInputStream(), zipOutputStream);
			}
			zipOutputStream.closeEntry();
		} catch (IOException e) {
			throw new ArchiveSaveFailureException(e);
		}
	}
	
	protected IFlatVirtualComponent getFlatComponent(IVirtualComponent component) {
		FlatComponentTaskModel options = new FlatComponentTaskModel();
		options.put(FlatVirtualComponent.PARTICIPANT_LIST, getParticipants());
		return new ConnectorExportComponent(component, options);
	}
	
	protected IFlattenParticipant[] getParticipants() {
		return new IFlattenParticipant[]{
				new AddJavaEEReferencesParticipant()
		};
	}

	private boolean isExportSource() {
		return isExportSource;
	}
	
	public boolean createManifest() {
		return false;
	}

	public class ConnectorExportComponent extends FlatVirtualComponent {

		public ConnectorExportComponent(IVirtualComponent component, FlatComponentTaskModel dataModel) {
			super(component, dataModel);
		}

		@Override
		protected void treeWalk() throws CoreException {
			if (getComponent() != null) {
				VirtualComponentFlattenUtility util = new VirtualComponentFlattenUtility(new ArrayList<IFlatResource>(), this);

				// the actual walking of the tree was already handled 
				// by the creation of the nested jars from the source folders
				//util.addMembers(component, vFolder, Path.EMPTY);

				addConsumedReferences(util, getComponent(), new Path("")); //$NON-NLS-1$
				addUsedReferences(util, getComponent(), new Path("")); //$NON-NLS-1$
			}
		}
	}

}
