/*******************************************************************************
 * Copyright (c) 2005, 2021 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
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jee.util.internal;

import java.io.IOException;
import java.io.InputStream;

import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.xml.sax.InputSource;

/**
 * A Utility for quickly determining the type and version of a Java EE
 * deployment descriptor.
 * 
 * @author jasholl
 * 
 */
public class JavaEEQuickPeek implements J2EEVersionConstants {

	private static final int UNSET = -2;

	private XMLRootHandler handler = null;

	public JavaEEQuickPeek(int type, int version) {
		this(type, version, UNSET);
	}

	public JavaEEQuickPeek(int type, int version, int javaEEVersion) {
		if (type == UNKNOWN) {
			throw new RuntimeException("type must not be UNKNOWN"); //$NON-NLS-1$
		} else if (version == UNKNOWN) {
			throw new RuntimeException("version must not be UNKNONW"); //$NON-NLS-1$
		} else if (javaEEVersion == UNKNOWN) {
			throw new RuntimeException("javaEEVersion must not be UNKNONW"); //$NON-NLS-1$
		}
		this.type = type;
		this.version = version;
		this.javaEEVersion = javaEEVersion;
	}

	public JavaEEQuickPeek(InputStream in) {
		if (in != null) {
			try {
				InputSource inputSource = new InputSource(in);
				handler = new XMLRootHandler();
				handler.parseContents(inputSource);
			} catch (Exception ex) {
				// ignore
			} finally {
				try {
					in.reset();
				} catch (IOException ex) {
					// ignore
				}
			}
		} else {
			version = UNKNOWN;
			javaEEVersion = UNKNOWN;
			type = UNKNOWN;
		}
	}

	private int version = UNSET;

	private int javaEEVersion = UNSET;

	private int type = UNSET;

	/**
	 * Returns the deployment descriptor type as defined by one of
	 * { @link J2EEVersionConstants#UNKNOWN},
	 * { @link J2EEVersionConstants#APPLICATION_CLIENT_TYPE},
	 * { @link J2EEVersionConstants#APPLICATION_TYPE},
	 * { @link J2EEVersionConstants#EJB_TYPE},
	 * { @link J2EEVersionConstants#CONNECTOR_TYPE},
	 * { @link J2EEVersionConstants#WEB_TYPE},
	 * { @link J2EEVersionConstants#WEBSERVICES_TYPE}
	 * { @link J2EEVersionConstants#WEBFRAGMENT_TYPE}
	 * 
	 * @return
	 */
	public int getType() {
		if (type == UNSET) {
			String rootName = handler.getRootName();
			if (rootName == null) {
				type = UNKNOWN;
			} else if (rootName.equals(J2EEConstants.APP_CLIENT_DOCTYPE)) {
				type = APPLICATION_CLIENT_TYPE;
			} else if (rootName.equals(J2EEConstants.APPLICATION_DOCTYPE)) {
				type = APPLICATION_TYPE;
			} else if (rootName.equals(J2EEConstants.EJBJAR_DOCTYPE)) {
				type = EJB_TYPE;
			} else if (rootName.equals(J2EEConstants.CONNECTOR_DOCTYPE)) {
				type = CONNECTOR_TYPE;
			} else if (rootName.equals(J2EEConstants.WEBAPP_DOCTYPE)) {
				type = WEB_TYPE;
			} else if (rootName.equals(J2EEConstants.WEB_SERVICES_DOCTYPE)) {
				type = WEBSERVICES_TYPE;
			} else if (rootName.equals(J2EEConstants.WEBFRAGMENT_DOCTYPE)) {
				type = WEBFRAGMENT_TYPE;
			}
			else {
				type = UNKNOWN;
			}
		}
		return type;
	}

	public static String normalizeSchemaLocation(String schemaLocation){
		if(schemaLocation == null){
			return null;
		}
		char [] oldChars = schemaLocation.toCharArray();
		char [] newChars = new char[oldChars.length];
		int newCharIndex = 0;
		boolean onWhiteSpace = true;
		boolean afterWhiteSpace = false;
		for(int oldCharIndex=0; oldCharIndex<oldChars.length; oldCharIndex++){
			afterWhiteSpace = onWhiteSpace;
			onWhiteSpace = Character.isWhitespace(oldChars[oldCharIndex]);
			boolean shouldSkip = onWhiteSpace && afterWhiteSpace;
			if(!shouldSkip){
				newChars[newCharIndex++] = onWhiteSpace ? ' ' : oldChars[oldCharIndex];
			}
			boolean atEnd = ((oldCharIndex + 1) == oldChars.length);
			if(atEnd && onWhiteSpace){
				while(newCharIndex > 0  && newChars[newCharIndex-1] == ' '){
					newCharIndex --;
				}
			}
		}
		return new String(newChars, 0, newCharIndex);
	}
	
