001    package org.apache.fulcrum.spring;
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 java.util.Map;
023    
024    import org.apache.avalon.framework.activity.Disposable;
025    import org.apache.avalon.framework.activity.Initializable;
026    import org.apache.avalon.framework.logger.Logger;
027    import org.apache.avalon.framework.logger.CommonsLogger;
028    import org.apache.avalon.framework.service.ServiceManager;
029    import org.apache.avalon.framework.service.ServiceException;
030    import org.apache.commons.logging.LogFactory;
031    import org.apache.commons.logging.Log;
032    import org.springframework.beans.factory.BeanFactoryAware;
033    import org.springframework.beans.factory.BeanFactory;
034    import org.springframework.beans.factory.BeanNameAware;
035    import org.springframework.beans.BeansException;
036    
037    /**
038     * Base class to create an Avalon container as Spring bean.
039     *
040     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
041     */
042    public abstract class AvalonContainerBean implements BeanNameAware, BeanFactoryAware, ServiceManager, Initializable, Disposable
043    {
044        /** The service manager used for service lookups */
045        private ServiceManager serviceManager;
046    
047        /** The logger being used */
048        private Logger logger;
049    
050        /** the name of the bean */
051        private String beanName;
052    
053        /** the Spring bean factory creating this instance */
054        private BeanFactory beanFactory;
055    
056        /** the Avalon default context passed to the container */
057        private Map defaultContext;
058    
059        /**
060         * Constructor
061         */
062        public AvalonContainerBean()
063        {
064        }
065    
066        /////////////////////////////////////////////////////////////////////////
067        // Service Interface Implementation
068        /////////////////////////////////////////////////////////////////////////
069    
070        /**
071         * Initialize the instance. This method must be configured using
072         * the 'init-method' attribute.
073         *
074         * @see org.apache.avalon.framework.activity.Initializable#initialize()
075         * @throws Exception the initialization failed
076         */
077        public abstract void initialize() throws Exception;
078    
079        /**
080         * Dispose the YAAFI container. This method must be configured using
081         * the 'destroy-method' attribute.
082         *
083         * @see org.apache.avalon.framework.activity.Disposable#dispose()
084         */
085        public abstract void dispose();
086    
087        /**
088         * @see org.apache.avalon.framework.service.ServiceManager#lookup(String)
089         */
090        public Object lookup(String s) throws ServiceException
091        {
092            return this.getServiceManager().lookup(s);
093        }
094    
095        /**
096         * @see org.apache.avalon.framework.service.ServiceManager#hasService(String)
097         */
098        public boolean hasService(String s)
099        {
100            return this.getServiceManager().hasService(s);
101        }
102    
103        /**
104         * @see org.apache.avalon.framework.service.ServiceManager#release(Object)
105         */
106        public void release(Object o)
107        {
108            this.getServiceManager().release(o);
109        }
110    
111        /**
112         * @see org.springframework.beans.factory.BeanFactoryAware#setBeanFactory(org.springframework.beans.factory.BeanFactory)
113         */
114        public void setBeanFactory(BeanFactory beanFactory) throws BeansException
115        {
116            this.beanFactory = beanFactory;
117        }
118    
119        /**
120         * @see org.springframework.beans.factory.BeanNameAware#setBeanName(String)
121         */
122        public void setBeanName(String name)
123        {
124            this.beanName = name;
125        }
126    
127        /////////////////////////////////////////////////////////////////////////
128        // Generated getters & setters
129        /////////////////////////////////////////////////////////////////////////
130    
131        /**
132         * @return Returns the logger.
133         */
134        public Logger getLogger()
135        {
136            if(this.logger == null)
137            {
138                this.logger = this.createLogger();
139            }
140    
141            return this.logger;
142        }
143    
144        /**
145         * @param logger The logger to set.
146         */
147        public void setLogger(Logger logger)
148        {
149            this.logger = logger;
150        }
151    
152    
153        /**
154         * Get the values for the custom Avalon context
155         *
156         * @return the Avalon default context
157         */
158        public Map getDefaultContext() {
159            return defaultContext;
160        }
161    
162        /**
163         * Allows setting a custom Avalon context.
164         * 
165         * @param defaultContext The Avalon default context to set
166         */
167        public void setDefaultContext(Map defaultContext) {
168            this.defaultContext = defaultContext;
169        }
170    
171        /**
172         * @return the Spring bean name
173         */
174        public String getBeanName() {
175            return beanName;
176        }
177    
178        /**
179         * @return the Spring bean factory
180         */
181        public BeanFactory getBeanFactory() {
182            return beanFactory;
183        }
184    
185        /////////////////////////////////////////////////////////////////////////
186        // Implementation
187        /////////////////////////////////////////////////////////////////////////
188    
189        /**
190         * Create the Avalon Logger to be used for the Avalon container. This
191         * method can be overridden if you don't want a CommonsLogger.
192         *
193         * @return avalon loggger
194         */
195        protected Logger createLogger()
196        {
197            Log log = LogFactory.getLog(this.getBeanName());
198            return new CommonsLogger(log, this.getBeanName());
199        }
200    
201        protected ServiceManager getServiceManager()
202        {
203            return this.serviceManager;
204        }
205    
206        protected void setServiceManager(ServiceManager serviceManager) {
207            this.serviceManager = serviceManager;
208        }
209    }