KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > alfresco > jcr > example > WIKIExample


1 /*
2  * Copyright (C) 2005 Alfresco, Inc.
3  *
4  * Licensed under the Mozilla Public License version 1.1
5  * with a permitted attribution clause. You may obtain a
6  * copy of the License at
7  *
8  * http://www.alfresco.org/legal/license.txt
9  *
10  * Unless required by applicable law or agreed to in writing,
11  * software distributed under the License is distributed on an
12  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13  * either express or implied. See the License for the specific
14  * language governing permissions and limitations under the
15  * License.
16  */

17 package org.alfresco.jcr.example;
18
19 import java.io.File JavaDoc;
20 import java.io.FileOutputStream JavaDoc;
21 import java.util.Calendar JavaDoc;
22
23 import javax.jcr.Node;
24 import javax.jcr.NodeIterator;
25 import javax.jcr.PathNotFoundException;
26 import javax.jcr.Property;
27 import javax.jcr.Repository;
28 import javax.jcr.RepositoryException;
29 import javax.jcr.Session;
30 import javax.jcr.SimpleCredentials;
31 import javax.jcr.Value;
32 import javax.jcr.Workspace;
33 import javax.jcr.query.Query;
34 import javax.jcr.query.QueryManager;
35 import javax.jcr.query.QueryResult;
36 import javax.jcr.version.Version;
37 import javax.jcr.version.VersionHistory;
38 import javax.jcr.version.VersionIterator;
39
40 import org.alfresco.jcr.api.JCRNodeRef;
41 import org.alfresco.model.ContentModel;
42 import org.alfresco.repo.content.MimetypeMap;
43 import org.alfresco.service.ServiceRegistry;
44 import org.alfresco.service.cmr.repository.ContentData;
45 import org.alfresco.service.cmr.repository.NodeRef;
46 import org.alfresco.service.cmr.repository.NodeService;
47 import org.alfresco.service.cmr.security.PermissionService;
48 import org.springframework.context.ApplicationContext;
49 import org.springframework.context.support.ClassPathXmlApplicationContext;
50 import org.springframework.core.io.ClassPathResource;
51
52
53 /**
54  * Example that demonstrates read and write of a simple WIKI model
55  *
56  * Please refer to http://www.alfresco.org/mediawiki/index.php/Introducing_the_Alfresco_Java_Content_Repository_API
57  * for a complete description of this example.
58  *
59  * @author David Caruana
60  */

