blob: f66a4c844cebf434009ed65e7d10a9ecaabcb548 [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.servlets.resolver.internal.helper;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.jackrabbit.JcrConstants;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.PersistenceException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.jcr.resource.JcrResourceConstants;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.apache.sling.testing.mock.sling.servlet.MockRequestPathInfo;
import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ScriptSelection2Test {
private static final String CONTENT_RESOURCE_PATH = "/content/test";
@Rule
public SlingContext context = new SlingContext();
@Test
public void testScriptEngineFactories1() throws PersistenceException {
/*
Assume the following scripting tree
/libs/test
test.jsp
sel.jsp
/apps/test
test.html
sel.html
/apps/test2
[sling:resourceSuperType='test']
test2.jsp
*/
context.create().resource("/libs/test/test.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/libs/test/sel.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test/test.html", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test/sel.html", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test2",
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
JcrResourceConstants.SLING_RESOURCE_SUPER_TYPE_PROPERTY, "test");
context.create().resource("/apps/test2/test2.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
Resource contentResource;
contentResource = context.create().resource(CONTENT_RESOURCE_PATH,
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
ResourceResolver.PROPERTY_RESOURCE_TYPE, "test");
// /content/test.html (sling:resourceType=test) --> /apps/test/test.html
assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
"/apps/test/test.html",
"/libs/test/test.jsp"
);
// /content/test.html (sling:resourceType=test) --> /apps/test/test.html
assertScript(contentResource, "GET", null, "html", Arrays.asList("jsp", "html"),
"/apps/test/test.html",
"/libs/test/test.jsp"
);
context.resourceResolver().delete(contentResource);
contentResource = context.create().resource(CONTENT_RESOURCE_PATH,
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
ResourceResolver.PROPERTY_RESOURCE_TYPE, "test2");
// /content/test.html (sling:resourceType=test2) --> /apps/test2/test2.jsp
assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
"/apps/test2/test2.jsp",
"/apps/test/test.html",
"/libs/test/test.jsp"
);
// /content/test.html (sling:resourceType=test2) --> /apps/test2/test2.jsp
assertScript(contentResource, "GET", null, "html", Arrays.asList("jsp", "html"),
"/apps/test2/test2.jsp",
"/apps/test/test.html",
"/libs/test/test.jsp"
);
}
@Test
public void testScriptEngineFactories2() {
/*
Assume the following scripting tree
/libs/test
test.jsp
sel.jsp
/apps/test
test.html
sel.html
/apps/test2
[sling:resourceSuperType='test']
test2.jsp
test2.html
*/
context.create().resource("/libs/test/test.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/libs/test/sel.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test/test.html", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test/sel.html", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
context.create().resource("/apps/test2",
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
JcrResourceConstants.SLING_RESOURCE_SUPER_TYPE_PROPERTY, "test");
context.create().resource("/apps/test2/test2.jsp", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
Resource contentResource = context.create().resource(CONTENT_RESOURCE_PATH,
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
ResourceResolver.PROPERTY_RESOURCE_TYPE, "test2");
context.create().resource("/apps/test2/test2.html", JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FILE);
// /content/test.html (sling:resourceType=test2) --> /apps/test2/test2.html
assertScript(contentResource, "GET", null, "html", Arrays.asList("jsp", "html"),
"/apps/test2/test2.html",
"/apps/test2/test2.jsp",
"/apps/test/test.html",
"/libs/test/test.jsp"
);
// /content/test.sel.html (sling:resourceType=test2) --> /apps/test/sel.html
assertScript(contentResource, "GET", "sel", "html", Collections.EMPTY_LIST,
"/apps/test/sel.html",
"/libs/test/sel.jsp",
"/apps/test2/test2.jsp",
"/apps/test2/test2.html",
"/apps/test/test.html",
"/libs/test/test.jsp"
);
// /content/test.sel.html (sling:resourceType=test2) --> /apps/test/sel.html
assertScript(contentResource, "GET", "sel", "html", Arrays.asList("jsp", "html"),
"/apps/test/sel.html",
"/libs/test/sel.jsp",
"/apps/test2/test2.html",
"/apps/test2/test2.jsp",
"/apps/test/test.html",
"/libs/test/test.jsp"
);
}
private void assertScript(Resource contentResource, String method, String selectors, String extension,
List<String> scriptEngineFactoriesExtensions, String... expectedScripts) {
SlingHttpServletRequest request = prepareRequest(method, contentResource, selectors, extension);
final ResourceCollector collector =
ResourceCollector.create(request, context.resourceResolver().getSearchPath(), new String[]{"html"});
final Collection<Resource> s = collector.getServlets(request.getResourceResolver(), scriptEngineFactoriesExtensions);
if (expectedScripts == null || expectedScripts.length == 0) {
assertFalse("No script must be found", s.iterator().hasNext());
} else {
assertEquals("The number of expected scripts is different than the number of collected scripts.", expectedScripts.length,
s.size());
// Verify that the expected script is the first in the list of candidates
Iterator<Resource> iterator = s.iterator();
assertTrue("A script must be found", iterator.hasNext());
final String scriptPath = iterator.next().getPath();
assertEquals("Expected a different main script.", expectedScripts[0], scriptPath);
int index = 1;
while (iterator.hasNext()) {
assertEquals("Unexpected script order.", expectedScripts[index++], iterator.next().getPath());
}
}
}
@NotNull
private SlingHttpServletRequest prepareRequest(@Nullable String method, @NotNull Resource resource, @Nullable String selectorString,
@NotNull String extension) {
MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.resourceResolver(), context.bundleContext());
if (StringUtils.isEmpty(method)) {
request.setMethod("GET");
} else {
request.setMethod(method);
}
request.setResource(resource);
MockRequestPathInfo requestPathInfo = (MockRequestPathInfo) request.getRequestPathInfo();
if (StringUtils.isNotEmpty(selectorString)) {
requestPathInfo.setSelectorString(selectorString);
}
requestPathInfo.setExtension(extension);
return request;
}
}