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


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jst.j2ee.common.internal.impl.XMLResourceImpl;
import org.eclipse.jst.j2ee.core.internal.plugin.J2EECorePlugin;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.model.translator.webservices.WsddTranslator;
import org.eclipse.jst.j2ee.webservice.internal.WebServiceConstants;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
import org.eclipse.jst.jee.util.internal.JavaEEQuickPeek;
import org.eclipse.wst.common.internal.emf.resource.Renderer;
import org.eclipse.wst.common.internal.emf.resource.Translator;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;

public class WsddResourceImpl extends XMLResourceImpl implements WsddResource
{
	/**
	 * Constructor for WsddResourceImpl.
	 */
	public WsddResourceImpl(URI uri, Renderer aRenderer) {
		super(uri, aRenderer);
	}

	/**
	 * Constructor for WsddResourceImpl.
	 * @param uri
	 */
	public WsddResourceImpl(Renderer aRenderer) {
		super(aRenderer);
	}

	/**
	 * Return the first element in the EList.
	 */
	public WebServices getWebServices() {
		return (WebServices) getRootObject();
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.TranslatorResource#getRootTranslator()
	 */
	public Translator getRootTranslator() {
		return WsddTranslator.INSTANCE;
	}

	/**
	 * @see org.eclipse.jst.j2ee.internal.common.XMLResource#getType()
	 */
	public int getType() {
		return WEB_SERVICE_TYPE;
	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.TranslatorResource#getDoctype()
	 */
	public String getDoctype() 
	{
	  switch (getJ2EEVersionID()) 
	  {
	    case (J2EE_1_2_ID) :
	    case (J2EE_1_3_ID) :	
	      return WebServiceConstants.WEBSERVICE_DOCTYPE;
	    default :
    		return null;
    }


	}

   public boolean isWebService1_0()
   {
      return (getModuleVersionID()==WebServiceConstants.WEBSERVICE_1_0_ID);
   }

   public boolean isWebService1_1()
   {
      return (getModuleVersionID()==WebServiceConstants.WEBSERVICE_1_1_ID);  
   }
   public boolean isWebService1_2()
   {
      return (getModuleVersionID()==WebServiceConstants.WEBSERVICE_1_2_ID);  
   }
   public boolean isWebService1_3()
   {
      return (getModuleVersionID()==WebServiceConstants.WEBSERVICE_1_3_ID);  
   }

	/* 
	 * This directly sets the module version id
	 */
	@Override
	public void setModuleVersionID(int id) {
	//super.setVersionID(id);
	switch (id) {
			case (WebServiceConstants.WEBSERVICE_1_3_ID) :
				super.setDoctypeValues(null, null);
				primSetVersionID(WebServiceConstants.WEBSERVICE_1_3_ID);
				break;
			case (WebServiceConstants.WEBSERVICE_1_2_ID) :
				super.setDoctypeValues(null, null);
				primSetVersionID(WebServiceConstants.WEBSERVICE_1_2_ID);
				break;
			case (WebServiceConstants.WEBSERVICE_1_1_ID) :
				super.setDoctypeValues(null, null);
				primSetVersionID(WebServiceConstants.WEBSERVICE_1_1_ID);
				break;
			case (WebServiceConstants.WEBSERVICE_1_0_ID) :
				super.setDoctypeValues(getJ2EE_1_3_PublicID(), getJ2EE_1_3_SystemID());
				break;			
		}
	}
	/*
	 * Based on the J2EE version, this will set the module version
	 */
	@Override
	public void setJ2EEVersionID(int id) 
  {
    switch (id) {
    	case (JEE_6_0_ID) :
					primSetDoctypeValues(null, null);
					primSetVersionID(WebServiceConstants.WEBSERVICE_1_3_ID);
					break;
	    case (JEE_5_0_ID) :
					primSetDoctypeValues(null, null);
					primSetVersionID(WebServiceConstants.WEBSERVICE_1_2_ID);
					break;
    	case (J2EE_1_4_ID) :
    				primSetDoctypeValues(null, null);
    				primSetVersionID(WebServiceConstants.WEBSERVICE_1_1_ID);
    				break;
    	case (J2EE_1_3_ID) :
    				primSetDoctypeValues(getJ2EE_1_3_PublicID(), getJ2EE_1_3_SystemID());
    				primSetVersionID(WebServiceConstants.WEBSERVICE_1_0_ID);
    				break;
    	case (J2EE_1_2_ID) :
    				primSetDoctypeValues(getJ2EE_1_2_PublicID(), getJ2EE_1_2_SystemID());
    				primSetVersionID(WebServiceConstants.WEBSERVICE_1_0_ID);
    		}

	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.j2eexml.XMLResourceImpl#getJ2EE_1_2_PublicID()
	 */
	@Override
	public String getJ2EE_1_2_PublicID() {
	  return  WebServiceConstants.WEBSERVICE_PUBLICID;
	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.j2eexml.XMLResourceImpl#getJ2EE_1_2_SystemID()
	 */
	@Override
	public String getJ2EE_1_2_SystemID() {
	  return WebServiceConstants.WEBSERVICE_SYSTEMID;
	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.j2eexml.XMLResourceImpl#getJ2EE_1_3_PublicID()
	 */
	@Override
	public String getJ2EE_1_3_PublicID() {
	  return WebServiceConstants.WEBSERVICE_PUBLICID;
	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.j2eexml.XMLResourceImpl#getJ2EE_1_3_SystemID()
	 */
	@Override
	public String getJ2EE_1_3_SystemID() {
    return WebServiceConstants.WEBSERVICE_SYSTEMID;
	}

	/* Return J2EE version based on module version
	*/
	@Override
	public int getJ2EEVersionID() {
		switch (getModuleVersionID()) {
			case WebServiceConstants.WEBSERVICE_1_0_ID:
				return J2EEVersionConstants.J2EE_1_3_ID;
			case WebServiceConstants.WEBSERVICE_1_1_ID :
				return J2EEVersionConstants.J2EE_1_4_ID;
			case WebServiceConstants.WEBSERVICE_1_2_ID :
				return J2EEVersionConstants.JEE_5_0_ID;
			case WebServiceConstants.WEBSERVICE_1_3_ID :
				return J2EEVersionConstants.JEE_6_0_ID;
			default :
			return J2EEVersionConstants.JEE_6_0_ID;
		}
	}

	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.impl.TranslatorResourceImpl#getDefaultVersionID()
	 */
	@Override
	protected int getDefaultVersionID() {
		return WebServiceConstants.WEBSERVICE_1_0_ID;
	}


  @Override
protected void syncVersionOfRootObject()
  {
    //Do nothing for now since the root object does not have a version.
  }


@Override
public void setDoctypeValues(String publicId, String systemId) {
	
		int myVersion = J2EE_1_4_ID;
		if (systemId == null) {
			myVersion = primGetVersionID();
			setModuleVersionID(myVersion);
			return;
		}
		super.setDoctypeValues(publicId, systemId);
		
}

private int primGetVersionID() {
	IFile afile = WorkbenchResourceHelper.getFile(this);
	InputStream in = null;
	JavaEEQuickPeek quickPeek = null;
	if (afile != null && afile.exists()) {
		try {
			in = afile.getContents();
			quickPeek = new JavaEEQuickPeek(in);
			return quickPeek.getVersion();
		}
		catch (CoreException e) {
			J2EECorePlugin.logError(e);
		}
	} else{
		String path = getURI().toFileString();
		if (path != null) {
			try {
				in = new FileInputStream(path);
				quickPeek = new JavaEEQuickPeek(in);
				return quickPeek.getVersion();
			} catch (FileNotFoundException e1) {
				J2EECorePlugin.logError(e1);
			} finally {
				if (in != null) {
					try {
						in.close();
					} catch (IOException e) {
						J2EECorePlugin.logError(e);
					}
				}
			}
		}
	}
	return getModuleVersionID();
}

  
    
}

