package net.sourceforge.phpeclipse.wiki.actions.mediawiki.post; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.util.Date; 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.Content; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.MediaWikiConnector; 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.internal.Configuration; import net.sourceforge.phpeclipse.wiki.preferences.Util; import net.sourceforge.phpeclipse.wiki.velocity.EditorText; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.ui.progress.IProgressConstants; public class PostJob extends WorkspaceJob { IFile[] files; IWikipedia wikipedia; Configuration configuration; String user; String password; public PostJob(Configuration configuration, IWikipedia wikipedia, String user, String password, IFile[] files) { super("Refresh Job"); this.files = files; this.wikipedia = wikipedia; this.user = user; this.password = password; this.configuration = configuration; } public String generateUrl(String template, String wikiname) { EditorText text = new EditorText(null); /* first, we init the runtime engine. Defaults are fine. */ try { Velocity.init(); /* lets make a Context and put data into it */ VelocityContext context = new VelocityContext(); context.put("config", configuration); text.clear(); text.setWikiname(wikiname); context.put("text", text); /* lets make our own string to render */ StringWriter w = new StringWriter(); w = new StringWriter(); Velocity.evaluate(context, w, "mystring", template); return w.toString(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return template; } private void selectWiki(String body, MediaWikiConnector connector, String actionUrl, String wikiName) { try { String url = generateUrl(configuration.getURL(), wikiName); Date d = new Date(); Content content = new Content(String.valueOf(d.getTime()), body); connector.store(wikipedia, actionUrl, wikiName, content, "", false, false); } catch (Exception e) { e.printStackTrace(); WikiEditorPlugin.getDefault() .reportError("Exception occured: ", e.getMessage() + "\nSee stacktrace in /.metadata/.log file."); } } public IStatus runInWorkspace(IProgressMonitor monitor) { boolean success = false; MediaWikiConnector connector = null; InputStream is = null; ProblemConsole console = new ProblemConsole(); String actionUrl = configuration.getURL(); if (actionUrl == null || actionUrl.equals("")) { // fall back to default settings actionUrl = wikipedia.getActionUrl(); } try { monitor.beginTask("Refresh Wikis", 100); int partWork = 100 / files.length; int work = 0; int autoCreateIndex = -1; StringBuffer buffer = new StringBuffer(); HashMap map = new HashMap(); String wikiTitle; IFile file = null; connector = new MediaWikiConnector(); success = connector.login(wikipedia, actionUrl, user, password, false); if (success) { for (int i = 0; i < files.length; i++) { try { file = files[i]; is = file.getContents(); String wikiName = Util.getFileWikiName(file); String body = StoreWikipediaAction.getInputStreamAsString(is, wikipedia.getCharSet()); autoCreateIndex = body.indexOf(WikiEditorPlugin.AUTOMATICALLY_CREATED); if (autoCreateIndex < 0) { selectWiki(body, connector, actionUrl, wikiName); } else { console.println("File: " + file.getLocation().toString() + "\n==>no upload allowed; Wiki text contains string: " + WikiEditorPlugin.AUTOMATICALLY_CREATED); } } catch (CoreException e1) { if (file != null) { console.println("File: " + file.getLocation().toString() + "\n==>CoreException: " + e1.getMessage()); } } if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } work += partWork; monitor.worked(work); } } if (isModal(this)) { // The progress dialog is still open show the message console.reportError(); } else { setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE); // setProperty(IProgressConstants.ACTION_PROPERTY, getWikisCompletedAction()); } return Status.OK_STATUS; // } catch(CoreException e) { // return e.getStatus(); } catch (IOException e) { console.println("==>IOException: " + e.getMessage()); } catch (UnexpectedAnswerException e) { console.println("==>UnexpectedAnswerException: " + e.getMessage()); } catch (MethodException e) { console.println("==>HTTP-MethodException: " + e.getMessage()); } finally { monitor.done(); if (success && connector != null) { try { connector.logout(wikipedia, actionUrl); } catch (UnexpectedAnswerException e1) { console.println("==>UnexpectedAnswerException: " + e1.getMessage()); } catch (MethodException e1) { console.println("==>HTTP-MethodException: " + e1.getMessage()); } } if (is != null) { try { is.close(); } catch (IOException e1) { } } } if (isModal(this)) { // The progress dialog is still open show the message console.reportError(); } return Status.CANCEL_STATUS; } public boolean isModal(Job job) { Boolean isModal = (Boolean) job.getProperty(IProgressConstants.PROPERTY_IN_DIALOG); if (isModal == null) { return false; } return isModal.booleanValue(); } }