blob: 42360112f7934195615d1b589b15a8747239af63 [file] [log] [blame]
/*
* 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.caconfig.resource.impl.def;
import static org.apache.sling.caconfig.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_COLLECTION_INHERIT;
import static org.apache.sling.caconfig.resource.impl.def.ConfigurationResourceNameConstants.PROPERTY_CONFIG_REF;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.caconfig.management.impl.ContextPathStrategyMultiplexerImpl;
import org.apache.sling.caconfig.resource.spi.ConfigurationResourceResolvingStrategy;
import org.apache.sling.hamcrest.ResourceCollectionMatchers;
import org.apache.sling.hamcrest.ResourceIteratorMatchers;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
/**
* Tests with content and configurations that form a deeper nested hierarchy with run-mode aware *not* activated
*/
public class DefaultConfigurationResourceResolvingStrategyHierarchyTest {
private static final String BUCKET = "sling:test";
private static final Collection<String> BUCKETS = Collections.singleton(BUCKET);
private static final String PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM = "custom:configCollectionInherit";
@Rule
public SlingContext context = new SlingContext();
private ConfigurationResourceResolvingStrategy underTest;
private Resource site1Page1;
private Resource site2Page1;
@Before
public void setUp() {
context.registerInjectActivateService(new DefaultContextPathStrategy());
context.registerInjectActivateService(new ContextPathStrategyMultiplexerImpl());
underTest = context.registerInjectActivateService(new DefaultConfigurationResourceResolvingStrategy(),
"configCollectionInheritancePropertyNames", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM);
// content resources that form a deeper hierarchy
context.build()
.resource("/content/tenant1", PROPERTY_CONFIG_REF, "/conf/brand1/tenant1")
.resource("/content/tenant1/region1", PROPERTY_CONFIG_REF, "/conf/brand1/tenant1/region1")
.resource("/content/tenant1/region1/site1", PROPERTY_CONFIG_REF, "/conf/brand1/tenant1/region1/site1")
.resource("/content/tenant1/region1/site2", PROPERTY_CONFIG_REF, "/conf/brand1/tenant1/region1/site2");
site1Page1 = context.create().resource("/content/tenant1/region1/site1/page1");
site2Page1 = context.create().resource("/content/tenant1/region1/site2/page1");
}
@Test
public void testGetResource() {
context.build()
.resource("/conf/brand1/tenant1/region1/site1/sling:test/cfgSite1")
.resource("/conf/brand1/tenant1/region1/site1/sling:test.runmode1/cfgSite1")
.resource("/conf/brand1/tenant1/region1/site1/sling:test.runmode2/cfgSite1")
.resource("/conf/brand1/tenant1/region1/sling:test/cfgRegion1")
.resource("/conf/brand1/tenant1/sling:test/cfgTenant1")
.resource("/conf/brand1/tenant1/sling:test.runmode1/cfgTenant1")
.resource("/conf/brand1/tenant1/sling:test/test")
.resource("/conf/brand1/sling:test/cfgBrand1")
.resource("/conf/global/sling:test/cfgGlobal")
.resource("/conf/global/sling:test/test")
.resource("/apps/conf/sling:test/cfgAppsGlobal")
.resource("/apps/conf/sling:test.runmode2/cfgAppsGlobal")
.resource("/apps/conf/sling:test/test")
.resource("/libs/conf/sling:test/cfgLibsGlobal")
.resource("/libs/conf/sling:test.runmode1/cfgLibsGlobal")
.resource("/libs/conf/sling:test/test");
assertEquals("/conf/brand1/tenant1/region1/site1/sling:test/cfgSite1", underTest.getResource(site1Page1, BUCKETS, "cfgSite1").getPath());
assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site1Page1, BUCKETS, "cfgRegion1").getPath());
assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site1Page1, BUCKETS, "cfgTenant1").getPath());
assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site1Page1, BUCKETS, "cfgBrand1").getPath());
assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgGlobal").getPath());
assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgAppsGlobal").getPath());
assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site1Page1, BUCKETS, "cfgLibsGlobal").getPath());
assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site1Page1, BUCKETS, "test").getPath());
assertNull(underTest.getResource(site2Page1, BUCKETS, "cfgSite1"));
assertEquals("/conf/brand1/tenant1/region1/sling:test/cfgRegion1", underTest.getResource(site2Page1, BUCKETS, "cfgRegion1").getPath());
assertEquals("/conf/brand1/tenant1/sling:test/cfgTenant1", underTest.getResource(site2Page1, BUCKETS, "cfgTenant1").getPath());
assertEquals("/conf/brand1/sling:test/cfgBrand1", underTest.getResource(site2Page1, BUCKETS, "cfgBrand1").getPath());
assertEquals("/conf/global/sling:test/cfgGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgGlobal").getPath());
assertEquals("/apps/conf/sling:test/cfgAppsGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgAppsGlobal").getPath());
assertEquals("/libs/conf/sling:test/cfgLibsGlobal", underTest.getResource(site2Page1, BUCKETS, "cfgLibsGlobal").getPath());
assertEquals("/conf/brand1/tenant1/sling:test/test", underTest.getResource(site2Page1, BUCKETS, "test").getPath());
}
@Test
public void testGetResourceInheritanceChain() {
context.build()
.resource("/conf/brand1/tenant1/region1/site1/sling:test/test")
.resource("/conf/brand1/tenant1/sling:test/test")
.resource("/conf/brand1/tenant1/sling:test.runmode1/test")
.resource("/conf/brand1/tenant1/sling:test.runmode2/test")
.resource("/conf/global/sling:test/test")
.resource("/apps/conf/sling:test/test")
.resource("/libs/conf/sling:test/test");
assertThat(underTest.getResourceInheritanceChain(site1Page1, BUCKETS, "test"), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/region1/site1/sling:test/test",
"/conf/brand1/tenant1/sling:test/test",
"/conf/global/sling:test/test",
"/apps/conf/sling:test/test",
"/libs/conf/sling:test/test"));
assertThat(underTest.getResourceInheritanceChain(site2Page1, BUCKETS, "test"), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/sling:test/test",
"/conf/global/sling:test/test",
"/apps/conf/sling:test/test",
"/libs/conf/sling:test/test"));
}
@Test
public void testGetResourceCollectionWithInheritance() {
context.build()
.resource("/conf/brand1/tenant1/region1/site1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("site1")
.resource("/conf/brand1/tenant1/region1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("region1")
.resource("/conf/brand1/tenant1/region1/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("region1")
.resource("/conf/brand1/tenant1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("tenant1")
.resource("/conf/brand1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM, true).resource("brand1")
.resource("/conf/global/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM, true).resource("confGlobal")
.resource("/apps/conf/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("appsGlobal")
.resource("/libs/conf/sling:test/cfgCol/libsGlobal1")
.resource("/libs/conf/sling:test/cfgCol/libsGlobal2")
.resource("/libs/conf/sling:test.runmode1/cfgCol/libsGlobal1")
.resource("/libs/conf/sling:test.runmode1/cfgCol/libsGlobal3")
.resource("/libs/conf/sling:test.runmode2/cfgCol/libsGlobal1")
.resource("/libs/conf/sling:test.runmode2/cfgCol/libsGlobal4");
assertThat(underTest.getResourceCollection(site1Page1, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths(
"/conf/brand1/tenant1/region1/site1/sling:test/cfgCol/site1",
"/conf/brand1/tenant1/region1/sling:test/cfgCol/region1",
"/conf/brand1/tenant1/sling:test/cfgCol/tenant1",
"/conf/brand1/sling:test/cfgCol/brand1",
"/conf/global/sling:test/cfgCol/confGlobal",
"/apps/conf/sling:test/cfgCol/appsGlobal",
"/libs/conf/sling:test/cfgCol/libsGlobal1",
"/libs/conf/sling:test/cfgCol/libsGlobal2"));
assertThat(underTest.getResourceCollection(site2Page1, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths(
"/conf/brand1/tenant1/region1/sling:test/cfgCol/region1",
"/conf/brand1/tenant1/sling:test/cfgCol/tenant1",
"/conf/brand1/sling:test/cfgCol/brand1",
"/conf/global/sling:test/cfgCol/confGlobal",
"/apps/conf/sling:test/cfgCol/appsGlobal",
"/libs/conf/sling:test/cfgCol/libsGlobal1",
"/libs/conf/sling:test/cfgCol/libsGlobal2"));
}
@Test
public void testGetResourceCollectionInheritanceChain() {
context.build()
.resource("/conf/brand1/tenant1/region1/site1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item1")
.resource("item2")
.resource("/conf/brand1/tenant1/region1/site1/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item2")
.resource("/conf/brand1/tenant1/region1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM, true)
.siblingsMode()
.resource("item1")
.resource("item3")
.resource("/conf/brand1/tenant1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item4")
.resource("/conf/global/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item1")
.resource("/conf/global/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item1")
.resource("/conf/global/sling:test.runmode2/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true)
.siblingsMode()
.resource("item1")
.resource("/libs/conf/sling:test/cfgCol")
.siblingsMode()
.resource("item2")
.resource("item3")
.resource("/libs/conf/sling:test.runmode1/cfgCol")
.siblingsMode()
.resource("item3");
List<Iterator<Resource>> resources = ImmutableList.copyOf(underTest.getResourceCollectionInheritanceChain(site1Page1, BUCKETS, "cfgCol"));
assertEquals(4, resources.size());
assertThat(resources.get(0), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/region1/site1/sling:test/cfgCol/item1",
"/conf/brand1/tenant1/region1/sling:test/cfgCol/item1",
"/conf/global/sling:test/cfgCol/item1"));
assertThat(resources.get(1), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/region1/site1/sling:test/cfgCol/item2",
"/libs/conf/sling:test/cfgCol/item2"));
assertThat(resources.get(2), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/region1/sling:test/cfgCol/item3",
"/libs/conf/sling:test/cfgCol/item3"));
assertThat(resources.get(3), ResourceIteratorMatchers.paths(
"/conf/brand1/tenant1/sling:test/cfgCol/item4"));
}
@Test
public void testGetResourceCollectionContentConfigRefInheritanceAndConfigResourceInheritance() {
context.build()
.resource("/content/level1", PROPERTY_CONFIG_REF, "/conf/a1/a2")
.resource("/content/level1/level2", PROPERTY_CONFIG_REF, "/conf/b1/b2")
.resource("/conf/a1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("a1")
.resource("/conf/a1/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("a1")
.resource("/conf/a1/sling:test.runmode2/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("a2")
.resource("/conf/a1/a2/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM, true).resource("a1_a2")
.resource("/conf/b1/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("b1")
.resource("/conf/b1/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("b1")
.resource("/conf/b1/b2/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT_CUSTOM, true).resource("b1_b2")
.resource("/conf/global/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("confGlobal")
.resource("/conf/global/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("confGlobal")
.resource("/conf/global/sling:test.runmode1/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("confGlobal2")
.resource("/apps/conf/sling:test/cfgCol", PROPERTY_CONFIG_COLLECTION_INHERIT, true).resource("appsGlobal")
.resource("/libs/conf/sling:test/cfgCol/libsGlobal");
Resource level1_2 = context.resourceResolver().getResource("/content/level1/level2");
assertThat(underTest.getResourceCollection(level1_2, BUCKETS, "cfgCol"), ResourceCollectionMatchers.paths(
"/conf/b1/b2/sling:test/cfgCol/b1_b2",
"/conf/b1/sling:test/cfgCol/b1",
"/conf/a1/a2/sling:test/cfgCol/a1_a2",
"/conf/a1/sling:test/cfgCol/a1",
"/conf/global/sling:test/cfgCol/confGlobal",
"/apps/conf/sling:test/cfgCol/appsGlobal",
"/libs/conf/sling:test/cfgCol/libsGlobal"));
}
}