/* * 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.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 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; import java.util.UUID; /** * <code>ConnectionTest</code>... */ public class BatchTest extends AbstractSPITest { private final String testPath = "/test"; private NamePathResolver resolver; private RepositoryService rs; private SessionInfo si; @Override protected void setUp() throws Exception { super.setUp(); rs = helper.getRepositoryService(); si = helper.getAdminSessionInfo(); NamespaceResolver nsResolver = new AbstractNamespaceResolver() { public String getURI(String prefix) { return ("jcr".equals(prefix)) ? "http://www.jcp.org/jcr/1.0" : prefix; } public String getPrefix(String uri) { 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); } } @Override 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<? extends ItemInfo> it = rs.getItemInfos(si, id); while (it.hasNext()) { ItemInfo info = it.next(); if (info.denotesNode()) { NodeInfo nInfo = (NodeInfo) info; assertEquals(NameConstants.NT_UNSTRUCTURED, nInfo.getNodetype()); Iterator<ChildInfo> 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<ChildInfo> it = rs.getChildInfos(si, nid); int i = 1; while (it.hasNext()) { ChildInfo ci = it.next(); assertEquals(i, Integer.parseInt(ci.getName().getLocalName())); 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<ChildInfo> it = rs.getChildInfos(si, nid); int i = 1; while (it.hasNext()) { ChildInfo ci = it.next(); assertEquals(i, Integer.parseInt(ci.getName().getLocalName())); 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<? extends ItemInfo> it = rs.getItemInfos(si, nid); while (it.hasNext()) { ItemInfo info = 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<String> l = new ArrayList<String>(); 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 (String val : l) { QValue v = vf.create(val, 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 testSetWeakReferenceValue() 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("weakRefProp"); QValue v = rs.getQValueFactory().create(ref, PropertyType.WEAKREFERENCE); 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.WEAKREFERENCE, pi.getType()); pi = getPropertyInfo(nid, propName); assertEquals(v, pi.getValues()[0]); assertEquals(PropertyType.WEAKREFERENCE, 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<? extends ItemInfo> it = rs.getItemInfos(si, parentId); while (it.hasNext()) { ItemInfo info = it.next(); if (!info.denotesNode()) { PropertyInfo pInfo = (PropertyInfo) info; if (propName.equals((pInfo.getId().getName()))) { return pInfo; } } } throw new ItemNotFoundException(); } }