Upload/Download of multiple files now possible
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / post / StoreWikipediaAction.java
index b796b80..d54b064 100644 (file)
@@ -6,15 +6,17 @@ package net.sourceforge.phpeclipse.wiki.actions.mediawiki.post;
 //The modified sources are available under the "Common Public License"
 //with permission from the original author: Daniel Wunsch
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.StringWriter;
-import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia;
-import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.WikipediaDE;
 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.Content;
 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.MediaWikiConnector;
 import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
@@ -28,6 +30,7 @@ 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.runtime.CoreException;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextSelection;
@@ -45,6 +48,13 @@ import org.eclipse.ui.texteditor.AbstractTextEditor;
 
 public class StoreWikipediaAction implements IEditorActionDelegate {
 
+  /**
+   * Constant for an empty char array
+   */
+  public static final char[] NO_CHAR = new char[0];
+
+  private static final int DEFAULT_READING_SIZE = 8192;
+
   private AbstractTextEditor fEditor;
 
   private EditorText text;
@@ -83,15 +93,19 @@ public class StoreWikipediaAction implements IEditorActionDelegate {
     return template;
   }
 
-  protected Configuration getConfiguration() {
+  protected Configuration getConfigurationPrefix(String prefix) {
+
     List allConfigsList = ConfigurationManager.getInstance().getConfigurations();
     ArrayList configsList = new ArrayList();
     for (int i = 0; i < allConfigsList.size(); i++) {
       IConfiguration temp = (IConfiguration) allConfigsList.get(i);
-      if (temp.getType().startsWith(WikiEditorPlugin.PREFIX_STORE)) {
+      if (temp.getType().startsWith(prefix)) {
         configsList.add(temp);
       }
     }
+    if (configsList.size() == 1) {
+      return (Configuration) configsList.get(0);
+    }
     Collections.sort(configsList);
     Configuration configuration = null;
     ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
@@ -110,37 +124,33 @@ public class StoreWikipediaAction implements IEditorActionDelegate {
     return configuration;
   }
 
+  protected Configuration getConfiguration() {
+    return getConfigurationPrefix(WikiEditorPlugin.PREFIX_STORE);
+  }
+
   public IDocument getDocument() {
     IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
     return doc;
   }
 
   private String getWikiFile(IFile file) {
-    return Util.getFileWikiName(file, WikiEditorPlugin.HTML_OUTPUT_PATH);
+    return Util.getFileWikiName(file);
   }
 
   public void init(IWorkbenchWindow window) {
     this.window = window;
   }
 
-  void openWikiFile(IFile cfile) {
-    String wikiName = getWikiFile(cfile);
-    try {
-      if (fEditor != null) {
-        selectWiki(wikiName);
-      }
-    } catch (Exception e) {
-    }
-
-  }
-
-  public void openWikiLinkOnSelection() {
-    IDocument doc = getDocument();
-    ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
-    int pos = selection.getOffset();
-    IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
-    openWikiFile(ei.getFile());
-  }
+//  void postWikiFile(IFile currentFile) {
+//    String wikiName = getWikiFile(currentFile);
+//    try {
+//      if (fEditor != null) {
+//        selectWiki(currentFile.getContents(), wikiName);
+//      }
+//    } catch (Exception e) {
+//    }
+//
+//  }
 
   public void run(IAction action) {
     if (fEditor == null) {
@@ -150,7 +160,59 @@ public class StoreWikipediaAction implements IEditorActionDelegate {
       }
     }
     if (fEditor != null) {
-      openWikiLinkOnSelection();
+      Configuration configuration = getConfiguration();
+      if (configuration != null && !configuration.equals("")) {
+        try {
+          String wikiLocale = configuration.getType().substring(WikiEditorPlugin.PREFIX_STORE.length());
+          IWikipedia wikipediaProperties = WikiEditorPlugin.getWikiInstance(wikiLocale);
+          String user = configuration.getUser();
+          String password = configuration.getPassword();
+          if (user == null || password == null || user.equals("") || password.equals("")) {
+            String[] result = new String[2];
+            boolean cache = configuration.promptForPassword(configuration.getUser(), "Set User/Password", true, result);
+            if (result[0] == null || result[1] == null) {
+              return;
+            }
+            if (result[0].equals("") || result[1].equals("")) {
+              return;
+            }
+            user = result[0];
+            password = result[1];
+          }
+//          IDocument doc = getDocument();
+//          ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
+//          int pos = selection.getOffset();
+          if (fEditor.getEditorInput() instanceof IFileEditorInput) {
+            IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+            IFile currentFile = ei.getFile();
+            IFile[] files = { currentFile };
+            PostJob job = new PostJob(configuration, wikipediaProperties,  user,  password, files);
+            job.setRule(null);
+            job.setUser(true);
+            job.schedule();
+            
+            String wikiName = getWikiFile(currentFile);
+            if (fEditor != null) {
+              selectWiki(configuration, currentFile.getContents(), wikipediaProperties, user, password, wikiName);
+            }
+          }
+        } catch (CoreException e1) {
+          // TODO Auto-generated catch block
+          e1.printStackTrace();
+        } catch (NoSuchMethodException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        } catch (IllegalAccessException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        } catch (InvocationTargetException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+        }
+      }
     }
   }
 
@@ -167,34 +229,31 @@ public class StoreWikipediaAction implements IEditorActionDelegate {
     }
   }
 
-  private void selectWiki(String wikiName) {
-    Configuration configuration = getConfiguration();
-    if (configuration != null && !configuration.equals("")) {
-      try {
-        IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
-        String url = generateUrl(configuration, configuration.getURL(), wikiName);
-        String wikiLocale = configuration.getType().substring(WikiEditorPlugin.PREFIX_STORE.length());
-        IWikipedia wikipediaProperties = WikiEditorPlugin.getWikiInstance(wikiLocale);
-        
-        MediaWikiConnector connector = new MediaWikiConnector();
-        String actionUrl = configuration.getURL();
-        if (actionUrl == null || actionUrl.equals("")) {
-          // fall back to default settings 
-          actionUrl = wikipediaProperties.getActionUrl();
-        }
-        Date d = new Date();
+  private void selectWiki(Configuration configuration, InputStream is, IWikipedia wikipediaProperties, String user, String password, String wikiName) {
 
-        Content content = new Content(String.valueOf(d.getTime()), doc.get());
-        boolean success = connector.login(wikipediaProperties, actionUrl, configuration.getUser(), configuration.getPassword(), false);
-        if (success) {
-          connector.store(wikipediaProperties, actionUrl, wikiName, content, "", false, false);
-          connector.logout(wikipediaProperties, actionUrl);
-        }
-      } catch (Exception e) {
-        e.printStackTrace();
-        WikiEditorPlugin.getDefault()
-            .reportError("Exception occured: ", e.getMessage() + "\nSee stacktrace in /.metadata/.log file.");
+    try {
+      //        IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+      String url = generateUrl(configuration, configuration.getURL(), wikiName);
+
+      MediaWikiConnector connector = new MediaWikiConnector();
+      String actionUrl = configuration.getURL();
+      if (actionUrl == null || actionUrl.equals("")) {
+        // fall back to default settings
+        actionUrl = wikipediaProperties.getActionUrl();
+      }
+      Date d = new Date();
+
+      Content content = new Content(String.valueOf(d.getTime()), getInputStreamAsString(is, wikipediaProperties.getCharSet()));
+
+      boolean success = connector.login(wikipediaProperties, actionUrl, user, password, false);
+      if (success) {
+        connector.store(wikipediaProperties, actionUrl, wikiName, content, "", false, false);
+        connector.logout(wikipediaProperties, actionUrl);
       }
+    } catch (Exception e) {
+      e.printStackTrace();
+      WikiEditorPlugin.getDefault()
+          .reportError("Exception occured: ", e.getMessage() + "\nSee stacktrace in /.metadata/.log file.");
     }
   }
 
@@ -204,4 +263,75 @@ public class StoreWikipediaAction implements IEditorActionDelegate {
       text = new EditorText(targetEditor);
     }
   }
+
+  /**
+   * Returns the given input stream's contents as a character array. If a length is specified (ie. if length != -1), only length
+   * chars are returned. Otherwise all chars in the stream are returned. Note this doesn't close the stream.
+   * 
+   * @throws IOException
+   *           if a problem occured reading the stream.
+   */
+  public static String getInputStreamAsString(InputStream stream, String encoding) throws IOException {
+    char[] array = getInputStreamAsCharArray(stream, -1, encoding);
+    if (array != null) {
+      return new String(array);
+    }
+    return null;
+  }
+
+  /**
+   * Returns the given input stream's contents as a character array. If a length is specified (ie. if length != -1), only length
+   * chars are returned. Otherwise all chars in the stream are returned. Note this doesn't close the stream.
+   * 
+   * @throws IOException
+   *           if a problem occured reading the stream.
+   */
+  public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding) throws IOException {
+    InputStreamReader reader = null;
+    reader = encoding == null ? new InputStreamReader(stream) : new InputStreamReader(stream, encoding);
+    char[] contents;
+    if (length == -1) {
+      contents = NO_CHAR;
+      int contentsLength = 0;
+      int amountRead = -1;
+      do {
+        int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE); // read at least 8K
+
+        // resize contents if needed
+        if (contentsLength + amountRequested > contents.length) {
+          System.arraycopy(contents, 0, contents = new char[contentsLength + amountRequested], 0, contentsLength);
+        }
+
+        // read as many chars as possible
+        amountRead = reader.read(contents, contentsLength, amountRequested);
+
+        if (amountRead > 0) {
+          // remember length of contents
+          contentsLength += amountRead;
+        }
+      } while (amountRead != -1);
+
+      // resize contents if necessary
+      if (contentsLength < contents.length) {
+        System.arraycopy(contents, 0, contents = new char[contentsLength], 0, contentsLength);
+      }
+    } else {
+      contents = new char[length];
+      int len = 0;
+      int readSize = 0;
+      while ((readSize != -1) && (len != length)) {
+        // See PR 1FMS89U
+        // We record first the read size. In this case len is the actual read size.
+        len += readSize;
+        readSize = reader.read(contents, len, length - len);
+      }
+      // See PR 1FMS89U
+      // Now we need to resize in case the default encoding used more than one byte for each
+      // character
+      if (len != length)
+        System.arraycopy(contents, 0, (contents = new char[len]), 0, len);
+    }
+
+    return contents;
+  }
 }
\ No newline at end of file