public void registerEventHandler()

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();
            }
        }
    }