diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java index 55326f1..f22c495 100644 --- a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java +++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/JackrabbitRepositoryStub.java @@ -200,7 +200,8 @@ public class JackrabbitRepositoryStub extends RepositoryStub { repo = createRepository(dir, xml); Session session = repo.login(superuser); try { - prepareTestContent(session); + TestContentLoader loader = new TestContentLoader(ENCODING, JackrabbitRepositoryStub.class.getClassLoader()); + loader.loadTestContent(session); } finally { session.logout(); } @@ -211,216 +212,13 @@ public class JackrabbitRepositoryStub extends RepositoryStub { } } - private void prepareTestContent(Session session) - throws RepositoryException, IOException { - JackrabbitWorkspace workspace = - (JackrabbitWorkspace) session.getWorkspace(); - Collection workspaces = - Arrays.asList(workspace.getAccessibleWorkspaceNames()); - if (!workspaces.contains("test")) { - workspace.createWorkspace("test"); - } - - JackrabbitNodeTypeManager manager = - (JackrabbitNodeTypeManager) workspace.getNodeTypeManager(); - if (!manager.hasNodeType("test:versionable")) { - InputStream xml = getResource("test-nodetypes.xml"); - try { - manager.registerNodeTypes(xml, JackrabbitNodeTypeManager.TEXT_XML); - } finally { - xml.close(); - } - } - - Node data = getOrAddNode(session.getRootNode(), "testdata"); - addPropertyTestData(getOrAddNode(data, "property")); - addQueryTestData(getOrAddNode(data, "query")); - addNodeTestData(getOrAddNode(data, "node")); - addLifecycleTestData(getOrAddNode(data, "lifecycle")); - addExportTestData(getOrAddNode(data, "docViewTest")); - - Node conf = getOrAddNode(session.getRootNode(), "testconf"); - addRetentionTestData(getOrAddNode(conf, "retentionTest")); - - session.save(); - } - - private Node getOrAddNode(Node node, String name) - throws RepositoryException { - try { - return node.getNode(name); - } catch (PathNotFoundException e) { - return node.addNode(name); - } - } - - /** - * Creates a boolean, double, long, calendar and a path property at the - * given node. - */ - private void addPropertyTestData(Node node) throws RepositoryException { - node.setProperty("boolean", true); - node.setProperty("double", Math.PI); - node.setProperty("long", 90834953485278298l); - Calendar c = Calendar.getInstance(); - c.set(2005, 6, 18, 17, 30); - node.setProperty("calendar", c); - ValueFactory factory = node.getSession().getValueFactory(); - node.setProperty("path", factory.createValue("/", PropertyType.PATH)); - node.setProperty("multi", new String[] { "one", "two", "three" }); - } - - /** - * Creates a node with a RetentionPolicy - */ - private void addRetentionTestData(Node node) throws RepositoryException { - RetentionPolicy rp = RetentionPolicyImpl.createRetentionPolicy("testRetentionPolicy", node.getSession()); - node.getSession().getRetentionManager().setRetentionPolicy(node.getPath(), rp); - } - - /** - * Creates four nodes under the given node. Each node has a String - * property named "prop1" with some content set. - */ - private void addQueryTestData(Node node) throws RepositoryException { - while (node.hasNode("node1")) { - node.getNode("node1").remove(); - } - getOrAddNode(node, "node1").setProperty( - "prop1", "You can have it good, cheap, or fast. Any two."); - getOrAddNode(node, "node1").setProperty("prop1", "foo bar"); - getOrAddNode(node, "node1").setProperty("prop1", "Hello world!"); - getOrAddNode(node, "node2").setProperty("prop1", "Apache Jackrabbit"); - } - /** - * Creates three nodes under the given node: one of type nt:resource - * and the other nodes referencing it. - */ - private void addNodeTestData(Node node) throws RepositoryException, IOException { - if (node.hasNode("multiReference")) { - node.getNode("multiReference").remove(); - } - if (node.hasNode("resReference")) { - node.getNode("resReference").remove(); - } - if (node.hasNode("myResource")) { - node.getNode("myResource").remove(); - } - - Node resource = node.addNode("myResource", "nt:resource"); - // nt:resource not longer referenceable since JCR 2.0 - resource.addMixin("mix:referenceable"); - resource.setProperty("jcr:encoding", ENCODING); - resource.setProperty("jcr:mimeType", "text/plain"); - resource.setProperty( - "jcr:data", - new ByteArrayInputStream("Hello w\u00F6rld.".getBytes(ENCODING))); - resource.setProperty("jcr:lastModified", Calendar.getInstance()); - - Node resReference = getOrAddNode(node, "reference"); - resReference.setProperty("ref", resource); - // make this node itself referenceable - resReference.addMixin("mix:referenceable"); - - Node multiReference = node.addNode("multiReference"); - ValueFactory factory = node.getSession().getValueFactory(); - multiReference.setProperty("ref", new Value[] { - factory.createValue(resource), - factory.createValue(resReference) - }); - } - - /** - * Creates a lifecycle policy node and another node with a lifecycle - * referencing that policy. - */ - private void addLifecycleTestData(Node node) throws RepositoryException { - Node policy = getOrAddNode(node, "policy"); - policy.addMixin(NodeType.MIX_REFERENCEABLE); - Node transitions = getOrAddNode(policy, "transitions"); - Node transition = getOrAddNode(transitions, "identity"); - transition.setProperty("from", "identity"); - transition.setProperty("to", "identity"); - - Node lifecycle = getOrAddNode(node, "node"); - ((NodeImpl) lifecycle).assignLifecyclePolicy(policy, "identity"); - } - - private void addExportTestData(Node node) throws RepositoryException, IOException { - getOrAddNode(node, "invalidXmlName").setProperty("propName", "some text"); - - // three nodes which should be serialized as xml text in docView export - // separated with spaces - getOrAddNode(node, "jcr:xmltext").setProperty( - "jcr:xmlcharacters", "A text without any special character."); - getOrAddNode(node, "some-element"); - getOrAddNode(node, "jcr:xmltext").setProperty( - "jcr:xmlcharacters", - " The entity reference characters: <, ', ,&, >, \" should" - + " be escaped in xml export. "); - getOrAddNode(node, "some-element"); - getOrAddNode(node, "jcr:xmltext").setProperty( - "jcr:xmlcharacters", "A text without any special character."); - - Node big = getOrAddNode(node, "bigNode"); - big.setProperty( - "propName0", - "SGVsbG8gd8O2cmxkLg==;SGVsbG8gd8O2cmxkLg==".split(";"), - PropertyType.BINARY); - big.setProperty("propName1", "text 1"); - big.setProperty( - "propName2", - "multival text 1;multival text 2;multival text 3".split(";")); - big.setProperty("propName3", "text 1"); - - addExportValues(node, "propName"); - addExportValues(node, "Prop<>prop"); - } - - /** - * create nodes with following properties - * binary & single - * binary & multival - * notbinary & single - * notbinary & multival - */ - private void addExportValues(Node node, String name) - throws RepositoryException, IOException { - String prefix = "valid"; - if (name.indexOf('<') != -1) { - prefix = "invalid"; - } - node = getOrAddNode(node, prefix + "Names"); - - String[] texts = new String[] { - "multival text 1", "multival text 2", "multival text 3" }; - getOrAddNode(node, prefix + "MultiNoBin").setProperty(name, texts); - - Node resource = getOrAddNode(node, prefix + "MultiBin"); - resource.setProperty("jcr:encoding", ENCODING); - resource.setProperty("jcr:mimeType", "text/plain"); - String[] values = - new String[] { "SGVsbG8gd8O2cmxkLg==", "SGVsbG8gd8O2cmxkLg==" }; - resource.setProperty(name, values, PropertyType.BINARY); - resource.setProperty("jcr:lastModified", Calendar.getInstance()); - - getOrAddNode(node, prefix + "NoBin").setProperty(name, "text 1"); - - resource = getOrAddNode(node, "invalidBin"); - resource.setProperty("jcr:encoding", ENCODING); - resource.setProperty("jcr:mimeType", "text/plain"); - byte[] bytes = "Hello w\u00F6rld.".getBytes(ENCODING); - resource.setProperty(name, new ByteArrayInputStream(bytes)); - resource.setProperty("jcr:lastModified", Calendar.getInstance()); - } - @Override public Principal getKnownPrincipal(Session session) throws RepositoryException { - + Principal knownPrincipal = null; - + if (session instanceof SessionImpl) { for (Principal p : ((SessionImpl)session).getSubject().getPrincipals()) { if (! (p instanceof Group)) { @@ -428,7 +226,7 @@ public class JackrabbitRepositoryStub extends RepositoryStub { } } } - + if (knownPrincipal != null) { return knownPrincipal; } @@ -442,7 +240,7 @@ public class JackrabbitRepositoryStub extends RepositoryStub { return "an_unknown_user"; } }; - + @Override public Principal getUnknownPrincipal(Session session) throws RepositoryException, NotExecutableException { return UNKNOWN_PRINCIPAL; diff --git a/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TestContentLoader.java b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TestContentLoader.java new file mode 100644 index 0000000..c2d3c27 --- /dev/null +++ b/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/TestContentLoader.java @@ -0,0 +1,263 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.apache.jackrabbit.core; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; + +import javax.jcr.Node; +import javax.jcr.PathNotFoundException; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.Value; +import javax.jcr.ValueFactory; +import javax.jcr.nodetype.NodeType; +import javax.jcr.retention.RetentionPolicy; + +import org.apache.jackrabbit.api.JackrabbitNodeTypeManager; +import org.apache.jackrabbit.api.JackrabbitWorkspace; +import org.apache.jackrabbit.core.retention.RetentionPolicyImpl; + +/** + * Test Content Loader. + */ +public class TestContentLoader { + + private String encoding; + private ClassLoader classLoader; + + public TestContentLoader(String encoding, ClassLoader classLoader) { + this.encoding = encoding; + this.classLoader = classLoader; + } + + private InputStream getResource(String name) { + return classLoader.getResourceAsStream(name); + } + + public void loadTestContent(Session session) throws RepositoryException, IOException { + JackrabbitWorkspace workspace = + (JackrabbitWorkspace) session.getWorkspace(); + Collection workspaces = + Arrays.asList(workspace.getAccessibleWorkspaceNames()); + if (!workspaces.contains("test")) { + workspace.createWorkspace("test"); + } + + JackrabbitNodeTypeManager manager = + (JackrabbitNodeTypeManager) workspace.getNodeTypeManager(); + if (!manager.hasNodeType("test:versionable")) { + InputStream xml = getResource("test-nodetypes.xml"); + try { + manager.registerNodeTypes(xml, JackrabbitNodeTypeManager.TEXT_XML); + } finally { + xml.close(); + } + } + + Node data = getOrAddNode(session.getRootNode(), "testdata"); + addPropertyTestData(getOrAddNode(data, "property")); + addQueryTestData(getOrAddNode(data, "query")); + addNodeTestData(getOrAddNode(data, "node")); + addLifecycleTestData(getOrAddNode(data, "lifecycle")); + addExportTestData(getOrAddNode(data, "docViewTest")); + + Node conf = getOrAddNode(session.getRootNode(), "testconf"); + addRetentionTestData(getOrAddNode(conf, "retentionTest")); + + session.save(); + } + + + + private Node getOrAddNode(Node node, String name) + throws RepositoryException { + try { + return node.getNode(name); + } catch (PathNotFoundException e) { + return node.addNode(name); + } + } + + /** + * Creates a boolean, double, long, calendar and a path property at the + * given node. + */ + private void addPropertyTestData(Node node) throws RepositoryException { + node.setProperty("boolean", true); + node.setProperty("double", Math.PI); + node.setProperty("long", 90834953485278298l); + Calendar c = Calendar.getInstance(); + c.set(2005, 6, 18, 17, 30); + node.setProperty("calendar", c); + ValueFactory factory = node.getSession().getValueFactory(); + node.setProperty("path", factory.createValue("/", PropertyType.PATH)); + node.setProperty("multi", new String[] { "one", "two", "three" }); + } + + /** + * Creates a node with a RetentionPolicy + */ + private void addRetentionTestData(Node node) throws RepositoryException { + RetentionPolicy rp = RetentionPolicyImpl.createRetentionPolicy("testRetentionPolicy", node.getSession()); + node.getSession().getRetentionManager().setRetentionPolicy(node.getPath(), rp); + } + + /** + * Creates four nodes under the given node. Each node has a String + * property named "prop1" with some content set. + */ + private void addQueryTestData(Node node) throws RepositoryException { + while (node.hasNode("node1")) { + node.getNode("node1").remove(); + } + getOrAddNode(node, "node1").setProperty( + "prop1", "You can have it good, cheap, or fast. Any two."); + getOrAddNode(node, "node1").setProperty("prop1", "foo bar"); + getOrAddNode(node, "node1").setProperty("prop1", "Hello world!"); + getOrAddNode(node, "node2").setProperty("prop1", "Apache Jackrabbit"); + } + + + /** + * Creates three nodes under the given node: one of type nt:resource + * and the other nodes referencing it. + */ + private void addNodeTestData(Node node) throws RepositoryException, IOException { + if (node.hasNode("multiReference")) { + node.getNode("multiReference").remove(); + } + if (node.hasNode("resReference")) { + node.getNode("resReference").remove(); + } + if (node.hasNode("myResource")) { + node.getNode("myResource").remove(); + } + + Node resource = node.addNode("myResource", "nt:resource"); + // nt:resource not longer referenceable since JCR 2.0 + resource.addMixin("mix:referenceable"); + resource.setProperty("jcr:encoding", encoding); + resource.setProperty("jcr:mimeType", "text/plain"); + resource.setProperty( + "jcr:data", + new ByteArrayInputStream("Hello w\u00F6rld.".getBytes(encoding))); + resource.setProperty("jcr:lastModified", Calendar.getInstance()); + + Node resReference = getOrAddNode(node, "reference"); + resReference.setProperty("ref", resource); + // make this node itself referenceable + resReference.addMixin("mix:referenceable"); + + Node multiReference = node.addNode("multiReference"); + ValueFactory factory = node.getSession().getValueFactory(); + multiReference.setProperty("ref", new Value[] { + factory.createValue(resource), + factory.createValue(resReference) + }); + } + + /** + * Creates a lifecycle policy node and another node with a lifecycle + * referencing that policy. + */ + private void addLifecycleTestData(Node node) throws RepositoryException { + Node policy = getOrAddNode(node, "policy"); + policy.addMixin(NodeType.MIX_REFERENCEABLE); + Node transitions = getOrAddNode(policy, "transitions"); + Node transition = getOrAddNode(transitions, "identity"); + transition.setProperty("from", "identity"); + transition.setProperty("to", "identity"); + + Node lifecycle = getOrAddNode(node, "node"); + ((NodeImpl) lifecycle).assignLifecyclePolicy(policy, "identity"); + } + + private void addExportTestData(Node node) throws RepositoryException, IOException { + getOrAddNode(node, "invalidXmlName").setProperty("propName", "some text"); + + // three nodes which should be serialized as xml text in docView export + // separated with spaces + getOrAddNode(node, "jcr:xmltext").setProperty( + "jcr:xmlcharacters", "A text without any special character."); + getOrAddNode(node, "some-element"); + getOrAddNode(node, "jcr:xmltext").setProperty( + "jcr:xmlcharacters", + " The entity reference characters: <, ', ,&, >, \" should" + + " be escaped in xml export. "); + getOrAddNode(node, "some-element"); + getOrAddNode(node, "jcr:xmltext").setProperty( + "jcr:xmlcharacters", "A text without any special character."); + + Node big = getOrAddNode(node, "bigNode"); + big.setProperty( + "propName0", + "SGVsbG8gd8O2cmxkLg==;SGVsbG8gd8O2cmxkLg==".split(";"), + PropertyType.BINARY); + big.setProperty("propName1", "text 1"); + big.setProperty( + "propName2", + "multival text 1;multival text 2;multival text 3".split(";")); + big.setProperty("propName3", "text 1"); + + addExportValues(node, "propName"); + addExportValues(node, "Prop<>prop"); + } + + /** + * create nodes with following properties + * binary & single + * binary & multival + * notbinary & single + * notbinary & multival + */ + private void addExportValues(Node node, String name) + throws RepositoryException, IOException { + String prefix = "valid"; + if (name.indexOf('<') != -1) { + prefix = "invalid"; + } + node = getOrAddNode(node, prefix + "Names"); + + String[] texts = new String[] { + "multival text 1", "multival text 2", "multival text 3" }; + getOrAddNode(node, prefix + "MultiNoBin").setProperty(name, texts); + + Node resource = getOrAddNode(node, prefix + "MultiBin"); + resource.setProperty("jcr:encoding", encoding); + resource.setProperty("jcr:mimeType", "text/plain"); + String[] values = + new String[] { "SGVsbG8gd8O2cmxkLg==", "SGVsbG8gd8O2cmxkLg==" }; + resource.setProperty(name, values, PropertyType.BINARY); + resource.setProperty("jcr:lastModified", Calendar.getInstance()); + + getOrAddNode(node, prefix + "NoBin").setProperty(name, "text 1"); + + resource = getOrAddNode(node, "invalidBin"); + resource.setProperty("jcr:encoding", encoding); + resource.setProperty("jcr:mimeType", "text/plain"); + byte[] bytes = "Hello w\u00F6rld.".getBytes(encoding); + resource.setProperty(name, new ByteArrayInputStream(bytes)); + resource.setProperty("jcr:lastModified", Calendar.getInstance()); + } + +}