/** * 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.spi.tck; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.xcmis.spi.CmisConstants; import org.xcmis.spi.ConstraintException; import org.xcmis.spi.ItemsTree; import org.xcmis.spi.model.CmisObject; import org.xcmis.spi.model.TypeDefinition; import java.util.HashSet; import java.util.List; import java.util.Set; public class PolicyTest extends BaseTest { private static TypeDefinition folderType; private static TypeDefinition policyType; private static String controllablePolicyObject; private static TypeDefinition controllablePolicyType; private static String notControllablePolicyObject; private static TypeDefinition notControllablePolicyType; private static String testRootFolderId; @BeforeClass public static void start() throws Exception { folderType = connection.getTypeDefinition(CmisConstants.FOLDER); if (isPoliciesSupported) { policyType = connection.getTypeDefinition(CmisConstants.POLICY); } testRootFolderId = createFolder(rootFolderID, folderType.getId(), "policy_testroot", null, null, null); List<ItemsTree<TypeDefinition>> allTypes = connection.getTypeDescendants(null, -1, true); controllablePolicyType = getControllablePolicyType(allTypes); notControllablePolicyType = getNotControllablePolicyType(allTypes); if (controllablePolicyType != null) { switch (controllablePolicyType.getBaseId()) { case DOCUMENT : controllablePolicyObject = createDocument(testRootFolderId, controllablePolicyType.getId(), generateName(controllablePolicyType, null), null, null, null, null, null); break; case FOLDER : controllablePolicyObject = createFolder(testRootFolderId, controllablePolicyType.getId(), generateName(controllablePolicyType, null), null, null, null); break; case POLICY : controllablePolicyObject = createPolicy(testRootFolderId, controllablePolicyType.getId(), generateName(controllablePolicyType, null), null, null, null, null); break; case RELATIONSHIP : String sourceId = createDocument(testRootFolderId, CmisConstants.DOCUMENT, generateName(connection .getTypeDefinition(CmisConstants.DOCUMENT), null), null, null, null, null, null); String targetId = createDocument(testRootFolderId, CmisConstants.DOCUMENT, generateName(connection .getTypeDefinition(CmisConstants.DOCUMENT), null), null, null, null, null, null); controllablePolicyObject = createRelationship(controllablePolicyType.getId(), generateName(controllablePolicyType, null), sourceId, targetId, null, null, null); break; } } if (notControllablePolicyType != null) { switch (notControllablePolicyType.getBaseId()) { case DOCUMENT : notControllablePolicyObject = createDocument(testRootFolderId, notControllablePolicyType.getId(), generateName( notControllablePolicyType, null), null, null, null, null, null); break; case FOLDER : notControllablePolicyObject = createFolder(testRootFolderId, notControllablePolicyType.getId(), generateName( notControllablePolicyType, null), null, null, null); break; case POLICY : notControllablePolicyObject = createPolicy(testRootFolderId, notControllablePolicyType.getId(), generateName( notControllablePolicyType, null), null, null, null, null); break; case RELATIONSHIP : String sourceId = createDocument(testRootFolderId, CmisConstants.DOCUMENT, generateName(connection .getTypeDefinition(CmisConstants.DOCUMENT), null), null, null, null, null, null); String targetId = createDocument(testRootFolderId, CmisConstants.DOCUMENT, generateName(connection .getTypeDefinition(CmisConstants.DOCUMENT), null), null, null, null, null, null); notControllablePolicyObject = createRelationship(notControllablePolicyType.getId(), generateName(notControllablePolicyType, null), sourceId, targetId, null, null, null); break; } } System.out.println("Running Policy Service tests"); } @AfterClass public static void stop() throws Exception { if (testRootFolderId != null) { clear(testRootFolderId); } } /** * 2.2.9.1 applyPolicy. * * @throws Exception */ @Test public void testApplyPolicy() throws Exception { if (!isPoliciesSupported || controllablePolicyObject == null) { return; } String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); connection.applyPolicy(policy, controllablePolicyObject); List<CmisObject> policies = connection.getAppliedPolicies(controllablePolicyObject, true, null); assertTrue(policies.size() >= 1); Set<String> policiesId = new HashSet<String>(policies.size()); for (CmisObject o : policies) { policiesId.add(o.getObjectInfo().getId()); } assertTrue("Expected policy is not found. ", policiesId.contains(policy)); } /** * 2.2.9.1 applyPolicy. * <p> * {@link ConstraintException} must be thrown if the specified object's * object type definition's attribute for controllablePolicy is * <code>false</code>. * </p> * * @throws Exception */ @Test public void testApplyPolicy_ConstraintException() throws Exception { if (!isPoliciesSupported || notControllablePolicyObject == null) { return; } String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); try { connection.applyPolicy(policy, notControllablePolicyObject); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.9.2 removePolicy. * <p> * {@link ConstraintException} must be thrown if the specified object's * object type definition's attribute for controllablePolicy is * <code>false</code>. * </p> * * @throws Exception */ @Test public void testRemovePolicy_ConstraintException() throws Exception { if (!isPoliciesSupported || notControllablePolicyObject == null) { return; } try { // Do not send any policies to be removed. // ConstraintException must be thrown without checking any policies // since object is not controllable by policy. connection.removePolicy(null, notControllablePolicyObject); fail("ConstraintException must be thrown. "); } catch (ConstraintException e) { } } /** * 2.2.9.2 removePolicy. * * @throws Exception */ @Test public void testRemovePolicy_Simple() throws Exception { if (!isPoliciesSupported || controllablePolicyObject == null) { //SKIP return; } String policy = createPolicy(policyType.isFileable() ? testRootFolderId : null, policyType.getId(), generateName(policyType, null), "policy1", null, null, null); connection.applyPolicy(policy, controllablePolicyObject); connection.removePolicy(policy, controllablePolicyObject); List<CmisObject> policies = connection.getAppliedPolicies(controllablePolicyObject, true, null); Set<String> policiesId = new HashSet<String>(policies.size()); for (CmisObject o : policies) { policiesId.add(o.getObjectInfo().getId()); } assertFalse("Policy " + policy + " must be removed. ", policiesId.contains(policy)); } }