final java.util.Map duplicates = new java.util.TreeMap();
/*I_MapEntry[] results = */this.subscribeStore.getAll(new I_EntryFilter() {
public I_Entry intercept(I_Entry entry, I_Storage storage) {
if (storage.isTransient()) return null;
try {
SubscribeEntry subscribeEntry = (SubscribeEntry)entry;
//QueryKeyData keyData = queryKeyFactory.readObject(subscribeEntry.getKey());
QueryQosData qosData = global.getQueryQosFactory().readObject(subscribeEntry.getQos());
//String key = keyData.getOid() + qosData.getSender().getAbsoluteName();
SessionName sessionName = new SessionName(global, subscribeEntry.getSessionName());
Object found = sessionIds.get(sessionName.getAbsoluteName());
if (found == null) {
if (errorCounter == 0) {
log.warning("Ignoring invalid entry '" + sessionName.getAbsoluteName() + "' as user is not known");
}
errorCounter++;
return null;
}
String key = qosData.getSubscriptionId();
if (log.isLoggable(Level.FINE))
log.fine("Cleanup of duplicate subscriptions, key=" + key);
if (duplicates.containsKey(key)) {
if (duplicateCounter == 0)
log.warning("Cleanup of duplicate subscriptions, this may take a while, please wait ...");
duplicateCounter++;
//log.warn(ME, "Removing duplicate subscription '" + key + "' oid=" + keyData.getOid());
//subscribeStore.remove(subscribeEntry);
}
else {
duplicates.put(key, subscribeEntry);
}
}
catch (XmlBlasterException e) {
log.severe("Ignoring unexpected problem in checkForDuplicateSubscriptions :" + e.toString());
}
return null;
}
});
if (duplicateCounter > 0) {
this.subscribeStore.clear();
if (this.subscribeStore.getNumOfEntries() > 0)
log.severe("Internal prpblem with checkForDuplicateSubscriptions");
java.util.Iterator it = duplicates.keySet().iterator();
while (it.hasNext()) {
this.subscribeStore.put((I_MapEntry)duplicates.get(it.next()));
}
log.warning("Removed " + (duplicateCounter-duplicates.size()) + " identical subscriptions, keeping " + duplicates.size() + ". Ignored " + errorCounter + " invalid subscriptions as no session was found");
}
}
}
I_MapEntry[] entries = this.subscribeStore.getAll(null);
for (int i=0; i < entries.length; i++) {
if (entries[i] instanceof SubscribeEntry) {
// do connect
SubscribeEntry entry = (SubscribeEntry)entries[i];
String qos = entry.getQos();
QueryQosData qosData = global.getQueryQosFactory().readObject(qos);
ClientProperty clientProperty = qosData.getClientProperty(Constants.PERSISTENCE_ID);
if (clientProperty == null) {
log.severe("SubscribeQos with missing " + Constants.PERSISTENCE_ID + ": " + qosData.toXml());
long uniqueId = new Timestamp().getTimestamp();
qosData.getClientProperties().put(Constants.PERSISTENCE_ID, new ClientProperty(Constants.PERSISTENCE_ID, "long", null, "" + uniqueId));
}
boolean initialUpdates = qosData.getInitialUpdateProp().getValue();
if (initialUpdates) {
qosData.getClientProperties().put(ORIGINAL_INITIAL_UPDATES, new ClientProperty(ORIGINAL_INITIAL_UPDATES, "boolean", null, "true"));
}
SessionName sessionName = new SessionName(this.global, entry.getSessionName());
String sessionId = (String)sessionIds.get(sessionName.getAbsoluteName());
if (sessionId == null) {
log.severe("The persistent session '" + sessionName.getAbsoluteName() + "' is not found, removing persistent subscription " + entry.getLogId());
this.subscribeStore.remove(entry);
continue;
//throw new XmlBlasterException(this.global, ErrorCode.INTERNAL_NULLPOINTER, ME + ".recoverSubscriptions", "The secret sessionId was not found for session='" + sessionName.getAbsoluteName() + "'");
}
// TODO remove the setting of client properties and invoke directly requestBroker.subscribe with subscribeQosServer.inhibitInitialUpdates(true);
// also get the sessionInfo object from authenticate => eliminate sessionIds
this.global.getAuthenticate().getXmlBlaster().subscribe(this.addressServer, sessionId, entry.getKey(), qosData.toXml());
}
else {
throw new XmlBlasterException(this.global, ErrorCode.INTERNAL_ILLEGALARGUMENT, ME + ".recoverSubscriptions: the entry in the storage should be of type 'SubscribeEntry'but is of type'" + entries[i].getClass().getName() + "'");
}
}