[358545] Formatting a JSP file, containing Java snippets, leads to misformatted or even lost code
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/JSPUITestSuite.java b/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/JSPUITestSuite.java
index 9858388..06e701f 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/JSPUITestSuite.java
+++ b/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/JSPUITestSuite.java
@@ -22,6 +22,7 @@
 import org.eclipse.jst.jsp.ui.tests.contentassist.TestJSPContentAssistComputers;
 import org.eclipse.jst.jsp.ui.tests.contentdescription.TestContentDescription;
 import org.eclipse.jst.jsp.ui.tests.document.FileBufferDocumentTester;
+import org.eclipse.jst.jsp.ui.tests.format.TestContentFormatter;
 import org.eclipse.jst.jsp.ui.tests.model.TestModelsFromFiles;
 import org.eclipse.jst.jsp.ui.tests.modelquery.ModelQueryTester;
 import org.eclipse.jst.jsp.ui.tests.other.ScannerUnitTests;
@@ -47,6 +48,7 @@
 		addTest(new TestSuite(ScannerUnitTests.class, "ScannerUnitTests"));
 		addTest(new TestSuite(UnitTests.class, "UnitTests"));
 		addTest(new TestSuite(TestStructuredPartitionerJSP.class, "TestStructuredPartioner"));
+		addTest(new TestSuite(TestContentFormatter.class, "Content Formatter Tests"));
 		addTest(new TestSuite(ModelQueryTester.class, "ModelQueryTester"));
 		addTest(new TestSuite(JSPJavaTranslatorTest.class, "Mixed JavaScript Translator Tests"));
 		addTest(new TestSuite(TestEmailNotice.class, "TestEmailNotice"));
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/format/TestContentFormatter.java b/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/format/TestContentFormatter.java
index 173ef6f..231957e 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/format/TestContentFormatter.java
+++ b/tests/org.eclipse.jst.jsp.ui.tests/src/org/eclipse/jst/jsp/ui/tests/format/TestContentFormatter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2011 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
@@ -23,10 +23,7 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Preferences;
 import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.text.DocumentRewriteSession;
-import org.eclipse.jface.text.DocumentRewriteSessionType;
 import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
 import org.eclipse.jface.text.Region;
 import org.eclipse.jface.text.formatter.FormattingContext;
 import org.eclipse.jface.text.formatter.FormattingContextProperties;
@@ -35,12 +32,16 @@
 import org.eclipse.jface.text.source.SourceViewerConfiguration;
 import org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP;
 import org.eclipse.jst.jsp.ui.tests.util.ProjectUtil;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
 import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
 import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
 import org.eclipse.wst.sse.core.StructuredModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.sse.core.utils.StringUtils;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
 
 public class TestContentFormatter extends TestCase {
 	String wtp_autotest_noninteractive = null;
@@ -96,15 +97,15 @@
 			afterModel.save(afterBytes);
 
 			String expectedContents = new String(afterBytes.toByteArray(), UTF_8);
-			expectedContents = StringUtils.replace(expectedContents, "\r\n", "\n");
+			expectedContents = StringUtils.replace(expectedContents, "\r\n", "\r");
 			expectedContents = StringUtils.replace(expectedContents, "\r", "\n");
 
 			String actualContents = new String(formattedBytes.toByteArray(), UTF_8);
-			actualContents = StringUtils.replace(actualContents, "\r\n", "\n");
+			actualContents = StringUtils.replace(actualContents, "\r\n", "\r");
 			actualContents = StringUtils.replace(actualContents, "\r", "\n");
 
-			assertEquals("Formatted document differs from the expected.", expectedContents, actualContents);
 			assertTrue(onlyWhiteSpaceDiffers(expectedContents, actualContents));
+			assertEquals("Formatted document differs from the expected.", expectedContents, actualContents);
 		}
 		finally {
 			if (beforeModel != null)
@@ -115,41 +116,16 @@
 	}
 
 	private void formatAndAssertSignificantEquals(String beforePath, boolean resetPreferences) throws UnsupportedEncodingException, IOException, CoreException {
-		IStructuredModel beforeModel = null;
+		StructuredTextEditor editor = (StructuredTextEditor) IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(beforePath)), "org.eclipse.jst.jsp.core.jspsource.source", true);
 		try {
-			beforeModel = getModelForEdit(beforePath);
-			assertNotNull("could not retrieve structured model for : " + beforePath, beforeModel);
-			
-			if (resetPreferences) {
-				resetPreferencesToDefault();
-			}
+			String before = editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
+			editor.getTextViewer().doOperation(StructuredTextViewer.FORMAT_DOCUMENT);
 
-			SourceViewerConfiguration configuration = new StructuredTextViewerConfigurationJSP();
-			IContentFormatterExtension formatter = (IContentFormatterExtension) configuration.getContentFormatter(null);
-
-			IDocument document = beforeModel.getStructuredDocument();
-			String before = document.get();
-			Region region = new Region(0, document.getLength());
-			fContext.setProperty(FormattingContextProperties.CONTEXT_DOCUMENT, Boolean.TRUE);
-			fContext.setProperty(FormattingContextProperties.CONTEXT_REGION, region);
-			DocumentRewriteSession rewriteSession = null;
-			if (document instanceof IDocumentExtension4) {
-				IDocumentExtension4 extension = (IDocumentExtension4) document;
-				DocumentRewriteSessionType type = DocumentRewriteSessionType.UNRESTRICTED;
-				rewriteSession = (extension.getActiveRewriteSession() != null) ? null : extension.startRewriteSession(type);
-			}
-			formatter.format(document, fContext);
-			String after = document.get();
-			if (document instanceof IDocumentExtension4 && rewriteSession != null) {
-				IDocumentExtension4 extension = (IDocumentExtension4) document;
-				extension.stopRewriteSession(rewriteSession);
-			}
-
+			String after = editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
 			assertTrue(onlyWhiteSpaceDiffers(before, after));
 		}
 		finally {
-			if (beforeModel != null)
-				beforeModel.releaseFromEdit();
+			editor.close(false);
 		}
 	}
 
