David Caruana 19e3138e1c - Incorporate JCR project into Repository project
- Single configuration entry point for JCR and non-JCR clients (i.e. application-context.xml)
- Addition of build-war, incremental-war build targets (no deploy)
- Remove build of JCR TCK war file by default

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2777 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2006-05-05 16:33:22 +00:00

401 lines
16 KiB
Java

/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.jcr.example;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Calendar;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import javax.jcr.Workspace;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import org.alfresco.jcr.api.JCRNodeRef;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentData;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.PermissionService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
/**
* Example that demonstrates read and write of a simple WIKI model
*
* Please refer to http://www.alfresco.org/mediawiki/index.php/Introducing_the_Alfresco_Java_Content_Repository_API
* for a complete description of this example.
*
* @author David Caruana
*/
public class WIKIExample
{
public static void main(String[] args)
throws Exception
{
//
// Repository Initialisation
//
// access the Alfresco JCR Repository (here it's via programmatic approach, but it could also be injected)
System.out.println("Initialising Repository...");
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:org/alfresco/jcr/example/wiki-context.xml");
Repository repository = (Repository)context.getBean("JCR.Repository");
// display information about the repository
System.out.println("Repository Description...");
String[] keys = repository.getDescriptorKeys();
for (String key : keys)
{
String value = repository.getDescriptor(key);
System.out.println(" " + key + " = " + value);
}
//
// Create a WIKI structure
//
// Note: Here we're using the Alfresco Content Model and custom WIKI model to create
// WIKI pages and Content that are accessible via the Alfresco Web Client
//
// login to workspace (here we rely on the default workspace defined by JCR.Repository bean)
Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
try
{
System.out.println("Creating WIKI...");
// first, access the company home
Node rootNode = session.getRootNode();
System.out.println("Root node: path=" + rootNode.getPath() + ", type=" + rootNode.getPrimaryNodeType().getName());
Node companyHome = rootNode.getNode("app:company_home");
System.out.println("Company home node: path=" + companyHome.getPath() + ", type=" + companyHome.getPrimaryNodeType().getName());
// remove the WIKI structure if it already exists
try
{
Node encyclopedia = companyHome.getNode("wiki:encyclopedia");
encyclopedia.remove();
System.out.println("Existing WIKI found and removed");
}
catch(PathNotFoundException e)
{
// doesn't exist, no need to remove
}
// create the root WIKI folder
Node encyclopedia = companyHome.addNode("wiki:encyclopedia", "cm:folder");
encyclopedia.setProperty("cm:name", "WIKI Encyclopedia");
encyclopedia.setProperty("cm:description", "");
// create first wiki page
Node page1 = encyclopedia.addNode("wiki:entry1", "wiki:page");
page1.setProperty("cm:name", "Rose");
page1.setProperty("cm:description", "");
page1.setProperty("cm:title", "The rose");
page1.setProperty("cm:content", "A rose is a flowering shrub.");
page1.setProperty("wiki:category", new String[] {"flower", "plant", "rose"});
// create second wiki page
Node page2 = encyclopedia.addNode("wiki:entry2", "wiki:page");
page2.setProperty("cm:name", "Shakespeare");
page2.setProperty("cm:description", "");
page2.setProperty("cm:title", "William Shakespeare");
page2.setProperty("cm:content", "A famous poet who likes roses.");
page2.setProperty("wiki:restrict", true);
page2.setProperty("wiki:category", new String[] {"poet"});
// create an image (note: we're using an input stream to allow setting of binary content)
Node contentNode = encyclopedia.addNode("wiki:image", "cm:content");
contentNode.setProperty("cm:name", "Dog");
contentNode.setProperty("cm:description", "");
contentNode.setProperty("cm:title", "My dog at New Year party");
ClassPathResource resource = new ClassPathResource("org/alfresco/jcr/example/wikiImage.gif");
contentNode.setProperty("cm:content", resource.getInputStream());
session.save();
System.out.println("WIKI created");
}
finally
{
session.logout();
}
//
// Access the WIKI structure
//
// login to workspace (here we rely on the default workspace defined by JCR.Repository bean)
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
try
{
System.out.println("Accessing WIKI...");
// access a wiki node directly from root node (by path and by UUID)
Node rootNode = session.getRootNode();
Node encyclopedia = rootNode.getNode("app:company_home/wiki:encyclopedia");
Node direct = session.getNodeByUUID(encyclopedia.getUUID());
System.out.println("Found WIKI root correctly: " + encyclopedia.equals(direct));
// access a wiki property directly from root node
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
String title = entry1.getProperty("cm:title").getString();
System.out.println("Found WIKI page 1 title: " + title);
Calendar modified = entry1.getProperty("cm:modified").getDate();
System.out.println("Found WIKI page 1 last modified date: " + modified.getTime());
// browse all wiki entries
System.out.println("WIKI browser:");
NodeIterator entries = encyclopedia.getNodes();
while (entries.hasNext())
{
Node entry = entries.nextNode();
outputContentNode(entry);
}
// perform a search
System.out.println("Search results:");
Workspace workspace = session.getWorkspace();
QueryManager queryManager = workspace.getQueryManager();
Query query = queryManager.createQuery("//app:company_home/wiki:encyclopedia/*[@cm:title = 'The rose']", Query.XPATH);
//Query query = queryManager.createQuery("//app:company_home/wiki:encyclopedia/*[jcr:contains(., 'rose')]", Query.XPATH);
QueryResult result = query.execute();
NodeIterator it = result.getNodes();
while (it.hasNext())
{
Node n = it.nextNode();
outputContentNode(n);
}
// export content (system view format)
File systemView = new File("systemview.xml");
FileOutputStream systemViewOut = new FileOutputStream(systemView);
session.exportSystemView("/app:company_home/wiki:encyclopedia", systemViewOut, false, false);
// export content (document view format)
File docView = new File("docview.xml");
FileOutputStream docViewOut = new FileOutputStream(docView);
session.exportDocumentView("/app:company_home/wiki:encyclopedia", docViewOut, false, false);
System.out.println("WIKI exported");
}
finally
{
session.logout();
}
//
// Advanced Usage
//
// 1) Check-out / Check-in and version history retrieval
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
try
{
//
// Version WIKI Page 1
//
// first, access the page
Node rootNode = session.getRootNode();
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
// enable versioning capability
entry1.addMixin("mix:versionable");
// update the properties and content
entry1.setProperty("cm:title", "The Rise");
entry1.setProperty("cm:content", "A rose is a flowering shrub of the genus Rosa.");
Value[] categories = entry1.getProperty("wiki:category").getValues();
Value[] newCategories = new Value[categories.length + 1];
System.arraycopy(categories, 0, newCategories, 0, categories.length);
newCategories[categories.length] = session.getValueFactory().createValue("poet");
entry1.setProperty("wiki:category", newCategories);
// and checkin the changes
entry1.checkin();
// checkout, fix wiki title and checkin again
entry1.checkout();
entry1.setProperty("cm:title", "The Rose");
entry1.checkin();
session.save();
System.out.println("Versioned WIKI Page 1");
}
finally
{
session.logout();
}
// 2) Permission checks
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
try
{
//
// Browse WIKI Page 1 Version History
//
// first, access the page
Node rootNode = session.getRootNode();
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
// retrieve the history for thte page
VersionHistory versionHistory = entry1.getVersionHistory();
VersionIterator versionIterator = versionHistory.getAllVersions();
// for each version, output the node as it was versioned
while (versionIterator.hasNext())
{
Version version = versionIterator.nextVersion();
NodeIterator nodeIterator = version.getNodes();
while (nodeIterator.hasNext())
{
Node versionedNode = nodeIterator.nextNode();
System.out.println(" Version: " + version.getName());
System.out.println(" Created: " + version.getCreated().getTime());
outputContentNode(versionedNode);
}
}
//
// Permission Checks
//
System.out.println("Testing Permissions:");
// check for JCR 'read' permission
session.checkPermission("app:company_home/wiki:encyclopedia/wiki:entry1", "read");
System.out.println("Session has 'read' permission on app:company_home/wiki:encyclopedia/wiki:entry1");
// check for Alfresco 'Take Ownership' permission
session.checkPermission("app:company_home/wiki:encyclopedia/wiki:entry1", PermissionService.TAKE_OWNERSHIP);
System.out.println("Session has 'take ownership' permission on app:company_home/wiki:encyclopedia/wiki:entry1");
}
finally
{
session.logout();
}
//
// Mixing JCR and Alfresco API calls
//
// Provide mimetype for WIKI content properties
//
session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
try
{
// Retrieve the Alfresco Repository Service Registry
ServiceRegistry registry = (ServiceRegistry)context.getBean(ServiceRegistry.SERVICE_REGISTRY);
// set the mime type on both WIKI pages and Image
Node rootNode = session.getRootNode();
// note: we have to checkout entry1 first - it's versioned
Node entry1 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry1");
entry1.checkout();
setMimetype(registry, entry1, "cm:content", MimetypeMap.MIMETYPE_TEXT_PLAIN);
entry1.checkin();
Node entry2 = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:entry2");
setMimetype(registry, entry2, "cm:content", MimetypeMap.MIMETYPE_TEXT_PLAIN);
Node image = rootNode.getNode("app:company_home/wiki:encyclopedia/wiki:image");
setMimetype(registry, image, "cm:content", MimetypeMap.MIMETYPE_IMAGE_GIF);
// save the changes
session.save();
System.out.println("Updated WIKI mimetypes via Alfresco calls");
}
finally
{
session.logout();
}
// exit
System.out.println("Completed successfully.");
System.exit(0);
}
private static void outputContentNode(Node node)
throws RepositoryException
{
// output common content properties
System.out.println(" Node " + node.getUUID());
System.out.println(" title: " + node.getProperty("cm:title").getString());
// output properties specific to WIKI page
if (node.getPrimaryNodeType().getName().equals("wiki:page"))
{
System.out.println(" content: " + node.getProperty("cm:content").getString());
System.out.println(" restrict: " + node.getProperty("wiki:restrict").getString());
// output multi-value property
Property categoryProperty = node.getProperty("wiki:category");
Value[] categories = categoryProperty.getValues();
for (Value category : categories)
{
System.out.println(" category: " + category.getString());
}
}
}
private static void setMimetype(ServiceRegistry registry, Node node, String propertyName, String mimeType)
throws RepositoryException
{
// convert the JCR Node to an Alfresco Node Reference
NodeRef nodeRef = JCRNodeRef.getNodeRef(node);
// retrieve the Content Property (represented as a ContentData object in Alfresco)
NodeService nodeService = registry.getNodeService();
ContentData content = (ContentData)nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT);
// update the Mimetype
content = ContentData.setMimetype(content, mimeType);
nodeService.setProperty(nodeRef, ContentModel.PROP_CONTENT, content);
}
}