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.broker;
018
019import java.io.File;
020import java.io.FileInputStream;
021import java.io.IOException;
022import java.io.InputStream;
023import java.net.MalformedURLException;
024import java.net.URI;
025import java.net.URL;
026import java.util.Map;
027import java.util.Properties;
028
029import org.apache.activemq.util.IntrospectionSupport;
030
031/**
032 * A {@link BrokerFactoryHandler} which uses a properties file to configure the
033 * broker's various policies.
034 * 
035 * 
036 */
037public class PropertiesBrokerFactory implements BrokerFactoryHandler {
038
039    public BrokerService createBroker(URI brokerURI) throws Exception {
040
041        Map properties = loadProperties(brokerURI);
042        BrokerService brokerService = createBrokerService(brokerURI, properties);
043
044        IntrospectionSupport.setProperties(brokerService, properties);
045        return brokerService;
046    }
047
048    /**
049     * Lets load the properties from some external URL or a relative file
050     */
051    protected Map loadProperties(URI brokerURI) throws IOException {
052        // lets load a URI
053        String remaining = brokerURI.getSchemeSpecificPart();
054        Properties properties = new Properties();
055        File file = new File(remaining);
056
057        InputStream inputStream = null;
058        if (file.exists()) {
059            inputStream = new FileInputStream(file);
060        } else {
061            URL url = null;
062            try {
063                url = new URL(remaining);
064            } catch (MalformedURLException e) {
065                // lets now see if we can find the name on the classpath
066                inputStream = findResourceOnClassPath(remaining);
067                if (inputStream == null) {
068                    throw new IOException("File does not exist: " + remaining + ", could not be found on the classpath and is not a valid URL: " + e);
069                }
070            }
071            if (inputStream == null && url != null) {
072                inputStream = url.openStream();
073            }
074        }
075        if (inputStream != null) {
076            properties.load(inputStream);
077            inputStream.close();
078        }
079
080        // should we append any system properties?
081        try {
082            Properties systemProperties = System.getProperties();
083            properties.putAll(systemProperties);
084        } catch (Exception e) {
085            // ignore security exception
086        }
087        return properties;
088    }
089
090    protected InputStream findResourceOnClassPath(String remaining) {
091        InputStream answer = Thread.currentThread().getContextClassLoader().getResourceAsStream(remaining);
092        if (answer == null) {
093            answer = getClass().getClassLoader().getResourceAsStream(remaining);
094        }
095        return answer;
096    }
097
098    protected BrokerService createBrokerService(URI brokerURI, Map properties) {
099        return new BrokerService();
100    }
101}