#!/usr/bin/env bash

jruby_install_build_nailgun()
{
  __rvm_cd "${rvm_src_path}/$rvm_ruby_string/tool/nailgun" &&
  case "$rvm_ruby_version" in
    1.2*|1.3*)
      true
      ;;
    *)
      env "${rvm_configure_env[@]}" ./configure --prefix=$rvm_ruby_home
      ;;
  esac &&
  __rvm_make "${rvm_make_flags[@]}"
}

jruby_install_upto17()
{
  __rvm_log_command "ant.jar" "$rvm_ruby_string - #ant jar" __rvm_ant jar || return $?

  [[ -f "${rvm_src_path}/$rvm_ruby_string/bin/jruby" ]] ||
  {
    result=$?
    rvm_error "JRuby reported it was installed successfully, but RVM could not find proper installation,
please check why '${rvm_src_path}/$rvm_ruby_string/bin/jruby' was not created,
maybe here '$rvm_log_path/$rvm_ruby_string/ant.jar.log',
also make sure to report an error here 'https://github.com/jruby/jruby/issues'
about not returning non zero status in case of errors."
    return $result
  }

  if
    (( ${#rvm_configure_flags[@]} ))
  then
    __rvm_log_command "ant.jar.flags" "$rvm_ruby_string - #ant jar ${rvm_configure_flags[*]}" \
      __rvm_ant jar "${rvm_configure_flags[@]}" || return $?
  fi

  __rvm_log_command "ant.cext" "$rvm_ruby_string - #ant cext" __rvm_ant cext "${rvm_configure_flags[@]}" ||
  rvm_warn "cext is known to fail please report here: https://jira.codehaus.org/browse/JRUBY"

  __rvm_version_compare "$rvm_ruby_version" -ge "1.7.0" ||
  __rvm_log_command "nailgun" "$rvm_ruby_string - #nailgun" jruby_install_build_nailgun ||
  return $?
}

jruby_install_post17()
{
  __rvm_log_command "mvn" "$rvm_ruby_string - #mvn" mvn || return $?
  if
    (( ${#rvm_configure_flags[@]} ))
  then
    __rvm_log_command "mvn_flags" "$rvm_ruby_string - #mvn ${rvm_configure_flags[*]}" \
      mvn "${rvm_configure_flags[@]}" ||
      return $?
  fi
}

jruby_install()
{
  __rvm_setup_compile_environment "${rvm_ruby_string}" || return $?

  builtin command -v java > /dev/null ||
  {
    printf "%b" "java must be installed and in PATH for JRuby."
    return 1
  }

  if
    [[ -n "$JRUBY_HOME" ]]
  then
    printf "%b" "You have environment variable JRUBY_HOME set, please unset it before installing/using JRuby."
    return 2
  fi

  __rvm_cd "${rvm_src_path}"

  __rvm_fetch_ruby || return $?

  __rvm_cd "${rvm_src_path}/$rvm_ruby_string"

  __rvm_apply_patches

  if is_jruby_post17 "${rvm_ruby_string}" "${rvm_ruby_version}"
  then jruby_install_post17 || return $?
  else jruby_install_upto17 || return $?
  fi

  __rvm_rm_rf "$rvm_ruby_home" && \mkdir -p "$rvm_ruby_home" &&
  __rvm_log_command "install" "$rvm_ruby_string - #installing to $rvm_ruby_home" \
    __rvm_cp -Rf "${rvm_src_path}/$rvm_ruby_string"/{bin,lib} "$rvm_ruby_home"/ || return $?

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in irb ruby gem
        do
          [[ -f "${binary}" ]] || ln -fs "j${binary}" "${binary}"
        done
      )
      ;;
    *)
      (
        __rvm_cd "$rvm_ruby_home/bin/"
        for binary in jirb jruby jgem
        do
          ln -fs "$binary" "${binary#j}"
        done
      )
      ;;
  esac

  chmod +x "$rvm_ruby_home/bin/jruby"
  __rvm_initial_gemsets_create "$rvm_ruby_home/bin/ruby"

  case ${rvm_ruby_string} in
    jruby-head*|jruby-1.7.*)
      binaries=()
      ;;
    *)
      binaries=(jrubyc jirb_swing jirb jgem rdoc ri spec autospec testrb ast generate_yaml_index.rb rake)
      ;;
  esac
  __rvm_post_install
  __rvm_fetch_ruby_cleanup
}
