require 'rake'
require 'rake/testtask'

task :default => [:java_compile, :test]

def java_classpath_arg # myriad of ways to discover JRuby classpath
  begin
    cpath  = Java::java.lang.System.getProperty('java.class.path').split(File::PATH_SEPARATOR)
    cpath += Java::java.lang.System.getProperty('sun.boot.class.path').split(File::PATH_SEPARATOR)
    jruby_cpath = cpath.compact.join(File::PATH_SEPARATOR)
  rescue => e
  end
  unless jruby_cpath
    jruby_cpath = ENV['JRUBY_PARENT_CLASSPATH'] || ENV['JRUBY_HOME'] &&
      FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
  end
  jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
end

desc "Compile the native Java code."
task :java_compile do
  pkg_classes = File.join(*%w(pkg classes))
  jar_name = File.join(*%w(lib jdbc_adapter jdbc_adapter_internal.jar))
  mkdir_p pkg_classes
  sh "javac -target 1.5 -source 1.5 -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
  sh "jar cf #{jar_name} -C #{pkg_classes} ."
end
file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile

task :filelist do
  puts FileList['pkg/**/*'].inspect
end

if RUBY_PLATFORM =~ /java/
  # TODO: add more databases into the standard tests here.
  task :test => [:test_mysql, :test_jdbc, :test_derby, :test_hsqldb, :test_h2, :test_sqlite3]
else
  task :test => [:test_mysql]
end

FileList['drivers/*'].each do |d|
  next unless File.directory?(d)
  driver = File.basename(d)
  Rake::TestTask.new("test_#{driver}") do |t|
    files = FileList["test/#{driver}*test.rb"]
    if driver == "derby"
      files << 'test/activerecord/connection_adapters/type_conversion_test.rb'
    end
    t.ruby_opts << "-rjdbc/#{driver}"
    t.test_files = files
    t.libs << "test" << "#{d}/lib"
  end
end

Rake::TestTask.new(:test_jdbc) do |t|
  t.test_files = FileList['test/generic_jdbc_connection_test.rb']
  t.libs << 'test' << 'drivers/mysql/lib'
end

Rake::TestTask.new(:test_jndi) do |t|
  t.test_files = FileList['test/jndi_test.rb']
  t.libs << 'test' << 'drivers/derby/lib'
end

task :test_postgresql => [:test_postgres]
task :test_pgsql => [:test_postgres]

# Ensure oracle driver is on your classpath before launching rake
Rake::TestTask.new(:test_oracle) do |t|
  t.test_files = FileList['test/oracle_simple_test.rb']
  t.libs << 'test'
end

# Ensure DB2 driver is on your classpath before launching rake
Rake::TestTask.new(:test_db2) do |t|
  t.test_files = FileList['test/db2_simple_test.rb']
  t.libs << 'test'
end

# Ensure InterSystems CacheDB driver is on your classpath before launching rake
Rake::TestTask.new(:test_cachedb) do | t |
  t.test_files = FileList[ 'test/cachedb_simple_test.rb' ]
  t.libs << 'test'
end

# Ensure that the jTDS driver in on your classpath before launching rake
Rake::TestTask.new(:test_mssql) do | t |
  t.test_files = FileList[ 'test/mssql_simple_test.rb' ]
  t.libs << 'test'
end

# Tests for JDBC adapters that don't require a database.
Rake::TestTask.new(:test_jdbc_adapters) do | t |
  t.test_files = FileList[ 'test/jdbc_adapter/jdbc_sybase_test.rb' ]
  t.libs << 'test'
end

MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", 
  "Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
   "lib/**/*.rake", "src/**/*.java"]

file "Manifest.txt" => :manifest
task :manifest do
  File.open("Manifest.txt", "w") {|f| MANIFEST.each {|n| f << "#{n}\n"} }
end
Rake::Task['manifest'].invoke # Always regen manifest, so Hoe has up-to-date list of files

require File.dirname(__FILE__) + "/lib/jdbc_adapter/version"
begin
  require 'hoe'
  Hoe.new("activerecord-jdbc-adapter", JdbcAdapter::Version::VERSION) do |p|
    p.rubyforge_name = "jruby-extras"
    p.url = "http://jruby-extras.rubyforge.org/activerecord-jdbc-adapter"
    p.author = "Nick Sieger, Ola Bini and JRuby contributors"
    p.email = "nick@nicksieger.com, ola.bini@gmail.com"
    p.summary = "JDBC adapter for ActiveRecord, for use within JRuby on Rails."
    p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
    p.description = p.paragraphs_of('README.txt', 0...1).join("\n\n")
  end.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
rescue LoadError
  puts "You really need Hoe installed to be able to package this gem"
rescue => e
  puts "ignoring error while loading hoe: #{e.to_s}"
end

def rake(*args)
  ruby "-S", "rake", *args
end

%w(test package install_gem release clean).each do |task|
  desc "Run rake #{task} on all available adapters and drivers"
  task "all:#{task}" => task
end

(Dir["drivers/*/Rakefile"] + Dir["adapters/*/Rakefile"]).each do |rakefile|
  dir = File.dirname(rakefile)
  prefix = dir.sub(%r{/}, ':')
  tasks = %w(package install_gem debug_gem clean)
  tasks << "test" if File.directory?(File.join(dir, "test"))
  tasks.each do |task|
    desc "Run rake #{task} on #{dir}"
    task "#{prefix}:#{task}" do
      Dir.chdir(dir) do
        rake task
      end
    end
    task "#{File.dirname(dir)}:#{task}" => "#{prefix}:#{task}"
    task "all:#{task}" => "#{prefix}:#{task}"
  end
  desc "Run rake release on #{dir}"
  task "#{prefix}:release" do
    Dir.chdir(dir) do
      version = nil
      if dir =~ /adapters/
        version = ENV['VERSION']
      else
        Dir["lib/**/*.rb"].each do |file|
          version ||= File.open(file) {|f| f.read =~ /VERSION = "([^"]+)"/ && $1}
        end
      end
      rake "release", "VERSION=#{version}"
    end
  end
  # Only release adapters synchronously with main release. Drivers are versioned
  # according to their JDBC driver versions.
  if dir =~ /adapters/
    task "adapters:release" => "#{prefix}:release"
    task "all:release" => "#{prefix}:release"
  end
end

require 'rake/clean'
CLEAN.include 'derby*', 'test.db.*','test/reports', 'test.sqlite3','lib/**/*.jar','manifest.mf'
