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.html file.                                                    *
007     *                                                                           *
008     * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant   *
009     *****************************************************************************/
010    package org.picocontainer.testmodel;
011    
012    import static org.junit.Assert.assertNotNull;
013    
014    import org.picocontainer.Disposable;
015    import org.picocontainer.PicoContainer;
016    import org.picocontainer.Startable;
017    
018    
019    public abstract class RecordingLifecycle implements Startable, Disposable {
020        private final StringBuffer recording;
021    
022        protected RecordingLifecycle(StringBuffer recording) {
023            this.recording = recording;
024        }
025    
026        public void start() {
027            recording.append("<").append(code());
028        }
029    
030        public void stop() {
031            recording.append(code()).append(">");
032        }
033    
034        public void dispose() {
035            recording.append("!").append(code());
036        }
037        
038        public String recording() {
039            return recording.toString();
040        }
041    
042        private String code() {
043            String name = getClass().getName();
044            int idx = Math.max(name.lastIndexOf('$'), name.lastIndexOf('.'));
045            return name.substring(idx + 1);
046        }
047        
048        public interface Recorder extends  Startable, Disposable {
049            String recording();
050        }
051    
052        public static class One extends RecordingLifecycle implements Recorder {
053            public One(StringBuffer sb) {
054                super(sb);
055            }
056        }
057    
058        public static class Two extends RecordingLifecycle {
059            public Two(StringBuffer sb, One one) {
060                super(sb);
061                assertNotNull(one);
062            }
063        }
064    
065        public static class Three extends RecordingLifecycle {
066            public Three(StringBuffer sb, One one, Two two) {
067                super(sb);
068                assertNotNull(one);
069                assertNotNull(two);
070            }
071        }
072    
073        public static class Four extends RecordingLifecycle {
074            public Four(StringBuffer sb, Two two, Three three, One one) {
075                super(sb);
076                assertNotNull(one);
077                assertNotNull(two);
078                assertNotNull(three);
079            }
080        }
081    
082        public static class FiveTriesToBeMalicious extends RecordingLifecycle {
083            public FiveTriesToBeMalicious(StringBuffer sb, PicoContainer pc) {
084                super(sb);
085                assertNotNull(pc);
086                sb.append("Whao! Should not get instantiated!!");
087            }
088        }
089        
090    }