/*******************************************************************************
 * Copyright (c) 2004, 2010 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.jsp.core.tests.model;

import junit.framework.TestCase;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP;
import org.eclipse.jst.jsp.core.tests.taglibindex.BundleResourceUtil;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.w3c.dom.Element;

/**
 * Tests for JSP include directives
 */
public class TestModelIncludes extends TestCase {
	String wtp_autotest_noninteractive = null;

	protected void setUp() throws Exception {
		super.setUp();
		String noninteractive = System.getProperty("wtp.autotest.noninteractive");
		if (noninteractive != null)
			wtp_autotest_noninteractive = noninteractive;
		System.setProperty("wtp.autotest.noninteractive", "true");
	}

	protected void tearDown() throws Exception {
		super.tearDown();
		if (wtp_autotest_noninteractive != null)
			System.setProperty("wtp.autotest.noninteractive", wtp_autotest_noninteractive);
	}

	/**
	 * Tests the custom tag content model when single line fragments are used
	 * without trailing white space
	 * 
	 * @throws Exception
	 */
	public void testContentModelSingleLineIncludedFileWithNoSpacesButWithTaglibInInclude() throws Exception {
		String projectName = "prj119576_a";

		BundleResourceUtil.createSimpleProject(projectName, null, null);
		BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + projectName, "/" + projectName);
		assertTrue("project could not be created", ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).exists());

		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/prj119576_a/WebContent/body2.jsp"));
		IDOMModel model = null;
		try {
			model = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file);
			assertTrue("model has no content", model.getStructuredDocument().getLength() > 0);

			Element element = (Element) model.getIndexedRegion(75);
			CMElementDeclaration ed = ModelQueryUtil.getModelQuery(model).getCMElementDeclaration(element);
			assertNotNull("no (TLD) element declaration found for " + element.getNodeName(), ed);
			assertTrue("not a wrapping content model element declaration: " + ed.getNodeName(), ed instanceof CMNodeWrapper);
			assertTrue("not a taglib content model element declaration: " + ed.getNodeName(), ((CMNodeWrapper) ed).getOriginNode() instanceof TLDElementDeclaration);
			String tagClassName = ((TLDElementDeclaration) ((CMNodeWrapper) ed).getOriginNode()).getTagclass();
			assertNotNull("no tag class name found", tagClassName);
		}
		finally {
			if (model != null)
				model.releaseFromRead();
		}
	}

	/**
	 * Verify included files are translated properly when they contain a
	 * multiple lines
	 * 
	 * @throws Exception
	 */
	public void testTranslateMultiLineIncludedFileWithSpacesAndScriptletInInclude() throws Exception {
		String projectName = "prj119576_c";

		BundleResourceUtil.createSimpleProject(projectName, null, null);
		BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + projectName, "/" + projectName);
		assertTrue("project could not be created", ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).exists());

		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/" + projectName + "/WebContent/body3.jsp"));
		IDOMModel model = null;
		try {
			model = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file);
			assertTrue("model has no content", model.getStructuredDocument().getLength() > 0);
			ModelHandlerForJSP.ensureTranslationAdapterFactory(model);

			JSPTranslationAdapter adapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
			String source = adapter.getJSPTranslation().getJavaText();
			assertTrue("scriptlet with variable declaration not found\n" + source, source.indexOf("java.util.Date headerDate") > -1);
		}
		finally {
			if (model != null)
				model.releaseFromRead();
		}
	}

	/**
	 * Verify included files are translated properly when they contain a
	 * single line and document region and no trailing white space.
	 * 
	 * @throws Exception
	 */
	public void testTranslateSingleLineIncludedFileWithNoSpacesButScriptletInInclude() throws Exception {
		String projectName = "prj119576_b";

		BundleResourceUtil.createSimpleProject(projectName, null, null);
		BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" + projectName, "/" + projectName);
		assertTrue("project could not be created", ResourcesPlugin.getWorkspace().getRoot().getProject(projectName).exists());

		IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/" + projectName + "/WebContent/body3.jsp"));
		IDOMModel model = null;
		try {
			model = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(file);
			assertTrue("model has no content", model.getStructuredDocument().getLength() > 0);
			ModelHandlerForJSP.ensureTranslationAdapterFactory(model);

			JSPTranslationAdapter adapter = (JSPTranslationAdapter) model.getDocument().getAdapterFor(IJSPTranslation.class);
			String source = adapter.getJSPTranslation().getJavaText();
			assertTrue("scriptlet with variable declaration not found", source.indexOf("java.util.Date headerDate") > -1);
		}
		finally {
			if (model != null)
				model.releaseFromRead();
		}
	}
}
