hi david,
yeah, we recently stumbled over this new defect aswell. i will reopen the issue.
regards, toby
On 5/8/06, David Kennedy <[EMAIL PROTECTED]> wrote:
I finally got a chance to try out the fix for issue JCR 423 (
Node.restore() fails for existing non-versioned OPV=Version child nodes)
and unfortunately it still does not work. I now get an
ItemExistsException:
Here is a testcase illustrating the problem. Feel free to adapt it for a
JUnit test (or I can depending on the nodetypes you'd like to use). It
shouldn't need anything, but you can provide a configuration and home
definition in a test.properties file.
David
/*
*
*/
package test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.jcr.Credentials;
import javax.jcr.NamespaceException;
import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Workspace;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.NodeType;
import javax.jcr.version.OnParentVersionAction;
import javax.jcr.version.Version;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException;
import org.apache.jackrabbit.core.nodetype.NodeDefImpl;
import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
import org.apache.jackrabbit.name.QName;
/**
*
*/
public class VersionRestoreTest
{
private static final String DEFAULT_REPOSITORY_CONFIG_PATH =
"repository.xml";
private static final String DEFAULT_REPOSITORY_HOME = ".";
private static final String TEST_PROPERTIES = "test.properties";
public static final String REPOSITORY_CONFIG_PATH_KEY =
"repository.config.path";
public static final String REPOSITORY_HOME_KEY = "repository.home";
public static final String NS_PREFIX_SEPARATOR = ":";
public static final String NS_JRTEST_PREFIX = "tst";
public static final String NS_JRTEST_URI = "http://test/jr/1.0";
public static final String FOO = "foo";
public static final String BAR = "bar";
public static final String CHILD = "child";
public static final String TEST_TYPE = "testType";
public static final String PREFIXED_CHILD = NS_JRTEST_PREFIX +
NS_PREFIX_SEPARATOR + "child";
public static final String PREFIXED_TEST_TYPE = NS_JRTEST_PREFIX +
NS_PREFIX_SEPARATOR + "testType";
private Properties properties;
public static void main(String[] args){
try {
new VersionRestoreTest().run();
} catch (IOException e){
e.printStackTrace();
}
}
protected VersionRestoreTest()throws IOException {
properties = loadProperties();
}
protected void run(){
Session session = null;
try {
Repository repository = getRepository();
session = login(repository);
executeTest(session);
} catch (Exception e){
e.printStackTrace();
} finally {
logout(session);
}
}
protected Properties loadProperties() throws IOException {
Properties props = null;
InputStream stream =
this.getClass().getResourceAsStream(TEST_PROPERTIES);
if (stream != null){
props = new Properties();
props.load(stream);
}
return props;
}
protected Repository getRepository() throws RepositoryException {
try {
return new TransientRepository(getConfigPath(), getHome());
} catch (IOException e){
throw new RepositoryException(e.getMessage(), e);
}
}
protected Session login(Repository repository) throws
RepositoryException {
Credentials credentials = new SimpleCredentials(getUserID(),
getPassword().toCharArray());
return repository.login(credentials);
}
protected void logout(Session session){
if (session != null)
session.logout();
}
protected String getConfigPath(){
String cPath = DEFAULT_REPOSITORY_CONFIG_PATH;
if (properties != null)
cPath = properties.getProperty(REPOSITORY_CONFIG_PATH_KEY,
DEFAULT_REPOSITORY_CONFIG_PATH);
return cPath;
}
protected String getHome(){
String home = DEFAULT_REPOSITORY_HOME;
if (properties != null)
home = properties.getProperty(REPOSITORY_HOME_KEY,
DEFAULT_REPOSITORY_HOME);
return home;
}
protected String getUserID(){
return "userid";
}
protected String getPassword(){
return "password";
}
protected void executeTest(Session session) throws RepositoryException {
testCheckinRestore(session);
}
protected void testCheckinRestore(Session session) throws
RepositoryException
{
registerNodeTypes(session);
Node root = session.getRootNode();
Node n = root.addNode(FOO, PREFIXED_TEST_TYPE);
n.addNode(PREFIXED_CHILD);
root.save();
Version v = n.checkin();
n.restore(v, true);
}
protected void registerNodeTypes(Session session) throws
RepositoryException
{
Workspace workspace = session.getWorkspace();
NodeTypeManagerImpl ntm =
(NodeTypeManagerImpl)workspace.getNodeTypeManager();
NodeTypeRegistry ntRegistry = ntm.getNodeTypeRegistry();
NamespaceRegistry nsRegistry = workspace.getNamespaceRegistry();
String testPrefix = null;
try {
testPrefix = nsRegistry.getPrefix(NS_JRTEST_URI);
} catch (NamespaceException nse) {
//namespace does not exist....continue
}
if (testPrefix == null)
nsRegistry.registerNamespace(NS_JRTEST_PREFIX, NS_JRTEST_URI);
else if (!testPrefix.equals(NS_JRTEST_PREFIX))
throw new RepositoryException(NS_JRTEST_PREFIX + " is not
registered with the expected URI");
String nodeTypeName = FOO;
try
{
ntm.getNodeType(nodeTypeName);
}
catch (NoSuchNodeTypeException nsnte)
{
NodeType baseNodeType = ntm.getNodeType(JcrConstants.NT_BASE);
NodeType referenceableNodeType =
ntm.getNodeType(JcrConstants.MIX_REFERENCEABLE);
NodeType versionableNodeType =
ntm.getNodeType(JcrConstants.MIX_VERSIONABLE);
NodeTypeDef nodeTypeDef = new NodeTypeDef();
QName qualifiedNodeTypeName = new QName(NS_JRTEST_URI, TEST_TYPE);
nodeTypeDef.setName(qualifiedNodeTypeName);
nodeTypeDef.setSupertypes(new QName[] {QName.NT_BASE,
QName.MIX_REFERENCEABLE, QName.MIX_VERSIONABLE});
NodeDefImpl nodeDef = new NodeDefImpl();
nodeDef.setName(new QName(NS_JRTEST_URI, CHILD));
nodeDef.setDeclaringNodeType(qualifiedNodeTypeName);
nodeDef.setAutoCreated(false);
nodeDef.setDefaultPrimaryType(QName.NT_BASE);
nodeDef.setAllowsSameNameSiblings(false);
nodeDef.setOnParentVersion(OnParentVersionAction.VERSION);
nodeDef.setProtected(false);
nodeDef.setRequiredPrimaryTypes(new QName[]{QName.NT_BASE});
nodeTypeDef.setChildNodeDefs(new NodeDefImpl[]{nodeDef});
try {
ntRegistry.registerNodeType(nodeTypeDef);
} catch (InvalidNodeTypeDefException e){
//Eating this for now, hoping the only exception is that it
already exists....would be nice to be able to catch that specifically
e.printStackTrace();
}
}
}
}
--
-----------------------------------------< [EMAIL PROTECTED] >---
Tobias Bocanegra, Day Management AG, Barfuesserplatz 6, CH - 4001 Basel
T +41 61 226 98 98, F +41 61 226 98 97
-----------------------------------------------< http://www.day.com >---