Upload/Download of multiple files now possible
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / connect / XMLReader.java
1 package net.sourceforge.phpeclipse.wiki.actions.mediawiki.connect;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.InputStreamReader;
8 import java.io.Reader;
9 import java.io.StringReader;
10 import java.util.ArrayList;
11
12 import javax.xml.parsers.DocumentBuilder;
13 import javax.xml.parsers.DocumentBuilderFactory;
14 import javax.xml.parsers.ParserConfigurationException;
15
16 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
17
18 import org.apache.crimson.tree.ElementNode;
19 import org.eclipse.core.runtime.CoreException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.NamedNodeMap;
22 import org.w3c.dom.Node;
23 import org.w3c.dom.NodeList;
24 import org.xml.sax.InputSource;
25 import org.xml.sax.SAXException;
26 import org.xml.sax.SAXParseException;
27
28 /**
29  * <code>XMLReader</code> reads Wikipedia XML export pages
30  */
31 public class XMLReader {
32   private static final String TITLE_TAG = "title"; //$NON-NLS-1$
33   private static final String TIMESTAMP_TAG = "timestamp"; //$NON-NLS-1$
34   private static final String TEXT_TAG = "text"; //$NON-NLS-1$
35   private static final String PAGE_TAG = "page"; //$NON-NLS-1$
36
37   public XMLReader() {
38   }
39
40   //  public static void readInSyntax() {
41   //    try {
42   //      hasXMLFileBeenRead = true;
43   //      /*
44   //       * Attempt to read the syntax file from the metadata if this does not work, create metadata from default
45   //       */
46   //      File syntaxFile = getSyntaxFile();
47   //      if (syntaxFile.exists()) {
48   //        readFromFile(syntaxFile);
49   //      } else {
50   //        readFromStream(PHPSyntaxRdr.class.getResourceAsStream(PHPSYNTAX_FILE));
51   //        saveToFile(syntaxFile);
52   //      }
53   //
54   //    } catch (CoreException ce) {
55   //      ce.printStackTrace();
56   //    }
57   //  }
58
59   public static void readFromFile(String filename) {
60     try {
61       readFromFile(new File(filename));
62     } catch (CoreException e) {
63     }
64   }
65
66   public static void readFromFile(File file) throws CoreException {
67     InputStream stream = null;
68
69     if (file.exists()) {
70       try {
71         stream = new FileInputStream(file);
72         readFromStream(new InputStreamReader(stream));
73       } catch (IOException e) {
74         throwReadException(e);
75       } finally {
76         try {
77           if (stream != null) {
78             stream.close();
79           }
80         } catch (IOException e) {
81         }
82       }
83     }
84   }
85
86   private static void traverse(String eleName, Node cNode, Parsed parsed) {
87     switch (cNode.getNodeType()) {
88     case Node.DOCUMENT_NODE:
89 //      System.out.println("DOCUMENT_NODE " + cNode.getNodeName());
90       processChildren(eleName, cNode.getChildNodes(), parsed);
91       break;
92
93     case Node.ELEMENT_NODE:
94       eleName = cNode.getNodeName();
95 //      System.out.println("ELEMENT_NODE " + eleName);
96 //      NamedNodeMap attributeMap = cNode.getAttributes();
97 //      int numAttrs = attributeMap.getLength();
98 //      for (int i = 0; i < attributeMap.getLength(); i++) {
99 //        Attr attribute = (Attr) attributeMap.item(i);
100 //        String attrName = attribute.getNodeName();
101 //        String attrValue = attribute.getNodeValue();
102 //      }
103       processChildren(eleName, cNode.getChildNodes(), parsed);
104       break;
105     case Node.CDATA_SECTION_NODE:
106     case Node.TEXT_NODE:
107       if (eleName.equals(TITLE_TAG)) { // element name from the corresp tag
108         parsed.title = cNode.getNodeValue();
109       } else if (eleName.equals(TIMESTAMP_TAG)) {
110         parsed.timestamp = cNode.getNodeValue();
111       } else if (eleName.equals(TEXT_TAG)) {
112         parsed.body = cNode.getNodeValue();
113       }
114       break;
115     }
116   }
117
118   private static void processChildren(String eleName, NodeList nList, Parsed parsed) {
119     if (nList.getLength() != 0) {
120       for (int i = 0; i < nList.getLength(); i++) {
121         traverse(eleName, nList.item(i), parsed);
122         if (eleName.equals(TEXT_TAG)) {
123           break;
124         }
125       }
126     }
127   }
128
129   /**
130    * Reads the wikipedia xml data from the given stream
131    * 
132    * @param stream
133    * @return 
134    * @throws CoreException
135    */
136   public static ArrayList readFromStream(Reader stream) throws CoreException {
137     ArrayList list = new ArrayList();
138     try {
139       //  Create a factory object for creating DOM parsers
140       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
141       //  Now use the factory to create a DOM parser (a.k.a. a DocumentBuilder)
142       DocumentBuilder parser = factory.newDocumentBuilder();
143       //  Parse the file and build a Document tree to represent its content
144       Document document = parser.parse(new InputSource(stream));
145       //  Ask the document for a list of all <page> tags it contains
146       NodeList pages = document.getElementsByTagName(PAGE_TAG);
147       //  Loop through those <mediawiki> elements one at a time, and extract the
148       //  content of their <page> tags.
149       int numPages = pages.getLength();
150
151       for (int i = 0; i < numPages; i++) {
152         ElementNode page = (ElementNode) pages.item(i); // A <page>
153         Parsed parsed = new Parsed();
154         // set raw xml data:
155         parsed.xmlData = page.toString();
156         traverse("", page, parsed);
157         list.add(parsed);
158       }
159       return list;
160     } catch (ParserConfigurationException e) {
161       throwReadException(e);
162     } catch (IOException e) {
163       throwReadException(e);
164     } catch (SAXParseException e) {
165 //      System.out.println("SAXParseException in line:" + e.getLineNumber() + " column:" + e.getColumnNumber());
166       throwReadException(e);
167     } catch (SAXException e) {
168       throwReadException(e);
169     }
170     return list;
171   }
172
173   private static String getAttributeValue(NamedNodeMap attributes, String name) {
174     Node node = attributes.getNamedItem(name);
175     return node == null ? null : node.getNodeValue();
176   }
177   
178   //  public static void saveToFile(File file) throws CoreException {
179   //    OutputStream stream = null;
180   //    try {
181   //      stream = new FileOutputStream(file);
182   //      saveToStream(stream);
183   //    } catch (IOException e) {
184   //      throwWriteException(e);
185   //    } finally {
186   //      try {
187   //        if (stream != null)
188   //          stream.close();
189   //      } catch (IOException e) {
190   //      }
191   //    }
192   //  }
193
194   //  public static void saveToStream(OutputStream stream) throws CoreException {
195   //    try {
196   //      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
197   //      DocumentBuilder builder = factory.newDocumentBuilder();
198   //      Document document = builder.newDocument();
199   //      Node root = document.createElement("PHPStandardSyntax"); // $NON-NLS-1$ //$NON-NLS-1$
200   //      document.appendChild(root);
201   //      for (int i = 0; i != syntaxdata.size(); i++) {
202   //        Object bufferobj = (Object) syntaxdata.get(i);
203   //        Attr name = null;
204   //        Node node = document.createElement(REVISION_TAG); // $NON-NLS-1$ //$NON-NLS-1$
205   //        root.appendChild(node);
206   //        NamedNodeMap attributes = node.getAttributes();
207   //        // if (bufferobj instanceof PHPType)
208   //        // name = document.createAttribute(TYPE_ATTR);
209   //        // if (bufferobj instanceof PHPKeyword)
210   //        // name = document.createAttribute(KEYWORD_ATTR);
211   //        // if (bufferobj instanceof PHPFunction)
212   //        // name = document.createAttribute(FN_ATTR);
213   //        // if (bufferobj instanceof PHPConstant)
214   //        // name = document.createAttribute(CONSTANT_ATTR);
215   //        // name.setValue(((PHPElement) bufferobj).getName());
216   //        // attributes.setNamedItem(name);
217   //        // Attr description = document.createAttribute(USAGE_ATTR);
218   //        // description.setValue(((PHPElement) bufferobj).getUsage());
219   //        // attributes.setNamedItem(description);
220   //        // if (bufferobj instanceof PHPKeyword) {
221   //        // Attr tokenval = document.createAttribute(TOKENVAL_ATTR);
222   //        // tokenval.setValue((new Integer(((PHPKeyword) bufferobj).gettokenval())).toString());
223   //        // attributes.setNamedItem(tokenval);
224   //        // }
225   //        // if (bufferobj instanceof PHPFunction) {
226   //        // // Attr usage = document.createAttribute(USAGE_ATTR);
227   //        // Text usage = document.createTextNode(((PHPFunction) bufferobj).getDescription());
228   //        // node.appendChild(usage);
229   //        // }
230   //        // if (bufferobj instanceof PHPConstant) {
231   //        // // Attr usage = document.createAttribute(USAGE_ATTR);
232   //        // Text usage = document.createTextNode(((PHPConstant) bufferobj).getDescription());
233   //        // node.appendChild(usage);
234   //        // }
235   //      }
236   //      Transformer transformer = TransformerFactory.newInstance().newTransformer();
237   //      transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
238   //      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
239   //      DOMSource source = new DOMSource(document);
240   //      StreamResult result = new StreamResult(stream);
241   //
242   //      transformer.transform(source, result);
243   //
244   //    } catch (ParserConfigurationException e) {
245   //      throwWriteException(e);
246   //    } catch (TransformerException e) {
247   //      throwWriteException(e);
248   //    }
249   //
250   //  }
251
252   private static void throwReadException(Throwable t) throws CoreException {
253     WikiEditorPlugin.log(t);
254   }
255
256   private static void throwWriteException(Throwable t) throws CoreException {
257     WikiEditorPlugin.log(t);
258   }
259
260   public static void main(String[] args) {
261     try {
262       String test = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"
263           + "<mediawiki version=\"0.1\" xml:lang=\"de\">\r\n"
264           + "  <page>\r\n"
265           + "    <title>Mechanisches Fernsehen</title>\r\n"
266           + "    <revision>\r\n"
267           + "      <timestamp>2004-11-22T12:41:10Z</timestamp>\r\n"
268           + "      <contributor><username>Electrocat</username></contributor>\r\n"
269           + "      <text>Als \'\'\'mechanisches Fernsehen\'\'\' bezeichnet man [[Fernsehen]], bei dem die Bildzerlegung und -zusammensetzung im Gegensatz zum [[elektronisches Fernsehen|elektronischen Fernsehen]] mechanisch erfolgt. Die eigentliche Übertragung findet natürlich auf elektrischem Wege statt.\r\n"
270           + "\r\n"
271           + "Das mechanische Fernsehen war die erste Form des Fernsehens. Die erste  brauchbare Realisierung erfolgte mit Hilfe der nach ihrem Erfinder [[Paul Nipkow]] benannten [[Nipkow-Scheibe]]. Hierbei ist insbesondere die Pionierarbeit des ungarischen Ingenieurs [[D. von Mihaly]] und des schottischen Erfinders [[John Logie Baird]] zu erwähnen. [[D. von Mihaly]] entwickelte ebenfalls ein vollkommen anderes Verfahren, bei dem ein Spiegel zwischen einem Hufeisenmagneten schnell oszillierte. In einem verbesserten Verfahren wurde ein Spiegel auf Drahtsaiten befestigt, welche nach Stromdurchleitung in eine schnelle Schwingung versetzt wurden. Ein wieder anderes Verfahren entwickelte [[Dr. Carolus]] bei [[Telefunken]], wo mit schnell rotierenden Spiegeln gearbeitet wurde. Durch Carolus wurden auch beide Systeme miteinander kombiniert (Spiegelrad für horizontale Abtastung, oszillierende Spiegel für vertikale Abtastung. \r\n"
272           + "\r\n"
273           + "Dennoch sollte beim mechanischen Fernsehen insbesondere die Nipkow-Scheibe Verwendung finden, welche auf der Senderseite bis in die 1940er Jahre zur Bildzerlegung von Filmen Verwendung fand.   \r\n"
274           + "\r\n"
275           + "Auch heute ist das mechanische Fernsehen nicht vollkommen bedeutungslos. Insbesondere Spiegelsysteme finden heute wieder Verwendung beim Bau von [[Videoprojektoren]]. \r\n"
276           + "\r\n"
277           + "===Hinweis:===\r\n"
278           + "Die Begriffsbildung &quot;Mechanisches Fernsehen&quot; beruht auf der laienhaften Anschauung, die sichtbar drehende Nipkow-Lochscheibe als wesentlichstes Funktionselement oder anders ausgedrückt, den Vorgang der Bildpunkt-Zerlegung als Hauptteil des Fernseh-Gesamtsystems wahrzunehmen\r\n"
279           + "\r\n"
280           + "Demgegenüber besteht die nipkowsche Vorrichtung größtenteils aus elektrisch betriebenen Bauteilen, von denen mindestens eines - die [[Selen]]zelle - bereits ein elektronisches Bauelement darstellt. Desweiteren erfolgt die Übertragung vom Sender zum Empfänger elektrisch. &lt;br /&gt;\r\n"
281           + "\r\n"
282           + "Auf der Empfänger-Seite wird bei der nipkowschen Ausführung raffinierterweise ein [[Polarisation|polarisierter]] Lichstrahl von dem Magnetfeld einer Spule in Abhängigkeit von dem Signal der Sender-Selenzelle soweit gedreht und durch nachfolgende Linsen gefiltert, dass für das Auge der gleiche Helligkeits-Eindruck hervorgerufen wird, wie er auf der Sender-Seite besteht.&lt;br /&gt;\r\n"
283           + "Dieser polarisierte Lichtstrahl wurde mit Hilfe entweder eines speziellen optischen Glases oder einer mit Schwefelkohlenstoff gefüllten Röhre erzeugt(sog. &quot;Glimmlampe&quot;)  und   ersetzte damals die noch nicht erfundene Braunsche Elektronenstrahlröhre. \r\n"
284           + "\r\n"
285           + "Damit wird sichtbar, dass der Begriff des &quot;mechanischen Fernsehens&quot; weitgehend irreführend ist. Nipkow selbst nannte seinen Apparat in der Patentschrift etwas treffender ein &quot;Elektrisches Teleskop&quot;. \r\n"
286           + "Allenfalls korrekt wäre noch die Begriffsbildung &quot;mechanische Bildzerlegung&quot;. \r\n" + "\r\n"
287           + "== Weblinks ==\r\n" + "*http://www.kefk.net/Research/Funk/HA-Funk/ha_2-3.html\r\n" + "\r\n"
288           + "[[Kategorie:Fernsehtechnik]]</text>\r\n" + "    </revision>\r\n" + "  </page>\r\n" + "\r\n" + "</mediawiki>";
289       String test2 = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"
290           + "<mediawiki version=\"0.1\" xml:lang=\"de\">\r\n"
291           + "  <page>\r\n"
292           + "    <title>Anrechenbare Kosten</title>\r\n"
293           + "    <revision>\r\n"
294           + "      <timestamp>2004-09-22T17:18:23Z</timestamp>\r\n"
295           + "      <contributor><username>Fenice</username></contributor>\r\n"
296           + "      <comment>cat</comment>\r\n"
297           + "\r\n"
298           + "      <text>Die \'\'\'anrechenbaren Kosten\'\'\' sind eines der Regelkriterien bei der Ermittlung des [[Honorar]]s von Architekten und Ingenieuren nach der [[HOAI]]. Sie werden aus einem fachspezifischen Kostenanteil auf Basis der Kostenermittlungen nach [[DIN 276]] errechnet und können daher innerhalb eines Projektes je nach [[Leistungsphasen|Leistungsphase]] unterschiedlich hoch sein.\r\n"
299           + "\r\n"
300           + "[[Kategorie:Rechnungswesen]]</text>\r\n"
301           + "    </revision>\r\n"
302           + "  </page>\r\n"
303           + "  <page>\r\n"
304           + "    <title>Synästhesie</title>\r\n"
305           + "    <revision>\r\n"
306           + "      <timestamp>2004-12-01T12:19:53Z</timestamp>\r\n"
307           + "\r\n"
308           + "      <contributor><ip>145.253.155.135</ip></contributor>\r\n"
309           + "      <comment>vorübergehender statt verübergehender</comment>\r\n"
310           + "      <text>\'\'\'Synästhesie\'\'\' (griech. \'\'Mitempfindung\'\') ist die Kopplung zweier physikalisch getrennter Domänen der [[Wahrnehmung]] , etwa [[Farbe]] und [[Temperatur]] (\'\'&quot;warmes Grün&quot;\'\'), im engeren Sinne die [[Wahrnehmung]] von Sinnesreizen eines [[Sinnesorgan]]s als die eines anderen. Menschen, bei denen derart verknüpfte Wahrnehmungen auftreten, werden als [[Synästhetiker]] bezeichnet. Synästhesie kann auch als vorübergehender Effekt nach der Einnahme von [[Halluzinogen]]en auftreten.\r\n"
311           + "\r\n"
312           + "Synästhetiker haben also häufig zu einem Sinnesreiz zwei oder mehrere [[Wahrnehmung]]en. Sie können beispielsweise Geräusche nicht nur hören, sondern auch [[Form]]en und Farben dazu sehen. Das Geräusch bekommt zusätzlich zu den üblichen Eigenschaften diese weiteren Eigenschaften. Das Bild, das dabei entsteht, überlagert sich jedoch nur bei den wenigsten Synästhetikern mit dem Gesehenen, sondern wird vor einem &quot;inneren Auge&quot; sichtbar. Diese Synästhesie ist als \'\'Farbenhören\'\' bekannt.\r\n"
313           + "\r\n"
314           + "Viel häufiger als das Farbenhören ist jedoch das Sehen von farbigen Buchstaben, Wörtern oder Zahlen, unabhängig von der eigentlichen Schriftfarbe. \r\n"
315           + "\r\n"
316           + "Synästhesien müssen nicht notwendigerweise mit den 5 Hauptsinnen zu tun haben. Bei Gefühlssynästhetikern erzeugen beispielsweise Sinnesreize Gefühle, oder umgekehrt. Auch abstrakte Begriffe wie eine Jahreszahl oder der Charakter einer Person können bei einem Synästhetiker als Form, als Farbe oder sonstige Sinnesqualität wahrgenommen werden.\r\n"
317           + "\r\n"
318           + "Synästhesien sind z. B.\r\n"
319           + "*individuell verschieden\r\n"
320           + "*nicht umkehrbar (z. B. ruft ein bestimmtes Grün eine Fünf hervor, aber nicht umgekehrt)\r\n"
321           + "*identitätsstiftend\r\n"
322           + "*für den Betroffenen &quot;schon immer da gewesen&quot;, d. h., so lange dieser sich erinnern kann\r\n"
323           + "*unwillkürlich, d. h., ohne Willensanstrengung des Betroffenen\r\n"
324           + "*ohne Einfluss von Alkohol, Drogen oder Medikamenten entstanden\r\n"
325           + "*nicht an eine bestimmte Situation, Erinnerung oder einen Eindruck gebunden\r\n"
326           + "\r\n"
327           + "Alkohol verstärkt Synästhesien, Amphetamine verringern sie.\r\n"
328           + "\r\n"
329           + "\r\n"
330           + "Über die Häufigkeit synästhetischer Wahrnehmung gibt es widersprüchliche Angaben. In der Fachliteratur wird eine Häufigkeit zwischen 1:2000 und 1:500 bei Erwachsenen genannt. 95% der Betroffenen sind Frauen. Viele Synästhetiker sind sich der Besonderheit ihrer Wahrnehmung selbst nicht bewusst und werden erst durch Medienberichte darauf aufmerksam.\r\n"
331           + "\r\n"
332           + "&lt;!-- auskommentiert wegen siehe Diskussion\r\n"
333           + "Synästhesie tritt teilweise auch zusammen mit anderen Eigenschaften, wie beispielsweise starke Empfindsamkeit, ein überdurchschnittliches Gedächtnis und Linkshändigkeit auf.\r\n"
334           + "--&gt;\r\n"
335           + "\r\n"
336           + "Synästhesie ist im deutschsprachigen Raum derzeit ein populärer Forschungsgegenstand, da sie Rückschlüsse auf die Funktionsweise der menschlichen Wahrnehmung zulässt. Auch das Medienecho hat in den letzten Jahren stark zugenommen.\r\n"
337           + "\r\n"
338           + "== Siehe auch ==\r\n"
339           + "* [[Synästhetiker]]\r\n"
340           + "* [[Musikpsychologie]]\r\n"
341           + "* [[Geruchsorgel]]\r\n"
342           + "\r\n"
343           + "== Weblinks ==\r\n"
344           + "* [http://www.mhh-synaesthesie.de/synaesthesie.htm Synästhesieforschung an der medizinischen Hochschule in Hannover]\r\n"
345           + "* [http://www.ch-forschung.ch/alt/fs/0110/S1-1_synest.rtf Synästhesieforschung am neuropsychologischen Institut des Unispitals Zürich]\r\n"
346           + "* [http://www.synaesthesieforum.de Deutschsprachiges Forum von und für Synästhetiker mit ausführlicher Linksammlung zum Thema]\r\n"
347           + "\r\n" + "[[Kategorie:Rhetorischer Begriff]]\r\n"
348           + "[[en:Synaesthesia]] [[es:Sinestesia]] [[sv:Synestesi]] [[tr:Sinestezi]]</text>\r\n" + "    </revision>\r\n"
349           + "  </page>\r\n" + "</mediawiki>";
350       StringReader st = new StringReader(test2);
351
352       readFromStream(st);
353     } catch (CoreException e) {
354       // TODO Auto-generated catch block
355       e.printStackTrace();
356     }
357   }
358 }