Author: cziegeler Date: Sun Oct 16 10:18:44 2016 New Revision: 1765134 URL: http://svn.apache.org/viewvc?rev=1765134&view=rev Log: SLING-6070 : Reduce temporary storage required in JcrResourceListener, call reportChanges earlier
Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceChange.java sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceChange.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceChange.java?rev=1765134&r1=1765133&r2=1765134&view=diff ============================================================================== --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceChange.java (original) +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceChange.java Sun Oct 16 10:18:44 2016 @@ -20,76 +20,23 @@ package org.apache.sling.jcr.resource.in import org.apache.sling.api.resource.observation.ResourceChange; +/** + * Extension of {@code ResourceChange} to support user id (if available) + */ public class JcrResourceChange extends ResourceChange { private final String userId; - private JcrResourceChange(Builder builder) { - super(builder.changeType, builder.path, builder.isExternal); - this.userId = builder.userId; + public JcrResourceChange(final ResourceChange.ChangeType changeType, + final String path, + final boolean isExternal, + final String userId) { + super(changeType, path, isExternal); + this.userId = userId; } @Override public String getUserId() { return userId; } - - @Override - public String toString() { - StringBuilder b = new StringBuilder(); - b.append("ResourceChange[type=") - .append(this.getType()) - .append(", path=") - .append(this.getPath()) - .append("]"); - return b.toString(); - } - - public static class Builder { - - private String path; - - private ChangeType changeType; - - private boolean isExternal; - - private String userId; - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public ChangeType getChangeType() { - return changeType; - } - - public void setChangeType(ChangeType changeType) { - this.changeType = changeType; - } - - public boolean isExternal() { - return isExternal; - } - - public void setExternal(boolean isExternal) { - this.isExternal = isExternal; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public ResourceChange build() { - return new JcrResourceChange(this); - } - } - } \ No newline at end of file Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java?rev=1765134&r1=1765133&r2=1765134&view=diff ============================================================================== --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java (original) +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java Sun Oct 16 10:18:44 2016 @@ -32,7 +32,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -50,7 +49,6 @@ import org.apache.sling.api.resource.obs import org.apache.sling.api.resource.observation.ResourceChange.ChangeType; import org.apache.sling.api.resource.path.Path; import org.apache.sling.jcr.api.SlingRepository; -import org.apache.sling.jcr.resource.internal.JcrResourceChange.Builder; import org.apache.sling.jcr.resource.internal.helper.jcr.PathMapper; import org.apache.sling.spi.resource.provider.ObserverConfiguration; import org.apache.sling.spi.resource.provider.ProviderContext; @@ -134,9 +132,9 @@ public class JcrResourceListener impleme */ @Override public void onEvent(final EventIterator events) { - final Map<String, Builder> addedEvents = new HashMap<String, Builder>(); - final Map<String, Builder> changedEvents = new HashMap<String, Builder>(); - final Map<String, Builder> removedEvents = new HashMap<String, Builder>(); + final Map<String, ResourceChange> addedEvents = new HashMap<String, ResourceChange>(); + final Map<String, ResourceChange> changedEvents = new HashMap<String, ResourceChange>(); + final Map<String, ResourceChange> removedEvents = new HashMap<String, ResourceChange>(); AtomicBoolean refreshedSession = new AtomicBoolean(false); while ( events.hasNext() ) { @@ -183,35 +181,26 @@ public class JcrResourceListener impleme } final List<ResourceChange> changes = new ArrayList<ResourceChange>(); - buildResourceChanges(changes, addedEvents); - buildResourceChanges(changes, removedEvents); - buildResourceChanges(changes, changedEvents); + changes.addAll(addedEvents.values()); + changes.addAll(removedEvents.values()); + changes.addAll(changedEvents.values()); ctx.getObservationReporter().reportChanges(changes, false); } - private void buildResourceChanges(List<ResourceChange> result, Map<String, Builder> builders) { - for (Entry<String, Builder> e : builders.entrySet()) { - result.add(e.getValue().build()); - } - } - - private Builder createResourceChange(final Event event, + private ResourceChange createResourceChange(final Event event, final String path, final ChangeType changeType) { - Builder builder = new Builder(); - String pathWithPrefix = addMountPrefix(mountPrefix, path); - builder.setPath(pathMapper.mapJCRPathToResourcePath(pathWithPrefix)); - builder.setChangeType(changeType); - boolean isExternal = this.isExternal(event); - builder.setExternal(isExternal); + final String pathWithPrefix = addMountPrefix(mountPrefix, path); + final String fullPath = pathMapper.mapJCRPathToResourcePath(pathWithPrefix); + final boolean isExternal = this.isExternal(event); + final String userId; if (!isExternal) { - final String userID = event.getUserID(); - if (userID != null) { - builder.setUserId(userID); - } + userId = event.getUserID(); + } else { + userId = null; } - return builder; + return new JcrResourceChange(changeType, fullPath, isExternal, userId); } private boolean isExternal(final Event event) {