ups... I thought that I'm able to attach the file but it doesn't work so
I past cod here
package prototyping;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.WorkspaceImpl;
import org.apache.jackrabbit.core.config.RepositoryConfig;
public class CloningTest {
private static final org.apache.commons.logging.Log log =
org.apache.commons.logging.LogFactory.getLog(CloningTest.class);
public static String REPOSITORY_HOME = "d:/repo_embeded/";
public static String REPOSITORY_CONFIG = REPOSITORY_HOME +
"repository.xml";
public static String WORKSPACE_0 = "workspace_0";
public static String WORKSPACE_1 = "workspace_1";
public static String WORKSPACE_2 = "workspace_2";
public static String CHILD_NAME = "child";
public static void main(String[] args) throws RepositoryException {
System.setProperty("java.security.auth.login.config",
"jaas_jcr.config");
RepositoryConfig config =
RepositoryConfig.create(REPOSITORY_CONFIG, REPOSITORY_HOME);
Repository repository = RepositoryImpl.create(config);
Session session0 = repository.login(new
SimpleCredentials("admin", "admin".toCharArray()));
createWorkspace(session0, WORKSPACE_0);
createWorkspace(session0, WORKSPACE_1);
createWorkspace(session0, WORKSPACE_2);
session0 = repository.login(new SimpleCredentials("admin",
"admin".toCharArray()), WORKSPACE_0);
Session session1 = repository.login(new
SimpleCredentials("admin", "admin".toCharArray()), WORKSPACE_1);
Session session2 = repository.login(new
SimpleCredentials("admin", "admin".toCharArray()), WORKSPACE_2);
/*
* prepare data - build some simple hierarchy as presented
below:
*
* node
* |
* +--child
* |
* +--child[2]
* |
* +--child[3]
*/
Node node0 = prepareData(session0);
// clone this hierarchy into session1 (session to WORKSPACE_1)
Node node1 = cloneSubtree(session1, node0);
// clone this hierarchy into session2 (session to WORKSPACE_2)
Node node2 = cloneSubtree(session2, node0);
// add one more "child" to node1 (this is node from session1)
Node node1_child = addChild(node1);
// display tree hierarchy for node1 (session1)
log.info("Hierarchy in " + WORKSPACE_1);
printChildren(node1, "");
// display tree hierarchy for node2 (session2)
log.info("Hierarchy in " + WORKSPACE_2);
printChildren(node2, "");
// clone one more node into session2
cloneSubtree(session2, node1_child);
// display tree hierarchy for node2 (session2)
log.info("Hierarchy in " + WORKSPACE_2 + " aftert one more
clonning");
printChildren(node2, "");
session0.logout();
session1.logout();
session2.logout();
((RepositoryImpl) repository).shutdown();
log.info("Done.");
}
private static Node addChild(Node node) throws RepositoryException {
node.checkout();
Node child = node.addNode(CHILD_NAME);
child.addMixin("mix:versionable");
node.save();
child.checkin();
node.checkin();
log.info("Child added.");
return child;
}
private static void printChildren(Node node, String extra) throws
RepositoryException {
log.info(extra + "Node name = [" + node.getName() + "]; node
path = [" + node.getPath() + "]");
for (NodeIterator iter = node.getNodes(); iter.hasNext();) {
Node child = iter.nextNode();
printChildren(child, "\t");
}
}
private static Node prepareData(Session session) throws
RepositoryException {
Node root = session.getRootNode();
Node node = root.addNode("node");
node.addMixin("mix:versionable");
log.info("node.getDefinition().allowsSameNameSiblings() = [" +
node.getDefinition().allowsSameNameSiblings() + "]");
Node child0 = node.addNode(CHILD_NAME);
child0.addMixin("mix:versionable");
Node child1 = node.addNode(CHILD_NAME);
child1.addMixin("mix:versionable");
Node child2 = node.addNode(CHILD_NAME);
child2.addMixin("mix:versionable");
root.save();
child0.checkin();
child1.checkin();
child2.checkin();
node.checkin();
return node;
}
private static void createWorkspace(Session session, String
workspace) throws RepositoryException {
((WorkspaceImpl)
session.getWorkspace()).createWorkspace(workspace);
}
private static Node cloneSubtree(Session session, Node node) throws
RepositoryException {
Node root = session.getRootNode();
Node parent = node.getParent();
String path = "";
Node targetParent = null;
String rootName = "/";
if (!parent.isSame(root)) {
path = parent.getPath();
targetParent = session.getNodeByUUID(parent.getUUID());
targetParent.checkout();
}
path += "/" + node.getName();
String workspace = node.getSession().getWorkspace().getName();
session.getWorkspace().clone(workspace, node.getPath(), path,
false);
if (targetParent != null) {
targetParent.checkin();
rootName = targetParent.getName();
}
log.info("Subtree cloned; root node = [" + rootName + "]");
return session.getNodeByUUID(node.getUUID());
}
}
--
Tomasz Dabrowski
email: [EMAIL PROTECTED]
skype: tomekdab
www: www.cognifide.com