1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package com.sun.star.wiki;
25 
26 import com.sun.star.task.UrlRecord;
27 import java.io.*;
28 import java.util.Hashtable;
29 import javax.swing.text.html.*;
30 import com.sun.star.uno.XComponentContext;
31 
32 import org.apache.commons.httpclient.*;
33 import org.apache.commons.httpclient.methods.*;
34 
35 
36 public class WikiArticle
37 {
38     private XComponentContext m_xContext;
39 
40     private String m_sEditTime = "";
41     private String m_sEditToken = "";
42 
43     protected String m_sHTMLCode;
44     private boolean m_bNoArticle = true;
45 
46     protected String m_sWikiUser;
47     protected String m_sWikiPass;
48 
49     protected String m_sTitle = "";
50 
51     private URI m_aMainURI;
52     private HostConfiguration m_aHostConfig;
53 
54 
55     /** Creates a new instance of WikiArticle */
WikiArticle( XComponentContext xContext, String sTitle, Hashtable wikiSettings, boolean bLogin, WikiPropDialog aPropDialog )56     public WikiArticle( XComponentContext xContext, String sTitle, Hashtable wikiSettings, boolean bLogin, WikiPropDialog aPropDialog )
57         throws java.net.MalformedURLException, com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
58     {
59         m_xContext = xContext;
60 
61         String sMainUrl = (String) wikiSettings.get("Url");
62         m_sWikiUser = (String) wikiSettings.get("Username");
63         m_sWikiPass = (String) wikiSettings.get("Password");
64         m_sTitle = sTitle;
65 
66         m_aMainURI = new URI( sMainUrl );
67 
68 //         viewURL = sMainUrl + "index.php?title=" + m_sTitle;
69 //         editURL = sMainUrl + "index.php?title=" + m_sTitle + "&action=edit";
70 //         submitURL = sMainUrl + "index.php?title=" + m_sTitle + "&action=submit";
71 //         loginURL = sMainUrl + "index.php?title=Special:Userlogin";
72 //         loginSubmitURL = sMainUrl + "index.php?title=Special:Userlogin&action=submitlogin";
73 
74         if ( bLogin )
75         {
76             WikiEditSettingDialog aDialog = new WikiEditSettingDialog(m_xContext, "vnd.sun.star.script:WikiEditor.EditSetting?location=application", wikiSettings, false );
77             try
78             {
79                 while( !Login() )
80                 {
81                     if ( aPropDialog != null )
82                         aPropDialog.SetThrobberActive( false );
83 
84                     if ( MainThreadDialogExecutor.Show( xContext, aDialog ) )
85                     {
86                         m_sWikiUser = (String) wikiSettings.get("Username");
87                         m_sWikiPass = (String) wikiSettings.get("Password");
88                     }
89                     else
90                         throw new WikiCancelException();
91 
92                     if ( aPropDialog != null )
93                     {
94                         aPropDialog.SetThrobberActive( true );
95                         Thread.yield();
96                     }
97                 }
98             }
99             finally
100             {
101                 aDialog.DisposeDialog();
102             }
103         }
104 
105         // in case of loading the html contents are used
106         // in case of saving the contents should be checked whether they are empty
107         InitArticleHTML();
108 
109         // getArticleWiki();
110     }
111 
GetMainURL()112     public String GetMainURL()
113     {
114         return m_aMainURI.toString();
115     }
116 
GetTitle()117     public String GetTitle()
118     {
119         return m_sTitle;
120     }
121 
GetViewURL()122     public String GetViewURL()
123     {
124         return m_aMainURI.toString() + "index.php?title=" + m_sTitle;
125     }
126 
getArticleWiki()127     private String getArticleWiki()
128         throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
129     {
130         String sWikiCode = null;
131 
132         if ( m_aHostConfig != null )
133         {
134             URI aURI = new URI( m_aMainURI.toString() + "index.php?title=" + m_sTitle + "&action=edit" );
135             GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery() );
136 
137             Helper.ExecuteMethod( aRequest, m_aHostConfig, aURI, m_xContext, false );
138 
139             int nResultCode = aRequest.getStatusCode();
140             String sWebPage = null;
141             if ( nResultCode == 200 )
142                 sWebPage = aRequest.getResponseBodyAsString();
143 
144             aRequest.releaseConnection();
145 
146             if ( sWebPage != null )
147             {
148                 StringReader r = new StringReader(sWebPage);
149                 HTMLEditorKit.Parser parse = Helper.GetHTMLParser();
150                 EditPageParser callback = new EditPageParser();
151 
152                 parse.parse(r,callback,true);
153                 m_sEditTime = callback.m_sEditTime;
154                 m_sEditToken = callback.m_sEditToken;
155 
156                 int iPosStart = callback.m_nWikiArticleStart;
157                 int iPosEnd = callback.m_nWikiArticleEnd;
158 
159                 if ( iPosStart >= 0 && iPosEnd > 0 )
160                 {
161                     String sArticle = sWebPage.substring(iPosStart, iPosEnd);
162                     iPosStart = sArticle.indexOf(">") + 1;
163                     sWikiCode = sArticle.substring( iPosStart, sArticle.length() );
164                 }
165             }
166         }
167 
168         return sWikiCode;
169     }
170 
InitArticleHTML()171     private void InitArticleHTML()
172         throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
173     {
174         if ( m_aHostConfig != null )
175         {
176             URI aURI = new URI( m_aMainURI.toString() + "index.php?title=" + m_sTitle );
177             GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery() );
178 
179             Helper.ExecuteMethod( aRequest, m_aHostConfig, aURI, m_xContext, false );
180 
181             int nResultCode = aRequest.getStatusCode();
182             String sWebPage = null;
183             if ( nResultCode == 200 )
184                 sWebPage = aRequest.getResponseBodyAsString();
185 
186             if ( sWebPage != null )
187             {
188                 StringReader r = new StringReader(sWebPage);
189                 HTMLEditorKit.Parser parse = Helper.GetHTMLParser();
190                 EditPageParser callback = new EditPageParser();
191 
192                 parse.parse(r,callback,true);
193 
194                 int iPosStart = callback.m_nHTMLArticleStart;
195                 int iPosEnd = callback.m_nHTMLArticleEnd;
196                 int nPosNoArt = callback.m_nNoArticleInd;
197 
198                 if ( iPosStart >= 0 && iPosEnd > 0 )
199                 {
200                     m_sHTMLCode = sWebPage.substring(iPosStart, iPosEnd);
201                     m_bNoArticle = ( nPosNoArt >= 0 && nPosNoArt >= iPosStart && nPosNoArt <= iPosEnd );
202                 }
203             }
204         }
205     }
206 
setArticle( String sWikiCode, String sWikiComment, boolean bMinorEdit )207     protected boolean setArticle( String sWikiCode, String sWikiComment, boolean bMinorEdit )
208         throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
209     {
210         boolean bResult = false;
211 
212         if ( m_aHostConfig != null && sWikiCode != null && sWikiComment != null )
213         {
214             // get the edit time and token
215             getArticleWiki();
216 
217             URI aURI = new URI( m_aMainURI.getPath() + "index.php?title=" + m_sTitle + "&action=submit" );
218             PostMethod aPost = new PostMethod();
219             aPost.setPath( aURI.getEscapedPathQuery() );
220 
221             // aPost.addParameter( "title", m_sTitle );
222             // aPost.addParameter( "action", "submit" );
223             aPost.addParameter( "wpTextbox1", sWikiCode );
224             aPost.addParameter( "wpSummary", sWikiComment );
225             aPost.addParameter( "wpSection", "" );
226             aPost.addParameter( "wpEdittime", m_sEditTime );
227             aPost.addParameter( "wpSave", "Save page" );
228             aPost.addParameter( "wpEditToken", m_sEditToken );
229 
230             if ( bMinorEdit )
231                 aPost.addParameter( "wpMinoredit", "1" );
232 
233             Helper.ExecuteMethod( aPost, m_aHostConfig, aURI, m_xContext, false );
234 
235             int nResultCode = aPost.getStatusCode();
236             if ( nResultCode < 400 )
237                 bResult = true;
238 
239             String aResult = aPost.getResponseBodyAsString();
240 
241             // TODO: remove the debug printing, try to detect the error
242             System.out.print( "nSubmitCode = " + nResultCode + "\n===\n" + aResult );
243         }
244 
245         return bResult;
246     }
247 
Login()248     protected boolean Login()
249         throws com.sun.star.uno.Exception, java.io.IOException, WikiCancelException
250     {
251         m_aHostConfig = Helper.Login( m_aMainURI, m_sWikiUser, m_sWikiPass, m_xContext );
252         return ( m_aHostConfig != null );
253     }
254 
cleanHTML()255     protected void cleanHTML()
256     {
257         if ( m_sHTMLCode != null )
258         {
259             //Welcome to regex hell ;)
260 
261             //strip comments
262             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<![ \\r\\n\\t]*(--([^\\-]|[\\r\\n]|-[^\\-])*--[ \\r\\n\\t]*)\\>","");
263 
264             //strip edit section links
265             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<div class=\"editsection\".*?\\</div\\>","");
266 
267             //strip huge spaces
268             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<p\\>\\<br /\\>[ \r\n\t]*?\\</p\\>","");
269 
270             //strip toc
271             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<table.*id=\"toc\"(.|[\r\n])*?\\</table\\>","");
272 
273             //strip jump-to-nav
274             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<div id=\"jump-to-nav\".*?\\</div\\>","");
275 
276             //strip Javascript
277             m_sHTMLCode = m_sHTMLCode.replaceAll("\\<script(.|[\r\n])*?\\</script\\>","");
278         }
279     }
280 
281 
NotExist()282     protected boolean NotExist()
283     {
284         boolean bResult = true;
285         if ( m_sHTMLCode != null )
286             bResult = m_bNoArticle;
287 
288         return bResult;
289     }
290 }
291 
292