/*******************************************************************************
 * Copyright (c) 2001, 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.commonarchivecore.internal.impl;



import java.io.FileNotFoundException;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Container;
import org.eclipse.jst.j2ee.commonarchivecore.internal.EARFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ArchiveRuntimeException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.DuplicateObjectException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ResourceLoadException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ExportStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
import org.eclipse.jst.j2ee.internal.common.XMLResource;


/**
 * @generated
 */
public abstract class ModuleFileImpl extends ArchiveImpl implements ModuleFile {

	/** Implementer for extracting meta-data from this archive into the root object */
	protected ImportStrategy importStrategy;
	/** Implementer for adding meta-data to an about-to-be-exported archive */
	protected ExportStrategy exportStrategy;

	public ModuleFileImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected EClass eStaticClass() {
		return CommonarchivePackage.Literals.MODULE_FILE;
	}

	protected boolean canLazyInitialize() {
		return getImportStrategy() != null;
	}

	public Resource getDeploymentDescriptorResource() throws java.io.FileNotFoundException, ResourceLoadException {
		return getMofResource(getDeploymentDescriptorUri());
	}

	/**
	 * Subclasses must override
	 */
	public abstract String getDeploymentDescriptorUri();

	/**
	 * @see com.ibm.etools.commonarchive.ModuleFile
	 */
	public EARFile getEARFile() {
		Container aContainer = getContainer();
		if (aContainer == null || !aContainer.isEARFile()) {
			return null;
		}
		return ((EARFile) aContainer);
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @return com.ibm.etools.archive.ExportStrategy
	 */
	public org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ExportStrategy getExportStrategy() {
		return exportStrategy;
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @return com.ibm.etools.archive.ImportStrategy
	 */
	public org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy getImportStrategy() {
		return importStrategy;
	}

	/**
	 * Returns the specification version of the module file, or empty string if unknown version. For
	 * example, "2.0"
	 * 
	 * @deprecated, Use getDeploymentDescriptorResource().getModuleVersionID();
	 */
	public String getSpecVersion() {
		float ver = getSpecVersionID();
		Float specVersion = new Float(ver / 10);
		return specVersion.toString();
	}

	/**
	 * Return the version ID of the module For example, "20"
	 * 
	 * @return int
	 */
	public int getSpecVersionID() {
		try {
			return ((XMLResource) getDeploymentDescriptorResource()).getModuleVersionID();
		} catch (Exception e) {
			throw new ArchiveRuntimeException(e);
		}
	}

	/**
	 * @see com.ibm.etools.commonarchive.ModuleFile
	 */
	public abstract boolean isDeploymentDescriptorSet();

	/**
	 * @see com.ibm.etools.commonarchive.File
	 */
	public boolean isModuleFile() {
		return true;
	}



	/**
	 * subclasses must override
	 */
	public abstract EObject makeDeploymentDescriptor(XMLResource resource);

	public Resource makeDeploymentDescriptorResource() {
		XMLResource resource = null;
		try {
			resource = (XMLResource) makeMofResource(getDeploymentDescriptorUri());
		} catch (DuplicateObjectException ex) {
			try {
				return getDeploymentDescriptorResource();
			} catch (java.io.FileNotFoundException fnfEx) {
				//Ignore
			}
		}
		makeDeploymentDescriptor(resource);
		return resource;
	}

	public void save(SaveStrategy aSaveStrategy) throws SaveFailureException {
		setSaveStrategy(aSaveStrategy);
		if (getExportStrategy() != null)
			getExportStrategy().preSave(aSaveStrategy);
		super.save(aSaveStrategy);
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @param newExportStrategy
	 *            com.ibm.etools.archive.ExportStrategy
	 */
	public void setExportStrategy(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ExportStrategy newExportStrategy) {
		exportStrategy = newExportStrategy;
		if (newExportStrategy != null) {
			newExportStrategy.setArchive(this);
		}
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @param newImportStrategy
	 *            com.ibm.etools.archive.ImportStrategy
	 */
	public void setImportStrategy(org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.ImportStrategy newImportStrategy) {
		importStrategy = newImportStrategy;
		if (newImportStrategy != null) {
			newImportStrategy.setArchive(this);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ibm.etools.commonarchive.ModuleFile#setJ2EEVersion(int)
	 */
	public void setJ2EEVersion(int versionID) {
		try {
			((XMLResource) getDeploymentDescriptorResource()).setVersionID(versionID);
		} catch (ResourceLoadException e) {
			throw e;
		} catch (FileNotFoundException e) {
			throw new ArchiveRuntimeException(e);
		}
	}

}
