/******************************************************************************* * Copyright (c) 2004, 2006 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.ui.tests.model; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jst.jsp.core.internal.text.StructuredTextPartitionerForJSP; import org.eclipse.jst.jsp.ui.tests.document.UnzippedProjectTester; import org.eclipse.wst.html.core.internal.text.StructuredTextPartitionerForHTML; import org.eclipse.wst.sse.core.StructuredModelManager; import org.eclipse.wst.sse.core.internal.provisional.IModelManager; import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists; import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredPartitioning; import org.eclipse.wst.sse.core.internal.text.BasicStructuredDocument; import org.eclipse.wst.sse.core.internal.util.Utilities; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter; import org.eclipse.wst.xml.core.internal.text.rules.StructuredTextPartitionerForXML; public class TestModelsFromFiles extends UnzippedProjectTester { public void testNonExistentXML() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/xml/testnonexistent.xml", BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } public void testNonExistentXMLDocument() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNonExistentDocument("testfiles/xml/testnonexistent.xml", BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } public void testNonExistentXMLModel() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreateModelWithNonExistIFile("testfiles/xml/testnonexistent.xml", BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } public void testNonExistentJSP() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/jsp/testnonexistent.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testNonExistentJSPDocument() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNonExistentDocument("testfiles/jsp/testnonexistent.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testNonExistentJSPModel() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreateModelWithNonExistIFile("testfiles/jsp/testnonexistent.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testSimpleCase() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNotEmpty("testfiles/xml/testNormalCase.xml", BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } public void testSimpleDocumentCaseXML() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNotEmptyDocument("testfiles/xml/testNormalCase.xml", BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } public void testSimpleDocumentCaseJSP() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNotEmptyDocument("testfiles/regressionTestFiles/defect223365/SelColBeanRow12ResultsForm.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testComplexCase() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestNotEmpty("testfiles/regressionTestFiles/defect223365/SelColBeanRow12ResultsForm.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testReload() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestReload("testfiles/regressionTestFiles/defect223365/SelColBeanRow12ResultsForm.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testJSPWithXMLOutput() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestReload("testfiles/jsp/jsp-xml-output.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testXHTMLTransitional1() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/xhtml/testx.html", BasicStructuredDocument.class, StructuredTextPartitionerForHTML.class); } public void testXHTMLTransitional2() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/xhtml/testx.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } public void testXHTMLTransitional3() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/xhtml/testx.xhtml", BasicStructuredDocument.class, StructuredTextPartitionerForHTML.class); } public void testHTMLTransitional1() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/html/testh.html", BasicStructuredDocument.class, StructuredTextPartitionerForHTML.class); } public void testHTMLTransitional2() throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { doTestCreate("testfiles/html/testh.jsp", BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } /* * TODO: these test files are missing, for some reason when running on * build machine ... need to re-construct public void testNearEmptyJSP() * throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { * doTestNotEmpty("testfiles/jsp/nearEmpty.jsp", * BasicStructuredDocument.class, StructuredTextPartitionerForJSP.class); } * * public void testNearEmptyXML() throws ResourceAlreadyExists, * ResourceInUse, IOException, CoreException { * doTestNotEmpty("testfiles/xml/nearEmpty.xml", * BasicStructuredDocument.class, StructuredTextPartitionerForXML.class); } * * public void testNearEmptyHTML() throws ResourceAlreadyExists, * ResourceInUse, IOException, CoreException { * doTestNotEmpty("testfiles/html/nearEmpty.html", * BasicStructuredDocument.class, StructuredTextPartitionerForHTML.class); } */ private void doTestNotEmpty(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { String contents = doTestCreate(filePath, expectedDocumentClass, expectedPartioner); assertNotNull("contents were null", contents); assertTrue("contents were empty", contents.length() > 0); } /** * @param string * @param class1 * @param class2 * @throws CoreException * @throws IOException * @throws ResourceInUse * @throws ResourceAlreadyExists */ private void doTestNotEmptyDocument(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { String contents = null; IModelManager modelManager = StructuredModelManager.getModelManager(); IFile file = (IFile) fTestProject.findMember(filePath); if (file == null) { file = fTestProject.getFile(filePath); } IStructuredDocument document = modelManager.createStructuredDocumentFor(file); assertNotNull(document); assertTrue("wrong class of document", expectedDocumentClass.isInstance(document)); IDocumentPartitioner setupPartitioner = null; if (Utilities.contains(expectedDocumentClass.getInterfaces(), IDocumentExtension3.class)) { setupPartitioner = ((IDocumentExtension3) document).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING); } else { setupPartitioner = document.getDocumentPartitioner(); } assertTrue("wrong partitioner in document.", expectedPartioner.isInstance(setupPartitioner)); contents = document.get(); assertNotNull("contents were null", contents); assertTrue("contents were empty", contents.length() > 0); } private void doTestNonExistentDocument(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { String contents = null; boolean expectedExceptionCaught = false; IModelManager modelManager = StructuredModelManager.getModelManager(); IFile file = (IFile) fTestProject.findMember(filePath); if (file == null) { file = fTestProject.getFile(filePath); } IStructuredDocument document = null; try { document = modelManager.createStructuredDocumentFor(file); } catch (FileNotFoundException e) { expectedExceptionCaught = true; } if (expectedExceptionCaught) { document = modelManager.createNewStructuredDocumentFor(file); assertNotNull(document); assertTrue("wrong class of document", expectedDocumentClass.isInstance(document)); IDocumentPartitioner setupPartitioner = null; if (Utilities.contains(expectedDocumentClass.getInterfaces(), IDocumentExtension3.class)) { setupPartitioner = ((IDocumentExtension3) document).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING); } else { setupPartitioner = document.getDocumentPartitioner(); } assertTrue("wrong partitioner in document.", expectedPartioner.isInstance(setupPartitioner)); contents = document.get(); assertNotNull("contents were null", contents); assertTrue("contents were *not* empty as expected", contents.length() == 0); } else { assertTrue("FileNotFound exception was *not* thrown as expected", false); } } /** * @param string * @param class1 * @param class2 * @throws CoreException * @throws IOException * @throws ResourceInUse * @throws ResourceAlreadyExists */ private void doTestReload(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { IModelManager modelManager = StructuredModelManager.getModelManager(); IFile file = (IFile) fTestProject.findMember(filePath); if (file == null) { file = fTestProject.getFile(filePath); } IStructuredModel model = modelManager.getNewModelForEdit(file, true); try { assertNotNull(model); IStructuredDocument document = model.getStructuredDocument(); assertNotNull(document); assertTrue("wrong class of document", expectedDocumentClass.isInstance(document)); IDocumentPartitioner setupPartitioner = null; if (Utilities.contains(expectedDocumentClass.getInterfaces(), IDocumentExtension3.class)) { setupPartitioner = ((IDocumentExtension3) document).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING); } else { setupPartitioner = document.getDocumentPartitioner(); } assertTrue("wrong partitioner in document.", expectedPartioner.isInstance(setupPartitioner)); InputStream inStream = null; try { inStream = file.getContents(); model.reload(inStream); assertNotNull(model); IStructuredDocument documentReloaded = model.getStructuredDocument(); // note: NOT same instance of document // FIXME: this test has to be changed back, once the reload // API is // fixed to work with different document. // assertFalse(document == documentReloaded); assertTrue(document == documentReloaded); } finally { if (inStream != null) { inStream.close(); } } } finally { if (model != null) model.releaseFromEdit(); } } /** * @param string * @param class1 * @param class2 * @throws CoreException * @throws IOException * @throws ResourceInUse * @throws ResourceAlreadyExists */ private String doTestCreate(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { String contents = null; IModelManager modelManager = StructuredModelManager.getModelManager(); IFile file = (IFile) fTestProject.findMember(filePath); // file will be null if the resource does not exist if (file == null) { file = fTestProject.getFile(filePath); } IStructuredModel model = modelManager.getNewModelForEdit(file, true); try { assertNotNull(model); IStructuredDocument document = model.getStructuredDocument(); assertNotNull(document); contents = document.get(); assertTrue("wrong class of document", expectedDocumentClass.isInstance(document)); IDocumentPartitioner setupPartitioner = null; if (Utilities.contains(expectedDocumentClass.getInterfaces(), IDocumentExtension3.class)) { setupPartitioner = ((IDocumentExtension3) document).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING); } else { setupPartitioner = document.getDocumentPartitioner(); } assertTrue("wrong partitioner in document.", expectedPartioner.isInstance(setupPartitioner)); testClone(model); } finally { if (model != null) model.releaseFromEdit(); } return contents; } private void testClone(IStructuredModel structuredModel) throws IOException { IDOMDocument document = ((IDOMModel) structuredModel).getDocument(); INodeNotifier notifier = document; ModelQueryAdapter modelQueryAdapter = (ModelQueryAdapter) notifier.getAdapterFor(ModelQueryAdapter.class); assertNotNull("initial modelQueryAdapter should not be null", modelQueryAdapter); IStructuredModel newModel = structuredModel.newInstance(); IDOMDocument newDocument = ((IDOMModel) newModel).getDocument(); INodeNotifier newNotifier = newDocument; ModelQueryAdapter result = (ModelQueryAdapter) newNotifier.getAdapterFor(ModelQueryAdapter.class); assertNotNull("newInstance modelQueryAdapter should not be null", result); } /** * @param string * @param class1 * @param class2 * @throws CoreException * @throws IOException * @throws ResourceInUse * @throws ResourceAlreadyExists */ private String doTestCreateModelWithNonExistIFile(String filePath, Class expectedDocumentClass, Class expectedPartioner) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException { String contents = null; IModelManager modelManager = StructuredModelManager.getModelManager(); IFile file = (IFile) fTestProject.findMember(filePath); // file will be null if the resource does not exist if (file == null) { file = fTestProject.getFile(filePath); } IStructuredModel model = modelManager.getNewModelForEdit(file, false); try { assertNotNull(model); IStructuredDocument document = model.getStructuredDocument(); assertNotNull(document); contents = document.get(); assertTrue("wrong class of document", expectedDocumentClass.isInstance(document)); IDocumentPartitioner setupPartitioner = null; if (Utilities.contains(expectedDocumentClass.getInterfaces(), IDocumentExtension3.class)) { setupPartitioner = ((IDocumentExtension3) document).getDocumentPartitioner(IStructuredPartitioning.DEFAULT_STRUCTURED_PARTITIONING); } else { setupPartitioner = document.getDocumentPartitioner(); } assertTrue("wrong partitioner in document.", expectedPartioner.isInstance(setupPartitioner)); } finally { if (model != null) model.releaseFromEdit(); } return contents; } }