You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2015/01/14 18:42:50 UTC
svn commit: r1651744 - in /sling/trunk/contrib/extensions/validation:
api/src/main/java/org/apache/sling/validation/api/
core/src/main/java/org/apache/sling/validation/impl/
core/src/test/java/org/apache/sling/validation/impl/
core/src/test/java/org/ap...
Author: kwin
Date: Wed Jan 14 17:42:50 2015
New Revision: 1651744
URL: http://svn.apache.org/r1651744
Log:
SLING-4262 always convert resource types to relative ones
fix bug in overlay handling when search paths where ending with a slash
Modified:
sling/trunk/contrib/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java
sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java
sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/setup/MockedResourceResolver.java
Modified: sling/trunk/contrib/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java?rev=1651744&r1=1651743&r2=1651744&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java (original)
+++ sling/trunk/contrib/extensions/validation/api/src/main/java/org/apache/sling/validation/api/ValidationService.java Wed Jan 14 17:42:50 2015
@@ -31,11 +31,12 @@ public interface ValidationService {
/**
* Tries to obtain a {@link ValidationModel} that is able to validate a {@code Resource} of type {@code validatedResourceType}.
*
- * @param validatedResourceType the type of {@code Resources} the model validates
+ * @param validatedResourceType the type of {@code Resources} the model validates, should be either relative
+ * (i.e. not start with a "/") or starting with one of the resource resolver's search paths
* @param applicablePath the model's applicable path (the path of the validated resource)
* @return a {@code ValidationModel} if one is found, {@code null} otherwise
* @throws IllegalStateException in case an invalid validation model was found
- * @throws IllegalArgumentException in case validatedResourceType was blank or {@code null}
+ * @throws IllegalArgumentException in case validatedResourceType was blank, {@code null} or absolute but outside of the search paths.
*/
ValidationModel getValidationModel(String validatedResourceType, String applicablePath) throws IllegalStateException, IllegalArgumentException;
Modified: sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java?rev=1651744&r1=1651743&r2=1651744&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java (original)
+++ sling/trunk/contrib/extensions/validation/core/src/main/java/org/apache/sling/validation/impl/ValidationServiceImpl.java Wed Jan 14 17:42:50 2015
@@ -68,7 +68,7 @@ public class ValidationServiceImpl imple
private static final Logger LOG = LoggerFactory.getLogger(ValidationServiceImpl.class);
- static final String MODEL_XPATH_QUERY = "/jcr:root%s//" + Constants.MODELS_HOME + "/*[@sling:resourceType=\"%s\" and @%s=\"%s\"]";
+ static final String MODEL_XPATH_QUERY = "/jcr:root%s/" + Constants.MODELS_HOME + "/*[@sling:resourceType=\"%s\" and @%s=\"%s\"]";
static final String[] TOPICS = {SlingConstants.TOPIC_RESOURCE_REMOVED, SlingConstants.TOPIC_RESOURCE_CHANGED,
SlingConstants.TOPIC_RESOURCE_ADDED};
@@ -93,6 +93,10 @@ public class ValidationServiceImpl imple
// ValidationService ###################################################################################################################
@Override
public ValidationModel getValidationModel(String validatedResourceType, String resourcePath) {
+ if (validatedResourceType == null || resourcePath == null) {
+ throw new IllegalArgumentException("ValidationService.getValidationModel - cannot accept null parameters");
+ }
+ validatedResourceType = getRelativeResourceType(validatedResourceType);
ValidationModel model = null;
Trie<JCRValidationModel> modelsForResourceType = validationModelsCache.get(validatedResourceType);
if (modelsForResourceType != null) {
@@ -115,7 +119,7 @@ public class ValidationServiceImpl imple
@Override
public ValidationResult validate(Resource resource, ValidationModel model) {
if (resource == null || model == null) {
- throw new IllegalArgumentException("ValidationResult.validate - cannot accept null parameters");
+ throw new IllegalArgumentException("ValidationService.validate - cannot accept null parameters");
}
ValidationResultImpl result = new ValidationResultImpl();
@@ -128,6 +132,39 @@ public class ValidationServiceImpl imple
}
/**
+ * If the given resourceType is starting with a "/", it will strip out the leading search path from the given resource type.
+ * Otherwise it will just return the given resource type (as this is already relative).
+ * @param resourceType
+ * @return a relative resource type (without the leading search path)
+ * @throws IllegalArgumentException in case the resource type is starting with a "/" but not with any of the search paths.
+ */
+ protected String getRelativeResourceType(String resourceType) throws IllegalArgumentException {
+ if (resourceType.startsWith("/")) {
+ LOG.debug("try to strip the search path from the resource type");
+ ResourceResolver rr = null;
+ try {
+ rr = rrf.getAdministrativeResourceResolver(null);
+ for (String searchPath : rr.getSearchPath()) {
+ if (resourceType.startsWith(searchPath)) {
+ resourceType = resourceType.substring(searchPath.length());
+ return resourceType;
+ }
+ }
+ throw new IllegalArgumentException("Can only deal with resource types inside the resource resolver's search path (" + StringUtils.join(rr.getSearchPath())
+ + ") but given resource type " + resourceType + " is outside!");
+ } catch (LoginException e) {
+ throw new IllegalStateException("Could not login as administrator to figure out search paths", e);
+ } finally {
+ if (rr != null) {
+ rr.close();
+ }
+ }
+ }
+ return resourceType;
+
+ }
+
+ /**
* Validates a child resource with the help of the given {@code ChildResource} entry from the validation model
* @param resource
* @param relativePath relativePath of the resource (must be empty or end with "/")
@@ -316,9 +353,6 @@ public class ValidationServiceImpl imple
rr = rrf.getAdministrativeResourceResolver(null);
String[] searchPaths = rr.getSearchPath();
for (String searchPath : searchPaths) {
- if (searchPath.endsWith("/")) {
- searchPath = searchPath.substring(0, searchPath.length() - 1);
- }
final String queryString = String.format(MODEL_XPATH_QUERY, searchPath, Constants.VALIDATION_MODEL_RESOURCE_TYPE,
Constants.VALIDATED_RESOURCE_TYPE, validatedResourceType);
Iterator<Resource> models = rr.findResources(queryString, Query.XPATH);
Modified: sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java?rev=1651744&r1=1651743&r2=1651744&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java (original)
+++ sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/ValidationServiceImplTest.java Wed Jan 14 17:42:50 2015
@@ -731,6 +731,20 @@ public class ValidationServiceImplTest {
}
}
}
+
+ @Test
+ public void testGetRelativeResourcePath() {
+ // return relative paths unmodified
+ Assert.assertThat(validationService.getRelativeResourceType("relative/path"), Matchers.equalTo("relative/path"));
+ Assert.assertThat(validationService.getRelativeResourceType("/apps/relative/path"), Matchers.equalTo("relative/path"));
+ Assert.assertThat(validationService.getRelativeResourceType("/libs/relative/path"), Matchers.equalTo("relative/path"));
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testGetRelativeResourcePathWithAbsolutePathOutsideOfTheSearchPaths() {
+ // return relative paths unmodified
+ validationService.getRelativeResourceType("/apps2/relative/path");
+ }
private Resource createValidationModelResource(ResourceResolver rr, String root, String name, String validatedResourceType,
String[] applicableResourcePaths, TestProperty... properties) throws Exception {
Modified: sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/setup/MockedResourceResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/setup/MockedResourceResolver.java?rev=1651744&r1=1651743&r2=1651744&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/setup/MockedResourceResolver.java (original)
+++ sling/trunk/contrib/extensions/validation/core/src/test/java/org/apache/sling/validation/impl/setup/MockedResourceResolver.java Wed Jan 14 17:42:50 2015
@@ -45,7 +45,8 @@ public class MockedResourceResolver impl
private static final Logger LOG = LoggerFactory.getLogger(MockedResourceResolver.class);
- private static final String[] SEARCH_PATHS = new String[] {"/apps", "/libs"};
+ // must end with a slash according to ResourceResolver.getSearchPaths()
+ private static final String[] SEARCH_PATHS = new String[] {"/apps/", "/libs/"};
public final RepositoryProvider repoProvider;
private List<MockedResource> resources = new LinkedList<MockedResource>();