9758384d83f97bd8547c47a9976ef7181918859e
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / RefreshJob.java
1 package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.UnsupportedEncodingException;
5 import java.util.ArrayList;
6 import java.util.HashMap;
7
8 import net.sourceforge.phpeclipse.wiki.actions.ProblemConsole;
9 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia;
10 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.MediaWikiConnector;
11 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect.Parsed;
12 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.MethodException;
13 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.exceptions.UnexpectedAnswerException;
14 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
15 import net.sourceforge.phpeclipse.wiki.preferences.Util;
16 import net.sourceforge.phpeclipse.wiki.xml.Page;
17 import net.sourceforge.phpeclipse.wiki.xml.XStreamManager;
18
19 import org.eclipse.core.resources.IContainer;
20 import org.eclipse.core.resources.IFile;
21 import org.eclipse.core.resources.IFolder;
22 import org.eclipse.core.resources.ResourcesPlugin;
23 import org.eclipse.core.resources.WorkspaceJob;
24 import org.eclipse.core.runtime.CoreException;
25 import org.eclipse.core.runtime.IPath;
26 import org.eclipse.core.runtime.IProgressMonitor;
27 import org.eclipse.core.runtime.IStatus;
28 import org.eclipse.core.runtime.Path;
29 import org.eclipse.core.runtime.Status;
30 import org.eclipse.core.runtime.jobs.Job;
31 import org.eclipse.ui.progress.IProgressConstants;
32
33 public class RefreshJob extends WorkspaceJob {
34   IFile[] files;
35
36   IWikipedia configuration;
37
38   String actionURL;
39
40   public RefreshJob(IWikipedia configuration, IFile[] files, String actionURL) {
41     super("Refresh Job");
42     this.files = files;
43     this.configuration = configuration;
44     this.actionURL = actionURL;
45   }
46
47   public IStatus runInWorkspace(IProgressMonitor monitor) {
48     ProblemConsole console = new ProblemConsole();
49     IFile file = null;
50
51     try {
52       monitor.beginTask("Download Wiki Articles: ", 100);
53       //      ArrayList wikiTitles = new ArrayList();
54       //      for (int i = 0; i < files.length; i++) {
55       //        wikiTitles.add( Util.getReadableWikiName(files[i]) );
56       //      }
57       StringBuffer buffer = new StringBuffer();
58       HashMap map = new HashMap();
59       String wikiTitle;
60       int titleCounter = 0;
61       for (int i = 0; i < files.length; i++) {
62         file = files[i];
63         wikiTitle = createWikiTitle(file, i);
64         buffer.append(wikiTitle);
65         titleCounter++;
66         map.put(wikiTitle, file);
67         if (i != files.length - 1) {
68           buffer.append("\n");
69         }
70         if (i % 10 == 0) {
71           // read only 10 files at a time
72           IStatus status = readWikisFromBuffer(buffer, map, monitor, console);
73           if (status.equals(Status.CANCEL_STATUS)) {
74             return Status.CANCEL_STATUS;
75           }
76           buffer = new StringBuffer();
77           titleCounter = 0;
78         }
79       }
80       if (titleCounter > 0) {
81         IStatus status = readWikisFromBuffer(buffer, map, monitor, console);
82         if (status.equals(Status.CANCEL_STATUS)) {
83           return Status.CANCEL_STATUS;
84         }
85         buffer = new StringBuffer();
86         titleCounter = 0;
87       }
88
89       if (isModal(this)) {
90         // The progress dialog is still open show the message
91         console.reportError();
92       } else {
93         //        setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE);
94         //            setProperty(IProgressConstants.ACTION_PROPERTY, getWikisCompletedAction());
95       }
96       return Status.OK_STATUS;
97       //        } catch(CoreException e) {
98       //          return e.getStatus();
99     } catch (UnexpectedAnswerException e) {
100       if (file != null) {
101         console.println("File: " + file.getLocation().toString() + "\n==>UnexpectedAnswerException: " + e.getMessage());
102       } else {
103         console.println("UnexpectedAnswerException: " + e.getMessage());
104       }
105     } catch (MethodException e) {
106       if (file != null) {
107         console.println("File: " + file.getLocation().toString() + "\n==>HTTP-MethodException: " + e.getMessage());
108       } else {
109         console.println("HTTP-MethodException: " + e.getMessage());
110       }
111     } catch (InterruptedException e) {
112       if (file != null) {
113         console.println("File: " + file.getLocation().toString() + "\n==>InterruptedException: " + e.getMessage());
114       } else {
115         console.println("InterruptedException: " + e.getMessage());
116       }
117     } finally {
118       monitor.done();
119     }
120     if (isModal(this)) {
121       // The progress dialog is still open show the message
122       console.reportError();
123     }
124     return Status.OK_STATUS;
125   }
126
127   /**
128    * @param buffer
129    * @param map
130    * @param monitor
131    * @param console
132    * @param file
133    * @return
134    * @throws UnexpectedAnswerException
135    * @throws MethodException
136    */
137   private IStatus readWikisFromBuffer(StringBuffer buffer, HashMap map, IProgressMonitor monitor, ProblemConsole console)
138       throws UnexpectedAnswerException, InterruptedException, MethodException {
139     String wikiTitle;
140     boolean showConsole = WikiEditorPlugin.getDefault().getPreferenceStore().getBoolean(WikiEditorPlugin.CONSOLE_OUTPUT);
141     MediaWikiConnector mwConnector = new MediaWikiConnector();
142     String url = actionURL;
143     if (url == null) {
144       url = configuration.getActionUrl() + "/" + configuration.getSpecialNs() + ":Export";
145     }
146     // get a list of Parsed elements
147     monitor.subTask("Downloading (XML Import)");
148     if (showConsole) {
149       console.println("Downloading (XML Import):\n" + buffer.toString());
150     }
151     ArrayList list = mwConnector.loadXML(configuration, url, buffer.toString());
152     String body;
153     IFile file = null;
154     for (int i = 0; i < list.size(); i++) {
155       Parsed parsed = (Parsed) list.get(i);
156       wikiTitle = parsed.getTitle();
157       if (wikiTitle != null) {
158         body = parsed.getBody();
159         if (body != null) {
160           file = (IFile) map.get(wikiTitle);
161           if (file != null) {
162             // rearrange parsed data into a page for XStream hamdling:
163             Page page = new Page(parsed.getDateTimestamp(), wikiTitle, body);
164             monitor.subTask("Modify file: " + file.getLocation().toString());
165             if (showConsole) {
166               console.println("Update file: " + file.getLocation().toString());
167             }
168             updateFileContent(console, file, page, body, configuration, monitor);
169           }
170         }
171       }
172       if (monitor.isCanceled()) {
173         return Status.CANCEL_STATUS;
174       }
175     }
176
177     return Status.OK_STATUS;
178   }
179
180   /**
181    * @param file
182    * @param wikiTitle
183    * @param i
184    * @return
185    */
186   private String createWikiTitle(IFile file, int i) {
187     String wikiTitle = null;
188     String srcBasePath = Util.getWikiTextsPath(file);
189     String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH);
190
191     String fileXMLName = Util.getXMLFileName(file, binBasePath, srcBasePath);
192     IPath path = new Path(fileXMLName);
193     IFile xmlFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
194     if (xmlFile.exists()) {
195       try {
196         Page page = XStreamManager.fromXML(xmlFile.getContents());
197         if (page != null) {
198           wikiTitle = page.getTitle();
199         }
200         //                timestamp = XMLReader.getDateTimestamp(xmlFile.getContents());
201       } catch (Exception e2) {
202       }
203     }
204     if (wikiTitle == null) {
205       // if no XML file exists we create the name from the filename
206       wikiTitle = Util.getReadableWikiName(files[i]);
207     }
208     return wikiTitle;
209   }
210
211   public boolean isModal(Job job) {
212     Boolean isModal = (Boolean) job.getProperty(IProgressConstants.PROPERTY_IN_DIALOG);
213     if (isModal == null) {
214       return false;
215     }
216     return isModal.booleanValue();
217   }
218
219   private static void updateFileContent(ProblemConsole console, IFile file, Page page, String body, IWikipedia wp,
220       IProgressMonitor monitor) {
221     try {
222       if (file.exists()) {
223         if (wp == null) {
224           file.setContents(new ByteArrayInputStream(body.getBytes()), true, false, null);
225         } else {
226           file.setContents(new ByteArrayInputStream(body.getBytes(wp.getCharSet())), true, false, null);
227           file.setCharset(wp.getCharSet(), monitor);
228         }
229       } else {
230         if (wp == null) {
231           file.create(new ByteArrayInputStream(body.getBytes()), false, null);
232         } else {
233           file.create(new ByteArrayInputStream(body.getBytes(wp.getCharSet())), false, null);
234           file.setCharset(wp.getCharSet(), monitor);
235         }
236       }
237       String srcBasePath = Util.getWikiTextsPath(file);
238       String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH);
239
240       String filename = Util.getXMLFileName(file, binBasePath, srcBasePath);
241       IPath path = new Path(filename);
242       IFile xmlFile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
243       IContainer parent = xmlFile.getParent();
244       if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
245         Util.createFolder((IFolder) parent, monitor);
246       }
247       try {
248         //        String xmlData = parsed.getXmlData();
249         //        String charSet = "UTF-8";
250         //        StringBuffer buf = new StringBuffer();
251         //        int index = xmlData.indexOf("<page>");
252         //        if (index<0) {
253         //          console.println("File: " + xmlFile.getLocation().toString() + "\n==>Couldn't create xml file - <page> tag not found");
254         //          return;
255         //        }
256         //        xmlData = xmlData.substring(index);
257         //        buf.append(WikiEditorPlugin.XML_START_1);
258         //        buf.append(charSet);
259         //        buf.append(WikiEditorPlugin.XML_START_2);
260         //        buf.append(xmlData);
261         //        buf.append(WikiEditorPlugin.XML_END);
262
263         //        byte[] buffer = buf.toString().getBytes();
264         byte[] buffer = XStreamManager.toXML(page).getBytes();
265         ByteArrayInputStream source = new ByteArrayInputStream(buffer);
266         if (!xmlFile.exists()) {
267           xmlFile.create(source, true, monitor);
268         } else {
269           xmlFile.setContents(source, true, true, monitor);
270         }
271       } catch (CoreException e) {
272         if (file != null) {
273           console.println("File: " + xmlFile.getLocation().toString() + "\n==>CoreException: " + e.getMessage());
274         }
275       }
276     } catch (UnsupportedEncodingException e) {
277       console.println("File: " + file.getLocation().toString() + "\n==>UnsupportedEncodingException: " + e.getMessage());
278     } catch (Exception e) {
279       console.println("File: " + file.getLocation().toString() + "\n==>Exception: " + e.getMessage());
280     }
281   }
282 }