24
24
*/
25
25
package jdk .jpackage .internal ;
26
26
27
+ import static jdk .jpackage .internal .ApplicationImageUtils .createWriteAppImageFileAction ;
27
28
import static jdk .jpackage .internal .util .PListWriter .writeArray ;
28
29
import static jdk .jpackage .internal .util .PListWriter .writeBoolean ;
29
30
import static jdk .jpackage .internal .util .PListWriter .writeDict ;
39
40
import java .nio .charset .StandardCharsets ;
40
41
import java .nio .file .Files ;
41
42
import java .nio .file .Path ;
43
+ import java .util .ArrayList ;
42
44
import java .util .HashMap ;
43
45
import java .util .List ;
44
46
import java .util .Map ;
47
+ import java .util .Objects ;
45
48
import java .util .Optional ;
46
49
import javax .xml .stream .XMLOutputFactory ;
47
50
import javax .xml .stream .XMLStreamException ;
51
54
import jdk .jpackage .internal .PackagingPipeline .BuildApplicationTaskID ;
52
55
import jdk .jpackage .internal .PackagingPipeline .CopyAppImageTaskID ;
53
56
import jdk .jpackage .internal .PackagingPipeline .PackageBuildEnv ;
57
+ import jdk .jpackage .internal .PackagingPipeline .PackageTaskID ;
54
58
import jdk .jpackage .internal .PackagingPipeline .PrimaryTaskID ;
55
59
import jdk .jpackage .internal .PackagingPipeline .TaskAction ;
56
60
import jdk .jpackage .internal .PackagingPipeline .TaskContext ;
62
66
import jdk .jpackage .internal .model .MacApplication ;
63
67
import jdk .jpackage .internal .model .MacFileAssociation ;
64
68
import jdk .jpackage .internal .model .Package ;
69
+ import jdk .jpackage .internal .model .PackageType ;
65
70
import jdk .jpackage .internal .model .PackagerException ;
66
71
import jdk .jpackage .internal .model .SigningConfig ;
67
72
import jdk .jpackage .internal .util .function .ThrowingConsumer ;
@@ -81,6 +86,7 @@ enum MacBuildApplicationTaskID implements TaskID {
81
86
82
87
enum MacCopyAppImageTaskID implements TaskID {
83
88
COPY_PACKAGE_FILE ,
89
+ REPLACE_APP_IMAGE_FILE ,
84
90
COPY_SIGN
85
91
}
86
92
@@ -117,6 +123,9 @@ static PackagingPipeline.Builder build(Optional<Package> pkg) {
117
123
.task (MacBuildApplicationTaskID .PACKAGE_FILE )
118
124
.packageAction (MacPackagingPipeline ::writePackageFile )
119
125
.addDependents (BuildApplicationTaskID .CONTENT ).add ()
126
+ .task (MacCopyAppImageTaskID .REPLACE_APP_IMAGE_FILE )
127
+ .addDependent (PrimaryTaskID .COPY_APP_IMAGE )
128
+ .noaction ().add ()
120
129
.task (MacCopyAppImageTaskID .COPY_PACKAGE_FILE )
121
130
.packageAction (MacPackagingPipeline ::writePackageFile )
122
131
.addDependencies (CopyAppImageTaskID .COPY )
@@ -141,17 +150,49 @@ static PackagingPipeline.Builder build(Optional<Package> pkg) {
141
150
.add ();
142
151
143
152
pkg .ifPresent (p -> {
144
- if (p .isRuntimeInstaller () || (p .predefinedAppImage ().isPresent () && ((MacApplication )p .app ()).sign ())) {
153
+ final List <TaskID > disabledTasks = new ArrayList <>();
154
+
155
+ if (p .type () instanceof SignAppImagePackageType ) {
156
+ // This is a phony package signing predefined app image.
157
+ // Don't create ".package" file.
158
+ // Don't copy predefined app image, update it in place.
159
+ // Disable running user script after app image ready.
160
+ // Replace ".jpackage.xml" file.
161
+ // Use app image layout.
162
+ disabledTasks .add (MacCopyAppImageTaskID .COPY_PACKAGE_FILE );
163
+ disabledTasks .add (CopyAppImageTaskID .COPY );
164
+ disabledTasks .add (PackageTaskID .RUN_POST_IMAGE_USER_SCRIPT );
165
+ builder .task (MacCopyAppImageTaskID .REPLACE_APP_IMAGE_FILE ).applicationAction (createWriteAppImageFileAction ()).add ();
166
+ builder .appImageLayoutForPackaging (Package ::appImageLayout );
167
+ } else if (p .isRuntimeInstaller () || (p .predefinedAppImage ().isPresent () && ((MacApplication )p .app ()).sign ())) {
145
168
// If this is a runtime package or a signed predefined app image,
146
169
// don't create ".package" file and don't sign it.
147
- builder .task (MacCopyAppImageTaskID .COPY_PACKAGE_FILE ).noaction ().add ();
148
- builder .task (MacCopyAppImageTaskID .COPY_SIGN ).noaction ().add ();
170
+ disabledTasks .add (MacCopyAppImageTaskID .COPY_PACKAGE_FILE );
171
+ disabledTasks .add (MacCopyAppImageTaskID .COPY_SIGN );
172
+ }
173
+
174
+ for (final var taskId : disabledTasks ) {
175
+ builder .task (taskId ).noaction ().add ();
149
176
}
150
177
});
151
178
152
179
return builder ;
153
180
}
154
181
182
+ enum SignAppImagePackageType implements PackageType {
183
+ VALUE ;
184
+ }
185
+
186
+ static Package createSignAppImagePackage (MacApplication app , BuildEnv env ) {
187
+ if (!app .sign ()) {
188
+ throw new IllegalArgumentException ();
189
+ }
190
+ return toSupplier (() -> {
191
+ return new PackageBuilder (app , SignAppImagePackageType .VALUE ).predefinedAppImage (
192
+ Objects .requireNonNull (env .appImageDir ())).installDir (Path .of ("/foo" )).create ();
193
+ }).get ();
194
+ }
195
+
155
196
private static void copyAppImage (Package pkg , AppImageDesc srcAppImage ,
156
197
AppImageDesc dstAppImage ) throws IOException {
157
198
PackagingPipeline .copyAppImage (srcAppImage , dstAppImage , false /*!((MacApplication)pkg.app()).sign()*/ );
0 commit comments