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 }