forked from cloudfoundry/java-buildpack
-
Notifications
You must be signed in to change notification settings - Fork 2
/
dist_zip_like.rb
123 lines (98 loc) · 3.79 KB
/
dist_zip_like.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# frozen_string_literal: true
# Cloud Foundry Java Buildpack
# Copyright 2013-2020 the original author or authors.
#
# Licensed 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.
require 'java_buildpack/component/base_component'
require 'java_buildpack/container'
require 'java_buildpack/util/find_single_directory'
require 'java_buildpack/util/qualify_path'
require 'java_buildpack/util/start_script'
module JavaBuildpack
module Container
# Encapsulates the detect, compile, and release functionality for selecting a `distZip`-like container.
class DistZipLike < JavaBuildpack::Component::BaseComponent
include JavaBuildpack::Util
# (see JavaBuildpack::Component::BaseComponent#detect)
def detect
supports? ? id : nil
end
# (see JavaBuildpack::Component::BaseComponent#compile)
def compile
start_script(root).chmod 0o755
augment_classpath_content
end
# (see JavaBuildpack::Component::BaseComponent#release)
def release
@droplet.environment_variables.add_environment_variable 'JAVA_OPTS', '$JAVA_OPTS'
[
@droplet.environment_variables.as_env_vars,
@droplet.java_home.as_env_var,
'exec',
qualify_path(start_script(root), @droplet.root)
].flatten.compact.join(' ')
end
protected
# The id of this container
#
# @return [String] the id of this container
def id
raise "Method 'id' must be defined"
end
# The root directory of the application
#
# @return [Pathname] the root directory of the application
def root
find_single_directory || @droplet.root
end
# Whether or not this component supports this application
#
# @return [Boolean] whether or not this component supports this application
def supports?
raise "Method 'supports?' must be defined"
end
private
PATTERN_APP_CLASSPATH = /^declare -r app_classpath=\"(.*)\"$/.freeze
PATTERN_CLASSPATH = /^CLASSPATH=(.*)$/.freeze
private_constant :PATTERN_APP_CLASSPATH, :PATTERN_CLASSPATH
def augment_app_classpath(content)
additional_classpath = (@droplet.additional_libraries + @droplet.root_libraries).sort.map do |library|
"$app_home/#{library.relative_path_from(start_script(root).dirname)}"
end
update_file start_script(root), content,
PATTERN_APP_CLASSPATH, "declare -r app_classpath=\"#{additional_classpath.join(':')}:\\1\""
end
def augment_classpath(content)
additional_classpath = (@droplet.additional_libraries + @droplet.root_libraries).sort.map do |library|
"$APP_HOME/#{library.relative_path_from(root)}"
end
update_file start_script(root), content,
PATTERN_CLASSPATH, "CLASSPATH=#{additional_classpath.join(':')}:\\1"
end
def augment_classpath_content
content = start_script(root).read
if content =~ PATTERN_CLASSPATH
augment_classpath content
elsif content =~ PATTERN_APP_CLASSPATH
augment_app_classpath content
end
end
def update_file(path, content, pattern, replacement)
path.open('w') do |f|
f.write content.gsub pattern, replacement
f.fsync
end
end
end
end
end