All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.sling.discovery.commons.providers.ViewStateManager Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.sling.discovery.commons.providers;

import org.apache.sling.commons.scheduler.Scheduler;
import org.apache.sling.discovery.DiscoveryService;
import org.apache.sling.discovery.TopologyEventListener;

/**
 * The ViewStateManager is at the core of managing TopologyEventListeners,
 * the 'view state' (changing vs changed) and sending out the appropriate
 * and according TopologyEvents to the registered listeners - depending
 * on the implementation it also supports the ClusterSyncService, which is
 * invoked on handleNewView.
 */
public interface ViewStateManager {

    /**
     * Installs an optional 'min event delay handler' which, using the given scheduler,
     * delays sending TOPOLOGY_CHANGED event after receiving a handleNewView - with the
     * idea as to limit the number of toggling between view states.
     */
    void installMinEventDelayHandler(DiscoveryService discoveryService, Scheduler scheduler, 
            long minEventDelaySecs);
    
    /** 
     * Binds the given eventListener, sending it an INIT event if applicable.
     * @param eventListener the eventListener that is to bind
     */
    void bind(TopologyEventListener eventListener);

    /** 
     * Unbinds the given eventListener, returning whether or not it was bound at all.
     * @param eventListener the eventListner that is to unbind
     * @return whether or not the listener was added in the first place 
     */
    boolean unbind(TopologyEventListener eventListener);

    /**
     * Handles activation - ie marks this manager as activated thus the TOPOLOGY_INIT
     * event can be sent to already bound listeners and subsequent calls to
     * handleChanging/handleNewView will result in according/appropriate TOPOLOGY_CHANGING/
     * TOPOLOGY_CHANGED events.
     */
    void handleActivated();

    /** 
     * Must be called when the corresponding service (typically a DiscoveryService implementation)
     * is deactivated.
     * 

* Will mark this manager as deactivated and flags the last available view as not current. */ void handleDeactivated(); /** * Handles the fact that some (possibly early) indicator of a change in a topology * has been detected and that a new view is being agreed upon (whatever that means, * be it voting or similar). *

* Will send out TOPOLOGY_CHANGING to all initialized listeners. */ void handleChanging(); /** * Handles the fact that a new view became true/established and sends out * TOPOLOGY_INIT to uninitialized listeners and TOPOLOGY_CHANGED to already initialized * listeners (in the latter case, also sends a TOPOLOGY_CHANGING if that has not yet been * done) * @param newView the new, established view * true if we were either in changing mode or the newView was different from the previous one. */ void handleNewView(BaseTopologyView newView); /** * for testing only: wait for any potentially queued async events to be delivered * before returning. *

* @param timeout time in millis to wait for at max - 0 to not wait at all - -1 * to wait indefinitely * @return 0 if no more async events exist, or the number of queued or in-flight (being sent) * events if the timeout hit early */ int waitForAsyncEvents(long timeout); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy