1 /* 2 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.jpackage.internal; 27 28 import java.text.MessageFormat; 29 import java.util.Map; 30 import java.util.ResourceBundle; 31 import java.util.regex.Matcher; 32 import java.util.regex.Pattern; 33 import java.io.File; 34 import java.io.IOException; 35 36 import static jdk.jpackage.internal.StandardBundlerParam.*; 37 38 /** 39 * AbstractImageBundler 40 * 41 * This is the base class for each of the Application Image Bundlers. 42 * 43 * It contains methods and parameters common to all Image Bundlers. 44 * 45 * Application Image Bundlers are created in "create-app-image" mode, 46 * or as an intermeadiate step in "create-installer" mode. 47 * 48 * The concrete implementations are in the platform specific Bundlers. 49 */ 50 public abstract class AbstractImageBundler extends AbstractBundler { 51 52 private final static String JAVA_VERSION_SPEC = 53 "java version \"((\\d+).(\\d+).(\\d+).(\\d+))(-(.*))?(\\+[^\"]*)?\""; 54 55 private static final ResourceBundle I18N = ResourceBundle.getBundle( 56 "jdk.jpackage.internal.resources.MainResources"); 57 58 public void imageBundleValidation(Map<String, ? super Object> p) 59 throws ConfigException { 60 StandardBundlerParam.validateMainClassInfoFromAppResources(p); 61 62 } 63 64 public static void extractFlagsFromVersion( 65 Map<String, ? super Object> params, String versionOutput) { 66 Pattern bitArchPattern = Pattern.compile("(\\d*)[- ]?[bB]it"); 67 Matcher matcher = bitArchPattern.matcher(versionOutput); 68 if (matcher.find()) { 69 params.put(".runtime.bit-arch", matcher.group(1)); 70 } else { 71 // presume 32 bit on no match 72 params.put(".runtime.bit-arch", "32"); 73 } 74 75 Pattern oldVersionMatcher = Pattern.compile( 76 "java version \"((\\d+.(\\d+).\\d+)(_(\\d+)))?(-(.*))?\""); 77 matcher = oldVersionMatcher.matcher(versionOutput); 78 if (matcher.find()) { 79 params.put(".runtime.version", matcher.group(1)); 80 params.put(".runtime.version.release", matcher.group(2)); 81 params.put(".runtime.version.major", matcher.group(3)); 82 params.put(".runtime.version.update", matcher.group(5)); 83 params.put(".runtime.version.minor", matcher.group(5)); 84 params.put(".runtime.version.security", matcher.group(5)); 85 params.put(".runtime.version.patch", "0"); 86 params.put(".runtime.version.modifiers", matcher.group(7)); 87 } else { 88 Pattern newVersionMatcher = Pattern.compile(JAVA_VERSION_SPEC); 89 matcher = newVersionMatcher.matcher(versionOutput); 90 if (matcher.find()) { 91 params.put(".runtime.version", matcher.group(1)); 92 params.put(".runtime.version.release", matcher.group(1)); 93 params.put(".runtime.version.major", matcher.group(2)); 94 params.put(".runtime.version.update", matcher.group(3)); 95 params.put(".runtime.version.minor", matcher.group(3)); 96 params.put(".runtime.version.security", matcher.group(4)); 97 params.put(".runtime.version.patch", matcher.group(5)); 98 params.put(".runtime.version.modifiers", matcher.group(7)); 99 } else { 100 params.put(".runtime.version", ""); 101 params.put(".runtime.version.release", ""); 102 params.put(".runtime.version.major", ""); 103 params.put(".runtime.version.update", ""); 104 params.put(".runtime.version.minor", ""); 105 params.put(".runtime.version.security", ""); 106 params.put(".runtime.version.patch", ""); 107 params.put(".runtime.version.modifiers", ""); 108 } 109 } 110 } 111 112 protected File createRoot(Map<String, ? super Object> p, 113 File outputDirectory, boolean dependentTask, String name) 114 throws PackagerException { 115 if (!outputDirectory.isDirectory() && !outputDirectory.mkdirs()) { 116 throw new RuntimeException(MessageFormat.format( 117 I18N.getString("error.cannot-create-output-dir"), 118 outputDirectory.getAbsolutePath())); 119 } 120 if (!outputDirectory.canWrite()) { 121 throw new RuntimeException(MessageFormat.format( 122 I18N.getString("error.cannot-write-to-output-dir"), 123 outputDirectory.getAbsolutePath())); 124 } 125 if (!dependentTask) { 126 Log.verbose(MessageFormat.format( 127 I18N.getString("message.creating-app-bundle"), 128 name, outputDirectory.getAbsolutePath())); 129 } 130 131 // Create directory structure 132 File rootDirectory = new File(outputDirectory, name); 133 134 if (rootDirectory.exists()) { 135 throw new PackagerException("error.root-exists", 136 rootDirectory.getAbsolutePath()); 137 } 138 139 rootDirectory.mkdirs(); 140 141 return rootDirectory; 142 } 143 144 }