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 */
017package org.apache.activemq.xbean;
018
019import java.beans.PropertyEditorManager;
020import java.io.File;
021import java.net.MalformedURLException;
022import java.net.URI;
023import java.util.Map;
024
025import org.apache.activemq.broker.BrokerFactoryHandler;
026import org.apache.activemq.broker.BrokerService;
027import org.apache.activemq.spring.Utils;
028import org.apache.activemq.util.IntrospectionSupport;
029import org.apache.activemq.util.URISupport;
030import org.slf4j.Logger;
031import org.slf4j.LoggerFactory;
032import org.apache.xbean.spring.context.ResourceXmlApplicationContext;
033import org.apache.xbean.spring.context.impl.URIEditor;
034import org.springframework.beans.BeansException;
035import org.springframework.beans.FatalBeanException;
036import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
037import org.springframework.context.ApplicationContext;
038import org.springframework.context.ApplicationContextAware;
039import org.springframework.core.io.ClassPathResource;
040import org.springframework.core.io.FileSystemResource;
041import org.springframework.core.io.Resource;
042import org.springframework.core.io.UrlResource;
043import org.springframework.util.ResourceUtils;
044
045/**
046 * 
047 */
048public class XBeanBrokerFactory implements BrokerFactoryHandler {
049    private static final transient Logger LOG = LoggerFactory.getLogger(XBeanBrokerFactory.class);
050
051    static {
052        PropertyEditorManager.registerEditor(URI.class, URIEditor.class);
053    }
054
055    private boolean validate = true;
056    public boolean isValidate() {
057        return validate;
058    }
059
060    public void setValidate(boolean validate) {
061        this.validate = validate;
062    }
063
064    public BrokerService createBroker(URI config) throws Exception {
065
066        String uri = config.getSchemeSpecificPart();
067        if (uri.lastIndexOf('?') != -1) {
068            IntrospectionSupport.setProperties(this, URISupport.parseQuery(uri));
069            uri = uri.substring(0, uri.lastIndexOf('?'));
070        }
071
072        ApplicationContext context = createApplicationContext(uri);
073
074        BrokerService broker = null;
075        try {
076            broker = (BrokerService)context.getBean("broker");
077        } catch (BeansException e) {
078        }
079
080        if (broker == null) {
081            // lets try find by type
082            String[] names = context.getBeanNamesForType(BrokerService.class);
083            for (int i = 0; i < names.length; i++) {
084                String name = names[i];
085                broker = (BrokerService)context.getBean(name);
086                if (broker != null) {
087                    break;
088                }
089            }
090        }
091        if (broker == null) {
092            throw new IllegalArgumentException("The configuration has no BrokerService instance for resource: " + config);
093        }
094        
095        if (broker instanceof ApplicationContextAware) {
096                ((ApplicationContextAware)broker).setApplicationContext(context);
097        }
098        
099        // TODO warning resources from the context may not be closed down!
100
101        return broker;
102    }
103
104    protected ApplicationContext createApplicationContext(String uri) throws MalformedURLException {
105        Resource resource = Utils.resourceFromString(uri);
106        LOG.debug("Using " + resource + " from " + uri);
107        try {
108            return new ResourceXmlApplicationContext(resource) {
109                @Override
110                protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
111                    reader.setValidating(isValidate());
112                }
113            };
114        } catch (FatalBeanException errorToLog) {
115            LOG.error("Failed to load: " + resource + ", reason: " + errorToLog.getLocalizedMessage(), errorToLog);
116            throw errorToLog;
117        }
118    }
119}