package com.openkm.test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Calendar;
import javax.jcr.AccessDeniedException;
import javax.jcr.InvalidItemStateException;
import javax.jcr.ItemExistsException;
import javax.jcr.ItemNotFoundException;
import javax.jcr.LoginException;
import javax.jcr.NamespaceException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.UnsupportedRepositoryOperationException;
import javax.jcr.ValueFormatException;
import javax.jcr.Workspace;
import javax.jcr.lock.LockException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.query.InvalidQueryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.version.VersionException;
import javax.naming.NamingException;
import org.apache.commons.io.FileUtils;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Dummy {
private static Logger log = LoggerFactory.getLogger(Dummy.class);
private static String repHomeDir = "repotest2";
private static Session systemSession = null;
private static Repository repository = null;
public static void main(String[] args) throws NamingException,
RepositoryException, FileNotFoundException {
log.debug("*** DESTROY REPOSITORY ***");
removeRepository();
log.debug("*** CREATE REPOSITORY ***");
createRepository();
log.debug("*** USER LOGIN ***");
Session userSession = login("paco", "pepe");
log.debug("*** GET MY ROOT NODE ***");
Node rootNode = userSession.getRootNode();
Node myRoot = rootNode.getNode("my:root");
log.debug("*** ADD A DOCUMENT NODE ***");
Node fileNode = myRoot.addNode("perico", "nt:file");
// With Jackrabbot 1.0.1 I have always a bug in the next line:
// javax.jcr.PathNotFoundException: /my:root/perico
Node contentNode = fileNode.addNode("jcr:content", "nt:resource");
log.debug("*** ADD DOCUMENT NODE PROPERTIES ***");
log.debug("*** PROPERTIES #1 ***");
contentNode.setProperty("jcr:data", new ByteArrayInputStream("Texto de pruebas".getBytes()));
log.debug("*** PROPERTIES #2 ***");
contentNode.setProperty("jcr:mimeType", "text/plain");
log.debug("*** PROPERTIES #3 ***");
contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
log.debug("*** SERIALIZE THE ADDED NODE ***");
myRoot.save();
for (int i=0; i<100; i++) {
//Node n1 = myRoot.addNode("pepe "+i, "nt:hierarchyNode");
}
myRoot.save();
/*
addDocument(session, okmRoot, "documentos/Orden del Temple.txt");
addDocument(session, okmRoot, "documentos/Orden del Temple.pdf");
addDocument(session, okmRoot, "documentos/Orden del Temple.doc");
addDocument(session, okmRoot, "documentos/Orden del Temple.odt");
search(session, "temple");
*/
log.debug("*** SAY BYE ***");
userSession.logout();
getSystemSession().logout();
}
/**
*
*/
private static void removeRepository() {
try {
FileUtils.deleteDirectory(new File(repHomeDir));
} catch (IOException e) {
System.err.println("No previous repo");
}
}
/**
* @return
* @throws NamingException
* @throws RepositoryException
* @throws LoginException
* @throws NoSuchWorkspaceException
*/
public static Session login(String user, String pass) throws NamingException,
RepositoryException, LoginException, NoSuchWorkspaceException {
Repository repository = getRepository();
Session session = repository.login(new SimpleCredentials(user, pass.toCharArray()), null);
log.debug("Session: "+session);
return session;
}
/**
* @return
* @throws RepositoryException
*/
public static Repository getRepository() throws RepositoryException {
if (repository == null) {
// Repository config
String repositoryConfig = "repository2.xml";
String repositoryHome = "repotest2";
RepositoryConfig config = RepositoryConfig.create(repositoryConfig, repositoryHome);
repository = RepositoryImpl.create(config);
log.debug("*** System repository created "+repository);
}
return repository;
}
/**
* @return
* @throws LoginException
* @throws NoSuchWorkspaceException
* @throws RepositoryException
*/
public static Session getSystemSession() throws LoginException, NoSuchWorkspaceException, RepositoryException {
if (systemSession == null) {
// System User Session
systemSession = repository.login(new SimpleCredentials("system", "".toCharArray()), null);
log.debug("*** System user created "+systemSession.getUserID());
}
return systemSession;
}
/**
* @param session
* @return
* @throws NamespaceException
* @throws UnsupportedRepositoryOperationException
* @throws AccessDeniedException
* @throws RepositoryException
* @throws ItemExistsException
* @throws PathNotFoundException
* @throws NoSuchNodeTypeException
* @throws LockException
* @throws VersionException
* @throws ConstraintViolationException
* @throws InvalidItemStateException
*/
public static Node createRepository()
throws NamespaceException, UnsupportedRepositoryOperationException,
AccessDeniedException, RepositoryException, ItemExistsException,
PathNotFoundException, NoSuchNodeTypeException, LockException,
VersionException, ConstraintViolationException,
InvalidItemStateException {
// Initialize repository
//Repository repository = getRepository();
Session systemSession = getSystemSession();
// Namespace registration
Workspace ws = systemSession.getWorkspace();
ws.getNamespaceRegistry().registerNamespace("my", "http://www.guia-ubuntu.org/1.0");
// Node creation
Node root = systemSession.getRootNode();
Node okmRoot = root.addNode("my:root", "nt:folder");
okmRoot.addMixin("mix:referenceable");
systemSession.save();
log.info("****** Repository created *******");
return okmRoot;
}
/**
* @param session
* @param okmRoot
* @param fileName
* @throws ItemExistsException
* @throws PathNotFoundException
* @throws NoSuchNodeTypeException
* @throws LockException
* @throws VersionException
* @throws ConstraintViolationException
* @throws RepositoryException
* @throws ValueFormatException
* @throws FileNotFoundException
* @throws AccessDeniedException
* @throws InvalidItemStateException
*/
public static void addDocument(Session session, Node okmRoot,
String fileName) throws ItemExistsException, PathNotFoundException,
NoSuchNodeTypeException, LockException, VersionException,
ConstraintViolationException, RepositoryException,
ValueFormatException, FileNotFoundException, AccessDeniedException,
InvalidItemStateException {
// Add document
Node fileNode = okmRoot.addNode(new File(fileName).getName(), "nt:file");
fileNode.addMixin("mix:referenceable");
fileNode.addMixin("mix:lockable");
fileNode.addMixin("mix:versionable");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty("jcr:mimeType", getMime(fileName));
resNode.setProperty("jcr:data", new FileInputStream(fileName));
resNode.setProperty("jcr:lastModified", Calendar.getInstance());
session.save();
log.info("File '"+fileName+"' added.");
}
/**
* @param fileName
* @return
*/
public static String getMime(String fileName) {
if (fileName.endsWith(".doc")) {
return "application/msword";
} else if (fileName.endsWith(".odt")) {
return "application/vnd.oasis.opendocument.text";
} else if (fileName.endsWith(".pdf")) {
return "application/pdf";
} else if (fileName.endsWith(".txt")) {
return "text/plain";
}
return "application/octect-stream";
}
/**
* @param session
* @param words
* @throws RepositoryException
* @throws InvalidQueryException
* @throws UnsupportedRepositoryOperationException
* @throws ItemNotFoundException
* @throws AccessDeniedException
*/
public static void search(Session session, String words)
throws RepositoryException, InvalidQueryException,
UnsupportedRepositoryOperationException, ItemNotFoundException,
AccessDeniedException {
// Search
String statement = "/jcr:root/my:root//element(*,nt:resource)[jcr:contains(.,'" + words + "')]";
Workspace workspace = session.getWorkspace();
QueryManager queryManager = workspace.getQueryManager();
Query query = queryManager.createQuery(statement, javax.jcr.query.Query.XPATH);
QueryResult result = query.execute();
log.info("Search results:");
for (NodeIterator it = result.getNodes(); it.hasNext();) {
Node sNode = (Node) it.next();
log.info(" * "+sNode.getParent().getName());
}
}
}