001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.xbean.spring.context;
018    
019    import java.io.IOException;
020    import java.util.Collections;
021    import java.util.List;
022    
023    import org.apache.xbean.spring.context.impl.XBeanHelper;
024    import org.springframework.beans.BeansException;
025    import org.springframework.beans.factory.support.DefaultListableBeanFactory;
026    import org.springframework.beans.factory.xml.ResourceEntityResolver;
027    import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
028    import org.springframework.context.ApplicationContext;
029    
030    /**
031     * An XBean version of the regular Spring class to provide improved XML
032     * handling.
033     * 
034     * @author James Strachan
035     * @author Dain Sundstrom
036     * @version $Id$
037     * @since 2.0
038     */
039    public class FileSystemXmlApplicationContext extends org.springframework.context.support.FileSystemXmlApplicationContext implements SpringApplicationContext {
040        private final List xmlPreprocessors;
041    
042        /**
043         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified location on the file system.
044         * @param configLocation the location of the configuration file on the class path
045         * @throws BeansException if a problem occurs while reading the configuration
046         */
047        public FileSystemXmlApplicationContext(String configLocation) throws BeansException {
048            this(new String[] {configLocation}, true, null, Collections.EMPTY_LIST);
049        }
050    
051        /**
052         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
053         * @param configLocations the locations of the configuration files on the class path
054         * @throws BeansException if a problem occurs while reading the configuration
055         */
056        public FileSystemXmlApplicationContext(String[] configLocations) throws BeansException {
057            this(configLocations, true, null, Collections.EMPTY_LIST);
058        }
059    
060        /**
061         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
062         * @param configLocations the locations of the configuration files on the class path
063         * @param refresh if true the configurations are immedately loaded; otherwise the configurations are not loaded
064         * until refresh() is called
065         * @throws BeansException if a problem occurs while reading the configuration
066         */
067        public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh) throws BeansException {
068            this(configLocations, refresh, null, Collections.EMPTY_LIST);
069        }
070    
071        /**
072         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
073         * @param configLocations the locations of the configuration files on the class path
074         * @param parent the parent of this application context
075         * @throws BeansException if a problem occurs while reading the configuration
076         */
077        public FileSystemXmlApplicationContext(String[] configLocations, ApplicationContext parent) throws BeansException {
078            this(configLocations, true, parent, Collections.EMPTY_LIST);
079        }
080    
081        /**
082         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
083         * @param configLocations the locations of the configuration files on the class path
084         * @param refresh if true the configurations are immedately loaded; otherwise the configurations are not loaded
085         * until refresh() is called
086         * @param parent the parent of this application context
087         * @throws BeansException if a problem occurs while reading the configuration
088         */
089        public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException {
090            this(configLocations, refresh, parent, Collections.EMPTY_LIST);
091        }
092    
093        /**
094         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified location on the file system.
095         * @param configLocation the location of the configuration file on the class path
096         * @param xmlPreprocessors the SpringXmlPreprocessors to apply before passing the xml to Spring for processing
097         * @throws BeansException if a problem occurs while reading the configuration
098         */
099        public FileSystemXmlApplicationContext(String configLocation, List xmlPreprocessors) throws BeansException {
100            this(new String[] {configLocation}, true, null, xmlPreprocessors);
101        }
102    
103        /**
104         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
105         * @param configLocations the locations of the configuration files on the class path
106         * @param xmlPreprocessors the SpringXmlPreprocessors to apply before passing the xml to Spring for processing
107         * @throws BeansException if a problem occurs while reading the configuration
108         */
109        public FileSystemXmlApplicationContext(String[] configLocations, List xmlPreprocessors) throws BeansException {
110            this(configLocations, true, null, xmlPreprocessors);
111        }
112    
113        /**
114         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
115         * @param configLocations the locations of the configuration files on the class path
116         * @param refresh if true the configurations are immedately loaded; otherwise the configurations are not loaded
117         * until refresh() is called
118         * @param xmlPreprocessors the SpringXmlPreprocessors to apply before passing the xml to Spring for processing
119         * @throws BeansException if a problem occurs while reading the configuration
120         */
121        public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, List xmlPreprocessors) throws BeansException {
122            this(configLocations, refresh, null, xmlPreprocessors);
123        }
124    
125        /**
126         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
127         * @param configLocations the locations of the configuration files on the class path
128         * @param parent the parent of this application context
129         * @param xmlPreprocessors the SpringXmlPreprocessors to apply before passing the xml to Spring for processing
130         * @throws BeansException if a problem occurs while reading the configuration
131         */
132        public FileSystemXmlApplicationContext(String[] configLocations, ApplicationContext parent, List xmlPreprocessors) throws BeansException {
133            this(configLocations, true, parent, xmlPreprocessors);
134        }
135    
136        /**
137         * Creates a FileSystemXmlApplicationContext which loads the configuration at the specified locations on the file system.
138         * @param configLocations the locations of the configuration files on the class path
139         * @param refresh if true the configurations are immedately loaded; otherwise the configurations are not loaded
140         * until refresh() is called
141         * @param parent the parent of this application context
142         * @param xmlPreprocessors the SpringXmlPreprocessors to apply before passing the xml to Spring for processing
143         * @throws BeansException if a problem occurs while reading the configuration
144         */
145        public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent, List xmlPreprocessors) throws BeansException {
146            super(configLocations, false, parent);
147            this.xmlPreprocessors = xmlPreprocessors;
148            if (refresh) {
149                refresh();
150            }
151        }
152    
153        /**
154         * {@inheritDoc}
155         */
156        protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
157            // Create a new XmlBeanDefinitionReader for the given BeanFactory.
158            XmlBeanDefinitionReader beanDefinitionReader = XBeanHelper.createBeanDefinitionReader(this, beanFactory, xmlPreprocessors);
159    
160            // Configure the bean definition reader with this context's
161            // resource loading environment.
162            beanDefinitionReader.setResourceLoader(this);
163            beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
164    
165            // Allow a subclass to provide custom initialization of the reader,
166            // then proceed with actually loading the bean definitions.
167            initBeanDefinitionReader(beanDefinitionReader);
168            loadBeanDefinitions(beanDefinitionReader);
169        }
170        
171    }