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.activemq.store.jdbc;
018    
019    import java.io.File;
020    import java.io.IOException;
021    
022    import javax.sql.DataSource;
023    
024    import org.apache.activemq.broker.LockableServiceSupport;
025    import org.apache.activemq.util.IOHelper;
026    import org.apache.derby.jdbc.EmbeddedDataSource;
027    
028    /**
029     * A helper class which provides a factory method to create a default
030     * {@link DataSource) if one is not provided.
031     * 
032     * 
033     */
034    abstract public class DataSourceServiceSupport extends LockableServiceSupport {
035    
036        private String dataDirectory = IOHelper.getDefaultDataDirectory();
037        private File dataDirectoryFile;
038        private DataSource dataSource;
039    
040        public DataSourceServiceSupport() {
041        }
042    
043        public DataSourceServiceSupport(DataSource dataSource) {
044            this.dataSource = dataSource;
045        }
046    
047        public File getDataDirectoryFile() {
048            if (dataDirectoryFile == null) {
049                dataDirectoryFile = new File(getDataDirectory());
050            }
051            return dataDirectoryFile;
052        }
053    
054        public void setDataDirectoryFile(File dataDirectory) {
055            this.dataDirectoryFile = dataDirectory;
056        }
057    
058        public String getDataDirectory() {
059            return dataDirectory;
060        }
061    
062        public void setDataDirectory(String dataDirectory) {
063            this.dataDirectory = dataDirectory;
064        }
065    
066        public DataSource getDataSource() throws IOException {
067            if (dataSource == null) {
068                dataSource = createDataSource(getDataDirectoryFile().getCanonicalPath());
069                if (dataSource == null) {
070                    throw new IllegalArgumentException("No dataSource property has been configured");
071                }
072            }
073            return dataSource;
074        }
075    
076        public void setDataSource(DataSource dataSource) {
077            this.dataSource = dataSource;
078        }
079    
080        public static DataSource createDataSource(String homeDir) throws IOException {
081    
082            // Setup the Derby datasource.
083            System.setProperty("derby.system.home", homeDir);
084            System.setProperty("derby.storage.fileSyncTransactionLog", "true");
085            System.setProperty("derby.storage.pageCacheSize", "100");
086    
087            final EmbeddedDataSource ds = new EmbeddedDataSource();
088            ds.setDatabaseName("derbydb");
089            ds.setCreateDatabase("create");
090            return ds;
091        }
092    
093        public String toString() {
094            return "" + dataSource;
095        }
096    
097    
098    
099    }