001    package org.springframework.richclient.application;
002    
003    import org.apache.commons.logging.Log;
004    import org.apache.commons.logging.LogFactory;
005    import org.springframework.util.Assert;
006    
007    /**
008     * <p>
009     * This class provides a singleton model for accessing the configured
010     * ApplicationServices object. Create your {@link ApplicationServices} and load
011     * them into the locator within your Spring context to make the services available
012     * throughout the application.
013     * </p>
014     *
015     * <pre>
016     *  &lt;bean id=&quot;serviceLocator&quot; class=&quot;org.springframework.richclient.application.ApplicationServicesLocator&quot;&gt;
017     *    &lt;property name=&quot;applicationServices&quot; ref=&quot;applicationServices&quot;/&gt;
018     *  &lt;/bean&gt;
019     * </pre>
020     *
021     * or by using construtor arguments:
022     *
023     * <pre>
024     *  &lt;bean id=&quot;serviceLocator&quot; class=&quot;org.springframework.richclient.application.ApplicationServicesLocator&quot;&gt;
025     *    &lt;constructor-arg index=&quot;0&quot; ref=&quot;applicationServices&quot;/&gt;
026     *  &lt;/bean&gt;
027     * </pre>
028     *
029     *
030     * @author Larry Streepy
031     *
032     */
033    public class ApplicationServicesLocator {
034    
035            private static final Log logger = LogFactory.getLog(ApplicationServicesLocator.class);
036    
037            /** The singleton instance. */
038            private static ApplicationServicesLocator INSTANCE;
039    
040            /** The configured ApplicationServices. */
041            private ApplicationServices applicationServices;
042    
043            /**
044             * Default Constructor.
045             */
046            public ApplicationServicesLocator() {
047                    load(this);
048            }
049    
050            /**
051             * Convenience constructor to add ApplicationServices at construction time.
052             */
053            public ApplicationServicesLocator(ApplicationServices applicationServices) {
054                    setApplicationServices(applicationServices);
055                    load(this);
056            }
057    
058            /**
059             * Return the single ApplicationServicesLocator instance.
060             */
061            public static ApplicationServicesLocator instance() {
062                    Assert.state(INSTANCE != null, "The application services locator instance has not yet been initialized.");
063                    return INSTANCE;
064            }
065    
066            /**
067             * Check if an instance is available.
068             *
069             * @return <code>true</code> if an ApplicationServicesLocator is loaded.
070             */
071            public static boolean isLoaded() {
072                    return INSTANCE != null;
073            }
074    
075            /**
076             * Load the single ApplicationServicesLocator instance.
077             */
078            public static void load(ApplicationServicesLocator instance) {
079                    if (INSTANCE != null) {
080                            logger.info("Replacing existing ApplicationServicesLocator instance with: " + instance);
081                    }
082                    INSTANCE = instance;
083            }
084    
085            /**
086             * Convenience method to get the ApplicationServices by querying the
087             * currently loaded ApplicationServicesLocator.
088             */
089            public static ApplicationServices services() {
090                    return instance().getApplicationServices();
091            }
092    
093            /**
094             * Set the ApplicationServices instance.
095             */
096            public void setApplicationServices(ApplicationServices applicationServices) {
097                    this.applicationServices = applicationServices;
098            }
099    
100            /**
101             * Return the ApplicationServices instance.
102             */
103            public ApplicationServices getApplicationServices() {
104                    return applicationServices;
105            }
106    
107    }