Author: stefanegli
Date: Wed Apr 24 12:20:23 2013
New Revision: 1471381

URL: http://svn.apache.org/r1471381
Log:
SLING-2827 : reduce usage of javax.jcr as much as possible, eg using 
ModifiableValueMap instead

Modified:
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/View.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/ViewHelper.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/ResourceHelper.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/TopologyChangeHandler.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/Announcement.java
    
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/AnnouncementRegistryImpl.java
    
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
    
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResourceResolver.java

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java
 Wed Apr 24 12:20:23 2013
@@ -28,11 +28,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.PropertyIterator;
-import javax.jcr.RepositoryException;
+import java.util.Set;
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
@@ -40,6 +36,8 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ModifiableValueMap;
+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.api.resource.ResourceResolverFactory;
@@ -336,40 +334,41 @@ public class DiscoveryServiceImpl implem
                             resourceResolver,
                             config.getClusterInstancesPath()
                                     + "/" + slingId + "/properties");
-
-            Node node = myInstance.adaptTo(Node.class);
-
-            PropertyIterator pit = node.getProperties();
-            while (pit.hasNext()) {
-                Property p = pit.nextProperty();
-                if (newProps.containsKey(p.getName())) {
+            
+            final ModifiableValueMap myInstanceMap = 
myInstance.adaptTo(ModifiableValueMap.class);
+            final Set<String> keys = myInstanceMap.keySet();
+            final Iterator<String> it1 = keys.iterator();
+            while(it1.hasNext()) {
+                final String key = it1.next();
+                if (newProps.containsKey(key)) {
                     // perfect
                     continue;
-                } else if (p.getName().equals("jcr:primaryType")) {
+                } else if (key.equals("jcr:primaryType")) {
                     // ignore
                     continue;
                 } else {
                     // remove
-                    p.remove();
+                    it1.remove();
                 }
             }
 
-            for (Iterator<Entry<String, String>> it = newProps.entrySet()
-                    .iterator(); it.hasNext();) {
-                Entry<String, String> entry = it.next();
+            for (Iterator<Entry<String, String>> it2 = newProps.entrySet()
+                    .iterator(); it2.hasNext();) {
+                Entry<String, String> entry = it2.next();
                 logger.debug("doUpdateProperties: " + entry.getKey() + "="
                         + entry.getValue());
-                node.setProperty(entry.getKey(), entry.getValue());
+                myInstanceMap.put(entry.getKey(), entry.getValue());
             }
 
-            node.getSession().save();
+            resourceResolver.commit();
+            resourceResolver = null;
         } catch (LoginException e) {
             logger.error(
                     "handleEvent: could not log in administratively: " + e, e);
             throw new RuntimeException("Could not log in to repository (" + e
                     + ")", e);
-        } catch (RepositoryException e) {
-            logger.error("handleEvent: got a RepositoryException: " + e, e);
+        } catch (PersistenceException e) {
+            logger.error("handleEvent: got a PersistenceException: " + e, e);
             throw new RuntimeException(
                     "Exception while talking to repository (" + e + ")", e);
         } finally {

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java
 Wed Apr 24 12:20:23 2013
@@ -24,10 +24,6 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
@@ -35,6 +31,8 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ModifiableValueMap;
+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.api.resource.ResourceResolverFactory;
@@ -81,8 +79,7 @@ public class VotingHandler implements Ev
     /** the sling id of the local instance **/
     private String slingId;
 
-    protected void activate(final ComponentContext context)
-            throws RepositoryException {
+    protected void activate(final ComponentContext context) {
         slingId = slingSettingsService.getSlingId();
         logger = LoggerFactory.getLogger(this.getClass().getCanonicalName()
                 + "." + slingId);
@@ -115,9 +112,9 @@ public class VotingHandler implements Ev
         }
         try {
             analyzeVotings(resourceResolver);
-        } catch (RepositoryException e) {
+        } catch (PersistenceException e) {
             logger.error(
-                    "handleEvent: got a RepositoryException during votings 
analysis: "
+                    "handleEvent: got a PersistenceException during votings 
analysis: "
                             + e, e);
         } finally {
             if (resourceResolver != null) {
@@ -129,8 +126,7 @@ public class VotingHandler implements Ev
     /**
      * Analyze any ongoing voting in the repository
      */
-    public void analyzeVotings(final ResourceResolver resourceResolver)
-            throws RepositoryException {
+    public void analyzeVotings(final ResourceResolver resourceResolver) throws 
PersistenceException {
         VotingView winningVote = VotingHelper.getWinningVoting(
                 resourceResolver, config);
         if (winningVote != null) {
@@ -251,7 +247,7 @@ public class VotingHandler implements Ev
      * Promote a particular voting to be the new established view
      */
     private void promote(final ResourceResolver resourceResolver,
-            final Resource winningVoteResource) throws RepositoryException {
+            final Resource winningVoteResource) throws PersistenceException {
         final Resource previousViewsResource = ResourceHelper
                 .getOrCreateResource(
                         resourceResolver,
@@ -274,14 +270,11 @@ public class VotingHandler implements Ev
         logger.debug("promote: winningVoteResource="
                 + winningVoteResource.getPath());
 
-        final Session session = establishedViewsResource.adaptTo(Node.class)
-                .getSession();
-
         // step 1: remove any nodes under previousViews
         final Iterator<Resource> it1 = 
previousViewsResource.getChildren().iterator();
         while (it1.hasNext()) {
             Resource previousView = it1.next();
-            previousView.adaptTo(Node.class).remove();
+            resourceResolver.delete(previousView);
         }
 
         // step 2: retire the existing established view.
@@ -296,14 +289,13 @@ public class VotingHandler implements Ev
                 first = !first;
                 logger.debug("promote: moving the old established view to 
previous views: "
                         + retiredView.getPath());
-                session.move(
-                        retiredView.getPath(),
+                ResourceHelper.moveResource(retiredView, 
                         previousViewsResource.getPath()
                                 + "/" + retiredView.getName());
             } else {
                 logger.debug("promote: retiring an erroneously additionally 
established node "
                         + retiredView.getPath());
-                retiredView.adaptTo(Node.class).remove();
+                resourceResolver.delete(retiredView);
             }
         }
 
@@ -327,19 +319,17 @@ public class VotingHandler implements Ev
         }
         logger.debug("promote: leader is " + leaderid
                 + " - with leaderElectionId=" + leaderElectionId);
-        winningVoteResource.adaptTo(Node.class).setProperty("leaderId",
-                leaderid);
-        winningVoteResource.adaptTo(Node.class).setProperty("leaderElectionId",
-                leaderElectionId);
-        winningVoteResource.adaptTo(Node.class).setProperty("promotedAt",
-                Calendar.getInstance());
+        ModifiableValueMap winningVoteMap = 
winningVoteResource.adaptTo(ModifiableValueMap.class);
+        winningVoteMap.put("leaderId", leaderid);
+        winningVoteMap.put("leaderElectionId", leaderElectionId);
+        winningVoteMap.put("promotedAt", Calendar.getInstance());
 
         // 3b: move the result under /established
         final String newEstablishedViewPath = 
establishedViewsResource.getPath()
                 + "/" + winningVoteResource.getName();
         logger.debug("promote: promote to new established node "
                 + newEstablishedViewPath);
-        session.move(winningVoteResource.getPath(), newEstablishedViewPath);
+        ResourceHelper.moveResource(winningVoteResource, 
newEstablishedViewPath);
 
         // step 4: delete all ongoing votings...
         final Iterable<Resource> ongoingVotingsChildren = 
ongoingVotingsResource
@@ -348,7 +338,7 @@ public class VotingHandler implements Ev
             Iterator<Resource> it4 = ongoingVotingsChildren.iterator();
             while (it4.hasNext()) {
                 Resource anOngoingVoting = it4.next();
-                anOngoingVoting.adaptTo(Node.class).remove();
+                resourceResolver.delete(anOngoingVoting);
             }
         }
 
@@ -372,10 +362,10 @@ public class VotingHandler implements Ev
             }
             logger.warn("promote: cleaning up a duplicate ongoingVotingPath: "
                     + resource.getPath());
-            resource.adaptTo(Node.class).remove();
+            resourceResolver.delete(resource);
         }
 
         logger.debug("promote: done with promotiong. saving.");
-        session.save();
+        resourceResolver.commit();
     }
 }
\ No newline at end of file

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java
 Wed Apr 24 12:20:23 2013
@@ -20,14 +20,13 @@ package org.apache.sling.discovery.impl.
 
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.Value;
-
+import org.apache.sling.api.resource.ModifiableValueMap;
+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.api.resource.ValueMap;
@@ -59,29 +58,30 @@ public class VotingView extends View {
      */
     public static VotingView newVoting(final ResourceResolver resourceResolver,
             final Config config,
-            final String newViewId, String initiatorId, final Set<String> 
liveInstances)
-            throws RepositoryException {
+            final String newViewId, String initiatorId, final Set<String> 
liveInstances) throws PersistenceException {
         final Resource votingResource = ResourceHelper.createResource(
                 resourceResolver, config.getOngoingVotingsPath() + "/"
                         + newViewId);
-        final Node node = votingResource.adaptTo(Node.class);
-        node.setProperty("votingStart", Calendar.getInstance());
-        final Node membersNode = node.addNode("members");
+        final ModifiableValueMap votingMap = 
votingResource.adaptTo(ModifiableValueMap.class);
+        votingMap.put("votingStart", Calendar.getInstance());
+        final Resource membersResource = 
resourceResolver.create(votingResource, "members", null);
         final Iterator<String> it = liveInstances.iterator();
         while (it.hasNext()) {
             String memberId = it.next();
-            Node newMember = membersNode.addNode(memberId);
+            Map<String, Object> properties = new HashMap<String, Object>();
             if (memberId.equals(initiatorId)) {
-                newMember.setProperty("initiator", true);
+                properties.put("initiator", true);
             }
             Resource instanceResource = ResourceHelper.getOrCreateResource(
                     resourceResolver, config.getClusterInstancesPath() + "/"
                             + memberId);
             String leaderElectionId = instanceResource.adaptTo(ValueMap.class)
                     .get("leaderElectionId", String.class);
-            newMember.setProperty("leaderElectionId", leaderElectionId);
+            properties.put("leaderElectionId", leaderElectionId);
+            
+            resourceResolver.create(membersResource, memberId, properties);
         }
-        node.getSession().save();
+        resourceResolver.commit();
         return new VotingView(votingResource);
     }
 
@@ -228,27 +228,17 @@ public class VotingView extends View {
                     + ", resource=" + getResource());
             return;
         }
-        final Node memberNode = memberResource.adaptTo(Node.class);
-        Session session = null;
+        final ModifiableValueMap memberMap = 
memberResource.adaptTo(ModifiableValueMap.class);
+        
+        if (vote == null) {
+            memberMap.remove("vote");
+        } else {
+            memberMap.put("vote", vote);
+        }
         try {
-            session = memberNode.getSession();
-            if (vote == null) {
-                memberNode.setProperty("vote", (Value) null);
-            } else {
-                memberNode.setProperty("vote", vote);
-            }
-            session.save();
-        } catch (RepositoryException re) {
-            logger.error("RepositoryException while voting: " + re, re);
-            if (session != null) {
-                try {
-                    session.refresh(false);
-                } catch (RepositoryException e) {
-                    logger.error(
-                            "RepositoryException after trying to refresh 
session after another RepositoryException. "
-                                    + re, re);
-                }
-            }
+            getResource().getResourceResolver().commit();
+        } catch (PersistenceException e) {
+            logger.error("vote: PersistenceException while voting: "+e, e);
         }
     }
 

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/View.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/View.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/View.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/View.java
 Wed Apr 24 12:20:23 2013
@@ -22,11 +22,9 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
+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.discovery.impl.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -118,23 +116,13 @@ public class View {
      * Delete this view from the repository
      */
     public void remove() {
-        final Node myNode = getResource().adaptTo(Node.class);
-        Session session = null;
-        try {
-            session = myNode.getSession();
-            myNode.remove();
-            session.save();
-            session = null;
-        } catch (RepositoryException e) {
-            logger.error("remove: Could not remove node: " + e, e);
-        } finally {
-            if (session != null) {
-                try {
-                    session.refresh(false);
-                } catch (RepositoryException e1) {
-                    logger.error("remove: Could not refresh session: " + e1, 
e1);
-                }
-            }
+        final ResourceResolver resourceResolver = 
getResource().getResourceResolver();
+        try{
+            resourceResolver.delete(getResource());
+            resourceResolver.commit();
+        } catch(PersistenceException pe) {
+            logger.error("remove: Could not remove node: " + pe, pe);
+            resourceResolver.refresh();
         }
     }
 

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/ViewHelper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/ViewHelper.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/ViewHelper.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/ViewHelper.java
 Wed Apr 24 12:20:23 2013
@@ -23,8 +23,6 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
-import javax.jcr.RepositoryException;
-
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
@@ -120,8 +118,7 @@ public class ViewHelper {
      * Check if the established view matches the given set of slingIds
      */
     public static boolean establishedViewMatches(
-            final ResourceResolver resourceResolver, final Config config, 
final Set<String> view)
-            throws RepositoryException {
+            final ResourceResolver resourceResolver, final Config config, 
final Set<String> view) {
         final View establishedView = 
ViewHelper.getEstablishedView(resourceResolver, config);
         if (establishedView == null) {
             return false;

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
 Wed Apr 24 12:20:23 2013
@@ -23,8 +23,6 @@ import java.util.Iterator;
 import java.util.Set;
 import java.util.UUID;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.apache.felix.scr.annotations.Activate;
@@ -33,6 +31,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ModifiableValueMap;
 import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -102,8 +101,7 @@ public class HeartbeatHandler implements
     private boolean resetLeaderElectionId = false;
 
     @Activate
-    protected void activate(ComponentContext context)
-            throws RepositoryException {
+    protected void activate(ComponentContext context) {
         slingId = slingSettingsService.getSlingId();
         // on activate the resetLeaderElectionId is set to true to ensure that
         // the 'leaderElectionId' property is reset on next heartbeat issuance.
@@ -203,9 +201,9 @@ public class HeartbeatHandler implements
 
             final Resource resource = ResourceHelper.getOrCreateResource(
                     resourceResolver, myClusterNodePath);
-            final Node node = resource.adaptTo(Node.class);
-            node.setProperty("lastHeartbeat", Calendar.getInstance());
-            if (resetLeaderElectionId || 
!node.hasProperty("leaderElectionId")) {
+            final ModifiableValueMap resourceMap = 
resource.adaptTo(ModifiableValueMap.class);
+            resourceMap.put("lastHeartbeat", Calendar.getInstance());
+            if (resetLeaderElectionId || 
!resourceMap.containsKey("leaderElectionId")) {
                 int maxLongLength = String.valueOf(Long.MAX_VALUE).length();
                 String currentTimeMillisStr = String.format("%0"
                         + maxLongLength + "d", System.currentTimeMillis());
@@ -226,7 +224,7 @@ public class HeartbeatHandler implements
                         }
                     }
                 }
-                node.setProperty("leaderElectionId", prefix + "_"
+                resourceMap.put("leaderElectionId", prefix + "_"
                         + currentTimeMillisStr + "_" + slingId);
                 resetLeaderElectionId = false;
             }
@@ -238,9 +236,6 @@ public class HeartbeatHandler implements
         } catch (PersistenceException e) {
             logger.error("issueHeartbeat: Got a PersistenceException: "
                     + myClusterNodePath + " " + e, e);
-        } catch (RepositoryException e) {
-            logger.error("issueHeartbeat: Got a RepositoryExceptionnnn: "
-                    + myClusterNodePath + " " + e, e);
         } finally {
             if (resourceResolver != null) {
                 resourceResolver.close();
@@ -266,9 +261,9 @@ public class HeartbeatHandler implements
         } catch (LoginException e) {
             logger.error("checkView: could not log in administratively: " + e,
                     e);
-        } catch (RepositoryException e) {
+        } catch (PersistenceException e) {
             logger.error(
-                    "checkView: encountered a repository exception during view 
check: "
+                    "checkView: encountered a persistence exception during 
view check: "
                             + e, e);
         } finally {
             if (resourceResolver != null) {
@@ -277,9 +272,9 @@ public class HeartbeatHandler implements
         }
     }
 
-    /** do the established-against-heartbeat view check using the given 
resourceResolver. **/
-    private void doCheckView(final ResourceResolver resourceResolver)
-            throws RepositoryException {
+    /** do the established-against-heartbeat view check using the given 
resourceResolver. 
+     */
+    private void doCheckView(final ResourceResolver resourceResolver) throws 
PersistenceException {
 
         if (votingHandler==null) {
             logger.info("doCheckView: votingHandler is null!");

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/ResourceHelper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/ResourceHelper.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/ResourceHelper.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/ResourceHelper.java
 Wed Apr 24 12:20:23 2013
@@ -18,7 +18,9 @@
  */
 package org.apache.sling.discovery.impl.common.resource;
 
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.StringTokenizer;
@@ -27,6 +29,7 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+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.api.resource.ValueMap;
@@ -36,33 +39,31 @@ import org.apache.sling.api.resource.Val
  */
 public class ResourceHelper {
 
-    /** Get or create a resource at the given path **/
     public static Resource getOrCreateResource(
             final ResourceResolver resourceResolver, final String path)
-            throws RepositoryException {
+            throws PersistenceException {
         Resource resource = resourceResolver.getResource(path);
         if (resource == null) {
             resource = createResource(resourceResolver, path);
         }
         return resource;
     }
-
-    /** Create a resource at the given path **/
+    
     public static Resource createResource(final ResourceResolver 
resourceResolver,
-            final String path) throws RepositoryException {
-        final Session session = resourceResolver.adaptTo(Session.class);
-
+            final String path) throws PersistenceException {
         final StringTokenizer st = new StringTokenizer(path, "/");
-        Node node = session.getRootNode();
+        Resource resource = resourceResolver.getResource("/");
         while (st.hasMoreTokens()) {
             String elem = st.nextToken();
-            if (!node.hasNode(elem)) {
-                node = node.addNode(elem, "nt:unstructured");
-            } else {
-                node = node.getNode(elem);
+            Resource child = resource.getChild(elem);
+            if (child==null) {
+                Map<String, Object> properties = new HashMap<String, Object>();
+                properties.put("jcr:primaryType", "nt:unstructured");
+                child = resourceResolver.create(resource, elem, properties);
             }
+            resource = child;
         }
-        session.save();
+        resourceResolver.commit();
         return resourceResolver.getResource(path);
     }
 
@@ -74,6 +75,9 @@ public class ResourceHelper {
         } catch(RuntimeException re) {
             return new StringBuffer("non-existing resource: "+resource+" 
("+re.getMessage()+")");
         }
+        if (valueMap==null) {
+            return new StringBuffer("non-existing resource: "+resource+" (no 
ValueMap)");
+        }
         final Set<Entry<String, Object>> entrySet = valueMap.entrySet();
         final StringBuffer sb = new StringBuffer();
         for (Iterator<Entry<String, Object>> it = entrySet.iterator(); it
@@ -87,4 +91,13 @@ public class ResourceHelper {
         return sb;
     }
 
+    public static void moveResource(Resource res, String path) throws 
PersistenceException {
+        try{
+            Session session = res.adaptTo(Node.class).getSession();
+            session.move(res.getPath(), path);
+        } catch(RepositoryException re) {
+            throw new PersistenceException(String.valueOf(re), re);
+        }
+    }
+
 }

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/TopologyChangeHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/TopologyChangeHandler.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/TopologyChangeHandler.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/TopologyChangeHandler.java
 Wed Apr 24 12:20:23 2013
@@ -18,8 +18,6 @@
  */
 package org.apache.sling.discovery.impl.topology;
 
-import javax.jcr.RepositoryException;
-
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
@@ -72,8 +70,7 @@ public class TopologyChangeHandler imple
     /** the sling id of the local instance **/
     private String slingId;
 
-    protected void activate(final ComponentContext context)
-            throws RepositoryException {
+    protected void activate(final ComponentContext context) {
         slingId = slingSettingsService.getSlingId();
         logger.debug("activated. slingid=" + slingId + ", discoveryservice="
                 + discoveryService);

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/Announcement.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/Announcement.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/Announcement.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/Announcement.java
 Wed Apr 24 12:20:23 2013
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.discovery.impl.topology.announcement;
 
-import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
@@ -28,10 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
+import org.apache.sling.api.resource.ModifiableValueMap;
+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.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
@@ -337,15 +336,17 @@ public class Announcement {
      * under which a node with the primary key is created
      **/
     public void persistTo(Resource announcementsResource)
-            throws RepositoryException, JSONException {
-        Node node = announcementsResource.adaptTo(Node.class);
-        if (node.hasNode(getPrimaryKey())) {
-            node = node.getNode(getPrimaryKey());
+            throws PersistenceException, JSONException {
+        Resource announcementChildResource = 
announcementsResource.getChild(getPrimaryKey());
+        if (announcementChildResource==null) {
+            final ResourceResolver resourceResolver = 
announcementsResource.getResourceResolver();
+            Map<String, Object> properties = new HashMap<String, Object>();
+            properties.put("topologyAnnouncement", asJSON());
+            resourceResolver.create(announcementsResource, getPrimaryKey(), 
properties);
         } else {
-            node = node.addNode(getPrimaryKey());
+            final ModifiableValueMap announcementChildMap = 
announcementChildResource.adaptTo(ModifiableValueMap.class);
+            announcementChildMap.put("topologyAnnouncement", asJSON());
         }
-
-        node.setProperty("topologyAnnouncement", asJSON());
     }
 
     /** 

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/AnnouncementRegistryImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/AnnouncementRegistryImpl.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/AnnouncementRegistryImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/topology/announcement/AnnouncementRegistryImpl.java
 Wed Apr 24 12:20:23 2013
@@ -22,10 +22,6 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
 
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.Service;
@@ -163,14 +159,15 @@ public class AnnouncementRegistryImpl im
                 }
             }
 
-            resourceResolver.adaptTo(Session.class).save();
+            resourceResolver.commit();
+            resourceResolver = null;
         } catch (LoginException e) {
             logger.error(
                     "handleEvent: could not log in administratively: " + e, e);
             throw new RuntimeException("Could not log in to repository (" + e
                     + ")", e);
-        } catch (RepositoryException e) {
-            logger.error("handleEvent: got a RepositoryException: " + e, e);
+        } catch (PersistenceException e) {
+            logger.error("handleEvent: got a PersistenceException: " + e, e);
             throw new RuntimeException(
                     "Exception while talking to repository (" + e + ")", e);
         } catch (JSONException e) {
@@ -236,17 +233,17 @@ public class AnnouncementRegistryImpl im
                                     + settingsService.getSlingId()
                                     + "/announcements");
 
-            final Node node = announcementsResource.adaptTo(Node.class);
             topologyAnnouncement.persistTo(announcementsResource);
-            node.getSession().save();
+            resourceResolver.commit();
+            resourceResolver = null;
         } catch (LoginException e) {
             logger.error(
                     "registerAnnouncement: could not log in administratively: "
                             + e, e);
             throw new RuntimeException("Could not log in to repository (" + e
                     + ")", e);
-        } catch (RepositoryException e) {
-            logger.error("registerAnnouncement: got a RepositoryException: "
+        } catch (PersistenceException e) {
+            logger.error("registerAnnouncement: got a PersistenceException: "
                     + e, e);
             throw new RuntimeException(
                     "Exception while talking to repository (" + e + ")", e);
@@ -256,7 +253,7 @@ public class AnnouncementRegistryImpl im
                     + ")", e);
         } finally {
             if (resourceResolver != null) {
-                resourceResolver.close();
+                resourceResolver.refresh();
             }
         }
         return true;
@@ -303,16 +300,15 @@ public class AnnouncementRegistryImpl im
                     
target.addIncomingTopologyAnnouncement(topologyAnnouncement);
                 }
             }
-
-            Node node = clusterInstancesResource.adaptTo(Node.class);
-            node.getSession().save();
+            resourceResolver.commit();
+            resourceResolver = null;
         } catch (LoginException e) {
             logger.error(
                     "handleEvent: could not log in administratively: " + e, e);
             throw new RuntimeException("Could not log in to repository (" + e
                     + ")", e);
-        } catch (RepositoryException e) {
-            logger.error("handleEvent: got a RepositoryException: " + e, e);
+        } catch (PersistenceException e) {
+            logger.error("handleEvent: got a PersistenceException: " + e, e);
             throw new RuntimeException(
                     "Exception while talking to repository (" + e + ")", e);
         } catch (JSONException e) {
@@ -340,7 +336,6 @@ public class AnnouncementRegistryImpl im
                                     + settingsService.getSlingId()
                                     + "/announcements");
 
-            Node node = announcementsResource.adaptTo(Node.class);
             final Iterator<Resource> it = announcementsResource.getChildren()
                     .iterator();
             Announcement topologyAnnouncement;
@@ -354,7 +349,7 @@ public class AnnouncementRegistryImpl im
                 if (topologyAnnouncement.hasExpired(config)) {
                     logger.info("checkExpiredAnnouncements: topology 
announcement has expired: "
                             + anAnnouncement);
-                    anAnnouncement.adaptTo(Node.class).remove();
+                    resourceResolver.delete(anAnnouncement);
                 } else {
                     logger.debug("checkExpiredAnnouncements: topology 
announcement still valid: "
                             + anAnnouncement);
@@ -362,14 +357,15 @@ public class AnnouncementRegistryImpl im
                 }
             }
 
-            node.getSession().save();
+            resourceResolver.commit();
+            resourceResolver = null;
         } catch (LoginException e) {
             logger.error(
                     "handleEvent: could not log in administratively: " + e, e);
             throw new RuntimeException("Could not log in to repository (" + e
                     + ")", e);
-        } catch (RepositoryException e) {
-            logger.error("handleEvent: got a RepositoryException: " + e, e);
+        } catch (PersistenceException e) {
+            logger.error("handleEvent: got a PersistenceException: " + e, e);
             throw new RuntimeException(
                     "Exception while talking to repository (" + e + ")", e);
         } catch (JSONException e) {

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResource.java
 Wed Apr 24 12:20:23 2013
@@ -18,7 +18,12 @@
  */
 package org.apache.sling.discovery.impl.setup;
 
+import java.util.Calendar;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
@@ -27,6 +32,7 @@ import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.sling.api.resource.ModifiableValueMap;
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
@@ -108,8 +114,116 @@ public class MockedResource extends Synt
                 ValueMap valueMap = new ValueMapDecorator(map);
                 return (AdapterType) valueMap;
             } catch (Exception e) {
-                throw new RuntimeException("Exception occurred: " + e, e);
+                e.printStackTrace();
+                return null;
             }
+        } else if (type.equals(ModifiableValueMap.class)) {
+            return (AdapterType) new ModifiableValueMap() {
+                
+                public Collection<Object> values() {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public int size() {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public Object remove(Object arg0) {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public void putAll(Map<? extends String, ? extends Object> 
arg0) {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public Object put(String arg0, Object arg1) {
+                    Session session = getSession();
+                    try{
+                        final Node node = session.getNode(getPath());
+                        Object result = null;
+                        if (node.hasProperty(arg0)) {
+                            final Property previous = node.getProperty(arg0);
+                            if (previous==null) {
+                                // null
+                            } else if (previous.getType() == 
PropertyType.STRING) {
+                                result = previous.getString();
+                            } else if (previous.getType() == 
PropertyType.DATE) {
+                                result = previous.getDate();
+                            } else if (previous.getType() == 
PropertyType.BOOLEAN) {
+                                result = previous.getBoolean();
+                            } else {
+                                throw new UnsupportedOperationException();
+                            }
+                        }
+                        if (arg1 instanceof String) {
+                            node.setProperty(arg0, (String)arg1);
+                        } else if (arg1 instanceof Calendar) {
+                            node.setProperty(arg0, (Calendar)arg1);
+                        } else if (arg1 instanceof Boolean) {
+                            node.setProperty(arg0, (Boolean)arg1);
+                        } else {
+                            throw new UnsupportedOperationException();
+                        }
+                        return result;
+                    } catch(RepositoryException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+                
+                public Set<String> keySet() {
+                    Session session = getSession();
+                    try {
+                        final Node node = session.getNode(getPath());
+                        final PropertyIterator pi = node.getProperties();
+                        final Set<String> result = new HashSet<String>();
+                        while(pi.hasNext()) {
+                            final Property p = pi.nextProperty();
+                            result.add(p.getName());
+                        }
+                        return result;
+                    } catch (RepositoryException e) {
+                        throw new RuntimeException(e);
+                    }
+                }
+                
+                public boolean isEmpty() {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public Object get(Object arg0) {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public Set<Entry<String, Object>> entrySet() {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public boolean containsValue(Object arg0) {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public boolean containsKey(Object arg0) {
+                    Session session = getSession();
+                    try{
+                        final Node node = session.getNode(getPath());
+                        return node.hasProperty(String.valueOf(arg0));
+                    } catch(RepositoryException re) {
+                        throw new RuntimeException(re);
+                    }
+                }
+                
+                public void clear() {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public <T> T get(String name, T defaultValue) {
+                    throw new UnsupportedOperationException();
+                }
+                
+                public <T> T get(String name, Class<T> type) {
+                    throw new UnsupportedOperationException();
+                }
+            };
         } else {
             return super.adaptTo(type);
         }

Modified: 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResourceResolver.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResourceResolver.java?rev=1471381&r1=1471380&r2=1471381&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResourceResolver.java
 (original)
+++ 
sling/trunk/contrib/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/MockedResourceResolver.java
 Wed Apr 24 12:20:23 2013
@@ -22,17 +22,14 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
-import javax.jcr.AccessDeniedException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.lock.LockException;
-import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.version.VersionException;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.resource.LoginException;
@@ -115,7 +112,11 @@ public class MockedResourceResolver impl
     }
 
     public Resource getResource(Resource base, String path) {
-        return getResource(base.getPath() + "/" + path);
+        if (base.getPath().equals("/")) {
+            return getResource("/" + path);
+        } else {
+            return getResource(base.getPath() + "/" + path);
+        }
     }
 
     public String[] getSearchPath() {
@@ -220,7 +221,34 @@ public class MockedResourceResolver impl
 
     public Resource create(Resource parent, String name,
             Map<String, Object> properties) throws PersistenceException {
-        throw new UnsupportedOperationException("Not implemented");
+        final Node parentNode = parent.adaptTo(Node.class);
+        try {
+            final Node child;
+            if (properties!=null && properties.containsKey("jcr:primaryType")) 
{
+                child = parentNode.addNode(name, (String) 
properties.get("jcr:primaryType"));
+            } else {
+                child = parentNode.addNode(name);
+            }
+            if (properties!=null) {
+                final Iterator<Entry<String, Object>> it = 
properties.entrySet().iterator();
+                while(it.hasNext()) {
+                    final Entry<String, Object> entry = it.next();
+                    if (entry.getKey().equals("jcr:primaryType")) {
+                        continue;
+                    }
+                    if (entry.getValue() instanceof String) {
+                        child.setProperty(entry.getKey(), 
(String)entry.getValue());
+                    } else if (entry.getValue() instanceof Boolean) {
+                        child.setProperty(entry.getKey(), 
(Boolean)entry.getValue());
+                    } else {
+                        throw new UnsupportedOperationException("Not 
implemented");
+                    }
+                }
+            }
+            return getResource(parent, name);
+        } catch (RepositoryException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     public void revert() {


Reply via email to