/*******************************************************************************
 * Copyright (c) 2003, 2004 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.jca.archive.operations;


import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.internal.archive.operations.EJBArchiveOpsResourceHandler;
import org.eclipse.jst.j2ee.internal.archive.operations.J2EESaveStrategyImpl;
import org.eclipse.jst.j2ee.internal.jca.operations.ConnectorNatureRuntime;

import com.ibm.wtp.emf.workbench.WorkbenchByteArrayOutputStream;
import com.ibm.wtp.emf.workbench.WorkbenchURIConverter;
import com.ibm.wtp.emf.workbench.WorkbenchURIConverterImpl;

/**
 * Implements the save strategy for RAR projects
 */
public class RARProjectSaveStrategyImpl extends J2EESaveStrategyImpl {

	private ConnectorNatureRuntime connRT;

	/**
	 * Default constructor.
	 * 
	 * @param IProject
	 *            aProject - A project using this save strategy.
	 */
	public RARProjectSaveStrategyImpl(IProject aProject) {
		super(aProject);
		this.setConnectorNatureRuntime(ConnectorNatureRuntime.getRuntime(this.getProject()));
	} // RARProjectSaveStrategyImpl

	/**
	 * save method comment.
	 */
	public void initializeMofResourceURIList() {

		if (mofResourceURIList == null) {
			mofResourceURIList = new ArrayList();
			mofResourceURIList.add(ArchiveConstants.RAR_DD_URI);
		}
	}

	/**
	 * Returns the source URI
	 * 
	 * @return WorkbenchURIConverter
	 */
	public WorkbenchURIConverter getSourceURIConverter() {
		if (sourceURIConverter == null) {
			ConnectorNatureRuntime enr = ConnectorNatureRuntime.getRuntime(project);
			sourceURIConverter = new WorkbenchURIConverterImpl(enr.getSourceFolder());
			sourceURIConverter.setForceSaveRelative(true);
		}
		return sourceURIConverter;
	} // getSourceURIConverter

	/**
	 * saves the archive
	 */
	public void save(File aFile, InputStream in) throws SaveFailureException {
		String currentUri = aFile.getURI();
		try {
			String displayString = EJBArchiveOpsResourceHandler.getString("IMPORT_OPERATION_STRING"); //$NON-NLS-1$
			progressMonitor.subTask(displayString + aFile.getURI());
			WorkbenchURIConverter conv = null;
			if (isProjectMetaFile(aFile.getURI()))
				conv = getProjectMetaURIConverter();
			else
				conv = getSourceURIConverter();
			OutputStream out = null;

			IFile iFile = conv.getOutputFileWithMappingApplied(currentUri);
			validateEdit(iFile);
			out = new WorkbenchByteArrayOutputStream(iFile);
			ArchiveUtil.copy(in, out);
			worked(1);
		} catch (Exception e) {
			String errorString = EJBArchiveOpsResourceHandler.getString("ARCHIVE_OPERATION_SaveFile") + aFile.getName(); //$NON-NLS-1$
			throw new SaveFailureException(errorString, e);
		} // try

	} // save

	/**
	 * Gets the project name
	 * 
	 * @return String
	 */
	public String getProjectName() {
		return this.getArchive().getName().substring(0, this.getArchive().getName().indexOf(".")); //$NON-NLS-1$
	} // getProjectName

	protected boolean shouldOverwrite(String uri) {
		if (mofResourceURIList != null && mofResourceURIList.contains(uri))
			return true;
		return super.shouldOverwrite(uri);
	}

	/**
	 * Gets the connection runtime nature .
	 * 
	 * @return ConnectorNatureRuntime
	 */
	public ConnectorNatureRuntime getConnectorNatureRuntime() {
		return connRT;
	} // getConnectorNatureRuntime

	/**
	 * Sets the connection runtime nature
	 * 
	 * @param ConnectorNatureRuntime
	 *            connRT - The connector nature runtime.
	 */
	public void setConnectorNatureRuntime(ConnectorNatureRuntime connRT) {
		this.connRT = connRT;
	} // setConnectorNatureRuntime

} // RARProjectSaveStrategyImpl
