001    package org.apache.fulcrum.yaafi.service.servicemanager;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import org.apache.avalon.framework.activity.Disposable;
023    import org.apache.avalon.framework.context.Context;
024    import org.apache.avalon.framework.context.ContextException;
025    import org.apache.avalon.framework.context.Contextualizable;
026    import org.apache.avalon.framework.context.DefaultContext;
027    import org.apache.avalon.framework.logger.AbstractLogEnabled;
028    import org.apache.avalon.framework.logger.Logger;
029    import org.apache.avalon.framework.parameters.ParameterException;
030    import org.apache.avalon.framework.parameters.Parameterizable;
031    import org.apache.avalon.framework.parameters.Parameters;
032    import org.apache.avalon.framework.service.ServiceException;
033    import org.apache.avalon.framework.service.ServiceManager;
034    import org.apache.avalon.framework.service.Serviceable;
035    
036    
037    /**
038     * This is a sort of "edelhack" to solve the problem of accessing
039     * the Avalon infrastructure without having an instance of the
040     * container. The implementation stores the very first instance
041     * of itself in a static variable which can be accessed using
042     * getInstance().
043     *
044     * This allows access to the various Avalon artifacts.
045     *
046     *  @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
047     */
048    
049    public class ServiceManagerServiceImpl
050        extends AbstractLogEnabled
051        implements ServiceManagerService, Contextualizable, Parameterizable, Serviceable, Disposable
052    {
053        /** The one and only instance */
054        private static ServiceManagerServiceImpl instance;
055    
056        /** Store the ServiceContainer on a per instance base */
057        private ServiceManager serviceManager;
058    
059        /** Store the passed parameters on a per instance base */
060        private Parameters parameters;
061    
062        /** Store the passed parameters on a per instance base */
063        private Context context;
064    
065        /**
066         * Constructor
067         */
068        public ServiceManagerServiceImpl()
069        {
070            setInstance(this);
071        }
072    
073        /**
074         * @return the one and only instance of this class
075         */
076        public static synchronized ServiceManagerService getInstance()
077        {
078            return instance;
079        }
080    
081        /**
082         * Create the one and only instance
083         * @param instance the instance
084         */
085        protected static synchronized void setInstance( ServiceManagerServiceImpl instance )
086        {
087            if( ServiceManagerServiceImpl.instance == null )
088            {
089                ServiceManagerServiceImpl.instance = instance;
090            }
091        }
092    
093        /////////////////////////////////////////////////////////////////////////
094        // Avalon Lifecycle Implementation
095        /////////////////////////////////////////////////////////////////////////
096    
097        /**
098         * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
099         */
100        public void service(ServiceManager serviceManager) throws ServiceException
101        {
102            this.serviceManager = serviceManager;
103        }
104    
105        /**
106         * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
107         */
108        public void contextualize(Context context) throws ContextException
109        {
110            this.context = context;
111        }
112    
113        /**
114         * @see org.apache.avalon.framework.parameters.Parameterizable#parameterize(org.apache.avalon.framework.parameters.Parameters)
115         */
116        public void parameterize(Parameters parameters) throws ParameterException
117        {
118            this.parameters = parameters;
119        }
120    
121        /**
122         * @see org.apache.avalon.framework.activity.Disposable#dispose()
123         */
124        public void dispose()
125        {
126            this.serviceManager = null;
127            this.parameters = new Parameters();
128            this.context = new DefaultContext();
129            ServiceManagerServiceImpl.instance = null;
130        }
131    
132        /////////////////////////////////////////////////////////////////////////
133        // ServiceContainer Implementation
134        /////////////////////////////////////////////////////////////////////////
135    
136        /**
137         * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String)
138         */
139        public boolean hasService(String name)
140        {
141            return this.serviceManager.hasService(name);
142        }
143    
144        /**
145         * @see org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String)
146         */
147        public Object lookup(String name) throws ServiceException
148        {
149            return this.serviceManager.lookup(name);
150        }
151    
152        /**
153         * @see org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object)
154         */
155        public void release(Object object)
156        {
157            this.serviceManager.release(object);
158        }
159    
160        /**
161         * @return the ServiceManager for the container
162         */
163        public ServiceManager getServiceManager()
164        {
165            return this.serviceManager;
166        }
167    
168        /**
169         * @return the Parameters for the container
170         */
171        public Parameters getParameters()
172        {
173            return this.parameters;
174        }
175    
176        /**
177         * @return the Context for the container
178         */
179        public Context getContext()
180        {
181            return this.context;
182        }
183    
184        /**
185         * @see org.apache.fulcrum.yaafi.service.servicemanager.ServiceManagerService#getAvalonLogger()
186         */
187        public Logger getAvalonLogger()
188        {
189            return this.getLogger();
190        }
191    }