/*******************************************************************************
 * 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.internal.web.validation;



import java.util.Hashtable;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jst.j2ee.commonarchivecore.internal.WARFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.OpenFailureException;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.validation.J2EEValidationHelper;
import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;
import org.eclipse.jst.j2ee.model.internal.validation.WARMessageConstants;
import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
import org.eclipse.wst.common.componentcore.ArtifactEdit;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;



public class WarHelper extends J2EEValidationHelper {
	Hashtable warFileMap = new Hashtable();
	ArtifactEdit edit = null;
	WARFile warFile = null;
	final static String HelperID = "org.eclipse.wst.validation.internal.core.war.workbenchimpl.WarHelper"; //$NON-NLS-1$


	/**
	 * WarHelper constructor comment.
	 */

	public WarHelper() {
		super();

		registerModel(WARMessageConstants.WAR_MODEL_NAME, "loadWarFile"); //$NON-NLS-1$
	}

	/**
	 * This method will be invoked indirectly from the WarValidator (via. the WorkbenchReporter). It
	 * will expect the coming object to be a EObject for the node who generated this message. Note:
	 * This methods may need to be implemented higher up in the class stack.
	 */
	@Override
	public int getLineNo(Object object) {


		if (object instanceof Integer) { // Error discovered using the XML parser
			return ((Integer) object).intValue();
		}

		return super.getLineNo(object);
	}

	/**
	 * Given a resource, return its non-eclipse-specific location. If this resource, or type of
	 * resource, isn't handled by this helper, return null.
	 */
	@Override
	public String getPortableName(IResource resource) {
		if (!(resource instanceof IFile)) {
			return null;
		}

		IPath resourcePath = resource.getFullPath();
		if (resourcePath != null)
			return resourcePath.toString();

		return null;
	}

	/**
	 * Similar to the getFile() method, we know that we are talking about web.xml, but need a unique
	 * ID.
	 * 
	 * @return java.lang.String
	 * @param object
	 *            Object
	 */
	@Override
	public String getTargetObjectName(Object object) {
		
		if( object != null && object instanceof WARFile ){
			return J2EEConstants.WEBAPP_ID;
		}
		return null;
//		String ret = null;
//		if (object != null) {
//			IFile warFile = (IFile) warFileMap.get(getProject().toString());// validator framework
//																			// will call getFile()
//																			// first.
//			if (warFile != null) {
//				ret = (warFile.toString() + HelperID);
//			}
//		}
//		return ret;
	}

	
	public EObject loadWarFile() {
			IVirtualComponent comp = ComponentCore.createComponent(getProject());
			edit = ComponentUtilities.getArtifactEditForRead(comp);
			
			try {
				warFile = (WARFile)((WebArtifactEdit) edit).asArchive(false, true, true);
				return warFile;
			} catch (OpenFailureException e1) {
				WebPlugin.logError(e1);
			}
		return null;
	}	
	
	@Override
	public void cleanup(WorkbenchReporter reporter) {
		if (edit != null) {
			edit.dispose();
			edit = null;
		}	
		if(warFile != null){
			warFile.close();
			warFile = null;
		}
		super.cleanup(reporter);
	}
}
