#
#
# 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.
#
#
define hdp2::java::package(
  $size,
  $include_artifact_dir = true
)
{
    
  include hdp2::params
  
  $jdk_bin = $hdp2::params::jdk_bins[$size]
  $artifact_dir = $hdp2::params::artifact_dir
  $jdk_location = $hdp2::params::jdk_location
  $jdk_curl_target = "${artifact_dir}/${jdk_bin}"
 
  
  if ($size == "32") {
    $java_home = $hdp2::params::java32_home
  } else {
    $java_home = $hdp2::params::java64_home
  }
  $java_exec = "${java_home}/bin/java"
  $java_dir = regsubst($java_home,'/[^/]+$','')
   
  if ($include_artifact_dir == true) {
    hdp2::artifact_dir{ "java::package::${name}": }
  }
  
  $curl_cmd = "mkdir -p ${artifact_dir} ; curl -f --retry 10 ${jdk_location}/${jdk_bin} -o ${jdk_curl_target}"
  exec{ "${curl_cmd} ${name}":
    command => $curl_cmd,
    creates => $jdk_curl_target,
    path    => ["/bin","/usr/bin/"],
    unless  => "test -e ${java_exec}"
  }
 
  $install_cmd = "mkdir -p ${java_dir} ; chmod +x ${jdk_curl_target}; cd ${java_dir} ; echo A | ${jdk_curl_target} -noregister > /dev/null 2>&1"
  exec{ "${install_cmd} ${name}":
    command => $install_cmd,
    unless  => "test -e ${java_exec}",
    path    => ["/bin","/usr/bin/"]
  }
 
  file { "${java_exec} ${name}":
  ensure => present
  }   
 
  anchor{"hdp2::java::package::${name}::begin":} -> Exec["${curl_cmd} ${name}"] ->  Exec["${install_cmd} ${name}"] -> File["${java_exec} ${name}"] -> anchor{"hdp2::java::package::${name}::end":}
  if ($include_artifact_dir == true) {
    Anchor["hdp2::java::package::${name}::begin"] -> Hdp2::Artifact_dir["java::package::${name}"] -> Exec["${curl_cmd} ${name}"]
  }
}
