/*******************************************************************************
 * 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
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
/*
 * Created on Jan 6, 2004
 *
 * To change the template for this generated file go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
package org.eclipse.wtp.j2ee.headless.tests.ejb.operations;

import junit.framework.Test;

import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties;
import org.eclipse.jst.j2ee.internal.ejb.project.operations.EJBComponentExportDataModelProvider;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.tests.SimpleTestSuite;
import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaEEFacetConstants;
import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.JavaFileTestingUtilities;
import org.eclipse.wtp.j2ee.headless.tests.j2ee.operations.ModuleExportOperationTest;

/**
 * @author Administrator
 * @author Ian Tewksbury (ictewksb@us.ibm.com)
 *
 * To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Generation - Code and Comments
 */
public class EJBExportOperationTest extends ModuleExportOperationTest {  
	public EJBExportOperationTest() {
		super("EJBExportOperationTests");
	}
	
	public EJBExportOperationTest(String name) {
		super(name);
	}
	
	public static Test suite() {
		return new SimpleTestSuite(EJBExportOperationTest.class);
	}
	
	public void testEJBExport11_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("insaneEJB", null, null, null, JavaEEFacetConstants.EJB_11, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("fooEJB", null, null, null, JavaEEFacetConstants.EJB_2, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("barEJB", null, null, null, JavaEEFacetConstants.EJB_21, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("penEJB", null, null, null, JavaEEFacetConstants.EJB_3, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    private void addStateless(IDataModel dm) throws Exception {
    	String projectName = dm.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
		String packageName = "test";
		String className = "AnnotatedStateless";
		String classContents = "package test;\n\nimport javax.ejb.Stateless;\n\n@Stateless\npublic class AnnotatedStateless {\n\n}";
		JavaFileTestingUtilities.addJavaFileToEJB(projectName, className, packageName, classContents);
	}

	public void testEJBExport11_AddToEAR_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_AddToEAR_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_AddToEAR_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_AddToEAR_Defaults() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    
    public void testEJBExport11_AddToEAR_NoClient() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("testEJB", null, null, "testEAR", JavaEEFacetConstants.EJB_11, false, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_AddToEAR_NoClient() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("coolEJB", null, null, "booEAR", JavaEEFacetConstants.EJB_2, false, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_AddToEAR_NoClient() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("crazyEJB", null, null, "starEAR", JavaEEFacetConstants.EJB_21, false, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_AddToEAR_NoClient() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    
    public void testEJBExport11_AddToEAR_ChangedEJBClientName() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("fooBarEJB", "testEJBExportClient", null, "theirEAR", JavaEEFacetConstants.EJB_11, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_AddToEAR_ChangedEJBClientName() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("saneEJB", "coolEJBClient", null, "yourEAR", JavaEEFacetConstants.EJB_2, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_AddToEAR_ChangedEJBClientName() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("clipEJB", "crazyEJBClient", null, "ourEAR", JavaEEFacetConstants.EJB_21, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_AddToEAR_ChangedEJBClientName() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("phoneEJB", "netoEJBClient", null, "waterEAR", JavaEEFacetConstants.EJB_3, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    public void testEJBExport11_AddToEAR_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("cupEJB", null, "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_AddToEAR_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("mouseEJB", null, "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_AddToEAR_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pcEJB", null, "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_AddToEAR_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("keyEJB", null, "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    public void testEJBExport11A_ddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("cupEJB", "superClient", "src", "openEAR", JavaEEFacetConstants.EJB_11, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport20_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("mouseEJB", "dudeClient", "files", "closedEAR", JavaEEFacetConstants.EJB_2, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport21_AddToEAR_ChangedEJB_ClientNameChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pcEJB", "fireClient", "stuff", "batEAR", JavaEEFacetConstants.EJB_21, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    //TODO
    //NOT sure why, but the annotated beans are not being compiled correctly
    //so that during validation, their annotations are not read, and this test fails
    /*
    public void testEJBExport30_AddToEARChangedEJB_ClientName_ChangedClientSourceFolder() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("keyEJB", "wireClient", "foo", "keyEAR", JavaEEFacetConstants.EJB_3, false);
    	runDataModel(dm);
    	addStateless(dm);
    	
    	runExportTests_All(dm);
    }
    */
    
    public void testEJBExport30_Defaults_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("tigerEJB", null, null, null, JavaEEFacetConstants.EJB_3, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_Defaults_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6tigerEJB", null, null, null, JavaEEFacetConstants.EJB_31, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport30_AddToEAR_Defaults_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("pandaEJB", null, null, "roundEAR", JavaEEFacetConstants.EJB_3, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_AddToEAR_Defaults_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6pandaEJB", null, null, "EE6roundEAR", JavaEEFacetConstants.EJB_31, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport30_AddToEAR_NoClient_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("netoEJB", null, null, "myEAR", JavaEEFacetConstants.EJB_3, false, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_AddToEAR_NoClient_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6netoEJB", null, null, "EE6myEAR", JavaEEFacetConstants.EJB_31, false, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }

    public void testEJBExport30_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("snakeEJB", "client", null, "groundEAR", JavaEEFacetConstants.EJB_3, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_AddToEAR_ChangedEJBClientName_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6snakeEJB", "EE6client", null, "EE6groundEAR", JavaEEFacetConstants.EJB_31, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }

    public void testEJBExport30_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("lionEJB", null, "barSrc", "pinEAR", JavaEEFacetConstants.EJB_3, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_AddToEAR_ChangedClientSourceFolder_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6lionEJB", null, "EE6barSrc", "EE6pinEAR", JavaEEFacetConstants.EJB_31, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport30_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("monkeyEJB", "fooFooClient", "fooSrc", "outsideEAR", JavaEEFacetConstants.EJB_3, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }
    
    public void testEJBExport31_AddToEAR_ChangedEJBClientName_ChangedClientSourceFolder_WithDD() throws Exception {
    	IDataModel dm = EJBProjectCreationOperationTest.getEJBDataModel("EE6monkeyEJB", "EE6fooFooClient", "EE6fooSrc", "EE6outsideEAR", JavaEEFacetConstants.EJB_31, true);
    	runDataModel(dm);
    	
    	runExportTests_All(dm);
    }

    @Override
    protected String getModuleExtension() {
    	return ".jar";
    }

	@Override
	protected IDataModel getExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting) {
		return getEJBExportDataModel(projectName, destination, exportSource, runBuild, overwriteExisting);
	}
	
    /**
     * @param projectName name of the project to export
     * @param destination destination to export to
     * @param exportSource if TRUE export source files, else don't
     * @param runBuild if TRUE run a build before exporting, else don't
     * @param overwriteExisting if TRUE overwrite existing files, else don't
     * @return an EJBComponentExport data model with all of the given settings.
     */
    public static IDataModel getEJBExportDataModel(String projectName, String destination, boolean exportSource, boolean runBuild, boolean overwriteExisting){
    	IDataModel exportModel = DataModelFactory.createDataModel(new EJBComponentExportDataModelProvider());
    	
		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.PROJECT_NAME, projectName);
		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION, destination);
		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES, exportSource);
		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.OVERWRITE_EXISTING, overwriteExisting);
		exportModel.setProperty(IJ2EEComponentExportDataModelProperties.RUN_BUILD, runBuild);
		
		return exportModel;
    }
    
    @Override
    protected void addJavaFilesToProject(String projectName, String[] classNames, String prackageName) throws Exception {
    	JavaFileTestingUtilities.addJavaFilesToEJB(projectName, classNames, prackageName);
    }
    
    @Override
    protected void verifyJavaFilesExported(String archiveName, String[] classNames, String packageName, boolean withClassFiles, boolean withSource) throws Exception {
    	JavaFileTestingUtilities.verifyJavaFilesInJAR(archiveName, classNames, packageName, withClassFiles, withSource);
    }
}
