package net.sourceforge.phpeclipse.wiki.actions.mediawiki; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import net.sourceforge.phpeclipse.wiki.actions.ProblemConsole; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.MediaWikiConnector; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.Parsed; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.MethodException; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.UnexpectedAnswerException; import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin; import net.sourceforge.phpeclipse.wiki.preferences.Util; import net.sourceforge.phpeclipse.wiki.xml.Page; import net.sourceforge.phpeclipse.wiki.xml.XStreamManager; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.WorkspaceJob; 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.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.ui.progress.IProgressConstants; public class RefreshJob extends WorkspaceJob { IFile[] files; IWikipedia configuration; String actionURL; public RefreshJob(IWikipedia configuration, IFile[] files, String actionURL) { super("Refresh Job"); this.files = files; this.configuration = configuration; this.actionURL = actionURL; } public IStatus runInWorkspace(IProgressMonitor monitor) { ProblemConsole console = new ProblemConsole(); IFile file = null; try { int totalWork = files.length; if (totalWork <= 0) { totalWork = 100; } monitor.beginTask("Download Wiki Articles: ", totalWork); // ArrayList wikiTitles = new ArrayList(); // for (int i = 0; i < files.length; i++) { // wikiTitles.add( Util.getReadableWikiName(files[i]) ); // } StringBuffer buffer = new StringBuffer(); HashMap map = new HashMap(); MediaWikiConnector mwConnector = new MediaWikiConnector(); String wikiTitle; int titleCounter = 0; for (int i = 0; i < files.length; i++) { file = files[i]; wikiTitle = createWikiTitle(file, i); buffer.append(wikiTitle); titleCounter++; map.put(wikiTitle, file); if (i != files.length - 1) { buffer.append("\n"); } if (i % 5 == 0) { // read only 5 files at a time IStatus status = readWikisFromBuffer(mwConnector, buffer, map, monitor, console); if (status.equals(Status.CANCEL_STATUS)) { return Status.CANCEL_STATUS; } buffer = new StringBuffer(); titleCounter = 0; } } if (titleCounter > 0) { IStatus status = readWikisFromBuffer(mwConnector, buffer, map, monitor, console); if (status.equals(Status.CANCEL_STATUS)) { return Status.CANCEL_STATUS; } buffer = new StringBuffer(); titleCounter = 0; } if (isModal(this)) { // The progress dialog is still open show the message } else { // setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); // setProperty(IProgressConstants.ACTION_PROPERTY, getWikisCompletedAction()); } return Status.OK_STATUS; // } catch(CoreException e) { // return e.getStatus(); } catch (UnexpectedAnswerException e) { if (file != null) { console.println("File: " + file.getLocation().toString() + "\n==>UnexpectedAnswerException: " + e.getMessage()); } else { console.println("UnexpectedAnswerException: " + e.getMessage()); } } catch (MethodException e) { if (file != null) { console.println("File: " + file.getLocation().toString() + "\n==>HTTP-MethodException: " + e.getMessage()); } else { console.println("HTTP-MethodException: " + e.getMessage()); } } catch (InterruptedException e) { if (file != null) { console.println("File: " + file.getLocation().toString() + "\n==>InterruptedException: " + e.getMessage()); } else { console.println("InterruptedException: " + e.getMessage()); } } finally { monitor.done(); } if (isModal(this)) { // The progress dialog is still open show the message } return Status.OK_STATUS; } /** * @param buffer * @param map * @param monitor * @param console * @param file * @return * @throws UnexpectedAnswerException * @throws MethodException */ private IStatus readWikisFromBuffer(MediaWikiConnector mwConnector, StringBuffer buffer, HashMap map, IProgressMonitor monitor, ProblemConsole console) throws UnexpectedAnswerException, InterruptedException, MethodException { String wikiTitle; boolean showConsole = WikiEditorPlugin.getDefault().getPreferenceStore().getBoolean(WikiEditorPlugin.CONSOLE_OUTPUT); String url = actionURL; if (url == null) { url = configuration.getActionUrl() + "/" + configuration.getSpecialNs() + ":Export"; } // get a list of Parsed elements monitor.subTask("Downloading (XML Import)"); if (showConsole) { console.println("Downloading (XML Import):\n" + buffer.toString()); } ArrayList list = mwConnector.loadXML(configuration, url, buffer.toString()); String body; IFile file = null; for (int i = 0; i < list.size(); i++) { Parsed parsed = (Parsed) list.get(i); wikiTitle = parsed.getTitle(); if (wikiTitle != null) { body = parsed.getBody(); if (body != null) { file = (IFile) map.get(wikiTitle); if (file != null) { // rearrange parsed data into a page for XStream hamdling: Page page = new Page(parsed.getDateTimestamp(), wikiTitle, body); monitor.subTask("Modify file: " + file.getLocation().toString()); if (showConsole) { console.println("Update file: " + file.getLocation().toString()); } updateFileContent(console, file, page, body, configuration, monitor); } } } monitor.worked(1); if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } } return Status.OK_STATUS; } /** * @param file * @param wikiTitle * @param i * @return */ private String createWikiTitle(IFile file, int i) { String wikiTitle = null; String srcBasePath = Util.getWikiTextsPath(file); String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH); String fileXMLName = Util.getXMLFileName(file, binBasePath, srcBasePath); IPath path = new Path(fileXMLName); IFile xmlFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path); if (xmlFile.exists()) { try { Page page = XStreamManager.fromXML(xmlFile.getContents()); if (page != null) { wikiTitle = page.getTitle(); } // timestamp = XMLReader.getDateTimestamp(xmlFile.getContents()); } catch (Exception e2) { } } if (wikiTitle == null) { // if no XML file exists we create the name from the filename wikiTitle = Util.getReadableWikiName(files[i]); } return wikiTitle; } public boolean isModal(Job job) { Boolean isModal = (Boolean) job.getProperty(IProgressConstants.PROPERTY_IN_DIALOG); if (isModal == null) { return false; } return isModal.booleanValue(); } private static void updateFileContent(ProblemConsole console, IFile file, Page page, String body, IWikipedia wp, IProgressMonitor monitor) { try { if (file.exists()) { if (wp == null) { file.setContents(new ByteArrayInputStream(body.getBytes()), true, false, null); } else { file.setContents(new ByteArrayInputStream(body.getBytes(wp.getCharSet())), true, false, null); file.setCharset(wp.getCharSet(), monitor); } } else { if (wp == null) { file.create(new ByteArrayInputStream(body.getBytes()), false, null); } else { file.create(new ByteArrayInputStream(body.getBytes(wp.getCharSet())), false, null); file.setCharset(wp.getCharSet(), monitor); } } String srcBasePath = Util.getWikiTextsPath(file); String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH); String filename = Util.getXMLFileName(file, binBasePath, srcBasePath); IPath path = new Path(filename); IFile xmlFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path); IContainer parent = xmlFile.getParent(); if (parent instanceof IFolder && (!((IFolder) parent).exists())) { Util.createFolder((IFolder) parent, monitor); } try { // String xmlData = parsed.getXmlData(); // String charSet = "UTF-8"; // StringBuffer buf = new StringBuffer(); // int index = xmlData.indexOf(""); // if (index<0) { // console.println("File: " + xmlFile.getLocation().toString() + "\n==>Couldn't create xml file - tag not found"); // return; // } // xmlData = xmlData.substring(index); // buf.append(WikiEditorPlugin.XML_START_1); // buf.append(charSet); // buf.append(WikiEditorPlugin.XML_START_2); // buf.append(xmlData); // buf.append(WikiEditorPlugin.XML_END); // byte[] buffer = buf.toString().getBytes(); byte[] buffer = XStreamManager.toXML(page).getBytes(); ByteArrayInputStream source = new ByteArrayInputStream(buffer); if (!xmlFile.exists()) { xmlFile.create(source, true, monitor); } else { xmlFile.setContents(source, true, true, monitor); } } catch (CoreException e) { if (file != null) { console.println("File: " + xmlFile.getLocation().toString() + "\n==>CoreException: " + e.getMessage()); } } } catch (UnsupportedEncodingException e) { console.println("File: " + file.getLocation().toString() + "\n==>UnsupportedEncodingException: " + e.getMessage()); } catch (Exception e) { console.println("File: " + file.getLocation().toString() + "\n==>Exception: " + e.getMessage()); } } }