/* * 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.sling.resource.collection.impl; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import junit.framework.Assert; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.jcr.resource.JcrResourceConstants; import org.apache.sling.resource.collection.ResourceCollection; import org.apache.sling.resource.collection.ResourceCollectionManager; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory; import org.junit.Before; import org.junit.Test; public class ResourceCollectionImplTest { private ResourceResolver resResolver; private ResourceCollectionManager rcm; @Before public void setUp() throws Exception { resResolver = new MockResourceResolverFactory().getAdministrativeResourceResolver(null); rcm = new ResourceCollectionManagerImpl(); } @Test public void testAddResource() throws Exception { final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "test1"); final Resource res1 = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(res1); final Resource resource = resResolver.create(resResolver.getResource("/"), "res2", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource); Assert.assertEquals(true, collection.contains(resource)); Assert.assertEquals(true, collection.contains(resource)); Assert.assertNotNull(resResolver.getResource("/test1")); Assert.assertEquals(ResourceCollection.RESOURCE_TYPE, resResolver.getResource("/test1").getResourceType()); } @Test public void testCreateCollection() throws Exception { final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "test1"); final Resource res1 = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(res1, null); final Resource resource = resResolver.create(resResolver.getResource("/"), "res2", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, null); Assert.assertEquals(true, collection.contains(resource)); Assert.assertNotNull(resResolver.getResource("/test1")); Assert.assertEquals(ResourceCollection.RESOURCE_TYPE, resResolver.getResource("/test1").getResourceType()); } @Test public void testCheckPath() throws Exception { final Resource rootResource = resResolver.create(resResolver.getResource("/"), "root", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); final ResourceCollection collection = rcm.createCollection(rootResource, "test1"); Assert.assertEquals(rootResource.getPath() + "/" + "test1", collection.getPath()); } @Test public void testGetCollection() throws Exception { ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "test1"); final Resource res1 = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(res1, null); final Resource resource = resResolver.create(resResolver.getResource("/"), "res2", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, null); collection = rcm.getCollection(resResolver.getResource(collection.getPath())); Assert.assertEquals(true, collection.contains(resource)); Assert.assertNotNull(resResolver.getResource("/test1")); Assert.assertEquals(ResourceCollection.RESOURCE_TYPE, resResolver.getResource("/test1").getResourceType()); } @Test public void testListCollection() throws Exception { final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "collection1"); final Resource res1 = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(res1, null); final Resource resource = resResolver.create(resResolver.getResource("/"), "res2", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, null); Assert.assertEquals(true, collection.contains(resource)); final Iterator<Resource> resources = collection.getResources(); int numOfRes = 0; while (resources.hasNext()) { resources.next(); numOfRes ++; } Assert.assertEquals(2, numOfRes); } @Test public void testCreateCollectionWithProperties() throws Exception { final Map<String, Object> props = new HashMap<String, Object>(); props.put(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY, "some/type"); props.put("creator", "slingdev"); final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "collection3", props); final Resource resource = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, null); final Resource collectionRes = resResolver.getResource("/collection3"); Assert.assertNotNull(collectionRes); Assert.assertEquals(true, collection.contains(resource)); Assert.assertEquals(ResourceCollection.RESOURCE_TYPE, collectionRes.getResourceSuperType()); ValueMap vm = collectionRes.adaptTo(ValueMap.class); Assert.assertEquals("slingdev", vm.get("creator", "")); } @Test public void testAddResourceWithProperties() throws Exception { final Map<String, Object> props = new HashMap<String, Object>(); props.put("creator", "slingdev"); final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "collection3"); final Resource resource = resResolver.create(resResolver.getResource("/"), "res1", Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, props); final Resource collectionRes = resResolver.getResource("/collection3"); Assert.assertNotNull(collectionRes); Assert.assertEquals(true, collection.contains(resource)); ValueMap vm = collection.getProperties(resource); if (vm != null) { Assert.assertEquals("slingdev", vm.get("creator", "")); } else { Assert.fail("no resource entry in collection"); } } @Test public void testOrdering() throws Exception { final ResourceCollection collection = rcm.createCollection(resResolver.getResource("/"), "test1"); String[] resPaths = {"/res1", "/res2"}; final Resource resource = resResolver.create(resResolver.getResource("/"), resPaths[0].substring(1), Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource, null); final Resource resource2 = resResolver.create(resResolver.getResource("/"), resPaths[1].substring(1), Collections.singletonMap(ResourceResolver.PROPERTY_RESOURCE_TYPE, (Object)"type")); collection.add(resource2, null); Assert.assertEquals(true, collection.contains(resource2)); Assert.assertNotNull(resResolver.getResource("/test1")); Assert.assertEquals(ResourceCollection.RESOURCE_TYPE, resResolver.getResource("/test1").getResourceType()); Iterator<Resource> resources = collection.getResources(); int numOfRes = 0; while (resources.hasNext()) { Resource entry = resources.next(); Assert.assertEquals(resPaths[numOfRes], entry.getPath()); numOfRes ++; } try { collection.orderBefore(resource, resource); Assert.fail("should have thrown IllegalArgument"); } catch (IllegalArgumentException e) { } //change the order collection.orderBefore(resource2, resource); resources = collection.getResources(); numOfRes = 2; while (resources.hasNext()) { numOfRes --; Resource entry = resources.next(); Assert.assertEquals(resPaths[numOfRes], entry.getPath()); } Assert.assertEquals(0, numOfRes); } }