Wiki source code of XML-RPC Java Examples
Last modified by Thomas Mortagne on 2023/10/10 14:31
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | {{box cssClass="floatinginfobox" title="**Contents**"}} | ||
2 | {{toc/}} | ||
3 | {{/box}} | ||
4 | |||
5 | = Requirements = | ||
6 | |||
7 | The following libraries should be added to your application classpath: | ||
8 | |||
9 | {{info}} | ||
10 | Most of the libraries can be easily found in the WEB-INF/lib folder of your XWiki instance. As mentioned at [[Extension.XML-RPC Integration]], version numbers of these libraries for the most part are irrelevant. In the examples listed here, XWiki version 2.1.1 is used. | ||
11 | {{/info}} | ||
12 | |||
13 | |=Library|=Source | ||
14 | |commons-logging-1.1.1.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
15 | |ws-commons-util-1.0.2.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
16 | |xmlrpc-common-3.1.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
17 | |xmlrpc-client-3.1.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
18 | |xwiki-core-2.1.1.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
19 | |swizzle-confluence-1.2-20080419-xwiki.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
20 | |xwiki-core-xmlrpc-client-2.1.1.jar|Manually download the jar from [[Maven repository>>http://maven.xwiki.org/releases/org/xwiki/platform/xwiki-core-xmlrpc-client/2.1.1/]] | ||
21 | |xwiki-core-xmlrpc-model-2.1.1.jar|WEB-INF/lib folder of XWiki 2.1.1 | ||
22 | |||
23 | = Authentication: Login Example = | ||
24 | |||
25 | Try Providing an incorrect username & password. The application will throw an exception | ||
26 | For correct username & password, the application will compile & run successfully. | ||
27 | |||
28 | {{code language="java"}} | ||
29 | import java.net.MalformedURLException; | ||
30 | import org.apache.xmlrpc.XmlRpcException; | ||
31 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
32 | public class XmlRpcLogin { | ||
33 | public static void main(String[] args) throws MalformedURLException{ | ||
34 | |||
35 | //URL of the xwiki instance | ||
36 | String url="http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
37 | |||
38 | //Replace user & pass with desired xwiki username & password | ||
39 | String user="Admin"; | ||
40 | String pass="admin"; | ||
41 | |||
42 | //Perform Login & Authentication using above url address | ||
43 | try{ | ||
44 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
45 | rpc.login(user, pass); | ||
46 | |||
47 | } | ||
48 | catch(XmlRpcException e){ | ||
49 | System.out.println("invalid username/password was specified or communication problem"); | ||
50 | } | ||
51 | } | ||
52 | } | ||
53 | {{/code}} | ||
54 | |||
55 | = Authentication: Logout Example = | ||
56 | |||
57 | Let's build on the previous example where we "Logged In". We test logout action using a boolean variable since rpc.logout() method returns true on successful logout. | ||
58 | |||
59 | {{code language="java"}} | ||
60 | |||
61 | import java.net.MalformedURLException; | ||
62 | import org.apache.xmlrpc.XmlRpcException; | ||
63 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
64 | public class XmlRpcLogout { | ||
65 | public static void main(String[] args) throws MalformedURLException{ | ||
66 | |||
67 | //Variable to test whether user logged out successfully. Default set to false | ||
68 | boolean loggedOut=false; | ||
69 | |||
70 | //URL of the xwiki instance | ||
71 | String url="http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
72 | |||
73 | //Replace user & pass with desired xwiki username & password | ||
74 | String user="Admin"; | ||
75 | String pass="admin"; | ||
76 | |||
77 | try{ | ||
78 | //Perform Login & Authentication using above url address | ||
79 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
80 | rpc.login(user, pass); | ||
81 | |||
82 | //Log out action. Returns true if user successfully logged out | ||
83 | loggedOut=rpc.logout(); | ||
84 | System.out.println(loggedOut); | ||
85 | } | ||
86 | catch(XmlRpcException e){ | ||
87 | System.out.println("invalid username/password was specified or communication problem"); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | {{/code}} | ||
92 | |||
93 | |||
94 | = Space: Get A List Of Spaces = | ||
95 | |||
96 | Now, that we can log in and log out, let's move to finding out what's inside your wiki. How about a list of all the spaces inside the wiki. Compare the above two examples and you will see the new import that we added viz. the SpaceSummary class. | ||
97 | |||
98 | {{code language="java"}} | ||
99 | |||
100 | import java.net.MalformedURLException; | ||
101 | import java.util.List; | ||
102 | import org.apache.xmlrpc.XmlRpcException; | ||
103 | import org.codehaus.swizzle.confluence.SpaceSummary; | ||
104 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
105 | public class SpaceList { | ||
106 | |||
107 | public static void main(String[] args) throws MalformedURLException { | ||
108 | //URL of the xwiki instance | ||
109 | String url="http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
110 | |||
111 | //Replace user & pass with desired xwiki username & password | ||
112 | String user="Admin"; | ||
113 | String pass="admin"; | ||
114 | |||
115 | //Perform Login & Authentication using above url address | ||
116 | try{ | ||
117 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
118 | rpc.login(user, pass); | ||
119 | |||
120 | List<SpaceSummary> spaceList = rpc.getSpaces(); | ||
121 | System.out.println("Total Number of Spaces: " +spaceList.size()); | ||
122 | for(int i=0;i<spaceList.size();i++){ | ||
123 | System.out.println(spaceList.get(i).getKey()); | ||
124 | } | ||
125 | rpc.logout(); | ||
126 | } | ||
127 | catch(XmlRpcException e){ | ||
128 | System.out.println("invalid username/password was specified or communication problem"); | ||
129 | } | ||
130 | } | ||
131 | } | ||
132 | {{/code}} | ||
133 | |||
134 | = Space: Create A Space = | ||
135 | |||
136 | So far, we logged in, logged out & also were able to see a list of spaces in the xwiki instance. Let's go ahead and create a new space. And not just that we will also assign the default home page for the space. In this example, we use "XMLRPC" as the space name & "xmlrpc.WebHome" as the home page | ||
137 | |||
138 | {{code language="java"}} | ||
139 | import java.net.MalformedURLException; | ||
140 | import org.apache.xmlrpc.XmlRpcException; | ||
141 | import org.codehaus.swizzle.confluence.Space; | ||
142 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
143 | |||
144 | public class CreateSpace { | ||
145 | |||
146 | public static void main(String[] args) throws MalformedURLException { | ||
147 | //URL of the xwiki instance | ||
148 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
149 | |||
150 | //Replace user & pass with desired xwiki username & password | ||
151 | String user = "Admin"; | ||
152 | String pass = "admin"; | ||
153 | |||
154 | //Perform Login & Authentication using above url address | ||
155 | try { | ||
156 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
157 | rpc.login(user, pass); | ||
158 | |||
159 | //Create a Space object which holds the Key, Homepage, Name & description. | ||
160 | //Key is visible name for the space | ||
161 | Space space = new Space(); | ||
162 | space.setKey("XMLRPC"); | ||
163 | space.setHomepage("xmlrpc.WebHome"); | ||
164 | space.setName("xmlrpc"); | ||
165 | space.setDescription("Demo Space Created To Test XMLRPC"); | ||
166 | |||
167 | //One simple method adds the space created to your xwiki instance | ||
168 | rpc.addSpace(space); | ||
169 | |||
170 | rpc.logout(); | ||
171 | } catch (XmlRpcException e) { | ||
172 | System.out.println("invalid username/password was specified or communication problem"); | ||
173 | } | ||
174 | } | ||
175 | } | ||
176 | {{/code}} | ||
177 | |||
178 | = Space: Delete A Space = | ||
179 | |||
180 | Removal of a space is far more easier than creating one. All it requires is the "Key" (the visible name of the space) to be provided to the remove() method. | ||
181 | |||
182 | {{warning}} | ||
183 | Please note that deletion of space removes all pages in the space too. It is recommended to always make sure that the space is empty before deleting it. | ||
184 | {{/warning}} | ||
185 | |||
186 | {{code language="java"}} | ||
187 | |||
188 | import java.net.MalformedURLException; | ||
189 | import org.apache.xmlrpc.XmlRpcException; | ||
190 | import org.codehaus.swizzle.confluence.Space; | ||
191 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
192 | |||
193 | public class DeleteSpace { | ||
194 | |||
195 | public static void main(String[] args) throws MalformedURLException { | ||
196 | //URL of the xwiki instance | ||
197 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
198 | |||
199 | //Replace user & pass with desired xwiki username & password | ||
200 | String user = "Admin"; | ||
201 | String pass = "admin"; | ||
202 | |||
203 | //Perform Login & Authentication using above url address | ||
204 | try { | ||
205 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
206 | rpc.login(user, pass); | ||
207 | |||
208 | //Delete the space which is reference by "XMLRPC" key | ||
209 | rpc.removeSpace("XMLRPC"); | ||
210 | |||
211 | rpc.logout(); | ||
212 | } catch (XmlRpcException e) { | ||
213 | System.out.println("invalid username/password was specified or communication problem"); | ||
214 | } | ||
215 | } | ||
216 | } | ||
217 | {{/code}} | ||
218 | |||
219 | = Page: Retrieve/Search A Page = | ||
220 | |||
221 | A page is probably the most important unit of any wiki around which everything else is built. Spaces/Categories, Attachments, Comments, etc are more or less meaningless without a supporting page in a wiki system. | ||
222 | One of the most widely performed action on any wiki has to be searching for pages. Searches may happen through search boxes provided in a wiki or may be through following links from one page to another. On the XMLRPC side too, searching pages has been given a lot of importance and quite a few methods are available for the same. | ||
223 | Since, this topic is an important one, all the page retrieval/search examples [[can be found here>>XML-RPC Integration Java Examples - RetrieveSearch Pages]] | ||
224 | |||
225 | = Page: Create A Page = | ||
226 | |||
227 | Now for the moment of truth. Addition of Pages to a Wiki is as simple as searching for them. Thankfully, the XWiki XMLRPC api has just the tools you need to do your job. | ||
228 | At the very least, you would require the following three parameters to create a Page: | ||
229 | |||
230 | 1. Space - The Space where the Page is to be stored | ||
231 | 1. Title - The title for the Page | ||
232 | 1. Content - The content to be displayed inside the Page | ||
233 | |||
234 | {{warning}} | ||
235 | Please beware that using a title for an existing Page will overwrite all the contents of that Page. Make sure no Page *with the same title* exists in the same Space before you attempt to use the create Page functionality of XMLRPC. | ||
236 | {{/warning}} | ||
237 | |||
238 | In our example below, we would use | ||
239 | |||
240 | |=Parameter|=Value | ||
241 | |Space|demo code | ||
242 | |title|New Page | ||
243 | |Content|New Page Created | ||
244 | {{info}}This is XMLRPC Test{{/info}} | ||
245 | |||
246 | {{code language="java"}} | ||
247 | import java.net.MalformedURLException; | ||
248 | import org.apache.xmlrpc.XmlRpcException; | ||
249 | import org.codehaus.swizzle.confluence.Page; | ||
250 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
251 | |||
252 | public class CreatePage { | ||
253 | |||
254 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
255 | |||
256 | //URL of the xwiki instance | ||
257 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
258 | |||
259 | //Replace user & pass with desired xwiki username & password | ||
260 | String user = "Admin"; | ||
261 | String pass = "admin"; | ||
262 | |||
263 | |||
264 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
265 | try { | ||
266 | |||
267 | //Perform Login & Authentication | ||
268 | rpc.login(user, pass); | ||
269 | |||
270 | //Create a Page object & set it's three important attributes viz. Space, Title, Content | ||
271 | //Observe how the \\\\ has been used to create a new line in the final wiki Page | ||
272 | //Also, XWiki syntax can be passed as it is. Here, we passed the info macro | ||
273 | //The info macro would get rendered an info box in the Page | ||
274 | Page page = new Page(); | ||
275 | page.setSpace("demo code"); | ||
276 | page.setTitle("New Page"); | ||
277 | page.setContent("New Page Created \\\\ {{info}}This is XMLRPC Test{{/info}}"); | ||
278 | |||
279 | //Also set the parent Page to "demo code.WebHome" so that the "New Page" we created is not | ||
280 | //an orphan Page | ||
281 | page.setParentId("demo code.WebHome"); | ||
282 | |||
283 | |||
284 | //Store the page object into XWiki | ||
285 | rpc.storePage(page); | ||
286 | |||
287 | |||
288 | } catch (XmlRpcException e) { | ||
289 | System.out.println("invalid username/password was specified or communication problem or "); | ||
290 | System.out.println(e); | ||
291 | } finally { | ||
292 | rpc.logout(); | ||
293 | } | ||
294 | } | ||
295 | } | ||
296 | |||
297 | {{/code}} | ||
298 | |||
299 | |||
300 | = Page: Get Page History = | ||
301 | |||
302 | Now, that we are adding content to Pages, there are going to be versions of the same document. These versions are called History of the Page. The XWiki API has methods available to access the history of the Page. The class that would help us in this case is the XWikiPageHistorySummary class. | ||
303 | |||
304 | {{info}} | ||
305 | Please note that the methods of XWikiPageHistorySummary class only help you access the various historical revisions of the document & not the content of the document itself. Eg. You would get to know that a particular Page called Main.WebHome has highest version as 4.1 or maybe 10.9. In order to access the content of the 4.1 revision of the document, you would have to use the [[Page retrieval code provided here>>http://platform.xwiki.org/xwiki/bin/view/Features/XMLRPCJavaExamples2#HRetrievePageByMajorMinorVersion]] by passing the appropriate version of the document. | ||
306 | {{/info}} | ||
307 | |||
308 | {{code language="java"}} | ||
309 | import java.net.MalformedURLException; | ||
310 | import java.util.List; | ||
311 | import org.apache.xmlrpc.XmlRpcException; | ||
312 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
313 | import org.xwiki.xmlrpc.model.XWikiPageHistorySummary; | ||
314 | |||
315 | |||
316 | public class PageHistory { | ||
317 | |||
318 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
319 | |||
320 | //URL of the xwiki instance | ||
321 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
322 | |||
323 | //Replace user & pass with desired xwiki username & password | ||
324 | String user = "Admin"; | ||
325 | String pass = "admin"; | ||
326 | |||
327 | |||
328 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
329 | try { | ||
330 | |||
331 | //Perform Login & Authentication | ||
332 | rpc.login(user, pass); | ||
333 | |||
334 | //Create a XWikiPageHistorySummary object to hold all the revisions/history | ||
335 | //of the Main.WebHome Page | ||
336 | List<XWikiPageHistorySummary> hist = rpc.getPageHistory("Main.WebHome"); | ||
337 | |||
338 | //Iterate through all the available versions for Main.WebHome | ||
339 | for(XWikiPageHistorySummary xphs:hist){ | ||
340 | |||
341 | //Print the fully qualified name of the Page i.e. SpaceName.PageName | ||
342 | //In our example this would be Main.WebHome | ||
343 | System.out.println(xphs.getBasePageId()); | ||
344 | |||
345 | //Print the historical page ID or name of the Main.WebHome page | ||
346 | //This would print something like: | ||
347 | //Main.WebHome?minorVersion=1&language=&version=2 | ||
348 | //It means page=Main.WebHome, version=2, minor version=1 & language=default | ||
349 | System.out.println(xphs.getId()); | ||
350 | |||
351 | //Printing the version of Main.WebHome in the majorversion.minorversion format | ||
352 | System.out.println("Version: "+xphs.getVersion()+"."+xphs.getMinorVersion()); | ||
353 | |||
354 | //Date when the Page was last modified | ||
355 | System.out.println(xphs.getModified()); | ||
356 | |||
357 | //User who last modified the Page | ||
358 | System.out.println(xphs.getModifier()); | ||
359 | |||
360 | //Just a seperator between various versions of the document when printing | ||
361 | //to console | ||
362 | System.out.println("------------------------------"); | ||
363 | } | ||
364 | |||
365 | } catch (XmlRpcException e) { | ||
366 | System.out.println("invalid username/password was specified or communication problem or "); | ||
367 | System.out.println(e); | ||
368 | } finally { | ||
369 | rpc.logout(); | ||
370 | } | ||
371 | } | ||
372 | } | ||
373 | {{/code}} | ||
374 | |||
375 | |||
376 | = Page: Update A Page = | ||
377 | |||
378 | We saw code to search a Page, create a Page and get all it's revisions. Now, we move to updating a Page. In our example, we have used the Page called "Update Page" in the "demo code" Space. The basic intent is to get the content first from XWiki. Then add our updated content or "concatenate" new content with the existing content. Then, update the final content back to XWiki. Only the methods of the Page class & the rpc.getPage() & rpc.storePage() would be used here. | ||
379 | |||
380 | {{warning}}It is strongly advised that if this is the first time you are using XWiki XMLRPC, go through the examples at the start of this article. Each example tries to build up on the previous one & you would find understanding the API easier.{{/warning}} | ||
381 | |||
382 | {{code language="java"}} | ||
383 | |||
384 | import java.net.MalformedURLException; | ||
385 | import org.apache.xmlrpc.XmlRpcException; | ||
386 | import org.codehaus.swizzle.confluence.Page; | ||
387 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
388 | |||
389 | |||
390 | public class UpdatePage { | ||
391 | |||
392 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
393 | |||
394 | //URL of the xwiki instance | ||
395 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
396 | |||
397 | //Replace user & pass with desired xwiki username & password | ||
398 | String user = "Admin"; | ||
399 | String pass = "admin"; | ||
400 | |||
401 | |||
402 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
403 | try { | ||
404 | |||
405 | //Perform Login & Authentication | ||
406 | rpc.login(user, pass); | ||
407 | |||
408 | //Create a Page object to hold our Document information | ||
409 | Page page = new Page(); | ||
410 | //Fetch the required page. In our example, the page is in Space "demo code" | ||
411 | //and the Page is "Update Page" | ||
412 | page=rpc.getPage("demo code.Update Page"); | ||
413 | //Fetch the content of the page & store it in a string for temporary storage | ||
414 | //This is the present content of the Page | ||
415 | String presentContent=page.getContent(); | ||
416 | //Create a string that will hold the new content that is to be added to the Page | ||
417 | String newContent="\\\\Some new content added"; | ||
418 | //Set the content of the page as: present content + new content | ||
419 | //However, this page is not yet stored to XWiki. It only resides in your application | ||
420 | page.setContent(presentContent+newContent); | ||
421 | //Finally, store the "updated" Page to XWiki | ||
422 | rpc.storePage(page); | ||
423 | |||
424 | //Just to make sure everything saved all right, fetch the content again for the Page | ||
425 | System.out.println(page.getContent()); | ||
426 | |||
427 | } catch (XmlRpcException e) { | ||
428 | System.out.println("invalid username/password was specified or communication problem or "); | ||
429 | System.out.println(e); | ||
430 | } finally { | ||
431 | rpc.logout(); | ||
432 | } | ||
433 | } | ||
434 | } | ||
435 | {{/code}} | ||
436 | |||
437 | |||
438 | |||
439 | = Page: Remove A Page = | ||
440 | |||
441 | Removal of Pages is straight forward. You are required to know the fully qualified name of the Page i.e. SpaceName.PageName (in our example, this would be "demo code.New Page"). We test the safe deletion of the Page using a boolean variable. The rpc.removePage() method returns true if the Page was successfully removed from the wiki. | ||
442 | |||
443 | {{warning}}You would need to have the deletion rights assigned to the user credentials you are passing to the rpc.login() method{{/warning}} | ||
444 | {{warning}}rpc.removePage() method does not completely delete a Page in ordinary circumstances. If you have a recycle bin option enabled (by default, it is enabled for XWiki), then the "removed/deleted Page" is stored in the recycle bin from where it will cleaned out as per the settings for recycle bin in the xwiki.cfg file of your XWiki instance.{{/warning}} | ||
445 | |||
446 | {{code language="java"}} | ||
447 | |||
448 | |||
449 | import java.net.MalformedURLException; | ||
450 | import org.apache.xmlrpc.XmlRpcException; | ||
451 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
452 | |||
453 | |||
454 | public class DeletePage { | ||
455 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
456 | |||
457 | //URL of the xwiki instance | ||
458 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
459 | |||
460 | //Replace user & pass with desired xwiki username & password | ||
461 | String user = "Admin"; | ||
462 | String pass = "admin"; | ||
463 | |||
464 | |||
465 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
466 | try { | ||
467 | |||
468 | //Perform Login & Authentication | ||
469 | rpc.login(user, pass); | ||
470 | |||
471 | //Delete Page called "New Page" from Space called "demo code" | ||
472 | //Test deletion using a Boolean variable | ||
473 | Boolean b=rpc.removePage("demo code.New Page"); | ||
474 | |||
475 | //Should print "true" if deletion of page was successful | ||
476 | System.out.println(b); | ||
477 | |||
478 | |||
479 | } catch (XmlRpcException e) { | ||
480 | System.out.println("invalid username/password was specified or communication problem or "); | ||
481 | System.out.println(e); | ||
482 | } finally { | ||
483 | rpc.logout(); | ||
484 | } | ||
485 | } | ||
486 | } | ||
487 | |||
488 | {{/code}} | ||
489 | |||
490 | = Page: List Tags = | ||
491 | |||
492 | Pages are tagged via objects of type XWiki.TagClass. Thus you can switch to object edit mode on any page and edit tags this way. This is also the way, done by XMLRPC-API. | ||
493 | |||
494 | {{code language="java"}} | ||
495 | import java.net.MalformedURLException; | ||
496 | import java.util.List; | ||
497 | |||
498 | import org.apache.xmlrpc.XmlRpcException; | ||
499 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
500 | import org.xwiki.xmlrpc.model.XWikiObject; | ||
501 | import org.xwiki.xmlrpc.model.XWikiObjectSummary; | ||
502 | |||
503 | public class ListTags { | ||
504 | public static void main(String[] args) throws MalformedURLException, | ||
505 | XmlRpcException { | ||
506 | |||
507 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
508 | String user = "Admin"; | ||
509 | String pass = "admin"; | ||
510 | |||
511 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
512 | XWikiObjectSummary xosum = new XWikiObjectSummary(); | ||
513 | xosum.setClassName("XWiki.TagClass"); | ||
514 | // your page id | ||
515 | final String pageId = "Sandbox.Wdscfaq"; | ||
516 | xosum.setPageId(pageId); | ||
517 | try { | ||
518 | // Perform Login & Authentication | ||
519 | rpc.login(user, pass); | ||
520 | |||
521 | // retrieve current page object informations | ||
522 | XWikiObject xwo = rpc.getObject(xosum); | ||
523 | List<String> tags = (List<String>) xwo.getProperty("tags"); | ||
524 | System.out.println("--- CURRENT TAGS -----------------------"); | ||
525 | for (String tag : tags) { | ||
526 | System.out.println(tag); | ||
527 | } | ||
528 | } catch (Exception e) { | ||
529 | System.out.println(e.getMessage()); | ||
530 | } finally { | ||
531 | rpc.logout(); | ||
532 | } | ||
533 | } | ||
534 | } | ||
535 | {{/code}} | ||
536 | |||
537 | = Page: Add Tags = | ||
538 | |||
539 | Adding tags is a similar procedure to listening them. There are two starting points: a) retrieve current tags and a new one or b) set entirely new ones at once. Most often, you want to add tags, so this is one way to do it ... | ||
540 | |||
541 | {{code language="java"}}import java.net.MalformedURLException; | ||
542 | import java.util.List; | ||
543 | |||
544 | import org.apache.xmlrpc.XmlRpcException; | ||
545 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
546 | import org.xwiki.xmlrpc.model.XWikiObject; | ||
547 | import org.xwiki.xmlrpc.model.XWikiObjectSummary; | ||
548 | |||
549 | public class AddTags { | ||
550 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
551 | |||
552 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
553 | String user = "Admin"; | ||
554 | String pass = "admin"; | ||
555 | |||
556 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
557 | XWikiObjectSummary xosum = new XWikiObjectSummary(); | ||
558 | xosum.setClassName("XWiki.TagClass"); | ||
559 | // your page id | ||
560 | String pageId = "Sandbox.Wdscfaq"; | ||
561 | xosum.setPageId(pageId); | ||
562 | try { | ||
563 | // Perform Login & Authentication | ||
564 | rpc.login(user, pass); | ||
565 | |||
566 | // retrieve current page object informations | ||
567 | XWikiObject xwo = rpc.getObject(xosum); | ||
568 | List<String> tags = (List<String>) xwo.getProperty("tags"); | ||
569 | System.out.println("--- CURRENT TAGS -----------------------"); | ||
570 | for (String tag : tags) { | ||
571 | System.out.println(tag); | ||
572 | } | ||
573 | System.out.println("--- NEW TAG -----------------------"); | ||
574 | // add a new random tag | ||
575 | String tag = "NOW"+System.currentTimeMillis(); | ||
576 | System.out.println(tag); | ||
577 | tags.add(tag); | ||
578 | rpc.storeObject(xwo); | ||
579 | } catch (XmlRpcException e) { | ||
580 | System.out.println(e.getMessage()); | ||
581 | } finally { | ||
582 | rpc.logout(); | ||
583 | } | ||
584 | } | ||
585 | } | ||
586 | {{/code}} | ||
587 | |||
588 | = Attachment: List Attachments For Page = | ||
589 | |||
590 | So far, we worked with the Spaces (which are like directories/folders), Pages (which are the actual documents inside directories/folders). Both, Spaces & Pages can reside on their own & still be meaningful. However, there are other entities such as Attachments/Comments which are meaningful only when attached to Pages. | ||
591 | The first entity that we explore are Attachments. A very common operation in a Wiki is to attach files to an existing Page. However, let's start with an example where we assume that there are a number of attachments already associated with a Page. Our job here is to find out what are those attachments. | ||
592 | |||
593 | {{error}} | ||
594 | Please be aware that there are two class files for "Attachment" in two different packages and both look like they are exactly the same thing. One of them is the org.codehaus.swizzle.confluence.Attachment & the other is the com.xpn.xwiki.api.Attachment. We use the former one which is org.codehaus.swizzle.confluence.Attachment. The other one is part of the XWiki Core & used for Attachment related actions in the XWiki itself. | ||
595 | {{/error}} | ||
596 | |||
597 | {{code language="java"}} | ||
598 | |||
599 | import org.codehaus.swizzle.confluence.Attachment; | ||
600 | import java.net.MalformedURLException; | ||
601 | import java.util.List; | ||
602 | import org.apache.xmlrpc.XmlRpcException; | ||
603 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
604 | |||
605 | public class AttachmentList { | ||
606 | public static void main(String[] args) throws MalformedURLException, XmlRpcException { | ||
607 | //Replace the url with your xwiki server address | ||
608 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
609 | |||
610 | //Replace user & pass with desired xwiki username & password | ||
611 | String user = "Admin"; | ||
612 | String pass = "admin"; | ||
613 | |||
614 | //Perform Login & Authentication using above url address | ||
615 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
616 | |||
617 | try { | ||
618 | rpc.login(user, pass); | ||
619 | |||
620 | //Get the list of all attachments for the Page named "Main.Host Page" | ||
621 | List<Attachment> att = rpc.getAttachments("Main.Host Page"); | ||
622 | |||
623 | //Iterate through all the attachments in the list obtained | ||
624 | for (Attachment attachment : att) { | ||
625 | |||
626 | //Name of the file attached to the "Main.Host Page" | ||
627 | System.out.println(attachment.getFileName()); | ||
628 | //Size of the file (in Bytes) | ||
629 | System.out.println(attachment.getFileSize()); | ||
630 | //Absolute URL of the attachment for direct access | ||
631 | System.out.println(attachment.getUrl()); | ||
632 | } | ||
633 | |||
634 | |||
635 | } catch (XmlRpcException e) { | ||
636 | System.out.println("invalid username/password was specified or communication problem or "); | ||
637 | System.out.println(e); | ||
638 | } finally { | ||
639 | rpc.logout(); | ||
640 | } | ||
641 | } | ||
642 | } | ||
643 | {{/code}} | ||
644 | |||
645 | = Attachment: Add An Attachment To A Page = | ||
646 | |||
647 | This is a simple example, how to add an attachment to a specific page. | ||
648 | |||
649 | {{code language="java"}} | ||
650 | import java.io.ByteArrayOutputStream; | ||
651 | import java.io.File; | ||
652 | import java.io.FileInputStream; | ||
653 | |||
654 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
655 | import org.codehaus.swizzle.confluence.Attachment; | ||
656 | |||
657 | public class UploadAttachment { | ||
658 | public static void main(String[] args) { | ||
659 | File f = new File("xwiki.txt"); // put your file HERE | ||
660 | |||
661 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
662 | String user = "Admin"; | ||
663 | String pass = "admin"; | ||
664 | |||
665 | XWikiXmlRpcClient rpc = null; | ||
666 | try { | ||
667 | rpc = new XWikiXmlRpcClient(url); | ||
668 | rpc.login(user, pass); | ||
669 | |||
670 | // read file content into memory | ||
671 | FileInputStream fis = new FileInputStream(f); | ||
672 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||
673 | byte[] buffer = new byte[8192]; | ||
674 | int read = -1; | ||
675 | while ((read = fis.read(buffer)) > 0) { | ||
676 | baos.write(buffer, 0, read); | ||
677 | } | ||
678 | fis.close(); | ||
679 | |||
680 | // prepare upload, set meta information | ||
681 | Attachment a = new Attachment(); | ||
682 | a.setFileName(f.getName()); | ||
683 | a.setFileSize(Long.toString(f.length())); | ||
684 | a.setPageId("Sandbox.WebHome"); // your page id | ||
685 | |||
686 | // do upload | ||
687 | // note: the first integer parameter has no impact, | ||
688 | // cause it gets ignored on the server side. | ||
689 | rpc.addAttachment(new Integer(f.getName().hashCode()), a, baos.toByteArray()); | ||
690 | } catch (Exception e) { | ||
691 | e.printStackTrace(); | ||
692 | } finally { | ||
693 | if (rpc != null) { | ||
694 | try { | ||
695 | rpc.logout(); | ||
696 | } catch (Exception e2) { | ||
697 | // something real bad happens. | ||
698 | } | ||
699 | } | ||
700 | } | ||
701 | } | ||
702 | } | ||
703 | {{/code}} | ||
704 | |||
705 | = User: Create A New User = | ||
706 | |||
707 | This is an Administrative function in XWiki & needs Admin privileges for the User with whose credential we connect through the XML-RPC. Creating a new User involves the following steps: | ||
708 | |||
709 | 1. Create a Page with the desired "UserName" as the Page Name | ||
710 | 1. Create this Page in the "XWiki" space | ||
711 | 1. Set the properties of the newly created User | ||
712 | |||
713 | Please read the comments in the example below to understand the detailed steps: | ||
714 | |||
715 | {{code language="java"}} | ||
716 | |||
717 | import java.net.MalformedURLException; | ||
718 | import java.security.NoSuchAlgorithmException; | ||
719 | import org.apache.xmlrpc.XmlRpcException; | ||
720 | import org.codehaus.swizzle.confluence.Page; | ||
721 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
722 | import org.xwiki.xmlrpc.model.XWikiObject; | ||
723 | |||
724 | public class CreateUser { | ||
725 | |||
726 | public static void main(String[] args) throws MalformedURLException, XmlRpcException, NoSuchAlgorithmException { | ||
727 | |||
728 | //URL of the xwiki instance | ||
729 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
730 | |||
731 | //Replace user & pass with desired xwiki username & password | ||
732 | String user = "Admin"; | ||
733 | String pass = "admin"; | ||
734 | |||
735 | |||
736 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
737 | try { | ||
738 | //Perform Login & Authentication | ||
739 | rpc.login(user, pass); | ||
740 | |||
741 | //Create a Page object & set it's three important attributes viz. Space, Title, Content | ||
742 | //In our example, testuser is the Page Name | ||
743 | //We set the content of the Page to automatically load XWiki.XWikiUserSheet | ||
744 | //This sheet is used to display the User Profile in the default format | ||
745 | |||
746 | Page page = new Page(); | ||
747 | page.setSpace("XWiki"); | ||
748 | page.setTitle("testuser"); | ||
749 | page.setId("XWiki.testuser"); | ||
750 | page.setContent("{{include document=\"XWiki.XWikiUserSheet\"/}}"); | ||
751 | rpc.storePage(page); | ||
752 | |||
753 | //Set properties for the newly created user "testuser" | ||
754 | //List of all properties available in the XWiki.XWikiUsers class in your wiki | ||
755 | //Edit XWikiUsers class in class editing mode to access all properties or define new ones | ||
756 | |||
757 | XWikiObject xobj = new XWikiObject(); | ||
758 | xobj.setClassName("XWiki.XWikiUsers"); | ||
759 | xobj.setId(-1); | ||
760 | xobj.setPageId("XWiki.testuser"); | ||
761 | xobj.setProperty("first_name", "Test"); | ||
762 | xobj.setProperty("last_name", "User"); | ||
763 | xobj.setProperty("password","asdfjk"); | ||
764 | rpc.storeObject(xobj); | ||
765 | |||
766 | //Finally, associate the user to the XWikiAllGroup | ||
767 | //We simply associate the XWiki.testuser Page to the XWiki.XWikiAllGroup Page | ||
768 | //Set the "member" property to the desired XWiki UserName | ||
769 | |||
770 | XWikiObject xobjgrp = new XWikiObject(); | ||
771 | xobjgrp.setClassName("XWiki.XWikiGroups"); | ||
772 | xobjgrp.setId(-1); | ||
773 | xobjgrp.setPageId("XWiki.XWikiAllGroup"); | ||
774 | xobjgrp.setProperty("member","XWiki.testuser"); | ||
775 | rpc.storeObject(xobjgrp); | ||
776 | |||
777 | } catch (XmlRpcException e) { | ||
778 | System.out.println(e); | ||
779 | } finally { | ||
780 | rpc.logout(); | ||
781 | } | ||
782 | } | ||
783 | } | ||
784 | |||
785 | {{/code}} | ||
786 | |||
787 | = User: Add User To Groups = | ||
788 | |||
789 | Adding User to Groups is a very simple task. This requires us to add the desired user to the properties of the Group in question. The example below details all the steps needed to complete this task: | ||
790 | |||
791 | {{code langauge="java"}} | ||
792 | |||
793 | import java.net.MalformedURLException; | ||
794 | import java.security.NoSuchAlgorithmException; | ||
795 | import org.apache.xmlrpc.XmlRpcException; | ||
796 | import org.codehaus.swizzle.confluence.Page; | ||
797 | import org.xwiki.xmlrpc.XWikiXmlRpcClient; | ||
798 | import org.xwiki.xmlrpc.model.XWikiObject; | ||
799 | |||
800 | public class AddUserToGroup { | ||
801 | |||
802 | public static void main(String[] args) throws MalformedURLException, XmlRpcException, NoSuchAlgorithmException { | ||
803 | |||
804 | //URL of the xwiki instance | ||
805 | String url = "http://localhost:8080/xwiki/xmlrpc/confluence"; | ||
806 | |||
807 | //Replace user & pass with desired xwiki username & password | ||
808 | String user = "Admin"; | ||
809 | String pass = "admin"; | ||
810 | |||
811 | |||
812 | XWikiXmlRpcClient rpc = new XWikiXmlRpcClient(url); | ||
813 | try { | ||
814 | //Perform Login & Authentication | ||
815 | rpc.login(user, pass); | ||
816 | |||
817 | //Associate an existing user to the XWikiAllGroup | ||
818 | //We simply associate the XWiki.testuser Page to the XWiki.XWikiAllGroup Page | ||
819 | //Set the "member" property to the desired XWiki UserName | ||
820 | //You may associate the member to any custom Group you may have created | ||
821 | |||
822 | XWikiObject xobjgrp = new XWikiObject(); | ||
823 | xobjgrp.setClassName("XWiki.XWikiGroups"); | ||
824 | xobjgrp.setId(-1); | ||
825 | xobjgrp.setPageId("XWiki.XWikiAllGroup"); | ||
826 | xobjgrp.setProperty("member","XWiki.testuser"); | ||
827 | rpc.storeObject(xobjgrp); | ||
828 | |||
829 | } catch (XmlRpcException e) { | ||
830 | System.out.println(e); | ||
831 | } finally { | ||
832 | rpc.logout(); | ||
833 | } | ||
834 | } | ||
835 | } | ||
836 | |||
837 | {{/code}} |