61 public class WIKIExample
62 {
63
64     public static void main(String JavaDoc[] args)
65         throws Exception JavaDoc
66     {
67         //
68
// Repository Initialisation
69
//
70

71         // access the Alfresco JCR Repository (here it's via programmatic approach, but it could also be injected)
72
System.out.println("Initialising Repository...");
73         ApplicationContext context = new ClassPathXmlApplicationContext("classpath:org/alfresco/jcr/example/wiki-context.xml");
74         Repository repository = (Repository)context.getBean("JCR.Repository");
75
76         // display information about the repository
77
System.out.println("Repository Description...");
78         String JavaDoc[] keys = repository.getDescriptorKeys();
79         for (String JavaDoc key : keys)
80         {
81             String JavaDoc value = repository.getDescriptor(key);
82             System.out.println(" " + key + " = " + value);
83         }
84         
85         //
86
// Create a WIKI structure
87
//
88
// Note: Here we're using the Alfresco Content Model and custom WIKI model to create
89
// WIKI pages and Content that are accessible via the Alfresco Web Client
90
//
91

92         // login to workspace (here we rely on the default workspace defined by JCR.Repository bean)
93
Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
94
95         try
96         {
97             System.out.println("Creating WIKI...");
98
99             // first, access the company home
100
Node rootNode = session.getRootNode();
101             System.out.println("Root node: path=" + rootNode.getPath() + ", type=" + rootNode.getPrimaryNodeType().getName());
102             Node companyHome = rootNode.getNode("app:company_home");
103             System.out.println("Company home node: path=" + companyHome.getPath() + ", type=" + companyHome.getPrimaryNodeType().getName());
104             
105             // remove the WIKI structure if it already exists
106
try
107             {
108                 Node encyclopedia = companyHome.getNode("wiki:encyclopedia");
109                 encyclopedia.remove();
110                 System.out.println("Existing WIKI found and removed");
111             }
112             catch(PathNotFoundException e)
113             {
114                // doesn't exist, no need to remove
115
}
116
117             // create the root WIKI folder
118
Node encyclopedia = companyHome.addNode("wiki:encyclopedia", "cm:folder");
119             encyclopedia.setProperty("cm:name", "WIKI Encyclopedia");
120             encyclopedia.setProperty("cm:description", "");
121
122             // create first wiki page
123
Node page1 = encyclopedia.addNode("wiki:entry1", "wiki:page");
124             page1.setProperty("cm:name", "Rose");
125             page1.setProperty("cm:description", "");
126             page1.setProperty("cm:title", "The rose");
127             page1.setProperty("cm:content", "A rose is a flowering shrub.");
128             page1.setProperty("wiki:category", new String JavaDoc[] {"flower", "plant", "rose"});
129
130             // create second wiki page
131
Node page2 = encyclopedia.addNode("wiki:entry2", "wiki:page");
132             page2.setProperty("cm:name", "Shakespeare");
133             page2.setProperty("cm:description", "");
134             page2.setProperty("cm:title", "William Shakespeare");
135             page2.setProperty("cm:content", "A famous poet who likes roses.");
136             page2.setProperty("wiki:restrict", true);
137             page2.setProperty("wiki:category", new String JavaDoc[] {"poet"});
138             
139             // create an image (note: we're using an input stream to allow setting of binary content)
140
Node contentNode = encyclopedia.addNode("wiki:image", "cm:content");
141             contentNode.setProperty("cm:name", "Dog");
142             contentNode.setProperty("cm:description", "");
143             contentNode.setProperty("cm:title", "My dog at New Year party");
144             ClassPathResource resource = new ClassPathResource("org/alfresco/jcr/example/wikiImage.gif");
145             contentNode.setProperty("cm:content", resource.getInputStream());
146             
147             session.save();
148             System.out.println("WIKI created");
149         }
150         finally
151         {
152             session.logout();
153         }
154         
155         //
156
// Access the WIKI structure
157
//
158

159         // login to workspace (here we rely on the default workspace defined by JCR.Repository bean)
160
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
161     
162         try
163         {
164             System.out.println("Accessing WIKI...");
165             
166             // access a wiki node directly from root node (by path and by UUID)
167
Node rootNode = session.getRootNode();
168             Node encyclopedia = rootNode.getNode("app:company_home/wiki:encyclopedia");
169             Node direct = session.getNodeByUUID(encyclopedia.getUUID());
170             System.out.println("Found WIKI root correctly: " + encyclopedia.equals(direct));
171
172             // access a wiki property directly from root node
173
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
174             String JavaDoc title = entry1.getProperty("cm:title").getString();
175             System.out.println("Found WIKI page 1 title: " + title);
176             Calendar JavaDoc modified = entry1.getProperty("cm:modified").getDate();
177             System.out.println("Found WIKI page 1 last modified date: " + modified.getTime());
178
179             // browse all wiki entries
180
System.out.println("WIKI browser:");
181             NodeIterator entries = encyclopedia.getNodes();
182             while (entries.hasNext())
183             {
184                 Node entry = entries.nextNode();
185                 outputContentNode(entry);
186             }
187
188             // perform a search
189
System.out.println("Search results:");
190             Workspace workspace = session.getWorkspace();
191             QueryManager queryManager = workspace.getQueryManager();
192             Query query = queryManager.createQuery("//app:company_home/wiki:encyclopedia/*[@cm:title = 'The rose']", Query.XPATH);
193             //Query query = queryManager.createQuery("//app:company_home/wiki:encyclopedia/*[jcr:contains(., 'rose')]", Query.XPATH);
194
QueryResult result = query.execute();
195             NodeIterator it = result.getNodes();
196             while (it.hasNext())
197             {
198                 Node n = it.nextNode();
199                 outputContentNode(n);
200             }
201
202             // export content (system view format)
203
File JavaDoc systemView = new File JavaDoc("systemview.xml");
204             FileOutputStream JavaDoc systemViewOut = new FileOutputStream JavaDoc(systemView);
205             session.exportSystemView("/app:company_home/wiki:encyclopedia", systemViewOut, false, false);
206             
207             // export content (document view format)
208
File JavaDoc docView = new File JavaDoc("docview.xml");
209             FileOutputStream JavaDoc docViewOut = new FileOutputStream JavaDoc(docView);
210             session.exportDocumentView("/app:company_home/wiki:encyclopedia", docViewOut, false, false);
211             
212             System.out.println("WIKI exported");
213
214         }
215         finally
216         {
217             session.logout();
218         }
219
220         
221         //
222
// Advanced Usage
223
//
224

225         // 1) Check-out / Check-in and version history retrieval
226
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
227     
228         try
229         {
230             //
231
// Version WIKI Page 1
232
//
233

234             // first, access the page
235
Node rootNode = session.getRootNode();
236             Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
237
238             // enable versioning capability
239
entry1.addMixin("mix:versionable");
240
241             // update the properties and content
242
entry1.setProperty("cm:title", "The Rise");
243             entry1.setProperty("cm:content", "A rose is a flowering shrub of the genus Rosa.");
244             Value[] categories = entry1.getProperty("wiki:category").getValues();
245             Value[] newCategories = new Value[categories.length + 1];
246             System.arraycopy(categories, 0, newCategories, 0, categories.length);
247             newCategories[categories.length] = session.getValueFactory().createValue("poet");
248             entry1.setProperty("wiki:category", newCategories);
249
250             // and checkin the changes
251
entry1.checkin();
252
253             // checkout, fix wiki title and checkin again
254
entry1.checkout();
255             entry1.setProperty("cm:title", "The Rose");
256             entry1.checkin();
257             
258             session.save();
259             System.out.println("Versioned WIKI Page 1");
260         }
261         finally
262         {
263             session.logout();
264         }
265
266         // 2) Permission checks
267
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
268         
269         try
270         {
271             //
272
// Browse WIKI Page 1 Version History
273
//
274

275             // first, access the page
276
Node rootNode = session.getRootNode();
277             Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
278
279             // retrieve the history for thte page
280
VersionHistory versionHistory = entry1.getVersionHistory();
281             VersionIterator versionIterator = versionHistory.getAllVersions();
282
283             // for each version, output the node as it was versioned
284
while (versionIterator.hasNext())
285             {
286                 Version version = versionIterator.nextVersion();
287                 NodeIterator nodeIterator = version.getNodes();
288
289                 while (nodeIterator.hasNext())
290                 {
291                     Node versionedNode = nodeIterator.nextNode();
292                     System.out.println(" Version: " + version.getName());
293                     System.out.println(" Created: " + version.getCreated().getTime());
294                     outputContentNode(versionedNode);
295                 }
296             }
297             
298             
299             //
300
// Permission Checks
301
//
302

303             System.out.println("Testing Permissions:");
304             
305             // check for JCR 'read' permission
306
session.checkPermission("app:company_home/wiki:encyclopedia/wiki:entry1", "read");
307             System.out.println("Session has 'read' permission on app:company_home/wiki:encyclopedia/wiki:entry1");
308
309             // check for Alfresco 'Take Ownership' permission
310
session.checkPermission("app:company_home/wiki:encyclopedia/wiki:entry1", PermissionService.TAKE_OWNERSHIP);
311             System.out.println("Session has 'take ownership' permission on app:company_home/wiki:encyclopedia/wiki:entry1");
312         }
313         finally
314         {
315             session.logout();
316         }
317
318
319         //
320
// Mixing JCR and Alfresco API calls
321
//
322
// Provide mimetype for WIKI content properties
323
//
324

325         session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
326         
327         try
328         {
329             // Retrieve the Alfresco Repository Service Registry
330
ServiceRegistry registry = (ServiceRegistry)context.getBean(ServiceRegistry.SERVICE_REGISTRY);
331             
332             // set the mime type on both WIKI pages and Image
333
Node rootNode = session.getRootNode();
334             
335             // note: we have to checkout entry1 first - it's versioned
336
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
337             entry1.checkout();
338             setMimetype(registry, entry1, "cm:content", MimetypeMap.MIMETYPE_TEXT_PLAIN);
339             entry1.checkin();
340             
341             Node entry2 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry2");
342             setMimetype(registry, entry2, "cm:content", MimetypeMap.MIMETYPE_TEXT_PLAIN);
343             Node image = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:image");
344             setMimetype(registry, image, "cm:content", MimetypeMap.MIMETYPE_IMAGE_GIF);
345
346             // save the changes
347
session.save();
348             System.out.println("Updated WIKI mimetypes via Alfresco calls");
349         }
350         finally
351         {
352             session.logout();
353         }
354             
355         // exit
356
System.out.println("Completed successfully.");
357         System.exit(0);
358     }
359
360     
361     private static void outputContentNode(Node node)
362         throws RepositoryException
363     {
364         // output common content properties
365
System.out.println(" Node " + node.getUUID());
366         System.out.println(" title: " + node.getProperty("cm:title").getString());
367         
368         // output properties specific to WIKI page
369
if (node.getPrimaryNodeType().getName().equals("wiki:page"))
370         {
371             System.out.println(" content: " + node.getProperty("cm:content").getString());
372             System.out.println(" restrict: " + node.getProperty("wiki:restrict").getString());
373             
374             // output multi-value property
375
Property categoryProperty = node.getProperty("wiki:category");
376             Value[] categories = categoryProperty.getValues();
377             for (Value category : categories)
378             {
379                 System.out.println(" category: " + category.getString());
380             }
381         }
382     }
383
384     
385     private static void setMimetype(ServiceRegistry registry, Node node, String JavaDoc propertyName, String JavaDoc mimeType)
386         throws RepositoryException
387     {
388         // convert the JCR Node to an Alfresco Node Reference
389
NodeRef nodeRef = JCRNodeRef.getNodeRef(node);
390
391         // retrieve the Content Property (represented as a ContentData object in Alfresco)
392
NodeService nodeService = registry.getNodeService();
393         ContentData content = (ContentData)nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT);
394         
395         // update the Mimetype
396
content = ContentData.setMimetype(content, mimeType);
397         nodeService.setProperty(nodeRef, ContentModel.PROP_CONTENT, content);
398     }
399     
400 }
401
Popular Tags