content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You under the Apache License, Version 2.0
   * (the "License"); you may not use this file except in compliance with
   * the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.activemq.store.jdbc;
  
  import java.io.File;
  import java.io.IOException;
  import java.sql.SQLException;
  
  import javax.sql.DataSource;
  
  import org.apache.activemq.broker.LockableServiceSupport;
  import org.apache.activemq.util.IOHelper;
  import org.apache.derby.jdbc.EmbeddedDataSource;
  
  /**
   * A helper class which provides a factory method to create a default
   * {@link DataSource) if one is not provided.
   * 
   * 
   */
  abstract public class DataSourceServiceSupport extends LockableServiceSupport {
  
      private String dataDirectory = IOHelper.getDefaultDataDirectory();
      private File dataDirectoryFile;
      private DataSource dataSource;
      private DataSource createdDefaultDataSource;
  
      public DataSourceServiceSupport() {
      }
  
      public DataSourceServiceSupport(DataSource dataSource) {
          this.dataSource = dataSource;
      }
  
      public File getDataDirectoryFile() {
          if (dataDirectoryFile == null) {
              dataDirectoryFile = new File(getDataDirectory());
          }
          return dataDirectoryFile;
      }
  
      public void setDataDirectoryFile(File dataDirectory) {
          this.dataDirectoryFile = dataDirectory;
      }
  
      public String getDataDirectory() {
          return dataDirectory;
      }
  
      public void setDataDirectory(String dataDirectory) {
          this.dataDirectory = dataDirectory;
      }
  
      public DataSource getDataSource() throws IOException {
          if (dataSource == null) {
              dataSource = createDataSource(getDataDirectoryFile().getCanonicalPath());
              if (dataSource == null) {
                  throw new IllegalArgumentException("No dataSource property has been configured");
              } else {
                  createdDefaultDataSource = dataSource;
              }
          }
          return dataSource;
      }
  
      public void closeDataSource(DataSource dataSource) {
          if (createdDefaultDataSource != null && createdDefaultDataSource.equals(dataSource)) {
              shutdownDefaultDataSource(dataSource);
              createdDefaultDataSource = this.dataSource = null;
          }
      }
  
      public void setDataSource(DataSource dataSource) {
          this.dataSource = dataSource;
      }
  
      public static DataSource createDataSource(String homeDir) throws IOException {
          return createDataSource(homeDir, "derbydb");
      }
  
      public static DataSource createDataSource(String homeDir, String dbName) throws IOException {
  
          // Setup the Derby datasource.
          System.setProperty("derby.system.home", homeDir);
          System.setProperty("derby.storage.fileSyncTransactionLog", "true");
          System.setProperty("derby.storage.pageCacheSize", "100");
  
          final EmbeddedDataSource ds = new EmbeddedDataSource();
          ds.setDatabaseName(dbName);
          ds.setCreateDatabase("create");
          return ds;
      }
  
      public static void shutdownDefaultDataSource(DataSource dataSource) {
          final EmbeddedDataSource ds =  (EmbeddedDataSource) dataSource;
          ds.setCreateDatabase("shutdown");
          ds.setShutdownDatabase("shutdown");
          try {
              ds.getConnection();
          } catch (SQLException expectedAndIgnored) {
          }
      }
  
      public String toString() {
          return "" + dataSource;
      }
  
  
  
  }
  