/**
 *
 * Copyright 2005 the original author or authors.
 *
 *  Licensed 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.gbean.kernel;

/**
 * This condition that requires another service be in the RUNNING state to be satisfied.
 *
 * @author Dain Sundstrom
 * @version $Id$
 * @since 1.0
 */
public class RunningServiceCondition implements ServiceCondition {
    private final ServiceName dependency;
    private final boolean ownedRelationship;
    private final boolean stopOnServiceShutdown;
    private final DependencyServiceMonitor serviceMonitor = new DependencyServiceMonitor();

    private ServiceConditionContext context;
    private boolean satisfied = true;
    private StoppedServiceCondition stoppedServiceCondition;

    /**
     * Creates a condition that requires the specified service be in the RUNNING state to be satisfied.
     *
     * @param dependency the service that must be running
     * @param ownedRelationship if true the condition will register the relationship
     * @param stopOnServiceShutdown if the our service should be stopped when the specified service shutsdown
     */
    public RunningServiceCondition(ServiceName dependency, boolean ownedRelationship, boolean stopOnServiceShutdown) {
        this.dependency = dependency;
        this.ownedRelationship = ownedRelationship;
        this.stopOnServiceShutdown = stopOnServiceShutdown;
    }

    /**
     * {@inheritDoc}
     */
    public synchronized void initialize(ServiceConditionContext context) {
        if (context == null) throw new NullPointerException("context is null");

        // if we have no been destroyed, destroy not
        if (this.context != null) {
            destroy();
        }

        this.context = context;

        satisfied = false;
        context.getKernel().addServiceMonitor(serviceMonitor, dependency);
        if (ownedRelationship) {
            // todo register owned relationship
        }

        if (stopOnServiceShutdown) {
            stoppedServiceCondition = new StoppedServiceCondition(context.getServiceName());
        }
    }

    /**
     * {@inheritDoc}
     */
    public synchronized boolean isSatisfied() {
        if (context == null) {
            // we are not initialized so default to true
            return true;
        }

        if (!satisfied) {
            try {
                // grab a synchronized lock on the service factory to assure that the state doesn't change while
                // adding the dependency.... the kernel will grab the same lock when getting the stop dependencies
                ServiceFactory serviceFactory = context.getKernel().getServiceFactory(dependency);
                synchronized (serviceFactory) {
                    if (context.getKernel().getService(dependency) == ServiceState.RUNNING) {
                        if (stopOnServiceShutdown) {
                            serviceFactory.addStopCondition(stoppedServiceCondition);
                        }
                        satisfied = true;
                        context.getKernel().removeServiceMonitor(serviceMonitor);
                    }
                }
            } catch (ServiceNotFoundException ignored) {
                // service hasn't registered yet
            }
        }
        return satisfied;
    }

    /**
     * {@inheritDoc}
     */
    public synchronized void destroy() {
        if (context == null) {
            // we are already destroyed
            return;
        }

        context.getKernel().removeServiceMonitor(serviceMonitor);
        context = null;
        satisfied = true;
        if (ownedRelationship) {
            // todo unregister owned relationship
        }
        if (stopOnServiceShutdown) {
            stoppedServiceCondition.destroy();
            stoppedServiceCondition = null;
        }
    }

    private class DependencyServiceMonitor extends NullServiceMonitor {
        public void serviceRunning(ServiceEvent serviceEvent) {
            synchronized (RunningServiceCondition.this) {
                if (context != null) {
                    // we aren't running anymore
                    return;
                }

                if (!satisfied) {
                    return;
                }

                if (isSatisfied()) {
                    context.setSatisfied();
                }
            }
        }
    }
}