	/**
	 * Returns the module version for this deployment descriptor type. For
	 * example, if this is a EJB 3.0 deployment descriptor, this returns the
	 * constant for 3.0 as defined bye {@link J2EEVersionConstants}
	 * 
	 * @return
	 */
	public int getVersion() {
		if (version == UNSET) {
			String publicID = handler.getDtdPublicID();
			String systemID = handler.getDtdSystemID();
			String schemaName = null;
			String namespace = null;
			if (publicID == null || systemID == null) {
				if (handler.getRootAttributes() != null) {
					schemaName = normalizeSchemaLocation(handler.getRootAttributes().getValue("xsi:schemaLocation")); //$NON-NLS-1$
				}
			}
			switch (getType()) {
			case APPLICATION_CLIENT_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.APP_CLIENT_PUBLICID_1_3)
							&& (systemID.equals(J2EEConstants.APP_CLIENT_SYSTEMID_1_3) || systemID.equals(J2EEConstants.APP_CLIENT_ALT_SYSTEMID_1_3))) {
						version = J2EEVersionConstants.J2EE_1_3_ID;
					} else if (publicID.equals(J2EEConstants.APP_CLIENT_PUBLICID_1_2)
							&& (systemID.equals(J2EEConstants.APP_CLIENT_SYSTEMID_1_2) || systemID.equals(J2EEConstants.APP_CLIENT_ALT_SYSTEMID_1_2))) {
						version = J2EEVersionConstants.J2EE_1_2_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_1_4)!= -1) {
						version = J2EEVersionConstants.J2EE_1_4_ID;
					} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_5)!= -1) {
						version = J2EEVersionConstants.JEE_5_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_6)!= -1) {
						version = J2EEVersionConstants.JEE_6_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_7)!= -1) {
						version = J2EEVersionConstants.JEE_7_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APP_CLIENT_SCHEMA_8) != -1) {
						version = J2EEVersionConstants.JEE_8_0_ID;
					}
				}
				break;
			case APPLICATION_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.APPLICATION_PUBLICID_1_3)
							&& (systemID.equals(J2EEConstants.APPLICATION_SYSTEMID_1_3) || systemID.equals(J2EEConstants.APPLICATION_ALT_SYSTEMID_1_3))) {
						version = J2EEVersionConstants.J2EE_1_3_ID;
					} else if (publicID.equals(J2EEConstants.APPLICATION_PUBLICID_1_2)
							&& (systemID.equals(J2EEConstants.APPLICATION_SYSTEMID_1_2) || systemID.equals(J2EEConstants.APPLICATION_ALT_SYSTEMID_1_2))) {
						version = J2EEVersionConstants.J2EE_1_2_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_1_4) != -1) {
						version = J2EEVersionConstants.J2EE_1_4_ID;
					} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_5) != -1) {
						version = J2EEVersionConstants.JEE_5_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_6) != -1) {
						version = J2EEVersionConstants.JEE_6_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_7) != -1){
						version = J2EEVersionConstants.JEE_7_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.APPLICATION_SCHEMA_8) != -1) {
						version = J2EEVersionConstants.JEE_8_0_ID;
					}
				}
				break;
			case EJB_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.EJBJAR_PUBLICID_2_0) && (systemID.equals(J2EEConstants.EJBJAR_SYSTEMID_2_0) || systemID.equals(J2EEConstants.EJBJAR_ALT_SYSTEMID_2_0))) {
						version = J2EEVersionConstants.EJB_2_0_ID;
					} else if (publicID.equals(J2EEConstants.EJBJAR_PUBLICID_1_1) && (systemID.equals(J2EEConstants.EJBJAR_SYSTEMID_1_1) || systemID.equals(J2EEConstants.EJBJAR_ALT_SYSTEMID_1_1))) {
						version = J2EEVersionConstants.EJB_1_1_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_2_1) != -1) {
						version = J2EEVersionConstants.EJB_2_1_ID;
					} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_0) != -1) {
						version = J2EEVersionConstants.EJB_3_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_1) != -1) {
						version = J2EEVersionConstants.EJB_3_1_ID;
					} else if (schemaName.indexOf(J2EEConstants.EJBJAR_SCHEMA_3_2) != -1) {
						version = J2EEVersionConstants.EJB_3_2_ID;
					}
				}
				break;
			case CONNECTOR_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.CONNECTOR_PUBLICID_1_0) && (systemID.equals(J2EEConstants.CONNECTOR_SYSTEMID_1_0) || systemID.equals(J2EEConstants.CONNECTOR_ALT_SYSTEMID_1_0))) {
						version = J2EEVersionConstants.JCA_1_0_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_5) != -1) {
						version = J2EEVersionConstants.JCA_1_5_ID;
					} else if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_6) != -1) {
						version = J2EEVersionConstants.JCA_1_6_ID;
					} else if (schemaName.indexOf(J2EEConstants.CONNECTOR_SCHEMA_1_7) != -1) {
						version = J2EEVersionConstants.JCA_1_7_ID;
					}
				}
				break;
			case WEB_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.WEBAPP_PUBLICID_2_3) && (systemID.equals(J2EEConstants.WEBAPP_SYSTEMID_2_3) || systemID.equals(J2EEConstants.WEBAPP_ALT_SYSTEMID_2_3))) {
						version = J2EEVersionConstants.WEB_2_3_ID;
					} else if (publicID.equals(J2EEConstants.WEBAPP_PUBLICID_2_2) && (systemID.equals(J2EEConstants.WEBAPP_SYSTEMID_2_2) || systemID.equals(J2EEConstants.WEBAPP_ALT_SYSTEMID_2_2))) {
						version = J2EEVersionConstants.WEB_2_2_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_2_4) != -1) {
						version = J2EEVersionConstants.WEB_2_4_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_2_5) != -1) {
						version = J2EEVersionConstants.WEB_2_5_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_3_0) != -1) {
						version = J2EEVersionConstants.WEB_3_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_3_1) != -1) {
						version = J2EEVersionConstants.WEB_3_1_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_4_0) != -1) {
						version = J2EEVersionConstants.WEB_4_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBAPP_SCHEMA_5_0) != -1) {
						version = J2EEVersionConstants.WEB_5_0_ID;
					}
				} else if (J2EEConstants.J2EE_NS_URL.equals(namespace)) {
					String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
					if (J2EEVersionConstants.VERSION_2_4_TEXT.equals(versionAttribute)) {
						version = J2EEVersionConstants.WEB_2_4_ID;
					}
				} else if (J2EEConstants.JAVAEE_NS_URL.equals(namespace)) {
					String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
					if (J2EEVersionConstants.VERSION_2_5_TEXT.equals(versionAttribute)) {
						version = J2EEVersionConstants.WEB_2_5_ID;
					} else if (J2EEVersionConstants.VERSION_3_0_TEXT.equals(versionAttribute)) {
						version = J2EEVersionConstants.WEB_3_0_ID;
					}
				} else if (J2EEConstants.JAVAEE7_NS_URL.equals(namespace)) {
					String versionAttribute = handler.getRootAttributes().getValue("version"); //$NON-NLS-1$
					if (J2EEVersionConstants.VERSION_3_1_TEXT.equals(versionAttribute)) {
						version = J2EEVersionConstants.WEB_3_1_ID;
					} else if (J2EEVersionConstants.VERSION_4_0_TEXT.equals(versionAttribute)) {
						version = J2EEVersionConstants.WEB_4_0_ID;
					}
				}
				break;
			case WEBSERVICES_TYPE:
				if (publicID != null && systemID != null) {
					if (publicID.equals(J2EEConstants.WEBSERVICE_PUBLICID) && (systemID.equals(J2EEConstants.WEBSERVICE_SYSTEMID))) {
						version = J2EEVersionConstants.WEBSERVICES_1_0_ID;
					}
				} else if (schemaName != null) {
					if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_1)) {
						version = J2EEVersionConstants.WEBSERVICES_1_1_ID;
					} else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_2)) {
						version = J2EEVersionConstants.WEBSERVICES_1_2_ID;
					}else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_3)) {
						version = J2EEVersionConstants.WEBSERVICES_1_3_ID;
					}else if (schemaName.equals(J2EEConstants.WEBSERVICE_SCHEMA_1_4)) {
						version = J2EEVersionConstants.WEBSERVICES_1_4_ID;
					}
				}
				break;
			case WEBFRAGMENT_TYPE:
				if (schemaName != null) {
					if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_3_0) != -1) {
						version = J2EEVersionConstants.WEBFRAGMENT_3_0_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_3_1) != -1) {
						version = J2EEVersionConstants.WEBFRAGMENT_3_1_ID;
					} else if (schemaName.indexOf(J2EEConstants.WEBFRAGMENT_SCHEMA_4_0) != -1) {
						version = J2EEVersionConstants.WEBFRAGMENT_4_0_ID;
					}
				}
				break;
			default:
				break;
			}
			if (version == UNSET) {
				version = UNKNOWN;
			}
		}
		return version;
	}

	/**
	 * Maps the version returned from {@link #getVersion()} to the Java EE spec
	 * version. For example, this is an EJB 3.0 deployment descriptor, this
	 * returns the constant for 5.0 (which maps to the Java EE spec version of
	 * 5.0). as defined by {@link J2EEVersionConstants}
	 * 
	 * @return
	 */
	public int getJavaEEVersion() {
		if (javaEEVersion == UNSET) {
			int type = getType();
			int version = getVersion();
			switch (type) {
			case APPLICATION_CLIENT_TYPE:
			case APPLICATION_TYPE:
				javaEEVersion = version;
				break;
			case EJB_TYPE:
				switch (version) {
				case J2EEVersionConstants.EJB_1_1_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_2_ID;
					break;
				case J2EEVersionConstants.EJB_2_0_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
					break;
				case J2EEVersionConstants.EJB_2_1_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
					break;
				case J2EEVersionConstants.EJB_3_0_ID:
					javaEEVersion = J2EEConstants.JEE_5_0_ID;
					break;
				case J2EEVersionConstants.EJB_3_1_ID:
					javaEEVersion = J2EEConstants.JEE_6_0_ID;
					break;
				case J2EEVersionConstants.EJB_3_2_ID:
					javaEEVersion = J2EEConstants.JEE_7_0_ID;
					break;
				}
				break;
			case CONNECTOR_TYPE:
				switch (version) {
				case J2EEVersionConstants.JCA_1_0_ID:
					javaEEVersion = J2EEConstants.J2EE_1_3_ID;
					break;
				case J2EEVersionConstants.JCA_1_5_ID:
					javaEEVersion = J2EEConstants.J2EE_1_4_ID;
					break;
				case J2EEVersionConstants.JCA_1_6_ID:
					javaEEVersion = J2EEConstants.JEE_6_0_ID;
					break;
				case J2EEVersionConstants.JCA_1_7_ID:
					javaEEVersion = J2EEConstants.JEE_7_0_ID;
					break;
				}
				break;
			case WEB_TYPE:
				switch (version) {
				case J2EEVersionConstants.WEB_2_2_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_2_ID;
					break;
				case J2EEVersionConstants.WEB_2_3_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
					break;
				case J2EEVersionConstants.WEB_2_4_ID:
					javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
					break;
				case J2EEVersionConstants.WEB_2_5_ID:
					javaEEVersion = J2EEVersionConstants.JEE_5_0_ID;
					break;
				case J2EEVersionConstants.WEB_3_0_ID:
					javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
					break;
				case J2EEVersionConstants.WEB_3_1_ID:
					javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
					break;
				case J2EEVersionConstants.WEB_4_0_ID:
					javaEEVersion = J2EEVersionConstants.JEE_8_0_ID;
					break;
				case J2EEVersionConstants.WEB_5_0_ID:
					javaEEVersion = J2EEVersionConstants.JEE_9_0_ID;
					break;
				}
				break;
		case WEBSERVICES_TYPE:
			switch (version) {
			case J2EEVersionConstants.WEBSERVICES_1_0_ID:
				javaEEVersion = J2EEVersionConstants.J2EE_1_3_ID;
				break;
			case J2EEVersionConstants.WEBSERVICES_1_1_ID:
				javaEEVersion = J2EEVersionConstants.J2EE_1_4_ID;
				break;
			case J2EEVersionConstants.WEBSERVICES_1_2_ID:
				javaEEVersion = J2EEVersionConstants.JEE_5_0_ID;
				break;
			case J2EEVersionConstants.WEBSERVICES_1_3_ID:
				javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
				break;
			case J2EEVersionConstants.WEBSERVICES_1_4_ID:
				javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
				break;
			}
			break;
			
		case WEBFRAGMENT_TYPE:
			switch(version) {
			case J2EEVersionConstants.WEBFRAGMENT_3_0_ID:
				javaEEVersion = J2EEVersionConstants.JEE_6_0_ID;
				break;
			case J2EEVersionConstants.WEBFRAGMENT_3_1_ID:
				javaEEVersion = J2EEVersionConstants.JEE_7_0_ID;
				break;
			case J2EEVersionConstants.WEBFRAGMENT_4_0_ID:
				javaEEVersion = J2EEVersionConstants.JEE_8_0_ID;
				break;
			}
			break;
		}
			
			if (javaEEVersion == UNSET) {
				javaEEVersion = UNKNOWN;
			}
		}
		return javaEEVersion;
	}

	public void setVersion(int version) {
		this.version = version;
	}

	public void setJavaEEVersion(int javaEEVersion) {
		this.javaEEVersion = javaEEVersion;
	}

	public void setType(int type) {
		this.type = type;
	}

}
