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

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jst.j2ee.application.Application;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.common.J2EEVersionResource;
import org.eclipse.jst.j2ee.internal.common.XMLResource;
import org.eclipse.jst.j2ee.internal.xml.J2EEXmlDtDEntityResolver;
import org.eclipse.wst.common.internal.emf.resource.Renderer;
import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl;
import org.xml.sax.EntityResolver;


public abstract class XMLResourceImpl extends TranslatorResourceImpl implements XMLResource,J2EEVersionResource {
	/** Indicator to determine if this resource was loaded as an alt-dd (from an ear),
	  * default is false */
	protected boolean isAlt = false;
	/** The application which declared the alt-dd for this resource; exists only if this resource is and
	  * alt dd */
	protected Application application;
	protected boolean isNew = true;
	
	
	private static class RootVersionAdapter extends AdapterImpl {
		static final String ADAPTER_TYPE = RootVersionAdapter.class.getName();
		/* (non-Javadoc)
		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
		 */
		public boolean isAdapterForType(Object type) {
			return super.isAdapterForType(type);
		}
		
		/* (non-Javadoc)
		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
		 */
		public void notifyChanged(Notification msg) {
			if (msg.getFeatureID(null) == RESOURCE__CONTENTS &&
				msg.getEventType() == Notification.ADD) {
					((XMLResourceImpl)msg.getNotifier()).syncVersionOfRootObject();
					((Notifier)msg.getNotifier()).eAdapters().remove(this);
				}
		}
		
		

	
	}
	
	/**
	 * @deprecated since 4/29/2003 - used for compatibility
	 * Subclasses should be using the Renderers and translator framework 
	 */
	public XMLResourceImpl() {
		super();
	}

	/**
	 * @deprecated since 4/29/2003 - used for compatibility
	 * Subclasses should be using the Renderers and translator framework 
	 */
	public XMLResourceImpl(URI uri) {
		super(uri);
	}
	
	public XMLResourceImpl(URI uri, Renderer aRenderer) {
		super(uri, aRenderer);
	}

	public XMLResourceImpl(Renderer aRenderer) {
		super(aRenderer);
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.impl.TranslatorResourceImpl#initializeContents()
	 */
	protected void initializeContents() {
		super.initializeContents();
		eAdapters().add(new RootVersionAdapter());
	}

	
	/**
	 * Is this a resource loaded as an alternate deployment descriptor?
	 */
	public boolean isAlt() {
		return isAlt;
	}
	
	
	public void setApplication(Application newApplication) {
		application = newApplication;
	}
	/**
	 * Is this a resource loaded as an alternate deployment descriptor?
	 */
	public void setIsAlt(boolean isAlternateDD) {
		isAlt = isAlternateDD;
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.impl.TranslatorResourceImpl#getDefaultVersionID()
	 */
	protected int getDefaultVersionID() {
		return J2EE_1_4_ID;
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.TranslatorResource#setDoctypeValues(java.lang.String, java.lang.String)
	 * This is setting the module version on the resource, where values are different that the J2EE version, this will be overridden
	 */
	public void setDoctypeValues(String publicId, String systemId) {
		int version = J2EE_1_4_ID;
		if (systemId == null) 
			version = J2EE_1_4_ID;
		else if (systemId.equals(getJ2EE_1_3_SystemID()))
			version = J2EE_1_3_ID;
		else if (systemId.equals(getJ2EE_1_2_SystemID()))
			version = J2EE_1_2_ID;
		super.setDoctypeValues(publicId, systemId);
		setJ2EEVersionID(version);
	}


	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.TranslatorResource#usesDTD()
	 */
	public boolean usesDTD() {
		return getVersionID() != J2EE_1_4_ID;
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.etools.emf2xml.TranslatorResource#setVersionID(int)
	 * @deprecated, Use setJ2EEVersionID() to set module version based on j2ee version
	 **/
	public void setVersionID(int id) {
		setJ2EEVersionID(id);
	}
	protected void primSetVersionID(int id) {
		super.setVersionID(id);
	}
	protected void primSetDoctypeValues(String aPublicId, String aSystemId) {
		super.setDoctypeValues(aPublicId,aSystemId);
	}
	/*
	 * Sets the module version based on the J2EE version
	 */
	public abstract void setJ2EEVersionID(int id);
	/*
	 * Sets the module version directly
	 * */
	 public abstract void setModuleVersionID(int id);
	/**
	 * @deprecated 
	 * (non-Javadoc)
	 * @see org.eclipse.jst.j2ee.internal.XMLResource#isJ2EE1_3()
	 */
	public boolean isJ2EE1_3() {
		return getVersionID() == J2EE_1_3_ID;
	}
	
	/**
	 * @deprecated use {@link TranslatorResource#setVersionID(int)}, 
	 * {@link TranslatorResource#setDoctypeValues(String, String)}
	 * Sets the system id of the XML document.
	 * @see J2EEVersionConstants
	 */
	public void setPublicId(String id) {
		setDoctypeValues(id, getSystemId());
	}
	
	/**
	 * @deprecated use {@link TranslatorResource#setVersionID(int)},
	 * {@link TranslatorResource#setDoctypeValues(String, String)}
	 * Sets the public id of the XML document.
	 * @see J2EEVersionConstants
	 */
	public void setSystemId(String id) {
		setDoctypeValues(getPublicId(), id);
	}
	protected String getDefaultPublicId() {
		switch (getVersionID()) {
			case (J2EE_1_2_ID) :
				return getJ2EE_1_2_PublicID();
			case (J2EE_1_3_ID) :	
				return getJ2EE_1_3_PublicID();
			default :
				return null;
		}	
	}

	protected String getDefaultSystemId() {
		switch (getVersionID()) {
			case (J2EE_1_2_ID) :
				return getJ2EE_1_2_SystemID();
			case (J2EE_1_3_ID) :	
				return getJ2EE_1_3_SystemID();
			default :
				return null;
		}
	}
	public abstract String getJ2EE_1_2_PublicID();
	public abstract String getJ2EE_1_2_SystemID();
	public abstract String getJ2EE_1_3_PublicID();
	public abstract String getJ2EE_1_3_SystemID();
	
	
	public NotificationChain basicSetResourceSet(ResourceSet aResourceSet, NotificationChain notifications) {
		if (aResourceSet == null && this.resourceSet != null)
			preDelete();
		return super.basicSetResourceSet(aResourceSet, notifications);
	}
		
	public Application getApplication() {
		return application;
	}
	
	/**
	 * @deprecated - use getJ2EEVersionID() and getModuleVersionID()
	 */
	public int getVersionID() {
		return getJ2EEVersionID();
	}
	
	public EntityResolver getEntityResolver() {
		return J2EEXmlDtDEntityResolver.INSTANCE;
	}	
	/* All subclasses will derive this value based on their module version
	 */
	public abstract int getJ2EEVersionID();

	

	/* This will be computed during loads of the resource
	 */
	public int getModuleVersionID() {
		return super.getVersionID();
	}
	
	protected abstract void syncVersionOfRootObject();
	
	protected String getModuleVersionString() {
		float ver = getModuleVersionID();
		Float specVersion = new Float(ver/10);
		return specVersion.toString();
	}

}
