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 *****************************************************************************/
008 package org.picocontainer.lifecycle;
009
010 import org.picocontainer.PicoCompositionException;
011
012 import java.io.Serializable;
013
014 /**
015 * Bean-like implementation of LifecycleState.
016 * @author Paul Hammant
017 * @author Michael Rimov
018 *
019 */
020 @SuppressWarnings("serial")
021 public 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 }