Author: cziegeler
Date: Fri Oct 14 15:30:28 2016
New Revision: 1764933
URL: http://svn.apache.org/viewvc?rev=1764933&view=rev
Log:
SLING-6153 : Improve MapEntries implementation
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java?rev=1764933&r1=1764932&r2=1764933&view=diff
==============================================================================
---
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
(original)
+++
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
Fri Oct 14 15:30:28 2016
@@ -77,11 +77,11 @@ public class MapEntries implements
ResourceChangeListener,
ExternalResourceChangeListener {
- public static final String JCR_CONTENT = "jcr:content";
+ private static final String JCR_CONTENT = "jcr:content";
- public static final String JCR_CONTENT_PREFIX = "jcr:content/";
+ private static final String JCR_CONTENT_PREFIX = "jcr:content/";
- public static final String JCR_CONTENT_SUFFIX = "/jcr:content";
+ private static final String JCR_CONTENT_SUFFIX = "/jcr:content";
private static final String PROP_REG_EXP = "sling:match";
@@ -300,21 +300,7 @@ public class MapEntries implements
}
if (this.factory.isOptimizeAliasResolutionEnabled()) {
- changed |= doRemoveAlias(path, resource);
- if (props.containsKey(ResourceResolverImpl.PROP_ALIAS)) {
- changed |= doAddAlias(resource);
- }
- if ( JCR_CONTENT.equals(resource.getName()) ) {
- final Resource parent = resource.getParent();
- if (
parent.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS) ) {
- changed |= doAddAlias(parent);
- }
- } else {
- final Resource child = resource.getChild(JCR_CONTENT);
- if ( child != null &&
child.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS) ) {
- changed |= doAddAlias(child);
- }
- }
+ changed |= doUpdateAlias(resource);
}
return changed;
@@ -326,6 +312,28 @@ public class MapEntries implements
}
}
+ private boolean removeResource(final String path, final AtomicBoolean
resolverRefreshed) {
+ boolean changed = false;
+ final String actualContentPath = getActualContentPath(path);
+ final String actualContentPathPrefix = actualContentPath + "/";
+
+ for (final String target : this.vanityTargets.keySet()) {
+ if (target.startsWith(actualContentPathPrefix) ||
target.equals(actualContentPath)) {
+ changed |= removeVanityPath(target);
+ }
+ }
+ if (this.factory.isOptimizeAliasResolutionEnabled()) {
+ for (final String contentPath : this.aliasMap.keySet()) {
+ if (path.startsWith(contentPath + "/") ||
path.equals(contentPath)) {
+ changed |= removeAlias(contentPath, null,
resolverRefreshed);
+ } else if ( contentPath.startsWith(actualContentPathPrefix) ) {
+ changed |= removeAlias(contentPath, path,
resolverRefreshed);
+ }
+ }
+ }
+ return changed;
+ }
+
/**
* Remove all aliases for the content path
* @param contentPath The content path
@@ -454,46 +462,48 @@ public class MapEntries implements
return loadAlias(resource, this.aliasMap);
}
-
- private boolean doRemoveAlias(String path, final Resource resource) {
- String resourceName = null;
- if (resource.getName().equals(JCR_CONTENT)) {
- final Resource containingResource = resource.getParent();
- if ( containingResource != null ) {
- final Resource parent = containingResource.getParent();
- if ( parent != null ) {
- path = parent.getPath();
- resourceName = containingResource.getName();
- } else {
- path = null;
- }
- } else {
- path = null;
- }
+ /**
+ * Update alias from a resource
+ * @param resource The resource
+ * @return {@code true} if any change
+ */
+ private boolean doUpdateAlias(final Resource resource) {
+ final Resource containingResource;
+ if (JCR_CONTENT.equals(resource.getName())) {
+ containingResource = resource.getParent();
} else {
- final Resource parent = resource.getParent();
- if ( parent != null ) {
- path = parent.getPath();
- resourceName = resource.getName();
- } else {
- path = null;
- }
+ containingResource = resource;
}
- if ( path != null ) {
- final Map<String, String> aliasMapEntry = aliasMap.get(path);
+ if ( containingResource != null ) {
+ final String containingResourceName = containingResource.getName();
+ final String parentPath =
ResourceUtil.getParent(containingResource.getPath());
+
+ final Map<String, String> aliasMapEntry = aliasMap.get(parentPath);
if (aliasMapEntry != null) {
- for (Iterator<String> iterator
=aliasMapEntry.keySet().iterator(); iterator.hasNext(); ) {
- String key = iterator.next();
- if (resourceName.equals(aliasMapEntry.get(key))){
+ for (Iterator<Map.Entry<String, String>> iterator =
aliasMapEntry.entrySet().iterator(); iterator.hasNext(); ) {
+ final Map.Entry<String, String> entry = iterator.next();
+ if (containingResourceName.equals(entry.getValue())){
iterator.remove();
}
}
}
+
if (aliasMapEntry != null && aliasMapEntry.isEmpty()) {
- this.aliasMap.remove(path);
+ this.aliasMap.remove(parentPath);
}
- return aliasMapEntry != null;
+
+ boolean changed = aliasMapEntry != null;
+
+ if (
containingResource.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS) )
{
+ changed |= doAddAlias(containingResource);
+ }
+ final Resource child = containingResource.getChild(JCR_CONTENT);
+ if ( child != null &&
child.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS) ) {
+ changed |= doAddAlias(child);
+ }
+
+ return changed;
}
return false;
}
@@ -672,29 +682,12 @@ public class MapEntries implements
boolean changed = false;
// removal of a resource is handled differently
- if (rc.getType() == ResourceChange.ChangeType.REMOVED) {
+ if (rc.getType() == ResourceChange.ChangeType.REMOVED ) {
if ( handleConfigurationUpdate(path, resolverRefreshed) ) {
changed = true;
} else {
-
- final String actualContentPath =
getActualContentPath(path);
- final String actualContentPathPrefix = actualContentPath +
"/";
-
- for (final String target : this.vanityTargets.keySet()) {
- if (target.startsWith(actualContentPathPrefix) ||
target.equals(actualContentPath)) {
- changed |= removeVanityPath(target);
- }
- }
- if (this.factory.isOptimizeAliasResolutionEnabled()) {
- for (final String contentPath :
this.aliasMap.keySet()) {
- if (path.startsWith(contentPath + "/") ||
path.equals(contentPath)) {
- changed |= removeAlias(contentPath, null,
resolverRefreshed);
- } else if (
contentPath.startsWith(actualContentPathPrefix) ) {
- changed |= removeAlias(contentPath, path,
resolverRefreshed);
- }
- }
- }
+ changed |= removeResource(path, resolverRefreshed);
}
//session.move() is handled differently see also SLING-3713 and
@@ -706,7 +699,7 @@ public class MapEntries implements
changed |= addResource(path, resolverRefreshed);
}
- } else {
+ } else if (rc.getType() == ResourceChange.ChangeType.CHANGED ) {
if (handleConfigurationUpdate(path, resolverRefreshed)) {
changed = true;
} else {
@@ -845,8 +838,8 @@ public class MapEntries implements
private String getActualContentPath(final String path){
final String checkPath;
- if ( path.endsWith("/jcr:content") ) {
- checkPath = path.substring(0, path.length() -
"/jcr:content".length());
+ if ( path.endsWith(JCR_CONTENT_SUFFIX) ) {
+ checkPath = ResourceUtil.getParent(path);
} else {
checkPath = path;
}
@@ -996,7 +989,7 @@ public class MapEntries implements
final String resourceName;
final String parentPath;
- if (resource.getName().equals("jcr:content")) {
+ if (JCR_CONTENT.equals(resource.getName())) {
final Resource containingResource = resource.getParent();
if ( containingResource != null ) {
final Resource parent = containingResource.getParent();
@@ -1125,7 +1118,7 @@ public class MapEntries implements
// property (or its parent if the node is called
// jcr:content)
final Resource redirectTarget;
- if (resource.getName().equals("jcr:content")) {
+ if (JCR_CONTENT.equals(resource.getName())) {
redirectTarget = resource.getParent();
} else {
redirectTarget = resource;