in it-is-cloudy-here/org-apache-sling-remote-resourceprovider-dropbox/src/main/java/org/apache/sling/remote/resourceprovider/dropbox/impl/DropboxStorageProvider.java [198:258]
public void registerEventHandler(RemoteResourceEventHandler handler) {
synchronized (this) {
if (eventHandler == null) {
eventHandler = handler;
pollingActive = true;
final long longpollTimeoutSecs = TimeUnit.MINUTES.toSeconds(2);
new Thread(() -> {
synchronized (pollingLock) {
while (pollingActive) {
try {
ListFolderLongpollResult pollResult =
longPollClient.files().listFolderLongpoll(cursor, longpollTimeoutSecs);
if (pollResult.getChanges()) {
boolean hasChanges = true;
TreeSet<String> changedPaths = new TreeSet<>();
TreeSet<String> deletedPaths = new TreeSet<>();
while (hasChanges) {
ListFolderResult result = client.files().listFolderContinue(cursor);
for (Metadata metadata : result.getEntries()) {
if (metadata instanceof DeletedMetadata) {
deletedPaths.add(metadata.getPathLower());
} else {
changedPaths.add(metadata.getPathLower());
}
}
hasChanges = result.getHasMore();
cursor = result.getCursor();
}
if (!changedPaths.isEmpty()) {
handler.handleEvent(new DropboxChangeEvent(RemoteResourceEventType.CHANGED, changedPaths));
}
if (!deletedPaths.isEmpty()) {
handler.handleEvent(new DropboxChangeEvent(RemoteResourceEventType.DELETED, deletedPaths));
}
}
Long backoff = pollResult.getBackoff();
if (backoff != null) {
try {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Next poll will be executed in {} seconds.", backoff);
}
pollingLock.wait(TimeUnit.SECONDS.toMillis(backoff));
} catch (InterruptedException ex) {
LOGGER.error("Stopping long-poll thread.", ex);
pollingActive = false;
Thread.currentThread().interrupt();
}
}
} catch (DbxException ex) {
LOGGER.error("Unable to register long-poll hook.", ex);
pollingActive = false;
}
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Stopping long-poll thread.");
}
}
}, this.getClass().getName() + "-longpoll").start();
}
}
}