@@ -202,11 +178,8 @@
 		writer2.close();
 
 		char[] expectedCompacted = writer1.toCharArray();
-		char[] actualCompacted = writer1.toCharArray();
-		assertEquals("significant character lengths are not the same", expectedCompacted.length, actualCompacted.length);
-		for (int i = 0; i < actualCompacted.length; i++) {
-			assertEquals("significant character differs", expectedCompacted[i], actualCompacted[i]);
-		}
+		char[] actualCompacted = writer2.toCharArray();
+		assertEquals("significant character differs", new String(expectedCompacted), new String(actualCompacted));
 
 		return true;
 	}
@@ -250,7 +223,10 @@
 		formatAndAssertEquals(beforePath, afterPath, true);
 	}
 
-	public void testFormatBug358545() throws UnsupportedEncodingException, IOException, CoreException {
+	public void testFormatBug358545a() throws UnsupportedEncodingException, IOException, CoreException {
 		formatAndAssertSignificantEquals("/" + PROJECT_NAME + "/WebContent/formatbug358545.jsp", true);
 	}
+	public void testFormatBug358545b() throws UnsupportedEncodingException, IOException, CoreException {
+		formatAndAssertSignificantEquals("/" + PROJECT_NAME + "/WebContent/formatbug358545b.jsp", true);
+	}
 }
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495-fmt.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495-fmt.jsp
index b626c91..6ab463d 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495-fmt.jsp
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495-fmt.jsp
@@ -10,23 +10,26 @@
 <title>Insert title here</title>
 </head>
 <body>
-<%-- jsp expression must be followed directly by ! because no whitespace exists between --%>
-Welcome to WTP,
-<%=message%>!
-<p>Welcome to WTP, <%=pal%>!</p>
-<%-- jsp expression should be treated like any other attribute --%>
-<table <%="align='left'"%>>
-	<tr>
-		<%-- no whitespace exists before/after jsp tag so keep it that way --%>
-		<th>Column<jsp:setProperty name="myname" property="myproperty" />Heading</th>
-		<%-- whitespace exists before/after jsp tag so newlines are okay --%>
-		<th>Column <jsp:setProperty name="myname" property="myproperty" />
-		Heading</th>
-	</tr>
-	<tr>
-		<td>Row 1: Col 1</td>
-		<td>Row 1: Col 2</td>
-	</tr>
-</table>
+	<%-- jsp expression must be followed directly by ! because no whitespace exists between --%>
+	Welcome to WTP,
+	<%=message%>!
+	<p>
+		Welcome to WTP,
+		<%=pal%>!
+	</p>
+	<%-- jsp expression should be treated like any other attribute --%>
+	<table <%="align='left'"%>>
+		<tr>
+			<%-- no whitespace exists before/after jsp tag so keep it that way --%>
+			<th>Column<jsp:setProperty name="myname" property="myproperty" />Heading</th>
+			<%-- whitespace exists before/after jsp tag so newlines are okay --%>
+			<th>Column <jsp:setProperty name="myname" property="myproperty" />
+				Heading</th>
+		</tr>
+		<tr>
+			<td>Row 1: Col 1</td>
+			<td>Row 1: Col 2</td>
+		</tr>
+	</table>
 </body>
 </html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_2-fmt.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_2-fmt.jsp
