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() {