/* * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xcmis.sp.inmemory; import org.xcmis.spi.BaseContentStream; import org.xcmis.spi.CmisConstants; import org.xcmis.spi.ContentStream; import org.xcmis.spi.DocumentData; import org.xcmis.spi.FolderData; import org.xcmis.spi.ItemsIterator; import org.xcmis.spi.ObjectData; import org.xcmis.spi.model.AccessControlEntry; import org.xcmis.spi.model.ChangeEvent; import org.xcmis.spi.model.ChangeType; import org.xcmis.spi.model.Property; import org.xcmis.spi.model.PropertyDefinition; import org.xcmis.spi.model.VersioningState; import org.xcmis.spi.model.impl.StringProperty; import org.xcmis.spi.utils.MimeType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey * Kabashnyuk</a> * @version $Id: StorageTest.java 34360 2009-07-22 23:58:59Z ksm $ * */ public class StorageTest extends BaseTest { public void testChangeLog() throws Exception { DocumentData document = createDocument(rootFolder, "testChangeLog", documentTypeDefinition, null, null); String id = document.getObjectId(); document.setProperty(new StringProperty("cmis:name", "cmis:name", "cmis:name", "cmis:name", "testChangeLog_Rename")); List<ChangeEvent> l = new ArrayList<ChangeEvent>(); for (ItemsIterator<ChangeEvent> changeLog = storage.getChangeLog(null); changeLog.hasNext();) { ChangeEvent next = changeLog.next(); if (id.equals(next.getObjectId()) && (next.getType() == ChangeType.CREATED || next.getType() == ChangeType.UPDATED)) { l.add(next); } } assertEquals("Expect for two change event: 'create' and 'updated'. ", 2, l.size()); assertEquals(ChangeType.CREATED, l.get(0).getType()); assertEquals(ChangeType.UPDATED, l.get(1).getType()); } public void testChangeLogLogToken() throws Exception { DocumentData document = createDocument(rootFolder, "testChangeLogLogToken", documentTypeDefinition, null, null); String id = document.getObjectId(); document.setProperty(new StringProperty("cmis:name", "cmis:name", "cmis:name", "cmis:name", "testChangeLogLogToken_Rename")); String logToken = storage.getRepositoryInfo().getLatestChangeLogToken(); List<ChangeEvent> l = new ArrayList<ChangeEvent>(); // Get limited list of changes, event "created" should be skipped. for (ItemsIterator<ChangeEvent> changeLog = storage.getChangeLog(logToken); changeLog.hasNext();) { ChangeEvent next = changeLog.next(); if (id.equals(next.getObjectId()) && (next.getType() == ChangeType.CREATED || next.getType() == ChangeType.UPDATED)) { l.add(next); } } assertEquals("Expect for one change event: 'updated'. ", 1, l.size()); assertEquals(ChangeType.UPDATED, l.get(0).getType()); } public void testAddAcl() throws Exception { DocumentData document = createDocument(rootFolder, "aclTest", documentTypeDefinition, null, null); String id = document.getObjectId(); document.setACL(Collections.singletonList(new AccessControlEntry("root", new HashSet<String>(Arrays.asList( "cmis:read", "cmis:write"))))); document = (DocumentData)storage.getObjectById(id); System.out.println(document.getACL(true)); } public void testMultifiledChild() throws Exception { DocumentData document = createDocument(rootFolder, "multifiledChildTest", documentTypeDefinition, null, null); FolderData folder1 = createFolder(rootFolder, "multifiledChildFolderTest01"); DocumentData child1 = createDocument(folder1, "child1", documentTypeDefinition, null, null); List<String> chs = new ArrayList<String>(); for (ItemsIterator<ObjectData> children = folder1.getChildren(null); children.hasNext();) { chs.add(children.next().getObjectId()); } assertEquals(1, chs.size()); folder1.addObject(document); chs.clear(); for (ItemsIterator<ObjectData> children = folder1.getChildren(null); children.hasNext();) { chs.add(children.next().getObjectId()); } assertEquals(2, chs.size()); } public void testMultifiling() throws Exception { DocumentData document = createDocument(rootFolder, "multifilingDocumentTest", documentTypeDefinition, null, null); FolderData folder1 = createFolder(rootFolder, "multifilingFolderTest1"); FolderData folder2 = createFolder(rootFolder, "multifilingFolderTest2"); FolderData folder3 = createFolder(rootFolder, "multifilingFolderTest3"); FolderData folder4 = createFolder(rootFolder, "multifilingFolderTest4"); folder1.addObject(document); folder2.addObject(document); folder3.addObject(document); folder4.addObject(document); Set<String> expectedParents = new HashSet<String>(Arrays.asList(rootFolder.getObjectId(), folder1.getObjectId(), folder2.getObjectId(), folder3.getObjectId(), folder4.getObjectId())); Collection<FolderData> parents = document.getParents(); assertEquals(expectedParents.size(), parents.size()); for (FolderData f : parents) { assertTrue("Folder " + f.getObjectId() + " must be in parents list.", expectedParents .contains(f.getObjectId())); } // remove from three folders and check parents again folder1.removeObject(document); folder3.removeObject(document); rootFolder.removeObject(document); expectedParents = new HashSet<String>(Arrays.asList(folder2.getObjectId(), folder4.getObjectId())); parents = document.getParents(); assertEquals(expectedParents.size(), parents.size()); for (FolderData f : parents) { assertTrue("Folder " + f.getObjectId() + " must be in parents list.", expectedParents .contains(f.getObjectId())); } // System.out.println(" StorageTest.testMultifiling > new location: " // + ((DocumentDataImpl)document).getNode().getPath()); } public void testUnfiling() throws Exception { assertEquals(0, getSize(storage.getUnfiledObjectsId())); DocumentData document = createDocument(rootFolder, "unfilingDocumentTest", documentTypeDefinition, null, null); assertTrue(rootFolder.getChildren(null).hasNext()); rootFolder.removeObject(document); assertFalse(rootFolder.getChildren(null).hasNext()); Collection<FolderData> parents = document.getParents(); assertEquals(0, parents.size()); storage.getObjectById(document.getObjectId()); assertEquals(1, getSize(storage.getUnfiledObjectsId())); } public void testCreateDocumentDifferentContentName() throws Exception { PropertyDefinition<?> def = PropertyDefinitions.getPropertyDefinition("cmis:document", CmisConstants.NAME); Map<String, Property<?>> properties = new HashMap<String, Property<?>>(); properties.put(CmisConstants.NAME, new StringProperty(def.getId(), def.getQueryName(), def.getLocalName(), def .getDisplayName(), "createDocumentTest")); PropertyDefinition<?> contentNameDef = PropertyDefinitions.getPropertyDefinition("cmis:document", CmisConstants.CONTENT_STREAM_FILE_NAME); properties.put(CmisConstants.CONTENT_STREAM_FILE_NAME, new StringProperty(contentNameDef.getId(), contentNameDef .getQueryName(), contentNameDef.getLocalName(), contentNameDef.getDisplayName(), "createDocumentTest_ContentFile.txt")); ContentStream cs = new BaseContentStream("to be or not to be".getBytes(), /*"createDocumentTest"*/null, new MimeType("text", "plain")); DocumentData doc = storage.createDocument(rootFolder, documentTypeDefinition, properties, cs, null, null, VersioningState.MAJOR); assertEquals("text/plain", doc.getContentStreamMimeType()); assertEquals("createDocumentTest", doc.getName()); assertEquals("createDocumentTest_ContentFile.txt", doc.getContentStream().getFileName()); } private int getSize(Iterator<String> iterator) { int result = 0; while (iterator.hasNext()) { iterator.next(); result++; } return result; } }