index ce2159c..17487d8 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_2-fmt.jsp
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_2-fmt.jsp
@@ -9,9 +9,12 @@
 <title>Insert title here</title>
 </head>
 <body>
-<%-- jsp expression must be followed directly by ! because no whitespace exists between --%>
-Welcome to WTP,
-<%=message%>!
-<p>Welcome to WTP, <%=pal%>!</p>
+	<%-- jsp expression must be followed directly by ! because no whitespace exists between --%>
+	Welcome to WTP,
+	<%=message%>!
+	<p>
+		Welcome to WTP,
+		<%=pal%>!
+	</p>
 </body>
 </html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_3-fmt.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_3-fmt.jsp
index 287f804..a5fed8e 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_3-fmt.jsp
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_3-fmt.jsp
@@ -7,8 +7,8 @@
 <title>Insert title here</title>
 </head>
 <body>
-<%-- jsp expression should be treated like any other attribute --%>
-<table <%="align='left'"%>>
-</table>
+	<%-- jsp expression should be treated like any other attribute --%>
+	<table <%="align='left'"%>>
+	</table>
 </body>
 </html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_4-fmt.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_4-fmt.jsp
index 454b366..194dcc4 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_4-fmt.jsp
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug102495_4-fmt.jsp
@@ -7,18 +7,18 @@
 <title>Insert title here</title>
 </head>
 <body>
-<table>
-	<tr>
-		<%-- no whitespace exists before/after jsp tag so keep it that way --%>
-		<th>Column<jsp:setProperty name="myname" property="myproperty" />Heading</th>
-		<%-- whitespace exists before/after jsp tag so newlines are okay --%>
-		<th>Column <jsp:setProperty name="myname" property="myproperty" />
-		Heading</th>
-	</tr>
-	<tr>
-		<td>Row 1: Col 1</td>
-		<td>Row 1: Col 2</td>
-	</tr>
-</table>
+	<table>
+		<tr>
+			<%-- no whitespace exists before/after jsp tag so keep it that way --%>
+			<th>Column<jsp:setProperty name="myname" property="myproperty" />Heading</th>
+			<%-- whitespace exists before/after jsp tag so newlines are okay --%>
+			<th>Column <jsp:setProperty name="myname" property="myproperty" />
+				Heading</th>
+		</tr>
+		<tr>
+			<td>Row 1: Col 1</td>
+			<td>Row 1: Col 2</td>
+		</tr>
+	</table>
 </body>
 </html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545.jsp
index 622877c..9c804b5 100644
--- a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545.jsp
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545.jsp
@@ -89,4 +89,4 @@
 

 	

 </body>

-</html>

+</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545b.jsp b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545b.jsp
new file mode 100644
index 0000000..2f8879b
--- /dev/null
+++ b/tests/org.eclipse.jst.jsp.ui.tests/testfiles/jspformatting/WebContent/formatbug358545b.jsp
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<script type="text/javascript">
+
+	function verifyLocalAcessPLI() {
+<% if( request.getAttribute( "LOCAL_DIVERSE_ACESS_PLI" ) != null ) {%>
+	MM_showHideLayers('restrictLocalAccessPLIPopup', '', 'show');
+<% }%>
+	}
+</script>
+<title>ePrice Administration - Price Books - Edit Individual Prices</title>
+</head>
+<body onkeydown="selectSave()" onload="verifyLocalAcessPLI();">
+	
+
+	
+</body>
+</html>
\ No newline at end of file