488415: mediawiki-to-doc task can fetch more than 10 images

Support downloading images from newer versions of MediaWiki.

Change-Id: I55d17156ccf134be2dcce0444720169cc38f57b4
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=488415
diff --git a/org.eclipse.mylyn.wikitext.mediawiki.core.ant/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiApiImageFetchingStrategy.java b/org.eclipse.mylyn.wikitext.mediawiki.core.ant/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiApiImageFetchingStrategy.java
index d78a509..3a55e10 100644
--- a/org.eclipse.mylyn.wikitext.mediawiki.core.ant/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiApiImageFetchingStrategy.java
+++ b/org.eclipse.mylyn.wikitext.mediawiki.core.ant/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiApiImageFetchingStrategy.java
@@ -205,7 +205,7 @@
 		public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
 			if ("page".equals(localName)) { //$NON-NLS-1$
 				currentPage = atts.getValue("title"); //$NON-NLS-1$
-			} else if ("images".equals(localName)) { //$NON-NLS-1$
+			} else if ("images".equals(localName) || "continue".equals(localName)) { //$NON-NLS-1$ //$NON-NLS-2$
 				gimcontinue = atts.getValue("gimcontinue"); //$NON-NLS-1$
 			} else if ("imageinfo".equals(localName)) { //$NON-NLS-1$
 				inImageInfo = true;
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiImageFetcherTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiImageFetcherTest.java
new file mode 100644
index 0000000..ed04bc5
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/MediaWikiImageFetcherTest.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green 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:
+ *     David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.ant.tasks;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.tools.ant.Project;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class MediaWikiImageFetcherTest {
+	@Rule
+	public final TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+	private final MediaWikiImageFetcher task = new MediaWikiImageFetcher();
+
+	@Before
+	public void before() throws IOException {
+		task.setDest(temporaryFolder.getRoot());
+		task.setProject(new Project());
+	}
+
+	@Test
+	public void processPageWithManyImages() throws MalformedURLException {
+		task.setUrl(new URL("http://wiki.eclipse.org/"));
+		String wikiPageName = "Linux_Tools_Project/Vagrant_Tooling/User_Guide";
+		task.setPageName(wikiPageName);
+
+		task.execute();
+
+		WikiPageAssertions.assertManyImages(temporaryFolder.getRoot());
+	}
+
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiPageAssertions.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiPageAssertions.java
new file mode 100644
index 0000000..cb4941b
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiPageAssertions.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Tasktop Technologies 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:
+ *     David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.ant.tasks;
+
+import static java.text.MessageFormat.format;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import com.google.common.base.Joiner;
+
+class WikiPageAssertions {
+
+	private static final int MINIMUM_EXPECTED_IMAGES_EXCLUSIVE = 10;
+
+	public static void assertManyImages(File imagesFolder) {
+		assertTrue(imagesFolder.getPath(), imagesFolder.exists() && imagesFolder.isDirectory());
+
+		File[] images = imagesFolder.listFiles();
+		assertNotNull(format("{0} should have files", imagesFolder), images);
+		int imageCount = imageCount(images);
+		assertTrue(
+				format("Expected at least {0} images but got {1} (files in path: {2})",
+						MINIMUM_EXPECTED_IMAGES_EXCLUSIVE, imageCount, Joiner.on(", ").join(images)),
+				imageCount > MINIMUM_EXPECTED_IMAGES_EXCLUSIVE);
+	}
+
+	private static int imageCount(File[] images) {
+		int count = 0;
+		for (File file : images) {
+			String name = file.getName();
+			if (name.endsWith(".png") || name.endsWith(".gif") || name.endsWith(".jpeg") || name.endsWith(".jpg")) {
+				++count;
+			}
+		}
+		return count;
+	}
+
+	private WikiPageAssertions() {
+		// prevent instantiation
+	}
+}
diff --git a/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiToDocTaskIntegrationTest.java b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiToDocTaskIntegrationTest.java
new file mode 100644
index 0000000..c24cec6
--- /dev/null
+++ b/org.eclipse.mylyn.wikitext.tests/src/org/eclipse/mylyn/internal/wikitext/mediawiki/core/ant/tasks/WikiToDocTaskIntegrationTest.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Tasktop Technologies 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:
+ *     David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.wikitext.mediawiki.core.ant.tasks;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.apache.tools.ant.Project;
+import org.eclipse.mylyn.internal.wikitext.mediawiki.core.ant.tasks.WikiToDocTask.Path;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class WikiToDocTaskIntegrationTest {
+
+	@Rule
+	public final TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+	private WikiToDocTask task;
+
+	@Before
+	public void before() throws IOException {
+		task = new WikiToDocTask();
+		task.setDest(temporaryFolder.getRoot());
+		task.setProject(new Project());
+	}
+
+	@Test
+	public void processPageWithManyImages() {
+		task.setWikiBaseUrl("https://wiki.eclipse.org");
+		task.setPrependImagePrefix("images");
+		task.setFormatOutput(true);
+		task.setGenerateUnifiedToc(false);
+
+		Path path = new Path();
+		path.setTitle("Linux Tools Project - User Guide");
+		String wikiPageName = "Linux_Tools_Project/Vagrant_Tooling/User_Guide";
+		path.setName(wikiPageName);
+		path.setGenerateToc(true);
+
+		task.setPaths(Collections.singletonList(path));
+		task.execute();
+
+		File wikiPageFolder = new File(temporaryFolder.getRoot(), wikiPageName);
+		assertManyImages(wikiPageFolder);
+	}
+
+	private void assertManyImages(File wikiPageFolder) {
+		assertTrue(wikiPageFolder.exists());
+
+		File imagesFolder = new File(wikiPageFolder, "images");
+		WikiPageAssertions.assertManyImages(imagesFolder);
+	}
+}