Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 67418 invoked from network); 28 Jan 2009 13:36:19 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Jan 2009 13:36:19 -0000 Received: (qmail 82808 invoked by uid 500); 28 Jan 2009 13:36:19 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 82781 invoked by uid 500); 28 Jan 2009 13:36:18 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 82772 invoked by uid 99); 28 Jan 2009 13:36:18 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Jan 2009 05:36:18 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Jan 2009 13:36:09 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 646012388B52; Wed, 28 Jan 2009 13:35:49 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r738480 [3/3] - in /jackrabbit/sandbox/spi: ./ spi2davex/ spi2davex/src/ spi2davex/src/main/ spi2davex/src/main/java/ spi2davex/src/main/java/org/ spi2davex/src/main/java/org/apache/ spi2davex/src/main/java/org/apache/jackrabbit/ spi2davex/... Date: Wed, 28 Jan 2009 13:35:48 -0000 To: commits@jackrabbit.apache.org From: angela@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090128133549.646012388B52@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,731 @@ +/* + * 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.spi.spi2davex; + +import org.apache.jackrabbit.spi.AbstractSPITest; +import org.apache.jackrabbit.spi.Batch; +import org.apache.jackrabbit.spi.ChildInfo; +import org.apache.jackrabbit.spi.ItemInfo; +import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.spi.NodeInfo; +import org.apache.jackrabbit.spi.PropertyId; +import org.apache.jackrabbit.spi.PropertyInfo; +import org.apache.jackrabbit.spi.QValue; +import org.apache.jackrabbit.spi.QValueFactory; +import org.apache.jackrabbit.spi.RepositoryService; +import org.apache.jackrabbit.spi.SessionInfo; +import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; +import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; +import org.apache.jackrabbit.spi.commons.name.NameConstants; +import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; +import org.apache.jackrabbit.spi.commons.namespace.AbstractNamespaceResolver; +import org.apache.jackrabbit.uuid.UUID; + +import javax.jcr.ItemNotFoundException; +import javax.jcr.NamespaceException; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Iterator; +import java.util.List; + +/** + * ConnectionTest... + */ +public class BatchTest extends AbstractSPITest { + + private final String testPath = "/test"; + private NamePathResolver resolver; + private RepositoryService rs; + private SessionInfo si; + + protected void setUp() throws Exception { + super.setUp(); + + rs = helper.getRepositoryService(); + si = helper.getAdminSessionInfo(); + NamespaceResolver nsResolver = new AbstractNamespaceResolver() { + public String getURI(String prefix) throws NamespaceException { + return ("jcr".equals(prefix)) ? "http://www.jcp.org/jcr/1.0" : prefix; + } + public String getPrefix(String uri) throws NamespaceException { + return ("http://www.jcp.org/jcr/1.0".equals(uri)) ? "jcr" : uri; + } + }; + resolver = new DefaultNamePathResolver(nsResolver); + + try { + rs.getNodeInfo(si, getNodeId(testPath)); + } catch (RepositoryException e) { + Batch b = rs.createBatch(si, getNodeId("/")); + b.addNode(getNodeId("/"), resolver.getQName("test"), NameConstants.NT_UNSTRUCTURED, null); + rs.submit(b); + } + } + + protected void tearDown() throws Exception { + try { + Batch b = rs.createBatch(si, getNodeId("/")); + b.remove(getNodeId(testPath)); + rs.submit(b); + } finally { + rs.dispose(si); + super.tearDown(); + } + } + + public void testAddNode() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Batch b = rs.createBatch(si, nid); + + b.addNode(nid, resolver.getQName("aNode"), NameConstants.NT_UNSTRUCTURED, null); + b.addProperty(nid, resolver.getQName("aString"), rs.getQValueFactory().create("ba", PropertyType.STRING)); + b.addProperty(nid, resolver.getQName("aName"), new QValue[] {rs.getQValueFactory().create(NameConstants.JCR_ENCODING), rs.getQValueFactory().create(NameConstants.JCR_DATA)}); + b.addProperty(nid, resolver.getQName("aBinary"), rs.getQValueFactory().create(new byte[] { 'a', 'b', 'c'})); + + rs.submit(b); + + NodeId id = rs.getIdFactory().createNodeId(nid, resolver.getQPath("aNode")); + Iterator it = rs.getItemInfos(si, id); + while (it.hasNext()) { + ItemInfo info = (ItemInfo) it.next(); + if (info.denotesNode()) { + NodeInfo nInfo = (NodeInfo) info; + assertEquals(NameConstants.NT_UNSTRUCTURED, nInfo.getNodetype()); + Iterator childIt = nInfo.getChildInfos(); + assertTrue(childIt == null || !childIt.hasNext()); + assertEquals(id, nInfo.getId()); + } + } + + b = rs.createBatch(si, nid); + b.remove(id); + rs.submit(b); + } + + public void testImport() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Batch b = rs.createBatch(si, nid); + + String uuid = UUID.randomUUID().toString(); + b.addNode(nid, resolver.getQName("testUUIDNode"), NameConstants.NT_UNSTRUCTURED, uuid); + + NodeId id = getNodeId(testPath + "/testUUIDNode"); + b.setMixins(id, new Name[] {NameConstants.MIX_REFERENCEABLE}); + + rs.submit(b); + + NodeInfo nInfo = rs.getNodeInfo(si, id); + assertEquals(uuid, nInfo.getId().getUniqueID()); + Name[] mixins = nInfo.getMixins(); + assertEquals(1, mixins.length); + assertEquals(NameConstants.MIX_REFERENCEABLE, mixins[0]); + + b = rs.createBatch(si, nid); + b.remove(rs.getIdFactory().createNodeId(uuid)); + rs.submit(b); + + try { + rs.getItemInfos(si, id); + fail(); + } catch (RepositoryException e) { + // success + } + try { + rs.getItemInfos(si, rs.getIdFactory().createNodeId(uuid)); + fail(); + } catch (RepositoryException e) { + // success + } + } + + public void testSetMixin() throws RepositoryException { + NodeId nid = getNodeId(testPath); + + Batch b = rs.createBatch(si, nid); + b.addNode(nid, resolver.getQName("anyNode"), NameConstants.NT_UNSTRUCTURED, null); + NodeId id = getNodeId(testPath + "/anyNode"); + b.setMixins(id, new Name[] {NameConstants.MIX_LOCKABLE}); + rs.submit(b); + + b = rs.createBatch(si, id); + b.setMixins(id, new Name[0]); + rs.submit(b); + + NodeInfo nInfo = rs.getNodeInfo(si, id); + assertEquals(0, nInfo.getMixins().length); + } + + public void testMove() throws RepositoryException { + NodeId nid = getNodeId(testPath); + + Batch b = rs.createBatch(si, nid); + b.addNode(nid, resolver.getQName("anyNode"), NameConstants.NT_UNSTRUCTURED, null); + rs.submit(b); + + NodeId id = getNodeId(testPath + "/anyNode"); + + b = rs.createBatch(si, nid); + b.move(id, nid, resolver.getQName("moved")); + rs.submit(b); + + try { + rs.getItemInfos(si, id); + fail(); + } catch (RepositoryException e) { + // ok + } + + rs.getNodeInfo(si, getNodeId(testPath + "/moved")); + } + + public void testReorder() throws RepositoryException { + NodeId nid = getNodeId(testPath); + + Batch b = rs.createBatch(si, nid); + b.addNode(nid, resolver.getQName("1"), NameConstants.NT_UNSTRUCTURED, null); + b.addNode(nid, resolver.getQName("3"), NameConstants.NT_UNSTRUCTURED, null); + b.addNode(nid, resolver.getQName("2"), NameConstants.NT_UNSTRUCTURED, null); + rs.submit(b); + + b = rs.createBatch(si, nid); + b.reorderNodes(nid, getNodeId(testPath + "/3"), null); + rs.submit(b); + + Iterator it = rs.getChildInfos(si, nid); + int i = 1; + while (it.hasNext()) { + ChildInfo ci = (ChildInfo) it.next(); + assertEquals(i, new Integer(ci.getName().getLocalName()).intValue()); + i++; + } + } + + public void testReorder1() throws RepositoryException { + NodeId nid = getNodeId(testPath); + + Batch b = rs.createBatch(si, nid); + b.addNode(nid, resolver.getQName("2"), NameConstants.NT_UNSTRUCTURED, null); + b.addNode(nid, resolver.getQName("3"), NameConstants.NT_UNSTRUCTURED, null); + b.addNode(nid, resolver.getQName("1"), NameConstants.NT_UNSTRUCTURED, null); + rs.submit(b); + + b = rs.createBatch(si, nid); + b.reorderNodes(nid, getNodeId(testPath + "/1"), getNodeId(testPath + "/2")); + rs.submit(b); + + Iterator it = rs.getChildInfos(si, nid); + int i = 1; + while (it.hasNext()) { + ChildInfo ci = (ChildInfo) it.next(); + assertEquals(i, new Integer(ci.getName().getLocalName()).intValue()); + i++; + } + } + + public void testRemove() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Batch b = rs.createBatch(si, nid); + + NodeId id = getNodeId(testPath + "/aTestNode"); + b.addNode(nid, resolver.getQName("aTestNode"), NameConstants.NT_UNSTRUCTURED, null); + b.addProperty(id, resolver.getQName("aString"), rs.getQValueFactory().create("ba", PropertyType.STRING)); + rs.submit(b); + + PropertyId pid = getPropertyId(id, resolver.getQName("aString")); + b = rs.createBatch(si, nid); + b.remove(pid); + rs.submit(b); + + try { + rs.getPropertyInfo(si, pid); + fail(); + } catch (RepositoryException e) { + // success + } + } + + public void testEmptyValueArray() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("mvProperty"); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, new QValue[0]); + rs.submit(b); + + PropertyId pid = getPropertyId(nid, propName); + PropertyInfo pi = rs.getPropertyInfo(si, pid); + assertTrue(pi.isMultiValued()); + assertEquals(Arrays.asList(new QValue[0]), Arrays.asList(pi.getValues())); + assertFalse(pi.getType() == PropertyType.UNDEFINED); + + Iterator it = rs.getItemInfos(si, nid); + while (it.hasNext()) { + ItemInfo info = (ItemInfo) it.next(); + if (!info.denotesNode()) { + PropertyInfo pInfo = (PropertyInfo) info; + if (propName.equals((pInfo.getId().getName()))) { + assertTrue(pi.isMultiValued()); + assertEquals(Arrays.asList(new QValue[0]), Arrays.asList(pi.getValues())); + assertFalse(pi.getType() == PropertyType.UNDEFINED); + break; + } + } + } + } + + public void testEmptyValueArray2() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("mvProperty"); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, new QValue[] { rs.getQValueFactory().create(true)}); + rs.submit(b); + + PropertyId pid = getPropertyId(nid, propName); + b = rs.createBatch(si, pid); + b.setValue(pid, new QValue[0]); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, pid); + assertTrue(pi.isMultiValued()); + assertEquals(Arrays.asList(new QValue[0]), Arrays.asList(pi.getValues())); + } + + public void testMultiValuedProperty() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("mvProperty2"); + QValue[] vs = new QValue[] {rs.getQValueFactory().create(111), rs.getQValueFactory().create(222), rs.getQValueFactory().create(333)}; + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, vs); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertTrue(pi.isMultiValued()); + assertEquals(Arrays.asList(vs), Arrays.asList(pi.getValues())); + assertEquals(PropertyType.LONG, pi.getType()); + } + + public void testSetBinaryValue() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binProp"); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, rs.getQValueFactory().create(new byte[] {'a', 'b', 'c'})); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals("abc", pi.getValues()[0].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + } + + public void testSetEmptyBinaryValue() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binProp"); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, rs.getQValueFactory().create(new byte[0])); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + InputStream in = pi.getValues()[0].getStream(); + assertTrue(in.read() == -1); + assertEquals("", pi.getValues()[0].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertFalse(pi.isMultiValued()); + in = pi.getValues()[0].getStream(); + assertTrue(in.read() == -1); + assertEquals("", pi.getValues()[0].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + } + + public void testSetBinaryValues() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binPropMV"); + + Batch b = rs.createBatch(si, nid); + QValue[] vs = new QValue[] { + rs.getQValueFactory().create(new byte[] {'a', 'b', 'c'}), + rs.getQValueFactory().create(new byte[] {'d', 'e', 'f'}), + rs.getQValueFactory().create(new byte[] {'g', 'h', 'i'}) + }; + b.addProperty(nid, propName, vs); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertTrue(pi.isMultiValued()); + vs = pi.getValues(); + assertEquals("abc", vs[0].getString()); + assertEquals("def", vs[1].getString()); + assertEquals("ghi", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + + pi = getPropertyInfo(nid, propName); + vs = pi.getValues(); + assertEquals("abc", vs[0].getString()); + assertEquals("def", vs[1].getString()); + assertEquals("ghi", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + } + + public void testSetMixedBinaryValues() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binPropMV"); + + Batch b = rs.createBatch(si, nid); + QValue[] vs = new QValue[] { + rs.getQValueFactory().create(new byte[] {'a', 'b', 'c'}), + rs.getQValueFactory().create(new byte[0]), + rs.getQValueFactory().create(new byte[] {'g', 'h', 'i'}) + }; + b.addProperty(nid, propName, vs); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertTrue(pi.isMultiValued()); + vs = pi.getValues(); + assertEquals("abc", vs[0].getString()); + assertEquals("", vs[1].getString()); + assertEquals("ghi", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + + pi = getPropertyInfo(nid, propName); + vs = pi.getValues(); + assertEquals("abc", vs[0].getString()); + assertEquals("", vs[1].getString()); + assertEquals("ghi", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + } + + public void testSetEmptyBinaryValues() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binPropMV"); + + Batch b = rs.createBatch(si, nid); + QValue[] vs = new QValue[] { + rs.getQValueFactory().create(new byte[0]), + rs.getQValueFactory().create(new byte[0]), + rs.getQValueFactory().create(new byte[0]) + }; + b.addProperty(nid, propName, vs); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertTrue(pi.isMultiValued()); + vs = pi.getValues(); + assertEquals("", vs[0].getString()); + assertEquals("", vs[1].getString()); + assertEquals("", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + + pi = getPropertyInfo(nid, propName); + vs = pi.getValues(); + assertEquals("", vs[0].getString()); + assertEquals("", vs[1].getString()); + assertEquals("", vs[2].getString()); + assertEquals(PropertyType.BINARY, pi.getType()); + } + + public void testBinary() throws RepositoryException, IOException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("binProp"); + + Batch b = rs.createBatch(si, nid); + ClassLoader loader = getClass().getClassLoader(); + InputStream in = loader.getResourceAsStream("org/apache/jackrabbit/spi/spi2davex/image.bmp"); + if (in != null) { + try { + QValue v = rs.getQValueFactory().create(in); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + String str1 = pi.getValues()[0].getString(); + + pi = getPropertyInfo(nid, propName); + String str2 = pi.getValues()[0].getString(); + assertEquals(str1, str2); + } finally { + in.close(); + } + } + } + + public void testSetDoubleValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("doubleProp"); + + QValue v = rs.getQValueFactory().create((double) 12); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.DOUBLE, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.DOUBLE, pi.getType()); + } + + public void testSetLongValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("doubleProp"); + + QValue v = rs.getQValueFactory().create(234567); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.LONG, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.LONG, pi.getType()); + } + + public void testSetDateValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("dateProp"); + + QValue v = rs.getQValueFactory().create(Calendar.getInstance()); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.DATE, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.DATE, pi.getType()); + } + + public void testSetStringValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("stringProp"); + QValueFactory vf = rs.getQValueFactory(); + + List l = new ArrayList(); + l.add("String value containing \"double quotes\" and \'single\' and \"undeterminated quote."); + l.add("String value \ncontaining \n\rline \r\nseparators and \t tab."); + l.add("String value containing \r\n\r\r\n\r\n multiple \r\n\r\n line separators in sequence."); + l.add("String value containing >diff -char +act ^ters."); + l.add("String value containing \n>line sep \r+and \r\n-diff\n\r^chars."); + l.add("String value containing \u0633\u0634 unicode chars."); + + for (Iterator it = l.iterator(); it.hasNext();) { + QValue v = vf.create(it.next().toString(), PropertyType.STRING); + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = getPropertyInfo(nid, propName); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.STRING, pi.getType()); + + pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertEquals(v, pi.getValues()[0]); + assertEquals(v.getString(), pi.getValues()[0].getString()); + assertEquals(PropertyType.STRING, pi.getType()); + } + } + + public void testSetNameValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("nameProp"); + + QValue[] vs = new QValue[] { + rs.getQValueFactory().create(NameConstants.JCR_BASEVERSION), + rs.getQValueFactory().create(NameConstants.JCR_DEFAULTPRIMARYTYPE), + rs.getQValueFactory().create(NameConstants.MIX_LOCKABLE), + rs.getQValueFactory().create(NameConstants.JCR_PRIMARYTYPE), + rs.getQValueFactory().create(NameConstants.NT_VERSION) + }; + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, vs); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertTrue(pi.isMultiValued()); + assertEquals(Arrays.asList(vs), Arrays.asList(pi.getValues())); + assertEquals(PropertyType.NAME, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(vs[0].getName(), pi.getValues()[0].getName()); + assertEquals(Arrays.asList(vs), Arrays.asList(pi.getValues())); + assertEquals(PropertyType.NAME, pi.getType()); + } + + public void testSetPathValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("pathProp"); + + QValue v = rs.getQValueFactory().create(resolver.getQPath(testPath)); + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(v, pi.getValues()[0]); + assertEquals(PropertyType.PATH, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(v.getPath(), pi.getValues()[0].getPath()); + assertEquals(v, pi.getValues()[0]); + assertEquals(PropertyType.PATH, pi.getType()); + } + + public void testSetBooleanValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("booleanProp"); + + QValue v = rs.getQValueFactory().create(false); + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertFalse(pi.getValues()[0].getBoolean()); + assertEquals(PropertyType.BOOLEAN, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertFalse(pi.getValues()[0].getBoolean()); + assertEquals(PropertyType.BOOLEAN, pi.getType()); + } + + public void testSetReferenceValue() throws RepositoryException { + NodeId nid = getNodeId(testPath); + NodeInfo nInfo = rs.getNodeInfo(si, nid); + if (!Arrays.asList(nInfo.getMixins()).contains(NameConstants.MIX_REFERENCEABLE)) { + Batch b = rs.createBatch(si, nid); + b.setMixins(nid, new Name[] {NameConstants.MIX_REFERENCEABLE}); + rs.submit(b); + } + + String ref = rs.getNodeInfo(si, nid).getId().getUniqueID(); + Name propName = resolver.getQName("refProp"); + QValue v = rs.getQValueFactory().create(ref, PropertyType.REFERENCE); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(v, pi.getValues()[0]); + assertEquals(PropertyType.REFERENCE, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertEquals(v, pi.getValues()[0]); + assertEquals(PropertyType.REFERENCE, pi.getType()); + } + + public void testSetPropertyTwice() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Name propName = resolver.getQName("nameProp"); + PropertyId pid = getPropertyId(nid, propName); + + QValue v = rs.getQValueFactory().create(NameConstants.JCR_AUTOCREATED); + QValue v2 = rs.getQValueFactory().create(NameConstants.JCR_BASEVERSION); + QValue v3 = rs.getQValueFactory().create(NameConstants.JCR_CONTENT); + + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, propName, v); + b.setValue(pid, v2); + b.setValue(pid, v3); + rs.submit(b); + + PropertyInfo pi = rs.getPropertyInfo(si, getPropertyId(nid, propName)); + assertFalse(pi.isMultiValued()); + assertEquals(1, pi.getValues().length); + assertEquals(v3, pi.getValues()[0]); + assertEquals(PropertyType.NAME, pi.getType()); + + pi = getPropertyInfo(nid, propName); + assertFalse(pi.isMultiValued()); + assertEquals(1, pi.getValues().length); + assertEquals(v3, pi.getValues()[0]); + assertEquals(PropertyType.NAME, pi.getType()); + } + + public void testUseConsumedBatch() throws RepositoryException { + NodeId nid = getNodeId(testPath); + Batch b = rs.createBatch(si, nid); + b.addProperty(nid, resolver.getQName("any"), rs.getQValueFactory().create(1.34)); + rs.submit(b); + + try { + b.remove(nid); + rs.submit(b); + fail(); + } catch (IllegalStateException e) { + // success + } + } + //-------------------------------------------------------------------------- + private NodeId getNodeId(String path) throws NamespaceException, RepositoryException { + return rs.getIdFactory().createNodeId((String) null, resolver.getQPath(path)); + } + + private PropertyId getPropertyId(NodeId nId, Name propName) throws RepositoryException { + return rs.getIdFactory().createPropertyId(nId, propName); + } + + private PropertyInfo getPropertyInfo(NodeId parentId, Name propName) throws RepositoryException { + Iterator it = rs.getItemInfos(si, parentId); + while (it.hasNext()) { + ItemInfo info = (ItemInfo) it.next(); + if (!info.denotesNode()) { + PropertyInfo pInfo = (PropertyInfo) info; + if (propName.equals((pInfo.getId().getName()))) { + return pInfo; + } + } + } + throw new ItemNotFoundException(); + } +} Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/BatchTest.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,63 @@ +/* + * 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.spi.spi2davex; + +import org.apache.jackrabbit.spi.AbstractSPITest; +import org.apache.jackrabbit.spi.RepositoryService; +import org.apache.jackrabbit.spi.SessionInfo; +import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; +import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; +import org.apache.jackrabbit.spi.commons.namespace.AbstractNamespaceResolver; +import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; + +import javax.jcr.LoginException; +import javax.jcr.NamespaceException; +import javax.jcr.RepositoryException; +import javax.jcr.SimpleCredentials; + +/** + * ConnectionTest... + */ +public class ConnectionTest extends AbstractSPITest { + + private final String testPath = "/"; + private NamePathResolver resolver; + private RepositoryService rs; + + protected void setUp() throws Exception { + super.setUp(); + rs = helper.getRepositoryService(); + NamespaceResolver nsResolver = new AbstractNamespaceResolver() { + public String getURI(String prefix) throws NamespaceException { + return ("jcr".equals(prefix)) ? "http://www.jcp.org/jcr/1.0" : prefix; + } + public String getPrefix(String uri) throws NamespaceException { + return ("http://www.jcp.org/jcr/1.0".equals(uri)) ? "jcr" : uri; + } + }; + resolver = new DefaultNamePathResolver(nsResolver); + } + + public void testObtainWithNullWorkspaceName() throws RepositoryException, LoginException { + SessionInfo sInfo = rs.obtain(new SimpleCredentials("admin", "admin".toCharArray()), null); + try { + assertEquals("default",sInfo.getWorkspaceName()); + } finally { + rs.dispose(sInfo); + } + } +} \ No newline at end of file Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ConnectionTest.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,58 @@ +/* + * 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.spi.spi2davex; + +/** + * DummyJSONHandler... + */ +class DummyJSONHandler implements JSONHandler { + + public void object() { + System.out.println("Object"); + } + + public void endObject() { + System.out.println("Object: END"); + } + + public void array() { + System.out.println("\tArray"); + } + + public void endArray() { + System.out.println("\tArray: END"); + } + public void key(String key) { + System.out.println("Key = " + key); + } + + public void value(String value) { + System.out.println("\tValue = " + value); + } + + public void value(long value) { + System.out.println("\tValue (long) = " + value); + } + + public void value(double value) { + System.out.println("\tValue (double) = " + value); + } + + public void value(boolean value) { + System.out.println("\tValue (boolean) = " + value); + } +} Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/DummyJSONHandler.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,555 @@ +/* + * 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.spi.spi2davex; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import junit.framework.TestCase; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +/** + * JSONParserTest... + */ +public class JSONParserTest extends TestCase { + + private final JSONHandler handler = new DummyJSONHandler(); + private JSONParser parser; + + protected void setUp() throws Exception { + super.setUp(); + parser = new JSONParser(handler); + } + + public void testParser() throws JSONException, IOException { + JSONParser parser = new JSONParser(handler); + parser.parse(getObj().toString()); + } + + public void testParseBooleanValue() throws IOException, JSONException { + JSONObject obj = new JSONObject(); + obj.put("boolean", true); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("boolean", key); + } + public void value(String value) { + fail(); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + assertEquals(true, value); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testParseLongValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("long", 123456); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("long", key); + } + public void value(String value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + public void value(long value) { + assertEquals(123456, value); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testDoubleValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("double", 1235674.342424); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("double", key); + } + public void value(String value) { + fail(); + } + public void value(long value) { + fail(); + } + public void value(boolean value) { + fail(); + } + public void value(double value) { + assertEquals(new Double(1235674.342424), new Double(value)); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "abc"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("abc", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithQuoteValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "abc\"abc"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("abc\"abc", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithBackSlashValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "abc\\abc"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("abc\\abc", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithBackSlashValue2() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "\'abc\\\\x\\'abc"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("\'abc\\\\x\\'abc", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithUnicode() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "abc\u2345ab\u00EB\u0633c"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("abc\u2345ab\u00EB\u0633c", value); + assertEquals("abc\u2345abë\u0633c", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithUnicode2() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("string", "\u00EB"); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals("\u00EB", value); + assertEquals("ë", value); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testStringWithReturn() throws JSONException, IOException { + ArrayList l = new ArrayList(); + l.add("abc\ndef"); + l.add("abc\rdef"); + l.add("abc\n\rdef"); + l.add("abc\tdef"); + l.add("abc\bdef"); + l.add("abc\n\\\tdef"); + l.add("abc\f\u3456\b\\def"); + + for (Iterator it = l.iterator(); it.hasNext();) { + final String expValue = it.next().toString(); + JSONObject obj = new JSONObject(); + obj.put("string", expValue); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("string", key); + } + public void value(String value) { + assertEquals(expValue, value); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + } + + public void testNullValue() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("null", JSONObject.NULL); + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals("null", key); + } + public void value(String value) { + assertNull(value); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testArray() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("array", Arrays.asList(new String[] {"a", "b", "c"})); + + JSONHandler handler = new DummyJSONHandler() { + boolean arrayStarted = false; + int index = 0; + + public void key(String key) { + assertEquals("array", key); + } + public void array() { + assertFalse(arrayStarted); + arrayStarted = true; + } + public void endArray() { + assertTrue(arrayStarted); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + public void value(String value) { + assertTrue(arrayStarted); + switch (index) { + case 0: assertEquals("a", value); break; + case 1: assertEquals("b", value); break; + case 2: assertEquals("c", value); break; + default: fail(); + } + index++; + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testLongArray() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("longarray", Arrays.asList(new Long[] {new Long(123), new Long(3456), new Long(45367)})); + + JSONHandler handler = new DummyJSONHandler() { + boolean arrayStarted = false; + int index = 0; + + public void key(String key) { + assertEquals("longarray", key); + } + public void array() { + assertFalse(arrayStarted); + arrayStarted = true; + } + public void endArray() { + assertTrue(arrayStarted); + } + public void value(long value) { + assertTrue(arrayStarted); + switch (index) { + case 0: assertEquals(123, value); break; + case 1: assertEquals(3456, value); break; + case 2: assertEquals(45367, value); break; + default: fail(); + } + index++; + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + public void value(String value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse(obj.toString()); + } + + public void testParser2() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("obj1", getSimpleObj("bla")); + obj.put("obj2", getSimpleObj("blu")); + obj.put("obj3", getSimpleObj("bli")); + + parser.parse(obj.toString()); + } + + public void testParser4() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("arr1", getSimpleArray(new String[] {"s", "t", "r"})); + obj.put("arr2", getSimpleArray(new String[] {"s", "t", "r"})); + obj.put("arr3", getSimpleArray(new String[] {"s", "t", "r"})); + obj.put("arr4", getSimpleArray(new String[] {"s", "t", "r"})); + + parser.parse(obj.toString()); + } + + public void testParser5() throws JSONException, IOException { + JSONObject obj = new JSONObject(); + obj.put("arr1", getSimpleArray(new JSONObject[] { getSimpleObj(new Integer(1)), getSimpleObj("abc"), getSimpleObj(Boolean.TRUE) })); + obj.put("objvalue", getSimpleObj( getSimpleArray(new Object[] {"a", new Double(2.3), Boolean.FALSE}))); + obj.put("arrarr", getSimpleArray( new Object[] {getSimpleArray(new Object[] {"a", new Double(2.3), Boolean.FALSE})})); + obj.put("simplv", Boolean.TRUE); + + parser.parse(obj.toString()); + } + + public void testParser6() throws JSONException, IOException { + final String expKey = "prop1"; + final String expValue = "Any string containing comma, period. question mark?"; + + JSONHandler handler = new DummyJSONHandler() { + public void key(String key) { + assertEquals(expKey, key); + } + + public void value(String value) { + assertEquals(expValue, value); + } + }; + + String str = "{\"" +expKey+ "\":\""+expValue+"\"}"; + + JSONParser parser = new JSONParser(handler); + parser.parse(str); + } + + public void testParseEmptyObject() throws IOException, JSONException { + JSONHandler handler = new DummyJSONHandler() { + private int objectCnt = 0; + public void object() { + objectCnt++; + } + public void endObject() { + assertEquals(1, objectCnt); + } + public void array() { + fail(); + } + public void endArray() { + fail(); + } + public void key(String key) { + fail(); + } + public void value(String value) { + fail(); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + JSONParser parser = new JSONParser(handler); + parser.parse("{}"); + } + + public void testParseEmptyObjectValue() throws IOException, JSONException { + + List l = new ArrayList(); + l.add("{\"a\":{},\"b\":{},\"c\":{}}"); + l.add("{\"a\":{\"b\":{\"c\":{}}}}"); + l.add("{\"a\":{},\"b\":{\"c\":{}}}"); + l.add("{\"a\":{\"b\":{},\"c\":{}}}"); + + for (Iterator it = l.iterator(); it.hasNext();) { + JSONHandler handler = new DummyJSONHandler() { + private int objectCnt = 0; + public void object() { + objectCnt++; + } + public void endObject() { + assertFalse(objectCnt > 4); + } + public void array() { + fail(); + } + public void endArray() { + fail(); + } + public void value(String value) { + fail(); + } + public void value(long value) { + fail(); + } + public void value(double value) { + fail(); + } + public void value(boolean value) { + fail(); + } + }; + + JSONParser parser = new JSONParser(handler); + parser.parse(it.next().toString()); + } + } + + private static JSONObject getObj() throws JSONException { + JSONObject obj = new JSONObject(); + obj.put("boolean", true); + obj.put("long", 1); + obj.put("double", 1235674.342424); + obj.put("array", Arrays.asList(new String[] {"a", "b", "c"})); + obj.put("longarray", Arrays.asList(new Long[] {new Long(123), new Long(3456), new Long(45367)})); + obj.put("string", "abc"); + obj.put("string1", "123.456"); + return obj; + } + + private static JSONObject getSimpleObj(Object value) throws JSONException { + JSONObject obj = new JSONObject(); + obj.put("v", value); + return obj; + } + + private static JSONArray getSimpleArray(Object[] values) throws JSONException { + JSONArray arr = new JSONArray(); + for (int i = 0; i < values.length; i++) { + arr.put(values[i]); + } + return arr; + } + +} \ No newline at end of file Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/JSONParserTest.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,153 @@ +/* + * 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.spi.spi2davex; + +import org.apache.jackrabbit.spi.Batch; +import org.apache.jackrabbit.spi.ItemInfo; +import org.apache.jackrabbit.spi.Name; +import org.apache.jackrabbit.spi.NodeId; +import org.apache.jackrabbit.spi.PropertyId; +import org.apache.jackrabbit.spi.PropertyInfo; +import org.apache.jackrabbit.spi.RepositoryService; +import org.apache.jackrabbit.spi.SessionInfo; +import org.apache.jackrabbit.spi.AbstractSPITest; +import org.apache.jackrabbit.spi.commons.conversion.DefaultNamePathResolver; +import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver; +import org.apache.jackrabbit.spi.commons.name.NameConstants; +import org.apache.jackrabbit.spi.commons.namespace.AbstractNamespaceResolver; +import org.apache.jackrabbit.spi.commons.namespace.NamespaceResolver; + +import javax.jcr.ItemNotFoundException; +import javax.jcr.NamespaceException; +import javax.jcr.RepositoryException; +import java.util.Iterator; + +/** + * ConnectionTest... + */ +public class ReadTest extends AbstractSPITest { + + private final String testPath = "/test"; + private NamePathResolver resolver; + private RepositoryService rs; + private SessionInfo si; + + protected void setUp() throws Exception { + super.setUp(); + rs = helper.getRepositoryService(); + si = helper.getAdminSessionInfo(); + + NamespaceResolver nsResolver = new AbstractNamespaceResolver() { + public String getURI(String prefix) throws NamespaceException { + return ("jcr".equals(prefix)) ? "http://www.jcp.org/jcr/1.0" : prefix; + } + public String getPrefix(String uri) throws NamespaceException { + return ("http://www.jcp.org/jcr/1.0".equals(uri)) ? "jcr" : uri; + } + }; + resolver = new DefaultNamePathResolver(nsResolver); + + try { + rs.getNodeInfo(si, getNodeId(testPath)); + } catch (RepositoryException e) { + Batch b = rs.createBatch(si, getNodeId("/")); + b.addNode(getNodeId("/"), resolver.getQName("test"), NameConstants.NT_UNSTRUCTURED, null); + rs.submit(b); + } + } + + protected void tearDown() throws Exception { + try { + Batch b = rs.createBatch(si, getNodeId("/")); + b.remove(getNodeId(testPath)); + rs.submit(b); + } finally { + rs.dispose(si); + super.tearDown(); + } + } + + public void testReadNode() throws RepositoryException { + NodeId nid = getNodeId(testPath); + rs.getItemInfos(si, nid); + } + + public void testReadNonExistingNode() throws RepositoryException { + NodeId nid = getNodeId(testPath + "/non-existing"); + try { + rs.getItemInfos(si, nid); + fail(); + } catch (ItemNotFoundException e) { + // ok + } + } + + public void testReadNonExistingNode2() throws RepositoryException { + NodeId nid = getNodeId(testPath + "/non-existing"); + try { + rs.getNodeInfo(si, nid); + fail(); + } catch (ItemNotFoundException e) { + // ok + } + } + + public void testReadPropertyAsNode() throws RepositoryException { + NodeId nid = getNodeId(testPath + "/jcr:primaryType"); + try { + rs.getItemInfos(si, nid); + fail(); + } catch (ItemNotFoundException e) { + // ok + } + } + + public void testReadNonExistingProperty() throws RepositoryException { + NodeId nid = getNodeId(testPath); + PropertyId pid = getPropertyId(nid, NameConstants.JCR_CHILDNODEDEFINITION); + + try { + rs.getPropertyInfo(si, pid); + fail(); + } catch (ItemNotFoundException e) { + // ok + } + } + + //-------------------------------------------------------------------------- + private NodeId getNodeId(String path) throws NamespaceException, RepositoryException { + return rs.getIdFactory().createNodeId((String) null, resolver.getQPath(path)); + } + + private PropertyId getPropertyId(NodeId nId, Name propName) throws RepositoryException { + return rs.getIdFactory().createPropertyId(nId, propName); + } + + private PropertyInfo getPropertyInfo(NodeId parentId, Name propName) throws RepositoryException { + Iterator it = rs.getItemInfos(si, parentId); + while (it.hasNext()) { + ItemInfo info = (ItemInfo) it.next(); + if (!info.denotesNode()) { + PropertyInfo pInfo = (PropertyInfo) info; + if (propName.equals((pInfo.getId().getName()))) { + return pInfo; + } + } + } + throw new ItemNotFoundException(); + } +} Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ReadTest.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,95 @@ +/* + * 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.spi.spi2davex; + +import org.apache.jackrabbit.spi.Path; +import org.apache.jackrabbit.spi.RepositoryService; +import org.apache.jackrabbit.spi.RepositoryServiceStub; +import org.apache.jackrabbit.spi.commons.conversion.PathResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.jcr.Credentials; +import javax.jcr.RepositoryException; +import javax.jcr.SimpleCredentials; +import java.util.Properties; + +/** ServiceStubImpl... */ +public class ServiceStubImpl extends RepositoryServiceStub { + + private static Logger log = LoggerFactory.getLogger(ServiceStubImpl.class); + + public static final String PROP_REPOSITORY_URI = "org.apache.jackrabbit.spi.spi2davex.uri"; + public static final String PROP_DEFAULT_DEPTH = "org.apache.jackrabbit.spi.spi2davex.defaultDepth"; + public static final String PROP_WSP_NAME = "org.apache.jackrabbit.spi.spi2davex.workspacename"; + + private RepositoryService service; + private Credentials adminCredentials; + private Credentials readOnlyCredentials; + + /** + * Implementations of this class must overwrite this constructor. + * + * @param env the environment variables. This parameter must not be null. + */ + public ServiceStubImpl(Properties env) { + super(env); + } + + /** + * Workaround for SPI issue JCR-1851 + * + * @param propName Configuration property name. + * @return Configured property value. + */ + public String getProperty(String propName) { + String prop = super.getProperty(propName); + if (prop == null && propName.equals("workspacename")) { + prop = super.getProperty(PROP_WSP_NAME); + } + return prop; + } + + public RepositoryService getRepositoryService() throws RepositoryException { + if (service == null) { + String uri = getProperty(PROP_REPOSITORY_URI); + service = new RepositoryServiceImpl(uri, new BatchReadConfig() { + public int getDepth(Path path, PathResolver resolver) { + String depthStr = getProperty(PROP_DEFAULT_DEPTH); + return Integer.parseInt(depthStr); + } + }); + } + return service; + } + + public Credentials getAdminCredentials() { + if (adminCredentials == null) { + adminCredentials = new SimpleCredentials(getProperty(RepositoryServiceStub.PROP_PREFIX + "." + RepositoryServiceStub.PROP_ADMIN_NAME), + getProperty(RepositoryServiceStub.PROP_PREFIX + "." + RepositoryServiceStub.PROP_ADMIN_PWD).toCharArray()); + } + return adminCredentials; + } + + public Credentials getReadOnlyCredentials() { + if (readOnlyCredentials == null) { + readOnlyCredentials = new SimpleCredentials(getProperty(RepositoryServiceStub.PROP_PREFIX + "." + RepositoryServiceStub.PROP_READONLY_NAME), + getProperty(RepositoryServiceStub.PROP_PREFIX + "." + RepositoryServiceStub.PROP_READONLY_PWD).toCharArray()); + } + return readOnlyCredentials; + } +} \ No newline at end of file Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/ServiceStubImpl.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java Wed Jan 28 13:35:47 2009 @@ -0,0 +1,41 @@ +/* + * 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.spi.spi2davex; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** TestAll... */ +public class TestAll extends TestCase { + + public static Test suite() { + + TestSuite suite = new TestSuite("SPI and SPI-implementation tests"); + + suite.addTest(org.apache.jackrabbit.spi.TestAll.suite()); + + // impl specific spi tests + suite.addTestSuite(ConnectionTest.class); + suite.addTestSuite(ReadTest.class); + suite.addTestSuite(BatchTest.class); + + // impl specific tests + suite.addTestSuite(JSONParserTest.class); + return suite; + } +} \ No newline at end of file Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/java/org/apache/jackrabbit/spi/spi2davex/TestAll.java ------------------------------------------------------------------------------ svn:keywords = author date id revision url Added: jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties Wed Jan 28 13:35:47 2009 @@ -0,0 +1,36 @@ +# 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. + +# Set root logger level to INFO and its only appender to file. +log4j.rootLogger=INFO, file +#log4j.rootLogger=DEBUG, stdout, file +#log4j.rootLogger=ERROR, stdout, file + +log4j.logger.org.apache.jackrabbit.test=DEBUG + +# 'stdout' is set to be a ConsoleAppender. +log4j.appender.stdout=org.apache.log4j.ConsoleAppender + +# 'stdout' uses PatternLayout +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m (%F, line %L)\n + +# 'file' is set to be a FileAppender. +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.File=target/jcr.log + +# 'file' uses PatternLayout. +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} *%-5p* [%t] %c{1}: %m (%F, line %L)\n Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn = Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/sandbox/spi/spi2davex/src/test/resources/org/apache/jackrabbit/spi/spi2davex/image.bmp URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/resources/org/apache/jackrabbit/spi/spi2davex/image.bmp?rev=738480&view=auto ============================================================================== Binary file - no diff available. Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/resources/org/apache/jackrabbit/spi/spi2davex/image.bmp ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties?rev=738480&view=auto ============================================================================== --- jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties (added) +++ jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties Wed Jan 28 13:35:47 2009 @@ -0,0 +1,33 @@ +# 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. + +# +# This is the configuration file for the jackrabbit repositoryservice test stub. +# + +# the ServiceStubImpl used for SPI tests. +org.apache.jackrabbit.spi.repository_service_stub_impl=org.apache.jackrabbit.spi.spi2davex.ServiceStubImpl + +org.apache.jackrabbit.spi.admin.pwd=admin +org.apache.jackrabbit.spi.admin.name=admin +org.apache.jackrabbit.spi.readonly.pwd=anonymous +org.apache.jackrabbit.spi.readonly.name= +org.apache.jackrabbit.spi.workspacename=default + +org.apache.jackrabbit.spi.QValueFactoryTest.reference=cafebabe-cafe-babe-cafe-babecafebabe + +org.apache.jackrabbit.spi.spi2davex.uri=http://localhost:8080/jackrabbit/server +org.apache.jackrabbit.spi.spi2davex.workspacename=default +org.apache.jackrabbit.spi.spi2davex.defaultDepth=4 Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties ------------------------------------------------------------------------------ svn = Propchange: jackrabbit/sandbox/spi/spi2davex/src/test/resources/repositoryServiceStubImpl.properties ------------------------------------------------------------------------------ svn:eol-style = native