[102840] Dynamic Web Project Cannot be deleted if there are taglibs in jars that are placed under /WEB-INF/lib folder
diff --git a/tests/org.eclipse.wst.sse.core.tests/resources/testfile.jar b/tests/org.eclipse.wst.sse.core.tests/resources/testfile.jar
new file mode 100644
index 0000000..4f2d14e
--- /dev/null
+++ b/tests/org.eclipse.wst.sse.core.tests/resources/testfile.jar
Binary files differ
diff --git a/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/SSEModelTestSuite.java b/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/SSEModelTestSuite.java
index 6bcd226..b9400f7 100644
--- a/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/SSEModelTestSuite.java
+++ b/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/SSEModelTestSuite.java
@@ -20,6 +20,7 @@
import org.eclipse.wst.sse.core.tests.events.TestRegionChangedEvent;
import org.eclipse.wst.sse.core.tests.events.TestRegionsReplacedEvent;
import org.eclipse.wst.sse.core.tests.events.TestStructuredDocumentRegionsReplacedEvent;
+import org.eclipse.wst.sse.core.tests.util.TestJarUtilities;
public class SSEModelTestSuite extends TestSuite {
@@ -44,7 +45,7 @@
// TestDocumentReader.class, TestCharSequenceReader.class,
// TestRegionMatches.class};
- private static Class[] classes = new Class[]{ExistenceTest.class, TestNewDocumentContentEvent.class, TestAboutToBeChangedEvent.class, TestNewDocumentEvent.class, TestNoChangeEvent.class, TestRegionChangedEvent.class,TestRegionsReplacedEvent.class,TestStructuredDocumentRegionsReplacedEvent.class};
+ private static Class[] classes = new Class[]{ExistenceTest.class, TestNewDocumentContentEvent.class, TestAboutToBeChangedEvent.class, TestNewDocumentEvent.class, TestNoChangeEvent.class, TestRegionChangedEvent.class,TestRegionsReplacedEvent.class,TestStructuredDocumentRegionsReplacedEvent.class, TestJarUtilities.class};
public SSEModelTestSuite() {
super("SSE Model Basic Test Suite");
diff --git a/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/util/TestJarUtilities.java b/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/util/TestJarUtilities.java
new file mode 100644
index 0000000..e42cd83
--- /dev/null
+++ b/tests/org.eclipse.wst.sse.core.tests/src/org/eclipse/wst/sse/core/tests/util/TestJarUtilities.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.wst.sse.core.tests.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.sse.core.internal.util.JarUtilities;
+import org.eclipse.wst.sse.core.tests.SSEModelTestsPlugin;
+
+
+/**
+ * Tests for org.eclipse.wst.sse.core.internal.util.JarUtilities
+ */
+public class TestJarUtilities extends TestCase {
+
+ private static final String[] fExpectedNames = new String[]{".project", "about.html", "build.properties", "plugin.properties", "test.xml"};
+ private static final String TEST_JAR_UTILITIES_PROJECT = "TestJarUtilities";
+ private static final String TEST_JAR_UTILITIES_TESTFILE_JAR = "TestJarUtilities/testfile.jar";
+ private static final String TESTFILE_BUNDLE_ENTRY = "resources/testfile.jar";
+
+ static IFile _copyBundleEntryIntoWorkspace(String entryname, String fullPath) throws Exception {
+ IFile file = null;
+ URL entry = SSEModelTestsPlugin.getDefault().getBundle().getEntry(entryname);
+ if (entry != null) {
+ IPath path = new Path(fullPath);
+ byte[] b = new byte[2048];
+ InputStream input = entry.openStream();
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ int i = -1;
+ while ((i = input.read(b)) > -1) {
+ output.write(b, 0, i);
+ }
+ file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ if (file != null) {
+ if (!file.exists()) {
+ file.create(new ByteArrayInputStream(output.toByteArray()), true, new NullProgressMonitor());
+ }
+ else {
+ file.setContents(new ByteArrayInputStream(output.toByteArray()), true, false, new NullProgressMonitor());
+ }
+ }
+ }
+ else {
+ System.err.println("can't find " + entryname);
+ }
+ return file;
+ }
+
+ static IFile copyBundleEntryIntoWorkspace(final String entryname, final String fullPath) throws Exception {
+ final IFile file[] = new IFile[1];
+ IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ try {
+ file[0] = _copyBundleEntryIntoWorkspace(entryname, fullPath);
+ }
+ catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, SSEModelTestsPlugin.getDefault().getBundle().getSymbolicName(), 0, null, e));
+ }
+ ResourcesPlugin.getWorkspace().checkpoint(true);
+ }
+ };
+ ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+ return file[0];
+ }
+
+ /**
+ * Creates a simple project.
+ *
+ * @param name
+ * - the name of the project
+ * @return
+ */
+ static IProject createSimpleProject(String name) {
+ IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(name);
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+ try {
+ project.create(description, new NullProgressMonitor());
+ project.open(new NullProgressMonitor());
+ }
+ catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return project;
+ }
+
+ private int running = 0;
+
+ public TestJarUtilities() {
+ super("JarUtilities Tests");
+ }
+
+ private String readContents(InputStream is) {
+ String charset = "utf8";
+
+ StringBuffer s = new StringBuffer();
+ Reader reader = null;
+ try {
+ reader = new InputStreamReader(is, charset);
+ char[] readBuffer = new char[2048];
+ int n = reader.read(readBuffer);
+ while (n > 0) {
+ s.append(readBuffer, 0, n);
+ n = reader.read(readBuffer);
+ }
+
+ }
+ catch (Exception e) {
+ }
+ finally {
+ try {
+ if (is != null) {
+ is.close();
+ }
+ if (reader != null)
+ reader.close();
+ }
+ catch (Exception e) {
+ // nothing to do
+ }
+ }
+ return s.toString();
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(TEST_JAR_UTILITIES_PROJECT);
+ synchronized (TEST_JAR_UTILITIES_PROJECT) {
+ if (!project.isAccessible()) {
+ project = createSimpleProject(TEST_JAR_UTILITIES_PROJECT);
+ copyBundleEntryIntoWorkspace(TESTFILE_BUNDLE_ENTRY, TEST_JAR_UTILITIES_TESTFILE_JAR);
+ }
+ }
+ running++;
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ running--;
+ if (running == 0) {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(TEST_JAR_UTILITIES_PROJECT);
+ synchronized (TEST_JAR_UTILITIES_PROJECT) {
+ project.delete(true, true, null);
+ }
+ }
+ }
+
+ public void testEntryCountFromFilesystem() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString());
+ assertEquals("incorrect number of entries", 5, entryNames.length);
+ }
+
+ public void testEntryCountFromMissingFile() {
+ String[] names = JarUtilities.getEntryNames(TEST_JAR_UTILITIES_PROJECT + "/nonexistent.jar");
+ assertNotNull("null names", names);
+ assertEquals("entries returned for missing file", 0, names.length);
+ }
+
+
+ public void testEntryCountFromWorkspace() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)));
+ assertEquals("incorrect number of entries", 5, entryNames.length);
+ }
+
+ public void testEntryCountWithDirectoriesFromFilesystem() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString(), false);
+ assertEquals("incorrect number of entries", 6, entryNames.length);
+ }
+
+ public void testEntryNamesFromFilesystem() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString());
+ Collection names = new ArrayList(Arrays.asList(entryNames));
+
+ String[] expectedNames = new String[]{".project", "about.html", "build.properties", "plugin.properties", "test.xml"};
+ for (int i = 0; i < expectedNames.length; i++) {
+ assertTrue("missing name of entry: " + entryNames[i], names.contains(entryNames[i]));
+ }
+ }
+
+ public void testEntryNamesFromWorkspace() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)));
+ Collection names = new ArrayList(Arrays.asList(entryNames));
+
+ for (int i = 0; i < fExpectedNames.length; i++) {
+ assertTrue("missing name of entry: " + entryNames[i], names.contains(entryNames[i]));
+ }
+ }
+
+ public void testEntryNamesWithDirectoriesFromFilesystem() {
+ String[] entryNames = JarUtilities.getEntryNames(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString(), false);
+ Collection names = new ArrayList(Arrays.asList(entryNames));
+
+ String[] expectedNames = new String[]{".project", "about.html", "build.properties", "plugin.properties", "test.xml"};
+ for (int i = 0; i < expectedNames.length; i++) {
+ assertTrue("missing name of entry: " + entryNames[i], names.contains(entryNames[i]));
+ }
+ assertTrue("missing name of folder entry: empty/", names.contains("empty/"));
+ }
+
+ public void testReadFromFilesystem() {
+ String location = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString();
+ String contents = readContents(JarUtilities.getInputStream(location, "plugin.properties"));
+ assertNotNull("no contents loaded", contents);
+ assertTrue("not enough contents read", contents.length() > 40);
+ assertTrue("contents not as expected" + contents.substring(0, 40), contents.startsWith("##########################################################"));
+ }
+
+
+
+ public void testReadFromMissingFile() {
+ InputStream contents = JarUtilities.getInputStream(TEST_JAR_UTILITIES_PROJECT + "/nonexistent.jar", "plugin.properties");
+ assertNull("contents loaded", contents);
+ }
+
+ public void testReadFromSupportedURL() throws MalformedURLException {
+ String location = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR)).getLocation().toString();
+ String contents = readContents(JarUtilities.getInputStream(new URL("jar:file:" + location + "!/plugin.properties")));
+ assertNotNull("no contents loaded", contents);
+ assertTrue("not enough contents read", contents.length() > 0);
+ assertTrue("contents not as expected", contents.startsWith("##########################################################"));
+ }
+
+ public void testReadFromUnsupportedURL() {
+ URL entry = SSEModelTestsPlugin.getDefault().getBundle().getEntry("about.html");
+ String contents = readContents(JarUtilities.getInputStream(entry));
+ assertNotNull("no contents loaded", contents);
+ assertTrue("not enough contents read", contents.length() > 750);
+ assertTrue("contents not as expected" + contents.substring(0, 75), contents.indexOf("DOCTYPE") > 0);
+ }
+
+ public void testReadFromWorkspace() {
+ IResource jar = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(TEST_JAR_UTILITIES_TESTFILE_JAR));
+ String contents = readContents(JarUtilities.getInputStream(jar, "plugin.properties"));
+ assertNotNull("no contents loaded", contents);
+ assertTrue("not enough contents read", contents.length() > 40);
+ assertTrue("contents not as expected" + contents.substring(0, 40), contents.startsWith("##########################################################"));
+ }
+
+}