def create_deployment_descriptor(root_path)

dd = {
  'application' => {
    'root' => "#{root_path.respond_to?(:force_encoding) ? root_path.force_encoding('UTF-8') : root_path}",
  },
}

if fetch(:app_host)
  dd['web'] ||= {}
  dd['web']['host'] = fetch(:app_host)
end

if  fetch(:app_context)
  dd['web'] ||= {}
  dd['web']['context'] = fetch(:app_context)
end

if  fetch(:app_ruby_version)
  dd['ruby'] ||= {}
  dd['ruby']['version'] = fetch(:app_ruby_version)
end

if  fetch(:app_environment)
  dd['environment'] = fetch(:app_environment)
end

if  fetch(:rails_env)
  dd['environment'] ||= {}
  dd['environment']['RACK_ENV'] = fetch(:rails_env)
end

if fetch(:stomp_host)
  dd['stomp'] ||= {}
  dd['stomp']['host'] = fetch(:stomp_host)
end

filename = fetch(:knob_yml_extensions)
if filename
  dd_ext = YAML.load_file(filename)
  dd.merge! dd_ext
end

dd

end

namespace :deploy do

desc "Restart Application"
task :restart do
  on roles(:app), in: :sequence, wait: 5 do
    execute "touch #{fetch(:jboss_home)}/standalone/deployments/#{fetch(:torquebox_app_name, fetch(:application))}-knob.yml.dodeploy"
  end
end

namespace :torquebox do
  desc "Start TorqueBox Server"
  task :start do
    on roles(:app), in: :sequence, wait: 5 do
      info "Starting TorqueBox AS"

      case fetch(:jboss_control_style)
      when 'initd'
        execute "#{fetch(:jboss_init_script)} start"
      when 'binscripts'
        execute "nohup #{fetch(:jboss_home)}/bin/standalone.sh -b #{fetch(:jboss_bind_address)} < /dev/null > /dev/null 2>&1 &"
      when 'runit'
        execute "sv start torquebox"
      when 'upstart'
        execute "service torquebox start"
      end
    end
  end

  desc "Stop TorqueBox Server"
  task :stop do
    on roles(:app), in: :sequence, wait: 5 do
      info "Stopping TorqueBox AS"

      case fetch(:jboss_control_style)
        when 'initd'
          execute "JBOSS_HOME=#{fetch(:jboss_home)} #{fetch(:jboss_init_script)} stop"
        when 'binscripts'
          execute "#{fetch(:jboss_home)}/bin/jboss-cli.sh --connect :shutdown"
        when 'runit'
          execute "sv stop torquebox"
        when 'upstart'
          execute "service torquebox stop"
      end
    end
  end

  desc "Restart TorqueBox Server"
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      case ( fetch(:jboss_control_style) )
        when 'initd'
          info    "Restarting TorqueBox AS"
          execute "JBOSS_HOME=#{fetch(:jboss_home)} #{fetch(:jboss_init_script)} restart"
        when 'binscripts'
          execute "#{fetch(:jboss_home)}/bin/jboss-cli.sh --connect :shutdown"
          execute "nohup #{fetch(:jboss_home)}/bin/standalone.sh -bpublic=#{fetch(:jboss_bind_address)} < /dev/null > /dev/null 2>&1 &"
        when 'runit'
          info    "Restarting TorqueBox AS"
          execute "sv restart torquebox"
        when 'upstart'
          info    "Restarting TorqueBox AS"
          execute "service torquebox restart"
      end
    end
  end

  task :info do
    on roles(:app), in: :sequence, wait: 5 do
      info "torquebox_home........#{fetch(:torquebox_home)}"
      info "jboss_home............#{fetch(:jboss_home)}"
      info "jboss_init_script.....#{fetch(:jboss_init_script)}"
      info "jruby_home............#{fetch(:jruby_home)}"
      info "bundle command........#{fetch(:bundle_cmd)}"
      info "knob.yml.............."
      puts YAML.dump(create_deployment_descriptor(current_path))
    end
  end

  task :check do
    puts "style #{fetch(:jboss_control_style)}"

    on roles(:app), in: :sequence, wait: 5 do
      case fetch(:jboss_control_style)
      when 'initd'
        execute "test -x #{fetch(:jboss_init_script)}"
      when 'runit'
        execute "test -x #{fetch(:jboss_runit_script)}"
      when 'upstart'
        test "[[ -f #{fetch(:jboss_upstart_script)} ]]"
      end

      execute "test -d #{fetch(:jboss_home)}"

      unless %w[initd binscripts runit upstart].include?(fetch(:jboss_control_style))
        error "invalid fetch(:jboss_control_style): #{fetch(:jboss_control_style)}"
      end
    end
  end

  task :deployment_descriptor do
    puts "creating deployment descriptor"

    dd_str  = YAML.dump_stream(create_deployment_descriptor(release_path))
    dd_file = "#{fetch(:jboss_home)}/standalone/deployments/#{fetch(:torquebox_app_name, fetch(:application))}-knob.yml"

    on roles(:app), in: :sequence, wait: 5 do
      dd_io   = StringIO.new(dd_str)
      upload!(dd_io, dd_file)
    end
  end

  task :rollback_deployment_descriptor do
    puts "rolling back deployment descriptor"

    dd_str  = YAML.dump_stream(create_deployment_descriptor(previous_release))
    dd_file = "#{fetch(:jboss_home)}/standalone/deployments/#{fetch(:application)}-knob.yml"

    on roles(:app), in: :sequence, wait: 5 do
      dd_io   = StringIO.new(dd_str)
      upload!(dd_io, dd_file)
    end
  end

  desc "Dump the deployment descriptor"
  task :dump do
    on roles(:app), in: :sequence, wait: 5 do
      dd = create_deployment_descriptor(current_path)
      puts dd
      exit
      puts YAML.dump(create_deployment_descriptor(current_path))
    end
  end
end

end

before 'deploy:check', 'deploy:torquebox:check' after 'deploy:symshared', 'deploy:torquebox:deployment_descriptor' after 'deploy:rollback', 'deploy:torquebox:rollback_deployment_descriptor'