/*******************************************************************************
 * Copyright (c) 2005, 2007 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
 *******************************************************************************/
/*
 * Created on Apr 14, 2003
 *
 * To change this generated comment go to 
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.eclipse.jst.j2ee.archive.testutilities;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jst.j2ee.application.ApplicationPackage;
import org.eclipse.jst.j2ee.client.ClientPackage;
import org.eclipse.jst.j2ee.common.CommonPackage;
import org.eclipse.jst.j2ee.ejb.EjbPackage;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.jca.JcaPackage;
import org.eclipse.jst.j2ee.webapplication.WebapplicationPackage;

public class J2EEVersionCheck {
	public int version;
	//static versions
	public static final int VERSION_1_2 = 0;
	public static final int VERSION_1_3 = 1;
	public static final int VERSION_1_4 = 2;
	
	//modules
	public static final int APPICATION = 0;
	public static final int APP_CLIENT = 1;
	public static final int CONNECTOR = 2;
	public static final int EJB = 3;
	public static final int WEB = 4;

	public static List cur_Tags;
	private static CommonPackage COM = CommonPackage.eINSTANCE;

    public J2EEVersionCheck() {
        super();
    }
	public static boolean checkAttributeVersion(EAttribute att, int version, int type){
		//TODO: Add version 1.2 excludes
		if(version == VERSION_1_3 || version == VERSION_1_2){
			if(cur_Tags == null){
				cur_Tags = new ArrayList();
				populate_1_3List(type);
			}
		}
		else if(version == VERSION_1_4 || version == J2EEVersionConstants.JEE_5_0_ID){
			return true;
		}
		
		if(cur_Tags.contains(att) || cur_Tags.contains(att.getEType()))
			return false;
		return true;
	}
    
     public static boolean checkReferenceVersion(EStructuralFeature ref, int version, int type){
		//TODO: Add version 1.2 excludes
		if(version == VERSION_1_3 || version == VERSION_1_2){
			if(cur_Tags == null){
				cur_Tags = new ArrayList();
				populate_1_3List(type);
			}
		}
		else if(version == VERSION_1_4 || version == J2EEVersionConstants.JEE_5_0_ID){
			return true;
		}
		
		if(cur_Tags.contains(ref) || cur_Tags.contains(ref.getEType()))
			return false;
		return true;
    }
       
	private static void populate_1_2List(int type) {
		switch (type) {
			case APPICATION :
				populate_1_2Application();
				break;
			case APP_CLIENT :
				populate_1_2AppClient();
				break;
			case EJB :
				populate_1_2EJB();
				break;
			case CONNECTOR :
				populate_1_2EJB();
				break;
			case WEB :
				populate_1_2Web();
			default :
				break;
		}
	}
	
	private static void populate_1_3List(int type) {
		switch (type) {
			case APPICATION :
				populate_1_3Application();
				break;
			case APP_CLIENT :
				populate_1_3AppClient();
				break;
			case EJB :
				populate_1_3EJB();
				break;
			case CONNECTOR :
				populate_1_3EJB();
				break;
			case WEB :
				populate_1_3Web();
			default :
				break;
		}
	}

    private static void populate_1_2Application(){
		populate_1_3Application();
    }

	private static void populate_1_2AppClient(){
		populate_1_3AppClient();
	}
	
	private static void populate_1_2EJB(){
		populate_1_3EJB();
	}
	
	private static void populate_1_2Connector(){
		populate_1_3Connector();
	}
	
	private static void populate_1_2Web(){
		populate_1_3Web();
	}

	//1.3
	private static void populate_1_3Application(){
		CommonPackage COM = CommonPackage.eINSTANCE;
		cur_Tags.add(COM.getIconType());
		cur_Tags.add(COM.getDisplayName());
		cur_Tags.add(COM.getDescription());
		cur_Tags.add(COM.getDescriptionGroup());
		cur_Tags.add(COM.getSecurityIdentity_Descriptions());
		cur_Tags.add(ApplicationPackage.eINSTANCE.getApplication_Version());	
	}
	
	private static void populate_1_3AppClient(){
		cur_Tags.add(COM.getIconType());
		cur_Tags.add(COM.getDisplayName());
		cur_Tags.add(COM.getDescription());
		cur_Tags.add(COM.getDescriptionGroup());
		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_Version());
		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_ServiceRefs());
		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_MessageDestinationRefs());
		cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_MessageDestinations());
		cur_Tags.add(COM.getMessageDestination());
		cur_Tags.add(COM.getMessageDestinationRef());
		//cur_Tags.add(ClientPackage.eINSTANCE.getApplicationClient_ServiceRefs());
	}
	
	private static void populate_1_3Connector(){
		cur_Tags.add(COM.getIconType());
		cur_Tags.add(COM.getDisplayName());
		cur_Tags.add(COM.getDescription());
		cur_Tags.add(COM.getDescriptionGroup());
		cur_Tags.add(JcaPackage.eINSTANCE.getOutboundResourceAdapter());
		cur_Tags.add(JcaPackage.eINSTANCE.getInboundResourceAdapter());
		cur_Tags.add(JcaPackage.eINSTANCE.getAdminObject());
		cur_Tags.add(JcaPackage.eINSTANCE.getConnector_Version());
	}
	
    private static void populate_1_3EJB() {
		cur_Tags.add(COM.getIconType());
		cur_Tags.add(COM.getDisplayName());
		cur_Tags.add(COM.getDescription());
		cur_Tags.add(COM.getDescriptionGroup());
		cur_Tags.add(EjbPackage.eINSTANCE.getEJBJar_Version());
		cur_Tags.add(EjbPackage.eINSTANCE.getSession_ServiceEndpoint());
		cur_Tags.add(COM.getJNDIEnvRefsGroup_MessageDestinationRefs());
		cur_Tags.add(COM.getJNDIEnvRefsGroup_ServiceRefs());
		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_MessagingType());
		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_MessageDestination());
		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_Link());
		cur_Tags.add(EjbPackage.eINSTANCE.getMessageDriven_ActivationConfig());	
    }

	private static void populate_1_3Web(){
		cur_Tags.add(COM.getIconType());
		cur_Tags.add(COM.getDisplayName());
		cur_Tags.add(COM.getDescription());
		cur_Tags.add(COM.getDescriptionGroup());
		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_Version());
		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_JspConfig());
		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_MessageDestinations());
		cur_Tags.add(WebapplicationPackage.eINSTANCE.getWebApp_LocalEncodingMappingList());
	}

}
