[312129] JUnit test for war import problem with class file that is not in WEB-INF/classes and has a 16 character name
diff --git a/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war
new file mode 100644
index 0000000..a3bac0f
--- /dev/null
+++ b/tests/org.eclipse.jst.j2ee.tests/TestData/WARImportTests/Bug311542.war
Binary files differ
diff --git a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
index c60a8bf..2baca4f 100644
--- a/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
+++ b/tests/org.eclipse.jst.j2ee.tests/defect-tests/org/eclipse/jst/j2ee/defect/tests/DefectVerificationTests.java
@@ -11,6 +11,7 @@
 package org.eclipse.jst.j2ee.defect.tests;
 
 //import java.io.File;
+import java.io.File;
 import java.io.StringBufferInputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -92,6 +93,7 @@
 import org.eclipse.wst.common.tests.OperationTestCase;
 import org.eclipse.wst.common.tests.ProjectUtility;
 import org.eclipse.wtp.j2ee.headless.tests.plugin.HeadlessTestsPlugin;
+import org.eclipse.wtp.j2ee.headless.tests.web.operations.WebImportOperationTest;
 
 public class DefectVerificationTests extends OperationTestCase {
 
@@ -747,6 +749,21 @@
 	}
 	*/
 
+	/**
+	 * Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=311542
+	 */
+	public void test311542() throws Exception {
+		String warPath = null;
+		String projectName = null;
+		IDataModel model = null;
+		
+
+		warPath = getWarFile("Bug311542.war");
+		projectName = warPath.substring(warPath.lastIndexOf(File.separator) + 1, warPath.length() - 4);
+		model = WebImportOperationTest.getWebImportDataModel(warPath, projectName, null, true, null, null);
+		OperationTestCase.runAndVerify(model);
+	}
+
 	private String getWarFile(String fileName) {
 		return TEST_DATA_PATH + "WarImportTests" + java.io.File.separatorChar + fileName;
 	}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java
index 477933f..c31b794 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/j2ee/verifiers/JEEImportDataModelVerifier.java
@@ -19,6 +19,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEModuleImportDataModelProperties;
+import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
 import org.eclipse.jst.j2ee.internal.common.J2EEVersionUtil;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
@@ -181,7 +182,9 @@
 				case IArchiveResource.FILE_TYPE :
 					extension = resourcePath.getFileExtension();
 					
-					if(extension.equals(CLASS_EXTENSION)){
+					// Note: For war archive, the class must be in WEB-INF/classes, otherwise it's just content
+					if(extension.equals(CLASS_EXTENSION) &&
+							((getExportType() == J2EEVersionConstants.WEB_TYPE) ? (resourcePath.segmentCount() > 2 && resourcePath.segment(0).equals("WEB-INF") && resourcePath.segment(1).equals("classes")) : true)){
 						if(isClassWithoutSource(archive, resource)){
 							classes.add(resource);
 						}
diff --git a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
index a8695d8..cbbfffd 100644
--- a/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
+++ b/tests/org.eclipse.jst.j2ee.tests/j2ee-verifiers/org/eclipse/wtp/j2ee/headless/tests/web/verifiers/WebImportDataModelVerifier.java
@@ -93,7 +93,7 @@
 		String jspUri = javaUri.substring(0, javaUri.indexOf(ArchiveUtil.DOT_JAVA));
 		int lastSlash = jspUri.lastIndexOf('/');
 		int _index = lastSlash == -1 ? ArchiveConstants.WEBAPP_CLASSES_URI.length() : lastSlash + 1;
-		if (jspUri.charAt(_index) == '_') {
+		if (jspUri.length() > _index && jspUri.charAt(_index) == '_') {
 			jspUri = jspUri.substring(ArchiveConstants.WEBAPP_CLASSES_URI.length(), _index) + jspUri.substring(_index + 1) + ArchiveUtil.DOT_JSP;
 			IPath jspPath = new Path(jspUri);
 			if (archive.containsArchiveResource(jspPath)) {