001/*****************************************************************************
002 * Copyright (C) PicoContainer Organization. All rights reserved.            *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD      *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file.                                                     *
007 *****************************************************************************/
008package org.picocontainer.lifecycle;
009
010import org.picocontainer.PicoCompositionException;
011
012import java.io.Serializable;
013
014/**
015 * Bean-like implementation of LifecycleState.
016 * @author Paul Hammant
017 * @author Michael Rimov
018 *
019 */
020@SuppressWarnings("serial")
021public class DefaultLifecycleState implements LifecycleState, Serializable {
022
023    /**
024         * Default state of a container once it has been built.
025         */
026        private static final String CONSTRUCTED = "CONSTRUCTED";
027
028        /**
029         * 'Start' Lifecycle has been called.
030         */
031        private static final String STARTED = "STARTED";
032
033        /**
034         * 'Stop' lifecycle has been called.
035         */
036        private static final String STOPPED = "STOPPED";
037
038        /**
039         * 'Dispose' lifecycle has been called.
040         */
041        private static final String DISPOSED = "DISPOSED";
042
043        /**
044         * Initial state.
045         */
046    private String state = CONSTRUCTED;
047
048    /** {@inheritDoc} **/
049    public void removingComponent() {
050        if (isStarted()) {
051            throw new PicoCompositionException("Cannot remove components after the container has started");
052        }
053
054        if (isDisposed()) {
055            throw new PicoCompositionException("Cannot remove components after the container has been disposed");
056        }
057    }
058
059    /** {@inheritDoc} **/
060    public void starting() {
061                if (isConstructed() || isStopped()) {
062            state = STARTED;
063                        return;
064                }
065            throw new IllegalStateException("Cannot start.  Current container state was: " + state);
066    }
067
068
069    /** {@inheritDoc} **/
070    public void stopping() {
071        if (!(isStarted())) {
072            throw new IllegalStateException("Cannot stop.  Current container state was: " + state);
073        }
074    }
075
076    /** {@inheritDoc} **/
077    public void stopped() {
078        state = STOPPED;
079    }
080
081    /** {@inheritDoc} **/
082    public boolean isStarted() {
083        return state == STARTED;
084    }
085
086    /** {@inheritDoc} **/
087    public void disposing() {
088        if (!(isStopped() || isConstructed())) {
089            throw new IllegalStateException("Cannot dispose.  Current lifecycle state is: " + state);
090        }
091
092    }
093
094    /** {@inheritDoc} **/
095    public void disposed() {
096        state = DISPOSED;
097    }
098
099    
100    /** {@inheritDoc} **/
101        public boolean isDisposed() {
102                return state == DISPOSED;
103    }
104
105    /** {@inheritDoc} **/
106        public boolean isStopped() {
107                return state == STOPPED;
108    }
109
110        /**
111         * Returns true if no other state has been triggered so far.
112         * @return
113         */
114        public boolean isConstructed() {
115                return state == CONSTRUCTED;
116        }
117
118}