in src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingView.java [64:134]
public static VotingView newVoting(final ResourceResolver resourceResolver,
final Config config,
final String newViewId, String initiatorId, final Set<String> liveInstances) throws PersistenceException {
if (!liveInstances.contains(initiatorId)) {
// SLING-4617 : a voting, on a single instance, was created without the local instance
// this should in no case happen - the local instance should always be part of the live
// instances. if that's not the case, then something's fishy and we should not create
// the new voting - and instead rely on a retry later.
logger.warn("newVoting: liveInstances does not include initiatorId (local instance) - not creating new, invalid, voting");
return null;
}
final Resource votingResource = ResourceHelper.getOrCreateResource(
resourceResolver, config.getOngoingVotingsPath() + "/"
+ newViewId);
final ModifiableValueMap votingMap = votingResource.adaptTo(ModifiableValueMap.class);
votingMap.put("votingStart", Calendar.getInstance());
String clusterId = null;
Calendar clusterIdDefinedAt = null;
String clusterIdDefinedBy = null;
final View currentlyEstablishedView = ViewHelper.getEstablishedView(resourceResolver, config);
if (currentlyEstablishedView != null) {
final ValueMap establishedViewValueMap = currentlyEstablishedView.getResource().adaptTo(ValueMap.class);
clusterId = establishedViewValueMap.get(VIEW_PROPERTY_CLUSTER_ID, String.class);
if (clusterId == null || clusterId.length() == 0) {
clusterId = currentlyEstablishedView.getResource().getName();
}
Date date = establishedViewValueMap.get(VIEW_PROPERTY_CLUSTER_ID_DEFINED_AT, Date.class);
if (date!=null) {
clusterIdDefinedAt = Calendar.getInstance();
clusterIdDefinedAt.setTime(date);
}
clusterIdDefinedBy = establishedViewValueMap.get(VIEW_PROPERTY_CLUSTER_ID_DEFINED_BY, String.class);
}
if (clusterId == null || clusterId.length() == 0) {
clusterId = newViewId;
clusterIdDefinedAt = Calendar.getInstance();
}
votingMap.put(VIEW_PROPERTY_CLUSTER_ID, clusterId);
if (clusterIdDefinedAt != null) {
votingMap.put(VIEW_PROPERTY_CLUSTER_ID_DEFINED_AT, clusterIdDefinedAt);
}
if (clusterIdDefinedBy == null || clusterIdDefinedBy.length() == 0) {
clusterIdDefinedBy = initiatorId;
}
votingMap.put(VIEW_PROPERTY_CLUSTER_ID_DEFINED_BY, clusterIdDefinedBy);
final Resource membersResource = resourceResolver.create(votingResource, "members", null);
final Iterator<String> it = liveInstances.iterator();
while (it.hasNext()) {
String memberId = it.next();
Map<String, Object> properties = new HashMap<String, Object>();
if (memberId.equals(initiatorId)) {
properties.put("initiator", true);
properties.put("vote", true);
properties.put("votedAt", Calendar.getInstance());
}
Resource instanceResource = ResourceHelper.getOrCreateResource(
resourceResolver, config.getClusterInstancesPath() + "/"
+ memberId);
String leaderElectionId = instanceResource.adaptTo(ValueMap.class)
.get("leaderElectionId", String.class);
properties.put("leaderElectionId", leaderElectionId);
resourceResolver.create(membersResource, memberId, properties);
}
logger.debug("newVoting: committing new voting: newViewId="+newViewId+", initiatorId="+initiatorId+", resource="+votingResource+", #members: "+liveInstances.size()+", members: "+liveInstances);
resourceResolver.commit();
logger.info("newVoting: new voting started: newViewId="+newViewId+", initiatorId="+initiatorId+", resource="+votingResource+", #members: "+liveInstances.size()+", members: "+liveInstances);
return new VotingView(votingResource);
}