8212091: Move jpackage native code under platform specific folders and files JDK-8200758-branch
authorherrick
Sun, 17 Feb 2019 14:08:26 -0500
branchJDK-8200758-branch
changeset 57194 9d5fccd97421
parent 57193 fab566567af9
child 57197 7fc5a57945d2
8212091: Move jpackage native code under platform specific folders and files Submitten-by: almatvee Reviewed-by: herrick, ihse
src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp
src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.h
src/jdk.jpackage/linux/native/libapplauncher/PlatformDefs.h
src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.h
src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm
src/jdk.jpackage/macosx/native/libapplauncher/PlatformDefs.h
src/jdk.jpackage/share/native/libapplauncher/FileAttributes.h
src/jdk.jpackage/share/native/libapplauncher/FilePath.cpp
src/jdk.jpackage/share/native/libapplauncher/FilePath.h
src/jdk.jpackage/share/native/libapplauncher/GenericPlatform.cpp
src/jdk.jpackage/share/native/libapplauncher/GenericPlatform.h
src/jdk.jpackage/share/native/libapplauncher/Helpers.cpp
src/jdk.jpackage/share/native/libapplauncher/IniFile.cpp
src/jdk.jpackage/share/native/libapplauncher/JavaTypes.cpp
src/jdk.jpackage/share/native/libapplauncher/JavaTypes.h
src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.cpp
src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.h
src/jdk.jpackage/share/native/libapplauncher/Library.cpp
src/jdk.jpackage/share/native/libapplauncher/Library.h
src/jdk.jpackage/share/native/libapplauncher/LinuxPlatform.cpp
src/jdk.jpackage/share/native/libapplauncher/LinuxPlatform.h
src/jdk.jpackage/share/native/libapplauncher/Lock.cpp
src/jdk.jpackage/share/native/libapplauncher/Lock.h
src/jdk.jpackage/share/native/libapplauncher/MacPlatform.h
src/jdk.jpackage/share/native/libapplauncher/Messages.cpp
src/jdk.jpackage/share/native/libapplauncher/OrderedMap.h
src/jdk.jpackage/share/native/libapplauncher/Package.cpp
src/jdk.jpackage/share/native/libapplauncher/Platform.cpp
src/jdk.jpackage/share/native/libapplauncher/Platform.h
src/jdk.jpackage/share/native/libapplauncher/PlatformString.cpp
src/jdk.jpackage/share/native/libapplauncher/PlatformString.h
src/jdk.jpackage/share/native/libapplauncher/PlatformThread.cpp
src/jdk.jpackage/share/native/libapplauncher/PlatformThread.h
src/jdk.jpackage/share/native/libapplauncher/PosixPlatform.cpp
src/jdk.jpackage/share/native/libapplauncher/PosixPlatform.h
src/jdk.jpackage/share/native/libapplauncher/Properties.h
src/jdk.jpackage/share/native/libapplauncher/PropertyFile.cpp
src/jdk.jpackage/share/native/libapplauncher/PropertyFile.h
src/jdk.jpackage/share/native/libapplauncher/WindowsPlatform.cpp
src/jdk.jpackage/share/native/libapplauncher/WindowsPlatform.h
src/jdk.jpackage/share/native/libapplauncher/main.cpp
src/jdk.jpackage/unix/native/libapplauncher/FileAttribute.h
src/jdk.jpackage/unix/native/libapplauncher/FileAttributes.cpp
src/jdk.jpackage/unix/native/libapplauncher/FilePath.cpp
src/jdk.jpackage/unix/native/libapplauncher/PosixPlatform.cpp
src/jdk.jpackage/unix/native/libapplauncher/PosixPlatform.h
src/jdk.jpackage/windows/native/libapplauncher/DllMain.cpp
src/jdk.jpackage/windows/native/libapplauncher/FileAttribute.h
src/jdk.jpackage/windows/native/libapplauncher/FilePath.cpp
src/jdk.jpackage/windows/native/libapplauncher/PlatformDefs.h
src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.cpp
src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,1087 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "Platform.h"
+
+#include "JavaVirtualMachine.h"
+#include "LinuxPlatform.h"
+#include "PlatformString.h"
+#include "IniFile.h"
+#include "Helpers.h"
+#include "FilePath.h"
+
+#include <stdlib.h>
+#include <pwd.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <signal.h>
+
+#define LINUX_JPACKAGE_TMP_DIR "/.java/jpackage/tmp"
+
+TString GetEnv(const TString &name) {
+    TString result;
+
+    char *value = ::getenv((TCHAR*) name.c_str());
+
+    if (value != NULL) {
+        result = value;
+    }
+
+    return result;
+}
+
+LinuxPlatform::LinuxPlatform(void) : Platform(),
+PosixPlatform() {
+    FMainThread = pthread_self();
+}
+
+LinuxPlatform::~LinuxPlatform(void) {
+}
+
+TString LinuxPlatform::GetPackageAppDirectory() {
+    return FilePath::IncludeTrailingSeparator(
+            GetPackageRootDirectory()) + _T("app");
+}
+
+TString LinuxPlatform::GetAppName() {
+    TString result = GetModuleFileName();
+    result = FilePath::ExtractFileName(result);
+    return result;
+}
+
+TString LinuxPlatform::GetPackageLauncherDirectory() {
+    return GetPackageRootDirectory();
+}
+
+TString LinuxPlatform::GetPackageRuntimeBinDirectory() {
+    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("runtime/bin");
+}
+
+void LinuxPlatform::ShowMessage(TString title, TString description) {
+    printf("%s %s\n", PlatformString(title).toPlatformString(),
+            PlatformString(description).toPlatformString());
+    fflush(stdout);
+}
+
+void LinuxPlatform::ShowMessage(TString description) {
+    TString appname = GetModuleFileName();
+    appname = FilePath::ExtractFileName(appname);
+    ShowMessage(PlatformString(appname).toPlatformString(),
+            PlatformString(description).toPlatformString());
+}
+
+TCHAR* LinuxPlatform::ConvertStringToFileSystemString(TCHAR* Source,
+        bool &release) {
+    // Not Implemented.
+    return NULL;
+}
+
+TCHAR* LinuxPlatform::ConvertFileSystemStringToString(TCHAR* Source,
+        bool &release) {
+    // Not Implemented.
+    return NULL;
+}
+
+TString LinuxPlatform::GetModuleFileName() {
+    ssize_t len = 0;
+    TString result;
+    DynamicBuffer<TCHAR> buffer(MAX_PATH);
+    if (buffer.GetData() == NULL) {
+        return result;
+    }
+
+    if ((len = readlink("/proc/self/exe", buffer.GetData(),
+            MAX_PATH - 1)) != -1) {
+        buffer[len] = '\0';
+        result = buffer.GetData();
+    }
+
+    return result;
+}
+
+void LinuxPlatform::SetCurrentDirectory(TString Value) {
+    chdir(PlatformString(Value).toPlatformString());
+}
+
+TString LinuxPlatform::GetPackageRootDirectory() {
+    TString filename = GetModuleFileName();
+    return FilePath::ExtractFilePath(filename);
+}
+
+TString LinuxPlatform::GetAppDataDirectory() {
+    TString result;
+    TString home = GetEnv(_T("HOME"));
+
+    if (home.empty() == false) {
+        result += FilePath::IncludeTrailingSeparator(home) + _T(".local");
+    }
+
+    return result;
+}
+
+ISectionalPropertyContainer* LinuxPlatform::GetConfigFile(TString FileName) {
+    IniFile *result = new IniFile();
+    if (result == NULL) {
+        return NULL;
+    }
+
+    if (result->LoadFromFile(FileName) == false) {
+        // New property file format was not found,
+        // attempt to load old property file format.
+        Helpers::LoadOldConfigFile(FileName, result);
+    }
+
+    return result;
+}
+
+TString LinuxPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
+    TString result = FilePath::IncludeTrailingSeparator(RuntimePath) +
+            "lib/libjli.so";
+
+    if (FilePath::FileExists(result) == false) {
+        result = FilePath::IncludeTrailingSeparator(RuntimePath) +
+                "lib/jli/libjli.so";
+        if (FilePath::FileExists(result) == false) {
+            printf("Cannot find libjli.so!");
+        }
+    }
+
+    return result;
+}
+
+bool LinuxPlatform::IsMainThread() {
+    bool result = (FMainThread == pthread_self());
+    return result;
+}
+
+TString LinuxPlatform::getTmpDirString() {
+    return TString(LINUX_JPACKAGE_TMP_DIR);
+}
+
+TPlatformNumber LinuxPlatform::GetMemorySize() {
+    long pages = sysconf(_SC_PHYS_PAGES);
+    long page_size = sysconf(_SC_PAGE_SIZE);
+    TPlatformNumber result = pages * page_size;
+    result = result / 1048576; // Convert from bytes to megabytes.
+    return result;
+}
+
+void PosixProcess::Cleanup() {
+    if (FOutputHandle != 0) {
+        close(FOutputHandle);
+        FOutputHandle = 0;
+    }
+
+    if (FInputHandle != 0) {
+        close(FInputHandle);
+        FInputHandle = 0;
+    }
+}
+
+#define PIPE_READ 0
+#define PIPE_WRITE 1
+
+bool PosixProcess::Execute(const TString Application,
+        const std::vector<TString> Arguments, bool AWait) {
+    bool result = false;
+
+    if (FRunning == false) {
+        FRunning = true;
+
+        int handles[2];
+
+        if (pipe(handles) == -1) {
+            return false;
+        }
+
+        struct sigaction sa;
+        sa.sa_handler = SIG_IGN;
+        sigemptyset(&sa.sa_mask);
+        sa.sa_flags = 0;
+
+        FChildPID = fork();
+
+        // PID returned by vfork is 0 for the child process and the
+        // PID of the child process for the parent.
+        if (FChildPID == -1) {
+            // Error
+            TString message = PlatformString::Format(
+                    _T("Error: Unable to create process %s"),
+                    Application.data());
+            throw Exception(message);
+        } else if (FChildPID == 0) {
+            Cleanup();
+            TString command = Application;
+
+            for (std::vector<TString>::const_iterator iterator =
+                    Arguments.begin(); iterator != Arguments.end();
+                    iterator++) {
+                command += TString(_T(" ")) + *iterator;
+            }
+#ifdef DEBUG
+            printf("%s\n", command.data());
+#endif // DEBUG
+
+            dup2(handles[PIPE_READ], STDIN_FILENO);
+            dup2(handles[PIPE_WRITE], STDOUT_FILENO);
+
+            close(handles[PIPE_READ]);
+            close(handles[PIPE_WRITE]);
+
+            execl("/bin/sh", "sh", "-c", command.data(), (char *) 0);
+
+            _exit(127);
+        } else {
+            FOutputHandle = handles[PIPE_READ];
+            FInputHandle = handles[PIPE_WRITE];
+
+            if (AWait == true) {
+                ReadOutput();
+                Wait();
+                Cleanup();
+                FRunning = false;
+                result = true;
+            } else {
+                result = true;
+            }
+        }
+    }
+
+    return result;
+}
+
+
+//----------------------------------------------------------------------------
+
+#ifndef __UNIX_JPACKAGE_PLATFORM__
+#define __UNIX_JPACKAGE_PLATFORM__
+
+/** Provide an abstraction for difference in the platform APIs,
+     e.g. string manipulation functions, etc. */
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/stat.h>
+
+#define TCHAR char
+
+#define _T(x) x
+
+#define JPACKAGE_MULTIBYTE_SNPRINTF snprintf
+
+#define JPACKAGE_SNPRINTF(buffer, sizeOfBuffer, count, format, ...) \
+    snprintf((buffer), (count), (format), __VA_ARGS__)
+
+#define JPACKAGE_PRINTF(format, ...) \
+    printf((format), ##__VA_ARGS__)
+
+#define JPACKAGE_FPRINTF(dest, format, ...) \
+    fprintf((dest), (format), __VA_ARGS__)
+
+#define JPACKAGE_SSCANF(buf, format, ...) \
+    sscanf((buf), (format), __VA_ARGS__)
+
+#define JPACKAGE_STRDUP(strSource) \
+    strdup((strSource))
+
+//return "error code" (like on Windows)
+
+static int JPACKAGE_STRNCPY(char *strDest, size_t numberOfElements,
+        const char *strSource, size_t count) {
+    char *s = strncpy(strDest, strSource, count);
+    // Duplicate behavior of the Windows' _tcsncpy_s() by adding a NULL
+    // terminator at the end of the string.
+    if (count < numberOfElements) {
+        s[count] = '\0';
+    } else {
+        s[numberOfElements - 1] = '\0';
+    }
+    return (s == strDest) ? 0 : 1;
+}
+
+#define JPACKAGE_STRICMP(x, y) \
+    strcasecmp((x), (y))
+
+#define JPACKAGE_STRNICMP(x, y, cnt) \
+    strncasecmp((x), (y), (cnt))
+
+#define JPACKAGE_STRNCMP(x, y, cnt) \
+    strncmp((x), (y), (cnt))
+
+#define JPACKAGE_STRLEN(x) \
+    strlen((x))
+
+#define JPACKAGE_STRSTR(x, y) \
+    strstr((x), (y))
+
+#define JPACKAGE_STRCHR(x, y) \
+    strchr((x), (y))
+
+#define JPACKAGE_STRRCHR(x, y) \
+    strrchr((x), (y))
+
+#define JPACKAGE_STRPBRK(x, y) \
+    strpbrk((x), (y))
+
+#define JPACKAGE_GETENV(x) \
+    getenv((x))
+
+#define JPACKAGE_PUTENV(x) \
+    putenv((x))
+
+#define JPACKAGE_STRCMP(x, y) \
+    strcmp((x), (y))
+
+#define JPACKAGE_STRCPY(x, y) \
+    strcpy((x), (y))
+
+#define JPACKAGE_STRCAT(x, y) \
+    strcat((x), (y))
+
+#define JPACKAGE_ATOI(x) \
+    atoi((x))
+
+#define JPACKAGE_FOPEN(x, y) \
+    fopen((x), (y))
+
+#define JPACKAGE_FGETS(x, y, z) \
+    fgets((x), (y), (z))
+
+#define JPACKAGE_REMOVE(x) \
+    remove((x))
+
+#define JPACKAGE_SPAWNV(mode, cmd, args) \
+    spawnv((mode), (cmd), (args))
+
+#define JPACKAGE_ISDIGIT(ch) isdigit(ch)
+
+// for non-unicode, just return the input string for
+// the following 2 conversions
+#define JPACKAGE_NEW_MULTIBYTE(message) message
+
+#define JPACKAGE_NEW_FROM_MULTIBYTE(message) message
+
+// for non-unicode, no-op for the relase operation
+// since there is no memory allocated for the
+// string conversions
+#define JPACKAGE_RELEASE_MULTIBYTE(tmpMBCS)
+
+#define JPACKAGE_RELEASE_FROM_MULTIBYTE(tmpMBCS)
+
+// The size will be used for converting from 1 byte to 1 byte encoding.
+// Ensure have space for zero-terminator.
+#define JPACKAGE_GET_SIZE_FOR_ENCODING(message, theLength) (theLength + 1)
+
+#endif
+#define xmlTagType    0
+#define xmlPCDataType 1
+
+typedef struct _xmlNode XMLNode;
+typedef struct _xmlAttribute XMLAttribute;
+
+struct _xmlNode {
+    int _type; // Type of node: tag, pcdata, cdate
+    TCHAR* _name; // Contents of node
+    XMLNode* _next; // Next node at same level
+    XMLNode* _sub; // First sub-node
+    XMLAttribute* _attributes; // List of attributes
+};
+
+struct _xmlAttribute {
+    TCHAR* _name; // Name of attribute
+    TCHAR* _value; // Value of attribute
+    XMLAttribute* _next; // Next attribute for this tag
+};
+
+// Public interface
+static void RemoveNonAsciiUTF8FromBuffer(char *buf);
+XMLNode* ParseXMLDocument(TCHAR* buf);
+void FreeXMLDocument(XMLNode* root);
+
+// Utility methods for parsing document
+XMLNode* FindXMLChild(XMLNode* root, const TCHAR* name);
+TCHAR* FindXMLAttribute(XMLAttribute* attr, const TCHAR* name);
+
+// Debugging
+void PrintXMLDocument(XMLNode* node, int indt);
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <setjmp.h>
+#include <stdlib.h>
+#include <wctype.h>
+
+#define JWS_assert(s, msg)      \
+    if (!(s)) { Abort(msg); }
+
+
+// Internal declarations
+static XMLNode* ParseXMLElement(void);
+static XMLAttribute* ParseXMLAttribute(void);
+static TCHAR* SkipWhiteSpace(TCHAR *p);
+static TCHAR* SkipXMLName(TCHAR *p);
+static TCHAR* SkipXMLComment(TCHAR *p);
+static TCHAR* SkipXMLDocType(TCHAR *p);
+static TCHAR* SkipXMLProlog(TCHAR *p);
+static TCHAR* SkipPCData(TCHAR *p);
+static int IsPCData(TCHAR *p);
+static void ConvertBuiltInEntities(TCHAR* p);
+static void SetToken(int type, TCHAR* start, TCHAR* end);
+static void GetNextToken(void);
+static XMLNode* CreateXMLNode(int type, TCHAR* name);
+static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value);
+static XMLNode* ParseXMLElement(void);
+static XMLAttribute* ParseXMLAttribute(void);
+static void FreeXMLAttribute(XMLAttribute* attr);
+static void PrintXMLAttributes(XMLAttribute* attr);
+static void indent(int indt);
+
+static jmp_buf jmpbuf;
+static XMLNode* root_node = NULL;
+
+/** definition of error codes for setjmp/longjmp,
+ *  that can be handled in ParseXMLDocument()
+ */
+#define JMP_NO_ERROR     0
+#define JMP_OUT_OF_RANGE 1
+
+#define NEXT_CHAR(p) { \
+    if (*p != 0) { \
+        p++; \
+    } else { \
+        longjmp(jmpbuf, JMP_OUT_OF_RANGE); \
+    } \
+}
+#define NEXT_CHAR_OR_BREAK(p) { \
+    if (*p != 0) { \
+        p++; \
+    } else { \
+        break; \
+    } \
+}
+#define NEXT_CHAR_OR_RETURN(p) { \
+    if (*p != 0) { \
+        p++; \
+    } else { \
+        return; \
+    } \
+}
+#define SKIP_CHARS(p,n) { \
+    int i; \
+    for (i = 0; i < (n); i++) { \
+        if (*p != 0) { \
+            p++; \
+        } else { \
+           longjmp(jmpbuf, JMP_OUT_OF_RANGE); \
+        } \
+    } \
+}
+#define SKIP_CHARS_OR_BREAK(p,n) { \
+    int i; \
+    for (i = 0; i < (n); i++) { \
+        if (*p != 0) { \
+            p++; \
+        } else { \
+            break; \
+        } \
+    } \
+    if (i < (n)) { \
+        break; \
+    } \
+}
+
+/** Iterates through the null-terminated buffer (i.e., C string) and
+ *  replaces all UTF-8 encoded character >255 with 255
+ *
+ *  UTF-8 encoding:
+ *
+ *   Range A:  0x0000 - 0x007F
+ *                               0 | bits 0 - 7
+ *   Range B : 0x0080 - 0x07FF  :
+ *                               110 | bits 6 - 10
+ *                               10  | bits 0 - 5
+ *   Range C : 0x0800 - 0xFFFF  :
+ *                               1110 | bits 12-15
+ *                               10   | bits  6-11
+ *                               10   | bits  0-5
+ */
+static void RemoveNonAsciiUTF8FromBuffer(char *buf) {
+    char* p;
+    char* q;
+    char c;
+    p = q = buf;
+    // We are not using NEXT_CHAR() to check if *q is NULL, as q is output
+    // location and offset for q is smaller than for p.
+    while (*p != '\0') {
+        c = *p;
+        if ((c & 0x80) == 0) {
+            /* Range A */
+            *q++ = *p;
+            NEXT_CHAR(p);
+        } else if ((c & 0xE0) == 0xC0) {
+            /* Range B */
+            *q++ = (char) 0xFF;
+            NEXT_CHAR(p);
+            NEXT_CHAR_OR_BREAK(p);
+        } else {
+            /* Range C */
+            *q++ = (char) 0xFF;
+            NEXT_CHAR(p);
+            SKIP_CHARS_OR_BREAK(p, 2);
+        }
+    }
+    /* Null terminate string */
+    *q = '\0';
+}
+
+static TCHAR* SkipWhiteSpace(TCHAR *p) {
+    if (p != NULL) {
+        while (iswspace(*p))
+            NEXT_CHAR_OR_BREAK(p);
+    }
+    return p;
+}
+
+static TCHAR* SkipXMLName(TCHAR *p) {
+    TCHAR c = *p;
+    /* Check if start of token */
+    if (('a' <= c && c <= 'z') ||
+            ('A' <= c && c <= 'Z') ||
+            c == '_' || c == ':') {
+
+        while (('a' <= c && c <= 'z') ||
+                ('A' <= c && c <= 'Z') ||
+                ('0' <= c && c <= '9') ||
+                c == '_' || c == ':' || c == '.' || c == '-') {
+            NEXT_CHAR(p);
+            c = *p;
+            if (c == '\0') break;
+        }
+    }
+    return p;
+}
+
+static TCHAR* SkipXMLComment(TCHAR *p) {
+    if (p != NULL) {
+        if (JPACKAGE_STRNCMP(p, _T("<!--"), 4) == 0) {
+            SKIP_CHARS(p, 4);
+            do {
+                if (JPACKAGE_STRNCMP(p, _T("-->"), 3) == 0) {
+                    SKIP_CHARS(p, 3);
+                    return p;
+                }
+                NEXT_CHAR(p);
+            } while (*p != '\0');
+        }
+    }
+    return p;
+}
+
+static TCHAR* SkipXMLDocType(TCHAR *p) {
+    if (p != NULL) {
+        if (JPACKAGE_STRNCMP(p, _T("<!"), 2) == 0) {
+            SKIP_CHARS(p, 2);
+            while (*p != '\0') {
+                if (*p == '>') {
+                    NEXT_CHAR(p);
+                    return p;
+                }
+                NEXT_CHAR(p);
+            }
+        }
+    }
+    return p;
+}
+
+static TCHAR* SkipXMLProlog(TCHAR *p) {
+    if (p != NULL) {
+        if (JPACKAGE_STRNCMP(p, _T("<?"), 2) == 0) {
+            SKIP_CHARS(p, 2);
+            do {
+                if (JPACKAGE_STRNCMP(p, _T("?>"), 2) == 0) {
+                    SKIP_CHARS(p, 2);
+                    return p;
+                }
+                NEXT_CHAR(p);
+            } while (*p != '\0');
+        }
+    }
+    return p;
+}
+
+/* Search for the built-in XML entities:
+ * &amp; (&), &lt; (<), &gt; (>), &apos; ('), and &quote(")
+ * and convert them to a real TCHARacter
+ */
+static void ConvertBuiltInEntities(TCHAR* p) {
+    TCHAR* q;
+    q = p;
+    // We are not using NEXT_CHAR() to check if *q is NULL,
+    // as q is output location and offset for q is smaller than for p.
+    while (*p) {
+        if (IsPCData(p)) {
+            /* dont convert &xxx values within PData */
+            TCHAR *end;
+            end = SkipPCData(p);
+            while (p < end) {
+                *q++ = *p;
+                NEXT_CHAR(p);
+            }
+        } else {
+            if (JPACKAGE_STRNCMP(p, _T("&amp;"), 5) == 0) {
+                *q++ = '&';
+                SKIP_CHARS(p, 5);
+            } else if (JPACKAGE_STRNCMP(p, _T("&lt;"), 4) == 0) {
+                *q = '<';
+                SKIP_CHARS(p, 4);
+            } else if (JPACKAGE_STRNCMP(p, _T("&gt;"), 4) == 0) {
+                *q = '>';
+                SKIP_CHARS(p, 4);
+            } else if (JPACKAGE_STRNCMP(p, _T("&apos;"), 6) == 0) {
+                *q = '\'';
+                SKIP_CHARS(p, 6);
+            } else if (JPACKAGE_STRNCMP(p, _T("&quote;"), 7) == 0) {
+                *q = '\"';
+                SKIP_CHARS(p, 7);
+            } else {
+                *q++ = *p;
+                NEXT_CHAR(p);
+            }
+        }
+    }
+    *q = '\0';
+}
+
+/* ------------------------------------------------------------- */
+/* XML tokenizer */
+
+#define TOKEN_UNKNOWN             0
+#define TOKEN_BEGIN_TAG           1  /* <tag */
+#define TOKEN_END_TAG             2  /* </tag */
+#define TOKEN_CLOSE_BRACKET       3  /* >  */
+#define TOKEN_EMPTY_CLOSE_BRACKET 4  /* /> */
+#define TOKEN_PCDATA              5  /* pcdata */
+#define TOKEN_CDATA               6  /* cdata */
+#define TOKEN_EOF                 7
+
+static TCHAR* CurPos = NULL;
+static TCHAR* CurTokenName = NULL;
+static int CurTokenType;
+static int MaxTokenSize = -1;
+
+/* Copy token from buffer to Token variable */
+static void SetToken(int type, TCHAR* start, TCHAR* end) {
+    int len = end - start;
+    if (len > MaxTokenSize) {
+        if (CurTokenName != NULL) free(CurTokenName);
+        CurTokenName = (TCHAR *) malloc((len + 1) * sizeof (TCHAR));
+        if (CurTokenName == NULL) {
+            return;
+        }
+        MaxTokenSize = len;
+    }
+
+    CurTokenType = type;
+    JPACKAGE_STRNCPY(CurTokenName, len + 1, start, len);
+    CurTokenName[len] = '\0';
+}
+
+/* Skip XML comments, doctypes, and prolog tags */
+static TCHAR* SkipFilling(void) {
+    TCHAR *q = CurPos;
+
+    /* Skip white space and comment sections */
+    do {
+        q = CurPos;
+        CurPos = SkipWhiteSpace(CurPos);
+        CurPos = SkipXMLComment(CurPos); /* Must be called befor DocTypes */
+        CurPos = SkipXMLDocType(CurPos); /* <! ... > directives */
+        CurPos = SkipXMLProlog(CurPos); /* <? ... ?> directives */
+    } while (CurPos != q);
+
+    return CurPos;
+}
+
+/* Parses next token and initializes the global token variables above
+   The tokennizer automatically skips comments (<!-- comment -->) and
+   <! ... > directives.
+ */
+static void GetNextToken(void) {
+    TCHAR *p, *q;
+
+    /* Skip white space and comment sections */
+    p = SkipFilling();
+
+    if (p == NULL || *p == '\0') {
+        CurTokenType = TOKEN_EOF;
+        return;
+    } else if (p[0] == '<' && p[1] == '/') {
+        /* TOKEN_END_TAG */
+        q = SkipXMLName(p + 2);
+        SetToken(TOKEN_END_TAG, p + 2, q);
+        p = q;
+    } else if (*p == '<') {
+        /* TOKEN_BEGIN_TAG */
+        q = SkipXMLName(p + 1);
+        SetToken(TOKEN_BEGIN_TAG, p + 1, q);
+        p = q;
+    } else if (p[0] == '>') {
+        CurTokenType = TOKEN_CLOSE_BRACKET;
+        NEXT_CHAR(p);
+    } else if (p[0] == '/' && p[1] == '>') {
+        CurTokenType = TOKEN_EMPTY_CLOSE_BRACKET;
+        SKIP_CHARS(p, 2);
+    } else {
+        /* Search for end of data */
+        q = p + 1;
+        while (*q && *q != '<') {
+            if (IsPCData(q)) {
+                q = SkipPCData(q);
+            } else {
+                NEXT_CHAR(q);
+            }
+        }
+        SetToken(TOKEN_PCDATA, p, q);
+        /* Convert all entities inside token */
+        ConvertBuiltInEntities(CurTokenName);
+        p = q;
+    }
+    /* Advance pointer to beginning of next token */
+    CurPos = p;
+}
+
+static XMLNode* CreateXMLNode(int type, TCHAR* name) {
+    XMLNode* node;
+    node = (XMLNode*) malloc(sizeof (XMLNode));
+    if (node == NULL) {
+        return NULL;
+    }
+    node->_type = type;
+    node->_name = name;
+    node->_next = NULL;
+    node->_sub = NULL;
+    node->_attributes = NULL;
+    return node;
+}
+
+static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value) {
+    XMLAttribute* attr;
+    attr = (XMLAttribute*) malloc(sizeof (XMLAttribute));
+    if (attr == NULL) {
+        return NULL;
+    }
+    attr->_name = name;
+    attr->_value = value;
+    attr->_next = NULL;
+    return attr;
+}
+
+XMLNode* ParseXMLDocument(TCHAR* buf) {
+    XMLNode* root;
+    int err_code = setjmp(jmpbuf);
+    switch (err_code) {
+        case JMP_NO_ERROR:
+#ifndef _UNICODE
+            /* Remove UTF-8 encoding from buffer */
+            RemoveNonAsciiUTF8FromBuffer(buf);
+#endif
+
+            /* Get first Token */
+            CurPos = buf;
+            GetNextToken();
+
+            /* Parse document*/
+            root = ParseXMLElement();
+            break;
+        case JMP_OUT_OF_RANGE:
+            /* cleanup: */
+            if (root_node != NULL) {
+                FreeXMLDocument(root_node);
+                root_node = NULL;
+            }
+            if (CurTokenName != NULL) free(CurTokenName);
+            fprintf(stderr, "Error during parsing jnlp file...\n");
+            exit(-1);
+            break;
+        default:
+            root = NULL;
+            break;
+    }
+
+    return root;
+}
+
+static XMLNode* ParseXMLElement(void) {
+    XMLNode* node = NULL;
+    XMLNode* subnode = NULL;
+    XMLNode* nextnode = NULL;
+    XMLAttribute* attr = NULL;
+
+    if (CurTokenType == TOKEN_BEGIN_TAG) {
+
+        /* Create node for new element tag */
+        node = CreateXMLNode(xmlTagType, JPACKAGE_STRDUP(CurTokenName));
+        /* We need to save root node pointer to be able to cleanup
+           if an error happens during parsing */
+        if (!root_node) {
+            root_node = node;
+        }
+        /* Parse attributes. This section eats a all input until
+           EOF, a > or a /> */
+        attr = ParseXMLAttribute();
+        while (attr != NULL) {
+            attr->_next = node->_attributes;
+            node->_attributes = attr;
+            attr = ParseXMLAttribute();
+        }
+
+        /* This will eihter be a TOKEN_EOF, TOKEN_CLOSE_BRACKET, or a
+         * TOKEN_EMPTY_CLOSE_BRACKET */
+        GetNextToken();
+
+        /* Skip until '>', '/>' or EOF. This should really be an error, */
+        /* but we are loose */
+        //        if(CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET ||
+        //               CurTokenType == TOKEN_CLOSE_BRACKET ||
+        //               CurTokenType  == TOKEN_EOF) {
+        //            println("XML Parsing error: wrong kind of token found");
+        //            return NULL;
+        //        }
+
+        if (CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET) {
+            GetNextToken();
+            /* We are done with the sublevel - fall through to continue */
+            /* parsing tags at the same level */
+        } else if (CurTokenType == TOKEN_CLOSE_BRACKET) {
+            GetNextToken();
+
+            /* Parse until end tag if found */
+            node->_sub = ParseXMLElement();
+
+            if (CurTokenType == TOKEN_END_TAG) {
+                /* Find closing bracket '>' for end tag */
+                do {
+                    GetNextToken();
+                } while (CurTokenType != TOKEN_EOF &&
+                        CurTokenType != TOKEN_CLOSE_BRACKET);
+                GetNextToken();
+            }
+        }
+
+        /* Continue parsing rest on same level */
+        if (CurTokenType != TOKEN_EOF) {
+            /* Parse rest of stream at same level */
+            node->_next = ParseXMLElement();
+        }
+        return node;
+
+    } else if (CurTokenType == TOKEN_PCDATA) {
+        /* Create node for pcdata */
+        node = CreateXMLNode(xmlPCDataType, JPACKAGE_STRDUP(CurTokenName));
+        /* We need to save root node pointer to be able to cleanup
+           if an error happens during parsing */
+        if (!root_node) {
+            root_node = node;
+        }
+        GetNextToken();
+        return node;
+    }
+
+    /* Something went wrong. */
+    return NULL;
+}
+
+/* Parses an XML attribute. */
+static XMLAttribute* ParseXMLAttribute(void) {
+    TCHAR* q = NULL;
+    TCHAR* name = NULL;
+    TCHAR* PrevPos = NULL;
+
+    do {
+        /* We need to check this condition to avoid endless loop
+           in case if an error happend during parsing. */
+        if (PrevPos == CurPos) {
+            if (name != NULL) {
+                free(name);
+                name = NULL;
+            }
+
+            return NULL;
+        }
+
+        PrevPos = CurPos;
+
+        /* Skip whitespace etc. */
+        SkipFilling();
+
+        /* Check if we are done witht this attribute section */
+        if (CurPos[0] == '\0' ||
+                CurPos[0] == '>' ||
+                (CurPos[0] == '/' && CurPos[1] == '>')) {
+
+            if (name != NULL) {
+                free(name);
+                name = NULL;
+            }
+
+            return NULL;
+        }
+
+        /* Find end of name */
+        q = CurPos;
+        while (*q && !iswspace(*q) && *q != '=') NEXT_CHAR(q);
+
+        SetToken(TOKEN_UNKNOWN, CurPos, q);
+        if (name) {
+            free(name);
+            name = NULL;
+        }
+        name = JPACKAGE_STRDUP(CurTokenName);
+
+        /* Skip any whitespace */
+        CurPos = q;
+        CurPos = SkipFilling();
+
+        /* Next TCHARacter must be '=' for a valid attribute.
+           If it is not, this is really an error.
+           We ignore this, and just try to parse an attribute
+           out of the rest of the string.
+         */
+    } while (*CurPos != '=');
+
+    NEXT_CHAR(CurPos);
+    CurPos = SkipWhiteSpace(CurPos);
+    /* Parse CDATA part of attribute */
+    if ((*CurPos == '\"') || (*CurPos == '\'')) {
+        TCHAR quoteChar = *CurPos;
+        q = ++CurPos;
+        while (*q != '\0' && *q != quoteChar) NEXT_CHAR(q);
+        SetToken(TOKEN_CDATA, CurPos, q);
+        CurPos = q + 1;
+    } else {
+        q = CurPos;
+        while (*q != '\0' && !iswspace(*q)) NEXT_CHAR(q);
+        SetToken(TOKEN_CDATA, CurPos, q);
+        CurPos = q;
+    }
+
+    //Note: no need to free name and CurTokenName duplicate; they're assigned
+    // to an XMLAttribute structure in CreateXMLAttribute
+
+    return CreateXMLAttribute(name, JPACKAGE_STRDUP(CurTokenName));
+}
+
+void FreeXMLDocument(XMLNode* root) {
+    if (root == NULL) return;
+    FreeXMLDocument(root->_sub);
+    FreeXMLDocument(root->_next);
+    FreeXMLAttribute(root->_attributes);
+    free(root->_name);
+    free(root);
+}
+
+static void FreeXMLAttribute(XMLAttribute* attr) {
+    if (attr == NULL) return;
+    free(attr->_name);
+    free(attr->_value);
+    FreeXMLAttribute(attr->_next);
+    free(attr);
+}
+
+/* Find element at current level with a given name */
+XMLNode* FindXMLChild(XMLNode* root, const TCHAR* name) {
+    if (root == NULL) return NULL;
+
+    if (root->_type == xmlTagType && JPACKAGE_STRCMP(root->_name, name) == 0) {
+        return root;
+    }
+
+    return FindXMLChild(root->_next, name);
+}
+
+/* Search for an attribute with the given name and returns the contents. Returns NULL if
+ * attribute is not found
+ */
+TCHAR* FindXMLAttribute(XMLAttribute* attr, const TCHAR* name) {
+    if (attr == NULL) return NULL;
+    if (JPACKAGE_STRCMP(attr->_name, name) == 0) return attr->_value;
+    return FindXMLAttribute(attr->_next, name);
+}
+
+void PrintXMLDocument(XMLNode* node, int indt) {
+    if (node == NULL) return;
+
+    if (node->_type == xmlTagType) {
+        JPACKAGE_PRINTF(_T("\n"));
+        indent(indt);
+        JPACKAGE_PRINTF(_T("<%s"), node->_name);
+        PrintXMLAttributes(node->_attributes);
+        if (node->_sub == NULL) {
+            JPACKAGE_PRINTF(_T("/>\n"));
+        } else {
+            JPACKAGE_PRINTF(_T(">"));
+            PrintXMLDocument(node->_sub, indt + 1);
+            indent(indt);
+            JPACKAGE_PRINTF(_T("</%s>"), node->_name);
+        }
+    } else {
+        JPACKAGE_PRINTF(_T("%s"), node->_name);
+    }
+    PrintXMLDocument(node->_next, indt);
+}
+
+static void PrintXMLAttributes(XMLAttribute* attr) {
+    if (attr == NULL) return;
+
+    JPACKAGE_PRINTF(_T(" %s=\"%s\""), attr->_name, attr->_value);
+    PrintXMLAttributes(attr->_next);
+}
+
+static void indent(int indt) {
+    int i;
+    for (i = 0; i < indt; i++) {
+        JPACKAGE_PRINTF(_T("  "));
+    }
+}
+
+const TCHAR *CDStart = _T("<![CDATA[");
+const TCHAR *CDEnd = _T("]]>");
+
+static TCHAR* SkipPCData(TCHAR *p) {
+    TCHAR *end = JPACKAGE_STRSTR(p, CDEnd);
+    if (end != NULL) {
+        return end + sizeof (CDEnd);
+    }
+    return (++p);
+}
+
+static int IsPCData(TCHAR *p) {
+    const int size = sizeof (CDStart);
+    return (JPACKAGE_STRNCMP(CDStart, p, size) == 0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef LINUXPLATFORM_H
+#define LINUXPLATFORM_H
+
+#include "Platform.h"
+#include "PosixPlatform.h"
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <pthread.h>
+#include <list>
+
+class LinuxPlatform : virtual public Platform, PosixPlatform {
+private:
+    pthread_t FMainThread;
+
+protected:
+    virtual TString getTmpDirString();
+
+public:
+    LinuxPlatform(void);
+    virtual ~LinuxPlatform(void);
+
+    TString GetPackageAppDirectory();
+    TString GetPackageLauncherDirectory();
+    TString GetPackageRuntimeBinDirectory();
+
+    virtual void ShowMessage(TString title, TString description);
+    virtual void ShowMessage(TString description);
+
+    virtual TCHAR* ConvertStringToFileSystemString(
+            TCHAR* Source, bool &release);
+    virtual TCHAR* ConvertFileSystemStringToString(
+            TCHAR* Source, bool &release);
+
+    virtual void SetCurrentDirectory(TString Value);
+    virtual TString GetPackageRootDirectory();
+    virtual TString GetAppDataDirectory();
+    virtual TString GetAppName();
+
+    virtual TString GetModuleFileName();
+
+    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
+
+    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
+
+    virtual bool IsMainThread();
+    virtual TPlatformNumber GetMemorySize();
+};
+
+#endif //LINUXPLATFORM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/linux/native/libapplauncher/PlatformDefs.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef PLATFORM_DEFS_H
+#define PLATFORM_DEFS_H
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <dlfcn.h>
+#include <libgen.h>
+#include <string>
+
+using namespace std;
+
+#ifndef LINUX
+#define LINUX
+#endif
+
+#define _T(x) x
+
+typedef char TCHAR;
+typedef std::string TString;
+#define StringLength strlen
+
+typedef unsigned long DWORD;
+
+#define TRAILING_PATHSEPARATOR '/'
+#define BAD_TRAILING_PATHSEPARATOR '\\'
+#define PATH_SEPARATOR ':'
+#define BAD_PATH_SEPARATOR ';'
+#define MAX_PATH 1000
+
+typedef long TPlatformNumber;
+typedef pid_t TProcessID;
+
+#define HMODULE void*
+
+typedef void* Module;
+typedef void* Procedure;
+
+#define StringToFileSystemString PlatformString
+#define FileSystemStringToString PlatformString
+
+#endif // PLATFORM_DEFS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef MACPLATFORM_H
+#define MACPLATFORM_H
+
+#include "Platform.h"
+#include "PosixPlatform.h"
+
+class MacPlatform : virtual public Platform, PosixPlatform {
+private:
+    bool UsePListForConfigFile();
+
+protected:
+    virtual TString getTmpDirString();
+
+public:
+    MacPlatform(void);
+    virtual ~MacPlatform(void);
+
+public:
+    virtual void ShowMessage(TString title, TString description);
+    virtual void ShowMessage(TString description);
+
+    virtual TCHAR* ConvertStringToFileSystemString(
+            TCHAR* Source, bool &release);
+    virtual TCHAR* ConvertFileSystemStringToString(
+            TCHAR* Source, bool &release);
+
+    virtual void SetCurrentDirectory(TString Value);
+    virtual TString GetPackageRootDirectory();
+    virtual TString GetAppDataDirectory();
+    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
+    virtual TString GetAppName();
+
+    TString GetPackageAppDirectory();
+    TString GetPackageLauncherDirectory();
+    TString GetPackageRuntimeBinDirectory();
+
+    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
+    virtual TString GetModuleFileName();
+
+    virtual bool IsMainThread();
+    virtual TPlatformNumber GetMemorySize();
+
+    virtual std::map<TString, TString> GetKeys();
+};
+
+
+#endif // MACPLATFORM_H
--- a/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm	Sun Feb 17 14:08:26 2019 -0500
@@ -25,8 +25,6 @@
 
 #include "Platform.h"
 
-#ifdef MAC
-
 #include "MacPlatform.h"
 #include "Helpers.h"
 #include "Package.h"
@@ -36,6 +34,8 @@
 #include <sys/sysctl.h>
 #include <pthread.h>
 #include <vector>
+#include <signal.h>
+#include <mach-o/dyld.h>
 
 #import <Foundation/Foundation.h>
 #import <AppKit/NSRunningApplication.h>
@@ -51,17 +51,65 @@
         "/Library/Application Support/Java/JPackage/tmp"
 
 NSString* StringToNSString(TString Value) {
-    NSString* result = [NSString stringWithCString:Value.c_str()
-            encoding:[NSString defaultCStringEncoding]];
+    NSString* result = [NSString stringWithCString : Value.c_str()
+            encoding : [NSString defaultCStringEncoding]];
     return result;
 }
 
-MacPlatform::MacPlatform(void) : Platform(), GenericPlatform(), PosixPlatform() {
+FileSystemStringToString::FileSystemStringToString(const TCHAR* value) {
+    bool release = false;
+    PlatformString lvalue = PlatformString(value);
+    Platform& platform = Platform::GetInstance();
+    TCHAR* buffer = platform.ConvertFileSystemStringToString(lvalue, release);
+    FData = buffer;
+
+    if (buffer != NULL && release == true) {
+        delete[] buffer;
+    }
+}
+
+FileSystemStringToString::operator TString() {
+    return FData;
+}
+
+StringToFileSystemString::StringToFileSystemString(const TString &value) {
+    FRelease = false;
+    PlatformString lvalue = PlatformString(value);
+    Platform& platform = Platform::GetInstance();
+    FData = platform.ConvertStringToFileSystemString(lvalue, FRelease);
+}
+
+StringToFileSystemString::~StringToFileSystemString() {
+    if (FRelease == true) {
+        delete[] FData;
+    }
+}
+
+StringToFileSystemString::operator TCHAR* () {
+    return FData;
+}
+
+MacPlatform::MacPlatform(void) : Platform(), PosixPlatform() {
 }
 
 MacPlatform::~MacPlatform(void) {
 }
 
+TString MacPlatform::GetPackageAppDirectory() {
+    return FilePath::IncludeTrailingSeparator(
+            GetPackageRootDirectory()) + _T("Java");
+}
+
+TString MacPlatform::GetPackageLauncherDirectory() {
+    return FilePath::IncludeTrailingSeparator(
+            GetPackageRootDirectory()) + _T("MacOS");
+}
+
+TString MacPlatform::GetPackageRuntimeBinDirectory() {
+    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) +
+            _T("Plugins/Java.runtime/Contents/Home/bin");
+}
+
 bool MacPlatform::UsePListForConfigFile() {
     return FilePath::FileExists(GetConfigFileName()) == false;
 }
@@ -91,7 +139,7 @@
             Source, kCFStringEncodingUTF8);
 
     if (StringRef != NULL) {
-        @try {
+        @ try {
             CFIndex length =
                     CFStringGetMaximumSizeOfFileSystemRepresentation(StringRef);
             result = new char[length + 1];
@@ -99,14 +147,14 @@
                 if (CFStringGetFileSystemRepresentation(StringRef,
                         result, length)) {
                     release = true;
-                }
-                else {
+                } else {
                     delete[] result;
                     result = NULL;
                 }
             }
         }
-        @finally {
+        @finally
+        {
             CFRelease(StringRef);
         }
     }
@@ -122,7 +170,7 @@
             kCFAllocatorDefault, Source);
 
     if (StringRef != NULL) {
-        @try {
+        @ try {
             CFIndex length = CFStringGetLength(StringRef);
 
             if (length > 0) {
@@ -134,15 +182,15 @@
                     if (CFStringGetCString(StringRef, result, maxSize,
                             kCFStringEncodingUTF8) == true) {
                         release = true;
-                    }
-                    else {
+                    } else {
                         delete[] result;
                         result = NULL;
                     }
                 }
             }
         }
-        @finally {
+        @finally
+        {
             CFRelease(StringRef);
         }
     }
@@ -158,7 +206,7 @@
     NSBundle *mainBundle = [NSBundle mainBundle];
     NSString *mainBundlePath = [mainBundle bundlePath];
     NSString *contentsPath =
-            [mainBundlePath stringByAppendingString:@"/Contents"];
+            [mainBundlePath stringByAppendingString : @"/Contents"];
     TString result = [contentsPath UTF8String];
     return result;
 }
@@ -166,7 +214,7 @@
 TString MacPlatform::GetAppDataDirectory() {
     TString result;
     NSArray *paths = NSSearchPathForDirectoriesInDomains(
-           NSApplicationSupportDirectory, NSUserDomainMask, YES);
+            NSApplicationSupportDirectory, NSUserDomainMask, YES);
     NSString *applicationSupportDirectory = [paths firstObject];
     result = [applicationSupportDirectory UTF8String];
     return result;
@@ -177,11 +225,11 @@
 
     // first try lib/, then lib/jli
     result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-             _T("Contents/Home/lib/libjli.dylib");
+            _T("Contents/Home/lib/libjli.dylib");
 
     if (FilePath::FileExists(result) == false) {
         result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-                 _T("Contents/Home/lib/jli/libjli.dylib");
+                _T("Contents/Home/lib/jli/libjli.dylib");
 
         if (FilePath::FileExists(result) == false) {
             // cannot find
@@ -199,14 +247,108 @@
     return result;
 }
 
+void PosixProcess::Cleanup() {
+    if (FOutputHandle != 0) {
+        close(FOutputHandle);
+        FOutputHandle = 0;
+    }
+
+    if (FInputHandle != 0) {
+        close(FInputHandle);
+        FInputHandle = 0;
+    }
+
+    sigaction(SIGINT, &savintr, (struct sigaction *) 0);
+    sigaction(SIGQUIT, &savequit, (struct sigaction *) 0);
+    sigprocmask(SIG_SETMASK, &saveblock, (sigset_t *) 0);
+}
+
+#define PIPE_READ 0
+#define PIPE_WRITE 1
+
+bool PosixProcess::Execute(const TString Application,
+        const std::vector<TString> Arguments, bool AWait) {
+    bool result = false;
+
+    if (FRunning == false) {
+        FRunning = true;
+
+        int handles[2];
+
+        if (pipe(handles) == -1) {
+            return false;
+        }
+
+        struct sigaction sa;
+        sa.sa_handler = SIG_IGN;
+        sigemptyset(&sa.sa_mask);
+        sa.sa_flags = 0;
+        sigemptyset(&savintr.sa_mask);
+        sigemptyset(&savequit.sa_mask);
+        sigaction(SIGINT, &sa, &savintr);
+        sigaction(SIGQUIT, &sa, &savequit);
+        sigaddset(&sa.sa_mask, SIGCHLD);
+        sigprocmask(SIG_BLOCK, &sa.sa_mask, &saveblock);
+
+        FChildPID = fork();
+
+        // PID returned by vfork is 0 for the child process and the
+        // PID of the child process for the parent.
+        if (FChildPID == -1) {
+            // Error
+            TString message = PlatformString::Format(
+                    _T("Error: Unable to create process %s"),
+                    Application.data());
+            throw Exception(message);
+        } else if (FChildPID == 0) {
+            Cleanup();
+            TString command = Application;
+
+            for (std::vector<TString>::const_iterator iterator =
+                    Arguments.begin(); iterator != Arguments.end();
+                    iterator++) {
+                command += TString(_T(" ")) + *iterator;
+            }
+#ifdef DEBUG
+            printf("%s\n", command.data());
+#endif // DEBUG
+
+            dup2(handles[PIPE_READ], STDIN_FILENO);
+            dup2(handles[PIPE_WRITE], STDOUT_FILENO);
+
+            close(handles[PIPE_READ]);
+            close(handles[PIPE_WRITE]);
+
+            execl("/bin/sh", "sh", "-c", command.data(), (char *) 0);
+
+            _exit(127);
+        } else {
+            FOutputHandle = handles[PIPE_READ];
+            FInputHandle = handles[PIPE_WRITE];
+
+            if (AWait == true) {
+                ReadOutput();
+                Wait();
+                Cleanup();
+                FRunning = false;
+                result = true;
+            } else {
+                result = true;
+            }
+        }
+    }
+
+    return result;
+}
+
 void AppendPListArrayToIniFile(NSDictionary *infoDictionary,
         IniFile *result, TString Section) {
     NSString *sectionKey =
-        [NSString stringWithUTF8String:PlatformString(Section).toMultibyte()];
-    NSDictionary *array = [infoDictionary objectForKey:sectionKey];
+            [NSString stringWithUTF8String : PlatformString(Section).toMultibyte()];
+    NSDictionary *array = [infoDictionary objectForKey : sectionKey];
 
     for (id option in array) {
-        if ([option isKindOfClass:[NSString class]]) {
+        if ([option isKindOfClass : [NSString class]]) {
             TString arg = [option UTF8String];
 
             TString name;
@@ -224,19 +366,18 @@
     NSDictionary *dictionary = NULL;
 
     if (FollowSection == true) {
-        NSString *sectionKey = [NSString stringWithUTF8String:PlatformString(
+        NSString *sectionKey = [NSString stringWithUTF8String : PlatformString(
                 Section).toMultibyte()];
-        dictionary = [infoDictionary objectForKey:sectionKey];
-    }
-    else {
+        dictionary = [infoDictionary objectForKey : sectionKey];
+    } else {
         dictionary = infoDictionary;
     }
 
     for (id key in dictionary) {
-        id option = [dictionary valueForKey:key];
+        id option = [dictionary valueForKey : key];
 
-        if ([key isKindOfClass:[NSString class]] &&
-                    [option isKindOfClass:[NSString class]]) {
+        if ([key isKindOfClass : [NSString class]] &&
+                [option isKindOfClass : [NSString class]]) {
             TString name = [key UTF8String];
             TString value = [option UTF8String];
             result->Append(Section, name, value);
@@ -258,8 +399,7 @@
             // attempt to load old property file format.
             Helpers::LoadOldConfigFile(FileName, result);
         }
-    }
-    else {
+    } else {
         NSBundle *mainBundle = [NSBundle mainBundle];
         NSDictionary *infoDictionary = [mainBundle infoDictionary];
         std::map<TString, TString> keys = GetKeys();
@@ -288,7 +428,7 @@
 
 TString GetModuleFileNameOSX() {
     Dl_info module_info;
-    if (dladdr(reinterpret_cast<void*>(GetModuleFileNameOSX),
+    if (dladdr(reinterpret_cast<void*> (GetModuleFileNameOSX),
             &module_info) == 0) {
         // Failed to find the symbol we asked for.
         return std::string();
@@ -296,11 +436,7 @@
     return TString(module_info.dli_fname);
 }
 
-#include <mach-o/dyld.h>
-
 TString MacPlatform::GetModuleFileName() {
-    //return GetModuleFileNameOSX();
-
     TString result;
     DynamicBuffer<TCHAR> buffer(MAX_PATH);
     uint32_t size = buffer.GetSize();
@@ -330,9 +466,8 @@
     std::map<TString, TString> keys;
 
     if (UsePListForConfigFile() == false) {
-        return GenericPlatform::GetKeys();
-    }
-    else {
+        return Platform::GetKeys();
+    } else {
         keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION,
                 _T("app.version")));
         keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY,
@@ -376,31 +511,3 @@
 
     return keys;
 }
-
-#ifdef DEBUG
-bool MacPlatform::IsNativeDebuggerPresent() {
-    int state;
-    int mib[4];
-    struct kinfo_proc info;
-    size_t size;
-
-    info.kp_proc.p_flag = 0;
-
-    mib[0] = CTL_KERN;
-    mib[1] = KERN_PROC;
-    mib[2] = KERN_PROC_PID;
-    mib[3] = getpid();
-
-    size = sizeof(info);
-    state = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
-    assert(state == 0);
-    return ((info.kp_proc.p_flag & P_TRACED) != 0);
-}
-
-int MacPlatform::GetProcessID() {
-    int pid = [[NSProcessInfo processInfo] processIdentifier];
-    return pid;
-}
-#endif //DEBUG
-
-#endif //MAC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/macosx/native/libapplauncher/PlatformDefs.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef PLATFORM_DEFS_H
+#define PLATFORM_DEFS_H
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <dlfcn.h>
+#include <libgen.h>
+#include <string>
+
+using namespace std;
+
+#ifndef MAC
+#define MAC
+#endif
+
+#define _T(x) x
+
+typedef char TCHAR;
+typedef std::string TString;
+#define StringLength strlen
+
+typedef unsigned long DWORD;
+
+#define TRAILING_PATHSEPARATOR '/'
+#define BAD_TRAILING_PATHSEPARATOR '\\'
+#define PATH_SEPARATOR ':'
+#define BAD_PATH_SEPARATOR ';'
+#define MAX_PATH 1000
+
+typedef long TPlatformNumber;
+typedef pid_t TProcessID;
+
+#define HMODULE void*
+
+typedef void* Module;
+typedef void* Procedure;
+
+
+// StringToFileSystemString is a stack object. It's usage is
+// simply inline to convert a
+// TString to a file system string. Example:
+//
+// return dlopen(StringToFileSystemString(FileName), RTLD_LAZY);
+//
+class StringToFileSystemString {
+    // Prohibit Heap-Based StringToFileSystemString
+private:
+    static void *operator new(size_t size);
+    static void operator delete(void *ptr);
+
+private:
+    TCHAR* FData;
+    bool FRelease;
+
+public:
+    StringToFileSystemString(const TString &value);
+    ~StringToFileSystemString();
+
+    operator TCHAR* ();
+};
+
+
+// FileSystemStringToString is a stack object. It's usage is
+// simply inline to convert a
+// file system string to a TString. Example:
+//
+// DynamicBuffer<TCHAR> buffer(MAX_PATH);
+// if (readlink("/proc/self/exe", buffer.GetData(), MAX_PATH) != -1)
+//    result = FileSystemStringToString(buffer.GetData());
+//
+class FileSystemStringToString {
+    // Prohibit Heap-Based FileSystemStringToString
+private:
+    static void *operator new(size_t size);
+    static void operator delete(void *ptr);
+
+private:
+    TString FData;
+
+public:
+    FileSystemStringToString(const TCHAR* value);
+
+    operator TString ();
+};
+
+#endif // PLATFORM_DEFS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/share/native/libapplauncher/FileAttributes.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef FILEATTRIBUTES_H
+#define FILEATTRIBUTES_H
+
+#include "Platform.h"
+#include "PlatformString.h"
+#include "FileAttribute.h"
+
+#include <vector>
+
+class FileAttributes {
+private:
+    TString FFileName;
+    bool FFollowLink;
+    std::vector<FileAttribute> FAttributes;
+
+    bool WriteAttributes();
+    bool ReadAttributes();
+    bool Valid(const FileAttribute Value);
+
+public:
+    FileAttributes(const TString FileName, bool FollowLink = true);
+
+    void Append(const FileAttribute Value);
+    bool Contains(const FileAttribute Value);
+    void Remove(const FileAttribute Value);
+};
+
+#endif // FILEATTRIBUTES_H
+
--- a/src/jdk.jpackage/share/native/libapplauncher/FilePath.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,769 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "FilePath.h"
-
-#include <algorithm>
-#include <list>
-
-#ifdef WINDOWS
-#include <ShellAPI.h>
-#endif // WINDOWS
-
-#ifdef POSIX
-#include <sys/stat.h>
-#endif // POSIX
-
-
-bool FilePath::FileExists(const TString FileName) {
-    bool result = false;
-#ifdef WINDOWS
-    WIN32_FIND_DATA FindFileData;
-    TString fileName = FixPathForPlatform(FileName);
-    HANDLE handle = FindFirstFile(fileName.data(), &FindFileData);
-
-    if (handle != INVALID_HANDLE_VALUE) {
-        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
-            result = true;
-        }
-        else {
-            result = true;
-        }
-
-        FindClose(handle);
-    }
-#endif // WINDOWS
-#ifdef POSIX
-    struct stat buf;
-
-    if ((stat(StringToFileSystemString(FileName), &buf) == 0) &&
-            (S_ISREG(buf.st_mode) != 0)) {
-        result = true;
-    }
-#endif // POSIX
-    return result;
-}
-
-bool FilePath::DirectoryExists(const TString DirectoryName) {
-    bool result = false;
-#ifdef WINDOWS
-    WIN32_FIND_DATA FindFileData;
-    TString directoryName = FixPathForPlatform(DirectoryName);
-    HANDLE handle = FindFirstFile(directoryName.data(), &FindFileData);
-
-    if (handle != INVALID_HANDLE_VALUE) {
-        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
-            result = true;
-        }
-
-        FindClose(handle);
-    }
-#endif // WINDOWS
-#ifdef POSIX
-    struct stat buf;
-
-    if ((stat(StringToFileSystemString(DirectoryName), &buf) == 0) &&
-            (S_ISDIR(buf.st_mode) != 0)) {
-        result = true;
-    }
-#endif // POSIX
-    return result;
-}
-
-#ifdef WINDOWS
-std::string GetLastErrorAsString() {
-    // Get the error message, if any.
-    DWORD errorMessageID = ::GetLastError();
-
-    if (errorMessageID == 0) {
-        return "No error message has been recorded";
-    }
-
-    LPSTR messageBuffer = NULL;
-    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
-            | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-            NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL,
-            SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
-
-    std::string message(messageBuffer, size);
-
-    // Free the buffer.
-    LocalFree(messageBuffer);
-
-    return message;
-}
-#endif // WINDOWS
-
-bool FilePath::DeleteFile(const TString FileName) {
-    bool result = false;
-
-    if (FileExists(FileName) == true) {
-#ifdef WINDOWS
-        TString lFileName = FixPathForPlatform(FileName);
-        FileAttributes attributes(lFileName);
-
-        if (attributes.Contains(faReadOnly) == true) {
-            attributes.Remove(faReadOnly);
-        }
-
-        result = ::DeleteFile(lFileName.data()) == TRUE;
-#endif // WINDOWS
-#ifdef POSIX
-        if (unlink(StringToFileSystemString(FileName)) == 0) {
-            result = true;
-        }
-#endif // POSIX
-    }
-
-    return result;
-}
-
-bool FilePath::DeleteDirectory(const TString DirectoryName) {
-    bool result = false;
-
-    if (DirectoryExists(DirectoryName) == true) {
-#ifdef WINDOWS
-        SHFILEOPSTRUCTW fos = {0};
-        TString directoryName = FixPathForPlatform(DirectoryName);
-        DynamicBuffer<TCHAR> lDirectoryName(directoryName.size() + 2);
-        if (lDirectoryName.GetData() == NULL) {
-            return false;
-        }
-        memcpy(lDirectoryName.GetData(), directoryName.data(), (directoryName.size() + 2) * sizeof(TCHAR));
-        lDirectoryName[directoryName.size() + 1] = NULL;
-        // Double null terminate for SHFileOperation.
-
-        // Delete the folder and everything inside.
-        fos.wFunc = FO_DELETE;
-        fos.pFrom = lDirectoryName.GetData();
-        fos.fFlags = FOF_NO_UI;
-        result = SHFileOperation(&fos) == 0;
-#endif // WINDOWS
-#ifdef POSIX
-        if (unlink(StringToFileSystemString(DirectoryName)) == 0) {
-            result = true;
-        }
-#endif // POSIX
-    }
-
-    return result;
-}
-
-TString FilePath::IncludeTrailingSeparator(const TString value) {
-    TString result = value;
-
-    if (value.size() > 0) {
-        TString::iterator i = result.end();
-        i--;
-
-        if (*i != TRAILING_PATHSEPARATOR) {
-            result += TRAILING_PATHSEPARATOR;
-        }
-    }
-
-    return result;
-}
-
-TString FilePath::IncludeTrailingSeparator(const char* value) {
-    TString lvalue = PlatformString(value).toString();
-    return IncludeTrailingSeparator(lvalue);
-}
-
-TString FilePath::IncludeTrailingSeparator(const wchar_t* value) {
-    TString lvalue = PlatformString(value).toString();
-    return IncludeTrailingSeparator(lvalue);
-}
-
-TString FilePath::ExtractFilePath(TString Path) {
-#ifdef WINDOWS
-    TString result;
-    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
-    if (slash != TString::npos)
-        result = Path.substr(0, slash);
-    return result;
-#endif // WINDOWS
-#ifdef POSIX
-    return dirname(StringToFileSystemString(Path));
-#endif // POSIX
-}
-
-TString FilePath::ExtractFileExt(TString Path) {
-    TString result;
-    size_t dot = Path.find_last_of('.');
-
-    if (dot != TString::npos) {
-        result  = Path.substr(dot, Path.size() - dot);
-    }
-
-    return result;
-}
-
-TString FilePath::ExtractFileName(TString Path) {
-#ifdef WINDOWS
-    TString result;
-
-    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
-    if (slash != TString::npos)
-        result = Path.substr(slash + 1, Path.size() - slash - 1);
-
-    return result;
-#endif //  WINDOWS
-#ifdef POSIX
-    return basename(StringToFileSystemString(Path));
-#endif // POSIX
-}
-
-TString FilePath::ChangeFileExt(TString Path, TString Extension) {
-    TString result;
-    size_t dot = Path.find_last_of('.');
-
-    if (dot != TString::npos) {
-        result = Path.substr(0, dot) + Extension;
-    }
-
-    if (result.empty() == true) {
-        result = Path;
-    }
-
-    return result;
-}
-
-TString FilePath::FixPathForPlatform(TString Path) {
-    TString result = Path;
-    std::replace(result.begin(), result.end(),
-            BAD_TRAILING_PATHSEPARATOR, TRAILING_PATHSEPARATOR);
-#ifdef WINDOWS
-    // The maximum path that does not require long path prefix. On Windows the
-    // maximum path is 260 minus 1 (NUL) but for directories it is 260 minus
-    // 12 minus 1 (to allow for the creation of a 8.3 file in the directory).
-    const int maxPath = 247;
-    if (result.length() > maxPath &&
-        result.find(_T("\\\\?\\")) == TString::npos &&
-        result.find(_T("\\\\?\\UNC")) == TString::npos) {
-        const TString prefix(_T("\\\\"));
-        if (!result.compare(0, prefix.size(), prefix)) {
-            // UNC path, converting to UNC path in long notation
-            result = _T("\\\\?\\UNC") + result.substr(1, result.length());
-        } else {
-            // converting to non-UNC path in long notation
-            result = _T("\\\\?\\") + result;
-        }
-    }
-#endif // WINDOWS
-    return result;
-}
-
-TString FilePath::FixPathSeparatorForPlatform(TString Path) {
-    TString result = Path;
-    std::replace(result.begin(), result.end(),
-            BAD_PATH_SEPARATOR, PATH_SEPARATOR);
-    return result;
-}
-
-TString FilePath::PathSeparator() {
-    TString result;
-    result = PATH_SEPARATOR;
-    return result;
-}
-
-bool FilePath::CreateDirectory(TString Path, bool ownerOnly) {
-    bool result = false;
-
-    std::list<TString> paths;
-    TString lpath = Path;
-
-    while (lpath.empty() == false && DirectoryExists(lpath) == false) {
-        paths.push_front(lpath);
-        lpath = ExtractFilePath(lpath);
-    }
-
-    for (std::list<TString>::iterator iterator = paths.begin();
-            iterator != paths.end(); iterator++) {
-        lpath = *iterator;
-
-#ifdef WINDOWS
-        if (_wmkdir(lpath.data()) == 0) {
-#endif // WINDOWS
-#ifdef POSIX
-        mode_t mode = S_IRWXU;
-        if (!ownerOnly) {
-            mode |= S_IRWXG | S_IROTH | S_IXOTH;
-        }
-        if (mkdir(StringToFileSystemString(lpath), mode) == 0) {
-#endif // POSIX
-            result = true;
-        }
-        else {
-            result = false;
-            break;
-        }
-    }
-
-    return result;
-}
-
-void FilePath::ChangePermissions(TString FileName, bool ownerOnly) {
-#ifdef POSIX
-    mode_t mode = S_IRWXU;
-    if (!ownerOnly) {
-        mode |= S_IRWXG | S_IROTH | S_IXOTH;
-    }
-    chmod(FileName.data(), mode);
-#endif // POSIX
-}
-
-//----------------------------------------------------------------------------
-
-#include <algorithm>
-
-FileAttributes::FileAttributes(const TString FileName, bool FollowLink) {
-    FFileName = FileName;
-    FFollowLink = FollowLink;
-    ReadAttributes();
-}
-
-bool FileAttributes::WriteAttributes() {
-    bool result = false;
-
-#ifdef WINDOWS
-    DWORD attributes = 0;
-
-    for (std::vector<FileAttribute>::const_iterator iterator =
-            FAttributes.begin();
-        iterator != FAttributes.end(); iterator++) {
-        switch (*iterator) {
-            case faArchive: {
-                attributes = attributes & FILE_ATTRIBUTE_ARCHIVE;
-                break;
-            }
-            case faCompressed: {
-                attributes = attributes & FILE_ATTRIBUTE_COMPRESSED;
-                break;
-            }
-            case faDevice: {
-                attributes = attributes & FILE_ATTRIBUTE_DEVICE;
-                break;
-            }
-            case faDirectory: {
-                attributes = attributes & FILE_ATTRIBUTE_DIRECTORY;
-                break;
-            }
-            case faEncrypted: {
-                attributes = attributes & FILE_ATTRIBUTE_ENCRYPTED;
-                break;
-            }
-            case faHidden: {
-                attributes = attributes & FILE_ATTRIBUTE_HIDDEN;
-                break;
-            }
-            case faNormal: {
-                attributes = attributes & FILE_ATTRIBUTE_NORMAL;
-                break;
-            }
-            case faNotContentIndexed: {
-                attributes = attributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
-                break;
-            }
-            case faOffline: {
-                attributes = attributes & FILE_ATTRIBUTE_OFFLINE;
-                break;
-            }
-            case faSystem: {
-                attributes = attributes & FILE_ATTRIBUTE_SYSTEM;
-                break;
-            }
-            case faSymbolicLink: {
-                attributes = attributes & FILE_ATTRIBUTE_REPARSE_POINT;
-                break;
-            }
-            case faSparceFile: {
-                attributes = attributes & FILE_ATTRIBUTE_SPARSE_FILE;
-                break;
-            }
-            case faReadOnly: {
-                attributes = attributes & FILE_ATTRIBUTE_READONLY;
-                break;
-            }
-            case faTemporary: {
-                attributes = attributes & FILE_ATTRIBUTE_TEMPORARY;
-                break;
-            }
-            case faVirtual: {
-                attributes = attributes & FILE_ATTRIBUTE_VIRTUAL;
-                break;
-            }
-        }
-    }
-
-    if (::SetFileAttributes(FFileName.data(), attributes) != 0) {
-        result = true;
-    }
-#endif // WINDOWS
-#ifdef POSIX
-    mode_t attributes = 0;
-
-    for (std::vector<FileAttribute>::const_iterator iterator =
-            FAttributes.begin();
-        iterator != FAttributes.end(); iterator++) {
-        switch (*iterator) {
-            case faBlockSpecial: {
-                attributes |= S_IFBLK;
-                break;
-            }
-            case faCharacterSpecial: {
-                attributes |= S_IFCHR;
-                break;
-            }
-            case faFIFOSpecial: {
-                attributes |= S_IFIFO;
-                break;
-            }
-            case faNormal: {
-                attributes |= S_IFREG;
-                break;
-            }
-            case faDirectory: {
-                attributes |= S_IFDIR;
-                break;
-            }
-            case faSymbolicLink: {
-                attributes |= S_IFLNK;
-                break;
-            }
-            case faSocket: {
-                attributes |= S_IFSOCK;
-                break;
-            }
-
-            // Owner
-            case faReadOnly: {
-                attributes |= S_IRUSR;
-                break;
-            }
-            case  faWriteOnly: {
-                attributes |= S_IWUSR;
-                break;
-            }
-            case faReadWrite: {
-                attributes |= S_IRUSR;
-                attributes |= S_IWUSR;
-                break;
-            }
-            case faExecute: {
-                attributes |= S_IXUSR;
-                break;
-            }
-
-            // Group
-            case faGroupReadOnly: {
-                attributes |= S_IRGRP;
-                break;
-            }
-            case  faGroupWriteOnly: {
-                attributes |= S_IWGRP;
-                break;
-            }
-            case faGroupReadWrite: {
-                attributes |= S_IRGRP;
-                attributes |= S_IWGRP;
-                break;
-            }
-            case faGroupExecute: {
-                attributes |= S_IXGRP;
-                break;
-            }
-
-            // Others
-            case faOthersReadOnly: {
-                attributes |= S_IROTH;
-                break;
-            }
-            case  faOthersWriteOnly: {
-                attributes |= S_IWOTH;
-                break;
-            }
-            case faOthersReadWrite: {
-                attributes |= S_IROTH;
-                attributes |= S_IWOTH;
-                break;
-            }
-            case faOthersExecute: {
-                attributes |= S_IXOTH;
-                break;
-            }
-            default:
-                break;
-        }
-    }
-
-    if (chmod(FFileName.data(), attributes) == 0) {
-        result = true;
-    }
-#endif // POSIX
-
-    return result;
-}
-
-#define S_ISRUSR(m)    (((m) & S_IRWXU) == S_IRUSR)
-#define S_ISWUSR(m)    (((m) & S_IRWXU) == S_IWUSR)
-#define S_ISXUSR(m)    (((m) & S_IRWXU) == S_IXUSR)
-
-#define S_ISRGRP(m)    (((m) & S_IRWXG) == S_IRGRP)
-#define S_ISWGRP(m)    (((m) & S_IRWXG) == S_IWGRP)
-#define S_ISXGRP(m)    (((m) & S_IRWXG) == S_IXGRP)
-
-#define S_ISROTH(m)    (((m) & S_IRWXO) == S_IROTH)
-#define S_ISWOTH(m)    (((m) & S_IRWXO) == S_IWOTH)
-#define S_ISXOTH(m)    (((m) & S_IRWXO) == S_IXOTH)
-
-bool FileAttributes::ReadAttributes() {
-    bool result = false;
-
-#ifdef WINDOWS
-    DWORD attributes = ::GetFileAttributes(FFileName.data());
-
-    if (attributes != INVALID_FILE_ATTRIBUTES) {
-        result = true;
-
-        if (attributes | FILE_ATTRIBUTE_ARCHIVE) {
-            FAttributes.push_back(faArchive);
-        }
-        if (attributes | FILE_ATTRIBUTE_COMPRESSED) {
-            FAttributes.push_back(faCompressed);
-        }
-        if (attributes | FILE_ATTRIBUTE_DEVICE) {
-            FAttributes.push_back(faDevice);
-        }
-        if (attributes | FILE_ATTRIBUTE_DIRECTORY) {
-            FAttributes.push_back(faDirectory);
-        }
-        if (attributes | FILE_ATTRIBUTE_ENCRYPTED) {
-            FAttributes.push_back(faEncrypted);
-        }
-        if (attributes | FILE_ATTRIBUTE_HIDDEN) {
-            FAttributes.push_back(faHidden);
-        }
-        // if (attributes | FILE_ATTRIBUTE_INTEGRITY_STREAM) {
-        //     FAttributes.push_back(faIntegrityStream);
-        // }
-        if (attributes | FILE_ATTRIBUTE_NORMAL) {
-            FAttributes.push_back(faNormal);
-        }
-        if (attributes | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {
-            FAttributes.push_back(faNotContentIndexed);
-        }
-        // if (attributes | FILE_ATTRIBUTE_NO_SCRUB_DATA) {
-        //     FAttributes.push_back(faNoScrubData);
-        // }
-        if (attributes | FILE_ATTRIBUTE_SYSTEM) {
-            FAttributes.push_back(faSystem);
-        }
-        if (attributes | FILE_ATTRIBUTE_OFFLINE) {
-            FAttributes.push_back(faOffline);
-        }
-        if (attributes | FILE_ATTRIBUTE_REPARSE_POINT) {
-            FAttributes.push_back(faSymbolicLink);
-        }
-        if (attributes | FILE_ATTRIBUTE_SPARSE_FILE) {
-            FAttributes.push_back(faSparceFile);
-        }
-        if (attributes | FILE_ATTRIBUTE_READONLY ) {
-            FAttributes.push_back(faReadOnly);
-        }
-        if (attributes | FILE_ATTRIBUTE_TEMPORARY) {
-            FAttributes.push_back(faTemporary);
-        }
-        if (attributes | FILE_ATTRIBUTE_VIRTUAL) {
-            FAttributes.push_back(faVirtual);
-        }
-    }
-#endif // WINDOWS
-#ifdef POSIX
-    struct stat status;
-
-    if (stat(StringToFileSystemString(FFileName), &status) == 0) {
-        result = true;
-
-        if (S_ISBLK(status.st_mode) != 0) {
-            FAttributes.push_back(faBlockSpecial);
-        }
-        if (S_ISCHR(status.st_mode) != 0) {
-            FAttributes.push_back(faCharacterSpecial);
-        }
-        if (S_ISFIFO(status.st_mode) != 0) {
-            FAttributes.push_back(faFIFOSpecial);
-        }
-        if (S_ISREG(status.st_mode) != 0) {
-            FAttributes.push_back(faNormal);
-        }
-        if (S_ISDIR(status.st_mode) != 0) {
-            FAttributes.push_back(faDirectory);
-        }
-        if (S_ISLNK(status.st_mode) != 0) {
-            FAttributes.push_back(faSymbolicLink);
-        }
-        if (S_ISSOCK(status.st_mode) != 0) {
-            FAttributes.push_back(faSocket);
-        }
-
-        // Owner
-        if (S_ISRUSR(status.st_mode) != 0) {
-            if (S_ISWUSR(status.st_mode) != 0) {
-                FAttributes.push_back(faReadWrite);
-            } else {
-                FAttributes.push_back(faReadOnly);
-            }
-        } else if (S_ISWUSR(status.st_mode) != 0) {
-            FAttributes.push_back(faWriteOnly);
-        }
-
-        if (S_ISXUSR(status.st_mode) != 0) {
-            FAttributes.push_back(faExecute);
-        }
-
-        // Group
-        if (S_ISRGRP(status.st_mode) != 0) {
-            if (S_ISWGRP(status.st_mode) != 0) {
-                FAttributes.push_back(faGroupReadWrite);
-            } else {
-                FAttributes.push_back(faGroupReadOnly);
-            }
-        } else if (S_ISWGRP(status.st_mode) != 0) {
-            FAttributes.push_back(faGroupWriteOnly);
-        }
-
-        if (S_ISXGRP(status.st_mode) != 0) {
-            FAttributes.push_back(faGroupExecute);
-        }
-
-
-        // Others
-        if (S_ISROTH(status.st_mode) != 0) {
-            if (S_ISWOTH(status.st_mode) != 0) {
-                FAttributes.push_back(faOthersReadWrite);
-            } else {
-                FAttributes.push_back(faOthersReadOnly);
-            }
-        }
-        else if (S_ISWOTH(status.st_mode) != 0) {
-            FAttributes.push_back(faOthersWriteOnly);
-        }
-
-        if (S_ISXOTH(status.st_mode) != 0) {
-            FAttributes.push_back(faOthersExecute);
-        }
-
-        if (FFileName.size() > 0 && FFileName[0] == '.') {
-            FAttributes.push_back(faHidden);
-        }
-    }
-#endif // POSIX
-
-    return result;
-}
-
-bool FileAttributes::Valid(const FileAttribute Value) {
-    bool result = false;
-
-    switch (Value) {
-#ifdef WINDOWS
-        case faHidden:
-#endif // WINDOWS
-#ifdef POSIX
-        case faReadWrite:
-        case faWriteOnly:
-        case faExecute:
-
-        case faGroupReadWrite:
-        case faGroupWriteOnly:
-        case faGroupReadOnly:
-        case faGroupExecute:
-
-        case faOthersReadWrite:
-        case faOthersWriteOnly:
-        case faOthersReadOnly:
-        case faOthersExecute:
-#endif // POSIX
-
-        case faReadOnly: {
-            result = true;
-            break;
-        }
-        default:
-            break;
-    }
-
-    return result;
-}
-
-void FileAttributes::Append(FileAttribute Value) {
-    if (Valid(Value) == true) {
-#ifdef POSIX
-        if ((Value == faReadOnly && Contains(faWriteOnly) == true) ||
-            (Value == faWriteOnly && Contains(faReadOnly) == true)) {
-            Value = faReadWrite;
-        }
-#endif // POSIX
-
-        FAttributes.push_back(Value);
-        WriteAttributes();
-    }
-}
-
-bool FileAttributes::Contains(FileAttribute Value) {
-    bool result = false;
-
-    std::vector<FileAttribute>::const_iterator iterator =
-            std::find(FAttributes.begin(), FAttributes.end(), Value);
-
-    if (iterator != FAttributes.end()) {
-        result = true;
-    }
-
-    return result;
-}
-
-void FileAttributes::Remove(FileAttribute Value) {
-    if (Valid(Value) == true) {
-#ifdef POSIX
-        if (Value == faReadOnly && Contains(faReadWrite) == true) {
-            Append(faWriteOnly);
-            Remove(faReadWrite);
-        }
-        else if (Value == faWriteOnly && Contains(faReadWrite) == true) {
-            Append(faReadOnly);
-            Remove(faReadWrite);
-        }
-#endif // POSIX
-
-        std::vector<FileAttribute>::iterator iterator =
-            std::find(FAttributes.begin(), FAttributes.end(), Value);
-
-        if (iterator != FAttributes.end()) {
-            FAttributes.erase(iterator);
-            WriteAttributes();
-        }
-    }
-}
--- a/src/jdk.jpackage/share/native/libapplauncher/FilePath.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/FilePath.h	Sun Feb 17 14:08:26 2019 -0500
@@ -28,60 +28,10 @@
 
 #include "Platform.h"
 #include "PlatformString.h"
+#include "FileAttribute.h"
 
 #include <vector>
 
-enum FileAttribute {
-#ifdef WINDOWS
-    faArchive = FILE_ATTRIBUTE_ARCHIVE,
-    faCompressed = FILE_ATTRIBUTE_COMPRESSED,
-    faDevice = FILE_ATTRIBUTE_DEVICE,
-    faDirectory = FILE_ATTRIBUTE_DIRECTORY,
-    faEncrypted = FILE_ATTRIBUTE_ENCRYPTED,
-    faHidden = FILE_ATTRIBUTE_HIDDEN,
-    //faIntegrityStream = FILE_ATTRIBUTE_INTEGRITY_STREAM,
-    faNormal = FILE_ATTRIBUTE_NORMAL,
-    faNotContentIndexed = FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
-    //faNoScrubData = FILE_ATTRIBUTE_NO_SCRUB_DATA,
-    faOffline = FILE_ATTRIBUTE_OFFLINE,
-    faSystem = FILE_ATTRIBUTE_SYSTEM,
-    faSymbolicLink = FILE_ATTRIBUTE_REPARSE_POINT,
-    faSparceFile = FILE_ATTRIBUTE_SPARSE_FILE,
-    faReadOnly = FILE_ATTRIBUTE_READONLY,
-    faTemporary = FILE_ATTRIBUTE_TEMPORARY,
-    faVirtual = FILE_ATTRIBUTE_VIRTUAL
-#endif //WINDOWS
-#ifdef POSIX
-    faBlockSpecial,
-    faCharacterSpecial,
-    faFIFOSpecial,
-    faNormal,
-    faDirectory,
-    faSymbolicLink,
-    faSocket,
-
-    // Owner
-    faReadOnly,
-    faWriteOnly,
-    faReadWrite,
-    faExecute,
-
-    // Group
-    faGroupReadOnly,
-    faGroupWriteOnly,
-    faGroupReadWrite,
-    faGroupExecute,
-
-    // Others
-    faOthersReadOnly,
-    faOthersWriteOnly,
-    faOthersReadWrite,
-    faOthersExecute,
-
-    faHidden
-#endif //POSIX
-};
-
 class FileAttributes {
 private:
     TString FFileName;
--- a/src/jdk.jpackage/share/native/libapplauncher/GenericPlatform.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "GenericPlatform.h"
-
-#include <fstream>
-#include <locale>
-
-#ifdef WINDOWS
-#include <codecvt>
-#endif // WINDOWS
-
-
-GenericPlatform::GenericPlatform(void) {
-}
-
-GenericPlatform::~GenericPlatform(void) {
-}
-
-TString GenericPlatform::GetConfigFileName() {
-    TString result;
-    TString basedir = GetPackageAppDirectory();
-
-    if (basedir.empty() == false) {
-        basedir = FilePath::IncludeTrailingSeparator(basedir);
-        TString appConfig = basedir + GetAppName() + _T(".cfg");
-
-        if (FilePath::FileExists(appConfig) == true) {
-            result = appConfig;
-        }
-        else {
-            result = basedir + _T("package.cfg");
-
-            if (FilePath::FileExists(result) == false) {
-                result = _T("");
-            }
-        }
-    }
-
-    return result;
-}
-
-TString GenericPlatform::GetPackageAppDirectory() {
-#if defined(WINDOWS) || defined(LINUX)
-    return FilePath::IncludeTrailingSeparator(
-            GetPackageRootDirectory()) + _T("app");
-#endif // WINDOWS || LINUX
-#ifdef MAC
-    return FilePath::IncludeTrailingSeparator(
-            GetPackageRootDirectory()) + _T("Java");
-#endif
-}
-
-TString GenericPlatform::GetPackageLauncherDirectory() {
-#if defined(WINDOWS) || defined(LINUX)
-    return GetPackageRootDirectory();
-#endif // WINDOWS || LINUX
-#ifdef MAC
-    return FilePath::IncludeTrailingSeparator(
-            GetPackageRootDirectory()) + _T("MacOS");
-#endif
-}
-
-TString GenericPlatform::GetPackageRuntimeBinDirectory() {
-#ifdef WINDOWS
-    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("runtime\\bin");
-#endif // WINDOWS
-#ifdef LINUX
-    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("runtime/bin");
-#endif // LINUX
-#ifdef MAC
-    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("Plugins/Java.runtime/Contents/Home/bin");
-#endif
-}
-
-std::list<TString> GenericPlatform::LoadFromFile(TString FileName) {
-    std::list<TString> result;
-
-    if (FilePath::FileExists(FileName) == true) {
-        std::wifstream stream(FileName.data());
-
-#ifdef WINDOWS
-        const std::locale empty_locale = std::locale::empty();
-#endif // WINDOWS
-#ifdef POSIX
-        const std::locale empty_locale = std::locale::classic();
-#endif // POSIX
-#if defined(WINDOWS)
-        const std::locale utf8_locale =
-                std::locale(empty_locale, new std::codecvt_utf8<wchar_t>());
-        stream.imbue(utf8_locale);
-#endif // WINDOWS
-
-        if (stream.is_open() == true) {
-            while (stream.eof() == false) {
-                std::wstring line;
-                std::getline(stream, line);
-
-                // # at the first character will comment out the line.
-                if (line.empty() == false && line[0] != '#') {
-                    result.push_back(PlatformString(line).toString());
-                }
-            }
-        }
-    }
-
-    return result;
-}
-
-void GenericPlatform::SaveToFile(TString FileName, std::list<TString> Contents, bool ownerOnly) {
-    TString path = FilePath::ExtractFilePath(FileName);
-
-    if (FilePath::DirectoryExists(path) == false) {
-        FilePath::CreateDirectory(path, ownerOnly);
-    }
-
-    std::wofstream stream(FileName.data());
-
-    FilePath::ChangePermissions(FileName.data(), ownerOnly);
-
-#ifdef WINDOWS
-    const std::locale empty_locale = std::locale::empty();
-#endif // WINDOWS
-#ifdef POSIX
-    const std::locale empty_locale = std::locale::classic();
-#endif // POSIX
-#if defined(WINDOWS)
-    const std::locale utf8_locale =
-            std::locale(empty_locale, new std::codecvt_utf8<wchar_t>());
-    stream.imbue(utf8_locale);
-#endif // WINDOWS || MAC
-
-    if (stream.is_open() == true) {
-        for (std::list<TString>::const_iterator iterator =
-                Contents.begin(); iterator != Contents.end(); iterator++) {
-            TString line = *iterator;
-            stream << PlatformString(line).toUnicodeString() << std::endl;
-        }
-    }
-}
-
-#if defined(WINDOWS) || defined(LINUX)
-TString GenericPlatform::GetAppName() {
-    TString result = GetModuleFileName();
-    result = FilePath::ExtractFileName(result);
-#if defined(WINDOWS)
-    result = FilePath::ChangeFileExt(result, _T(""));
-#endif
-    return result;
-}
-#endif // WINDOWS || LINUX
-
-std::map<TString, TString> GenericPlatform::GetKeys() {
-    std::map<TString, TString> keys;
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION,
-            _T("app.version")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY,
-            _T("app.mainjar")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINMODULE_KEY,
-            _T("app.mainmodule")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY,
-            _T("app.mainclass")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY,
-            _T("app.classpath")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_MODULEPATH_KEY,
-            _T("app.modulepath")));
-    keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY,
-            _T("app.name")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_ID_KEY,
-            _T("app.preferences.id")));
-    keys.insert(std::map<TString, TString>::value_type(JVM_RUNTIME_KEY,
-            _T("app.runtime")));
-    keys.insert(std::map<TString, TString>::value_type(JPACKAGE_APP_DATA_DIR,
-            _T("app.identifier")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_SPLASH_KEY,
-            _T("app.splash")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_MEMORY,
-            _T("app.memory")));
-    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_DEBUG,
-            _T("app.debug")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_APPLICATION_INSTANCE,
-            _T("app.application.instance")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_SECTION_APPLICATION,
-            _T("Application")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_SECTION_JVMOPTIONS,
-            _T("JVMOptions")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_SECTION_APPCDSJVMOPTIONS,
-            _T("AppCDSJVMOptions")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS,
-            _T("AppCDSGenerateCacheJVMOptions")));
-    keys.insert(std::map<TString,
-            TString>::value_type(CONFIG_SECTION_ARGOPTIONS,
-            _T("ArgOptions")));
-
-    return keys;
-}
-
-#ifdef DEBUG
-DebugState GenericPlatform::GetDebugState() {
-    DebugState result = dsNone;
-
-    if (IsNativeDebuggerPresent() == true) {
-        result = dsNative;
-    }
-
-    return result;
-}
-#endif // DEBUG
--- a/src/jdk.jpackage/share/native/libapplauncher/GenericPlatform.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef GENERICPLATFORM_H
-#define GENERICPLATFORM_H
-
-#include "FilePath.h"
-// #include "Platform.h"
-
-#ifdef WINDOWS
-#pragma warning( push )
-// C4250 - 'class1' : inherits 'class2::member' via dominance
-#pragma warning( disable : 4250 )
-#endif
-
-class GenericPlatform : virtual public Platform {
-public:
-    GenericPlatform(void);
-    virtual ~GenericPlatform(void);
-
-    virtual TString GetPackageAppDirectory();
-    virtual TString GetPackageLauncherDirectory();
-    virtual TString GetPackageRuntimeBinDirectory();
-
-    virtual TString GetConfigFileName();
-
-    virtual std::list<TString> LoadFromFile(TString FileName);
-    virtual void SaveToFile(TString FileName,
-            std::list<TString> Contents, bool ownerOnly);
-
-#if defined(WINDOWS) || defined(LINUX)
-    virtual TString GetAppName();
-#endif // WINDOWS || LINUX
-
-    virtual std::map<TString, TString> GetKeys();
-
-#ifdef DEBUG
-    virtual DebugState GetDebugState();
-#endif // DEBUG
-};
-#ifdef WINDOWS
-#pragma warning( pop ) // C4250
-#endif
-#endif // GENERICPLATFORM_H
--- a/src/jdk.jpackage/share/native/libapplauncher/Helpers.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/Helpers.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -230,7 +230,7 @@
 
     for (OrderedMap<TString, TString>::const_iterator iterator = Map.begin();
             iterator != Map.end(); iterator++) {
-       pair<TString, TString> *item = *iterator;
+       JPPair<TString, TString> *item = *iterator;
        TString key = item->first;
        TString value = item->second;
 
--- a/src/jdk.jpackage/share/native/libapplauncher/IniFile.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/IniFile.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -35,7 +35,7 @@
 IniFile::~IniFile() {
     for (OrderedMap<TString, IniSectionData*>::iterator iterator =
             FMap.begin(); iterator != FMap.end(); iterator++) {
-        pair<TString, IniSectionData*> *item = *iterator;
+        JPPair<TString, IniSectionData*> *item = *iterator;
         delete item->second;
     }
 }
--- a/src/jdk.jpackage/share/native/libapplauncher/JavaTypes.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "JavaTypes.h"
-#include "PlatformString.h"
-
-#include <list>
-
-
-#ifdef DEBUG
-TString JavaException::CreateExceptionMessage(JNIEnv* Env,
-        jthrowable Exception, jmethodID GetCauseMethod,
-        jmethodID GetStackTraceMethod, jmethodID ThrowableToTStringMethod,
-        jmethodID FrameToTStringMethod) {
-
-    TString result;
-    jobjectArray frames =
-            (jobjectArray)Env->CallObjectMethod(Exception, GetStackTraceMethod);
-
-    // Append Throwable.toTString().
-    if (0 != frames) {
-        jstring jstr = (jstring)Env->CallObjectMethod(Exception,
-                ThrowableToTStringMethod);
-        const char* str = Env->GetStringUTFChars(jstr, 0);
-        result += PlatformString(str).toPlatformString();
-        Env->ReleaseStringUTFChars(jstr, str);
-        Env->DeleteLocalRef(jstr);
-    }
-
-    // Append stack trace if one exists.
-    if (Env->GetArrayLength(frames) > 0) {
-        jsize i = 0;
-
-        for (i = 0; i < Env->GetArrayLength(frames); i++) {
-            // Get the string from the next frame and append it to
-            // the error message.
-            jobject frame = Env->GetObjectArrayElement(frames, i);
-            jstring obj = (jstring)Env->CallObjectMethod(frame,
-                    FrameToTStringMethod);
-            const char* str = Env->GetStringUTFChars(obj, 0);
-            result += _T("\n  ");
-            result += PlatformString(str).toPlatformString();
-            Env->ReleaseStringUTFChars(obj, str);
-            Env->DeleteLocalRef(obj);
-            Env->DeleteLocalRef(frame);
-        }
-    }
-
-    // If Exception has a cause then append the stack trace messages.
-    if (0 != frames) {
-        jthrowable cause =
-                (jthrowable)Env->CallObjectMethod(Exception, GetCauseMethod);
-
-        if (cause != NULL) {
-            result += CreateExceptionMessage(Env, cause, GetCauseMethod,
-                GetStackTraceMethod, ThrowableToTStringMethod,
-                FrameToTStringMethod);
-        }
-    }
-
-    return result;
-}
-#endif //DEBUG
-
-JavaException::JavaException() : Exception() {}
-
-//#ifdef WINDOWS
-JavaException::JavaException(JNIEnv *Env,
-        const TString Message) : Exception(Message) {
-//#endif //WINDOWS
-//#ifdef POSIX
-//JavaException::JavaException(JNIEnv *Env, TString message) {
-//#endif //POSIX
-
-    FEnv = Env;
-    FException = Env->ExceptionOccurred();
-    Env->ExceptionClear();
-
-#ifdef DEBUG
-    Platform& platform = Platform::GetInstance();
-
-    if (platform.GetDebugState() == dsNone) {
-        jclass ThrowableClass = Env->FindClass("java/lang/Throwable");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        jmethodID GetCauseMethod = Env->GetMethodID(ThrowableClass,
-                "getCause", "()Ljava/lang/Throwable;");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        jmethodID GetStackTraceMethod = Env->GetMethodID(ThrowableClass,
-                 "getStackTrace", "()[Ljava/lang/StackTraceElement;");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        jmethodID ThrowableToTStringMethod = Env->GetMethodID(ThrowableClass,
-                "toString", "()Ljava/lang/String;");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        jclass FrameClass = Env->FindClass("java/lang/StackTraceElement");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        jmethodID FrameToTStringMethod = Env->GetMethodID(FrameClass,
-                "toString", "()Ljava/lang/String;");
-
-        if (FEnv->ExceptionCheck() == JNI_TRUE) {
-            Env->ExceptionClear();
-            return;
-        }
-
-        TString lmessage = CreateExceptionMessage(Env, FException,
-                GetCauseMethod, GetStackTraceMethod, ThrowableToTStringMethod,
-                FrameToTStringMethod);
-        SetMessage(lmessage);
-    }
-#endif //DEBUG
-}
-
-void JavaException::Rethrow() {
-    FEnv->Throw(FException);
-}
--- a/src/jdk.jpackage/share/native/libapplauncher/JavaTypes.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef JAVATYPES_H
-#define JAVATYPES_H
-
-#include "Platform.h"
-#include "Messages.h"
-
-#include "jni.h"
-
-class JavaException : public Exception {
-// Prohibit Heap-Based Classes.
-private:
-    static void *operator new(size_t size);
-
-private:
-#ifdef DEBUG
-    static TString CreateExceptionMessage(JNIEnv* Env, jthrowable Exception,
-            jmethodID GetCauseMethod, jmethodID GetStackTraceMethod,
-            jmethodID ThrowableToStringMethod, jmethodID FrameToStringMethod);
-#endif // DEBUG
-
-    jthrowable FException;
-    JNIEnv *FEnv;
-
-public:
-    explicit JavaException();
-    explicit JavaException(JNIEnv *Env, const TString message);
-    virtual ~JavaException() throw() {}
-
-    void Rethrow();
-};
-
-#endif // JAVATYPES_H
--- a/src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -28,11 +28,9 @@
 #include "PlatformString.h"
 #include "FilePath.h"
 #include "Package.h"
-#include "JavaTypes.h"
 #include "Helpers.h"
 #include "Messages.h"
 #include "Macros.h"
-#include "PlatformThread.h"
 
 #include "jni.h"
 
@@ -54,35 +52,6 @@
     return result;
 }
 
-JavaLibrary::JavaLibrary() : Library(), FCreateProc(NULL)  {
-}
-
-bool JavaLibrary::JavaVMCreate(size_t argc, char *argv[]) {
-    if (FCreateProc == NULL) {
-        FCreateProc = (JVM_CREATE)GetProcAddress(LAUNCH_FUNC);
-    }
-
-    if (FCreateProc == NULL) {
-        Platform& platform = Platform::GetInstance();
-        Messages& messages = Messages::GetInstance();
-        platform.ShowMessage(
-                messages.GetMessage(FAILED_LOCATING_JVM_ENTRY_POINT));
-        return false;
-    }
-
-    return FCreateProc((int)argc, argv,
-            0, NULL,
-            0, NULL,
-            "",
-            "",
-            "java",
-            "java",
-            false,
-            false,
-            false,
-            0) == 0;
-}
-
 //----------------------------------------------------------------------------
 
 JavaOptions::JavaOptions(): FOptions(NULL) {
@@ -265,22 +234,8 @@
 void JavaVirtualMachine::configureLibrary() {
     Platform& platform = Platform::GetInstance();
     Package& package = Package::GetInstance();
-    // TODO: Clean this up. Because of bug JDK-8131321 the opening of the
-    // PE file ails in WindowsPlatform.cpp on the check to
-    // if (pNTHeader->Signature == IMAGE_NT_SIGNATURE)
     TString libName = package.GetJVMLibraryFileName();
-#ifdef _WIN64
-    if (FilePath::FileExists(_T("msvcr100.dll")) == true) {
-        javaLibrary.AddDependency(_T("msvcr100.dll"));
-    }
-
-    TString runtimeBin = platform.GetPackageRuntimeBinDirectory();
-    SetDllDirectory(runtimeBin.c_str());
-#else
-    javaLibrary.AddDependencies(
-            platform.FilterOutRuntimeDependenciesForPlatform(
-            platform.GetLibraryImports(libName)));
-#endif
+    platform.addPlatformDependencies(&javaLibrary);
     javaLibrary.Load(libName);
 }
 
--- a/src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/JavaVirtualMachine.h	Sun Feb 17 14:08:26 2019 -0500
@@ -29,6 +29,7 @@
 
 #include "jni.h"
 #include "Platform.h"
+#include "Library.h"
 
 struct JavaOptionItem {
     TString name;
@@ -54,29 +55,6 @@
     size_t GetCount();
 };
 
-// Private typedef for function pointer casting
-#define LAUNCH_FUNC "JLI_Launch"
-
-typedef int (JNICALL *JVM_CREATE)(int argc, char ** argv,
-                                  int jargc, const char** jargv,
-                                  int appclassc, const char** appclassv,
-                                  const char* fullversion,
-                                  const char* dotversion,
-                                  const char* pname,
-                                  const char* lname,
-                                  jboolean javaargs,
-                                  jboolean cpwildcard,
-                                  jboolean javaw,
-                                  jint ergo);
-
-class JavaLibrary : public Library {
-    JVM_CREATE FCreateProc;
-    JavaLibrary(const TString &FileName);
-public:
-    JavaLibrary();
-    bool JavaVMCreate(size_t argc, char *argv[]);
-};
-
 class JavaVirtualMachine {
 private:
     JavaLibrary javaLibrary;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/share/native/libapplauncher/Library.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "Library.h"
+#include "Platform.h"
+#include "Messages.h"
+#include "PlatformString.h"
+
+#include <fstream>
+#include <locale>
+
+Library::Library() {
+    Initialize();
+}
+
+Library::Library(const TString &FileName) {
+    Initialize();
+    Load(FileName);
+}
+
+Library::~Library() {
+    Unload();
+}
+
+void Library::Initialize() {
+    FModule = NULL;
+    FDependentLibraryNames = NULL;
+    FDependenciesLibraries = NULL;
+}
+
+void Library::InitializeDependencies() {
+    if (FDependentLibraryNames == NULL) {
+        FDependentLibraryNames = new std::vector<TString>();
+    }
+
+    if (FDependenciesLibraries == NULL) {
+        FDependenciesLibraries = new std::vector<Library*>();
+    }
+}
+
+void Library::LoadDependencies() {
+    if (FDependentLibraryNames != NULL && FDependenciesLibraries != NULL) {
+        for (std::vector<TString>::const_iterator iterator =
+                FDependentLibraryNames->begin();
+                iterator != FDependentLibraryNames->end(); iterator++) {
+            Library* library = new Library();
+
+            if (library->Load(*iterator) == true) {
+                FDependenciesLibraries->push_back(library);
+            }
+        }
+
+        delete FDependentLibraryNames;
+        FDependentLibraryNames = NULL;
+    }
+}
+
+void Library::UnloadDependencies() {
+    if (FDependenciesLibraries != NULL) {
+        for (std::vector<Library*>::const_iterator iterator =
+                FDependenciesLibraries->begin();
+                iterator != FDependenciesLibraries->end(); iterator++) {
+            Library* library = *iterator;
+
+            if (library != NULL) {
+                library->Unload();
+                delete library;
+            }
+        }
+
+        delete FDependenciesLibraries;
+        FDependenciesLibraries = NULL;
+    }
+}
+
+Procedure Library::GetProcAddress(const std::string& MethodName) const {
+    Platform& platform = Platform::GetInstance();
+    return platform.GetProcAddress(FModule, MethodName);
+}
+
+bool Library::Load(const TString &FileName) {
+    bool result = true;
+
+    if (FModule == NULL) {
+        LoadDependencies();
+        Platform& platform = Platform::GetInstance();
+        FModule = platform.LoadLibrary(FileName);
+
+        if (FModule == NULL) {
+            Messages& messages = Messages::GetInstance();
+            platform.ShowMessage(messages.GetMessage(LIBRARY_NOT_FOUND),
+                    FileName);
+            result = false;
+        } else {
+            fname = PlatformString(FileName).toStdString();
+        }
+    }
+
+    return result;
+}
+
+bool Library::Unload() {
+    bool result = false;
+
+    if (FModule != NULL) {
+        Platform& platform = Platform::GetInstance();
+        platform.FreeLibrary(FModule);
+        FModule = NULL;
+        UnloadDependencies();
+        result = true;
+    }
+
+    return result;
+}
+
+void Library::AddDependency(const TString &FileName) {
+    InitializeDependencies();
+
+    if (FDependentLibraryNames != NULL) {
+        FDependentLibraryNames->push_back(FileName);
+    }
+}
+
+void Library::AddDependencies(const std::vector<TString> &Dependencies) {
+    if (Dependencies.size() > 0) {
+        InitializeDependencies();
+
+        if (FDependentLibraryNames != NULL) {
+            for (std::vector<TString>::const_iterator iterator =
+                    FDependentLibraryNames->begin();
+                    iterator != FDependentLibraryNames->end(); iterator++) {
+                TString fileName = *iterator;
+                AddDependency(fileName);
+            }
+        }
+    }
+}
+
+JavaLibrary::JavaLibrary() : Library(), FCreateProc(NULL) {
+}
+
+bool JavaLibrary::JavaVMCreate(size_t argc, char *argv[]) {
+    if (FCreateProc == NULL) {
+        FCreateProc = (JVM_CREATE) GetProcAddress(LAUNCH_FUNC);
+    }
+
+    if (FCreateProc == NULL) {
+        Platform& platform = Platform::GetInstance();
+        Messages& messages = Messages::GetInstance();
+        platform.ShowMessage(
+                messages.GetMessage(FAILED_LOCATING_JVM_ENTRY_POINT));
+        return false;
+    }
+
+    return FCreateProc((int) argc, argv,
+            0, NULL,
+            0, NULL,
+            "",
+            "",
+            "java",
+            "java",
+            false,
+            false,
+            false,
+            0) == 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/share/native/libapplauncher/Library.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef LIBRARY_H
+#define LIBRARY_H
+
+#include "PlatformDefs.h"
+//#include "Platform.h"
+#include "OrderedMap.h"
+
+#include "jni.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+#include <string>
+#include <map>
+#include <list>
+#include <vector>
+#include <fstream>
+
+using namespace std;
+
+// Private typedef for function pointer casting
+#define LAUNCH_FUNC "JLI_Launch"
+
+typedef int (JNICALL *JVM_CREATE)(int argc, char ** argv,
+        int jargc, const char** jargv,
+        int appclassc, const char** appclassv,
+        const char* fullversion,
+        const char* dotversion,
+        const char* pname,
+        const char* lname,
+        jboolean javaargs,
+        jboolean cpwildcard,
+        jboolean javaw,
+        jint ergo);
+
+class Library {
+private:
+    std::vector<TString> *FDependentLibraryNames;
+    std::vector<Library*> *FDependenciesLibraries;
+    Module FModule;
+    std::string fname;
+
+    void Initialize();
+    void InitializeDependencies();
+    void LoadDependencies();
+    void UnloadDependencies();
+
+public:
+    void* GetProcAddress(const std::string& MethodName) const;
+
+public:
+    Library();
+    Library(const TString &FileName);
+    ~Library();
+
+    bool Load(const TString &FileName);
+    bool Unload();
+
+    const std::string& GetName() const {
+        return fname;
+    }
+
+    void AddDependency(const TString &FileName);
+    void AddDependencies(const std::vector<TString> &Dependencies);
+};
+
+class JavaLibrary : public Library {
+    JVM_CREATE FCreateProc;
+    JavaLibrary(const TString &FileName);
+public:
+    JavaLibrary();
+    bool JavaVMCreate(size_t argc, char *argv[]);
+};
+
+#endif // LIBRARY_H
+
--- a/src/jdk.jpackage/share/native/libapplauncher/LinuxPlatform.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1181 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef LINUX
-
-#include "JavaVirtualMachine.h"
-#include "LinuxPlatform.h"
-#include "PlatformString.h"
-#include "IniFile.h"
-#include "Helpers.h"
-
-#include <stdlib.h>
-#include <pwd.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <limits.h>
-
-#define LINUX_JPACKAGE_TMP_DIR "/.java/jpackage/tmp"
-
-
-TString GetEnv(const TString &name) {
-    TString result;
-
-    char *value = ::getenv((TCHAR*)name.c_str());
-
-    if (value != NULL) {
-       result = value;
-    }
-
-    return result;
-}
-
-LinuxPlatform::LinuxPlatform(void) : Platform(),
-        GenericPlatform(), PosixPlatform() {
-    FMainThread = pthread_self();
-}
-
-LinuxPlatform::~LinuxPlatform(void) {
-}
-
-void LinuxPlatform::ShowMessage(TString title, TString description) {
-    printf("%s %s\n", PlatformString(title).toPlatformString(),
-            PlatformString(description).toPlatformString());
-    fflush(stdout);
-}
-
-void LinuxPlatform::ShowMessage(TString description) {
-    TString appname = GetModuleFileName();
-    appname = FilePath::ExtractFileName(appname);
-    ShowMessage(PlatformString(appname).toPlatformString(),
-            PlatformString(description).toPlatformString());
-}
-
-TCHAR* LinuxPlatform::ConvertStringToFileSystemString(TCHAR* Source,
-         bool &release) {
-    // Not Implemented.
-    return NULL;
-}
-
-TCHAR* LinuxPlatform::ConvertFileSystemStringToString(TCHAR* Source,
-         bool &release) {
-    // Not Implemented.
-    return NULL;
-}
-
-TString LinuxPlatform::GetModuleFileName() {
-    ssize_t len = 0;
-    TString result;
-    DynamicBuffer<TCHAR> buffer(MAX_PATH);
-    if (buffer.GetData() == NULL) {
-        return result;
-    }
-
-    if ((len = readlink("/proc/self/exe", buffer.GetData(),
-            MAX_PATH - 1)) != -1) {
-        buffer[len] = '\0';
-        result = buffer.GetData();
-    }
-
-    return result;
-}
-
-void LinuxPlatform::SetCurrentDirectory(TString Value) {
-    chdir(PlatformString(Value).toPlatformString());
-}
-
-TString LinuxPlatform::GetPackageRootDirectory() {
-    TString filename = GetModuleFileName();
-    return FilePath::ExtractFilePath(filename);
-}
-
-TString LinuxPlatform::GetAppDataDirectory() {
-    TString result;
-    TString home = GetEnv(_T("HOME"));
-
-    if (home.empty() == false) {
-        result += FilePath::IncludeTrailingSeparator(home) + _T(".local");
-    }
-
-    return result;
-}
-
-ISectionalPropertyContainer* LinuxPlatform::GetConfigFile(TString FileName) {
-    IniFile *result = new IniFile();
-    if (result == NULL) {
-        return NULL;
-    }
-
-    if (result->LoadFromFile(FileName) == false) {
-        // New property file format was not found,
-        // attempt to load old property file format.
-        Helpers::LoadOldConfigFile(FileName, result);
-    }
-
-    return result;
-}
-
-TString LinuxPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
-    TString result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-        "lib/libjli.so";
-
-    if (FilePath::FileExists(result) == false) {
-        result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-            "lib/jli/libjli.so";
-        if (FilePath::FileExists(result) == false) {
-            printf("Cannot find libjli.so!");
-        }
-    }
-
-    return result;
-}
-
-bool LinuxPlatform::IsMainThread() {
-    bool result = (FMainThread == pthread_self());
-    return result;
-}
-
-TString LinuxPlatform::getTmpDirString() {
-    return TString(LINUX_JPACKAGE_TMP_DIR);
-}
-
-TPlatformNumber LinuxPlatform::GetMemorySize() {
-    long pages = sysconf(_SC_PHYS_PAGES);
-    long page_size = sysconf(_SC_PAGE_SIZE);
-    TPlatformNumber result = pages * page_size;
-    result = result / 1048576; // Convert from bytes to megabytes.
-    return result;
-}
-
-#ifdef DEBUG
-bool LinuxPlatform::IsNativeDebuggerPresent() {
-    // gdb opens file descriptors stdin=3, stdout=4, stderr=5 whereas
-    // a typical prog uses only stdin=0, stdout=1, stderr=2.
-    bool result = false;
-    FILE *fd = fopen("/tmp", "r");
-
-    if (fileno(fd) > 5) {
-        result = true;
-    }
-
-    fclose(fd);
-    return result;
-}
-
-int LinuxPlatform::GetProcessID() {
-    int pid = getpid();
-    return pid;
-}
-#endif //DEBUG
-
-//----------------------------------------------------------------------------
-
-#ifndef __UNIX_JPACKAGE_PLATFORM__
-#define __UNIX_JPACKAGE_PLATFORM__
-
-/** Provide an abstraction for difference in the platform APIs,
-     e.g. string manipulation functions, etc. */
-#include <stdio.h>
-#include <string.h>
-#include <strings.h>
-#include <sys/stat.h>
-
-#define TCHAR char
-
-#define _T(x) x
-
-#define JPACKAGE_MULTIBYTE_SNPRINTF snprintf
-
-#define JPACKAGE_SNPRINTF(buffer, sizeOfBuffer, count, format, ...) \
-    snprintf((buffer), (count), (format), __VA_ARGS__)
-
-#define JPACKAGE_PRINTF(format, ...) \
-    printf((format), ##__VA_ARGS__)
-
-#define JPACKAGE_FPRINTF(dest, format, ...) \
-    fprintf((dest), (format), __VA_ARGS__)
-
-#define JPACKAGE_SSCANF(buf, format, ...) \
-    sscanf((buf), (format), __VA_ARGS__)
-
-#define JPACKAGE_STRDUP(strSource) \
-    strdup((strSource))
-
-//return "error code" (like on Windows)
-static int JPACKAGE_STRNCPY(char *strDest, size_t numberOfElements,
-        const char *strSource, size_t count) {
-    char *s = strncpy(strDest, strSource, count);
-    // Duplicate behavior of the Windows' _tcsncpy_s() by adding a NULL
-    // terminator at the end of the string.
-    if (count < numberOfElements) {
-        s[count] = '\0';
-    } else {
-        s[numberOfElements - 1] = '\0';
-    }
-    return (s == strDest) ? 0 : 1;
-}
-
-#define JPACKAGE_STRICMP(x, y) \
-    strcasecmp((x), (y))
-
-#define JPACKAGE_STRNICMP(x, y, cnt) \
-    strncasecmp((x), (y), (cnt))
-
-#define JPACKAGE_STRNCMP(x, y, cnt) \
-    strncmp((x), (y), (cnt))
-
-#define JPACKAGE_STRLEN(x) \
-    strlen((x))
-
-#define JPACKAGE_STRSTR(x, y) \
-    strstr((x), (y))
-
-#define JPACKAGE_STRCHR(x, y) \
-    strchr((x), (y))
-
-#define JPACKAGE_STRRCHR(x, y) \
-    strrchr((x), (y))
-
-#define JPACKAGE_STRPBRK(x, y) \
-    strpbrk((x), (y))
-
-#define JPACKAGE_GETENV(x) \
-    getenv((x))
-
-#define JPACKAGE_PUTENV(x) \
-    putenv((x))
-
-#define JPACKAGE_STRCMP(x, y) \
-    strcmp((x), (y))
-
-#define JPACKAGE_STRCPY(x, y) \
-    strcpy((x), (y))
-
-#define JPACKAGE_STRCAT(x, y) \
-    strcat((x), (y))
-
-#define JPACKAGE_ATOI(x) \
-    atoi((x))
-
-#define JPACKAGE_FOPEN(x, y) \
-    fopen((x), (y))
-
-#define JPACKAGE_FGETS(x, y, z) \
-    fgets((x), (y), (z))
-
-#define JPACKAGE_REMOVE(x) \
-    remove((x))
-
-#define JPACKAGE_SPAWNV(mode, cmd, args) \
-    spawnv((mode), (cmd), (args))
-
-#define JPACKAGE_ISDIGIT(ch) isdigit(ch)
-
-// for non-unicode, just return the input string for
-// the following 2 conversions
-#define JPACKAGE_NEW_MULTIBYTE(message) message
-
-#define JPACKAGE_NEW_FROM_MULTIBYTE(message) message
-
-// for non-unicode, no-op for the relase operation
-// since there is no memory allocated for the
-// string conversions
-#define JPACKAGE_RELEASE_MULTIBYTE(tmpMBCS)
-
-#define JPACKAGE_RELEASE_FROM_MULTIBYTE(tmpMBCS)
-
-// The size will be used for converting from 1 byte to 1 byte encoding.
-// Ensure have space for zero-terminator.
-#define JPACKAGE_GET_SIZE_FOR_ENCODING(message, theLength) (theLength + 1)
-
-#endif
-#define xmlTagType    0
-#define xmlPCDataType 1
-
-typedef struct _xmlNode XMLNode;
-typedef struct _xmlAttribute XMLAttribute;
-
-struct _xmlNode {
-    int           _type;        // Type of node: tag, pcdata, cdate
-    TCHAR*         _name;       // Contents of node
-    XMLNode*      _next;        // Next node at same level
-    XMLNode*      _sub;         // First sub-node
-    XMLAttribute* _attributes;  // List of attributes
-};
-
-struct _xmlAttribute {
-    TCHAR* _name;               // Name of attribute
-    TCHAR* _value;              // Value of attribute
-    XMLAttribute* _next;        // Next attribute for this tag
-};
-
-// Public interface
-static void     RemoveNonAsciiUTF8FromBuffer(char *buf);
-XMLNode* ParseXMLDocument    (TCHAR* buf);
-void     FreeXMLDocument     (XMLNode* root);
-
-// Utility methods for parsing document
-XMLNode* FindXMLChild        (XMLNode* root,      const TCHAR* name);
-TCHAR*    FindXMLAttribute    (XMLAttribute* attr, const TCHAR* name);
-
-// Debugging
-void PrintXMLDocument(XMLNode* node, int indt);
-
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <wctype.h>
-
-
-#define JWS_assert(s, msg)      \
-    if (!(s)) { Abort(msg); }
-
-
-// Internal declarations
-static XMLNode*      ParseXMLElement(void);
-static XMLAttribute* ParseXMLAttribute(void);
-static TCHAR*         SkipWhiteSpace(TCHAR *p);
-static TCHAR*         SkipXMLName(TCHAR *p);
-static TCHAR*         SkipXMLComment(TCHAR *p);
-static TCHAR*         SkipXMLDocType(TCHAR *p);
-static TCHAR*         SkipXMLProlog(TCHAR *p);
-static TCHAR*         SkipPCData(TCHAR *p);
-static int           IsPCData(TCHAR *p);
-static void          ConvertBuiltInEntities(TCHAR* p);
-static void          SetToken(int type, TCHAR* start, TCHAR* end);
-static void          GetNextToken(void);
-static XMLNode*      CreateXMLNode(int type, TCHAR* name);
-static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value);
-static XMLNode*      ParseXMLElement(void);
-static XMLAttribute* ParseXMLAttribute(void);
-static void          FreeXMLAttribute(XMLAttribute* attr);
-static void          PrintXMLAttributes(XMLAttribute* attr);
-static void          indent(int indt);
-
-static jmp_buf       jmpbuf;
-static XMLNode*      root_node = NULL;
-
-/** definition of error codes for setjmp/longjmp,
- *  that can be handled in ParseXMLDocument()
- */
-#define JMP_NO_ERROR     0
-#define JMP_OUT_OF_RANGE 1
-
-#define NEXT_CHAR(p) { \
-    if (*p != 0) { \
-        p++; \
-    } else { \
-        longjmp(jmpbuf, JMP_OUT_OF_RANGE); \
-    } \
-}
-#define NEXT_CHAR_OR_BREAK(p) { \
-    if (*p != 0) { \
-        p++; \
-    } else { \
-        break; \
-    } \
-}
-#define NEXT_CHAR_OR_RETURN(p) { \
-    if (*p != 0) { \
-        p++; \
-    } else { \
-        return; \
-    } \
-}
-#define SKIP_CHARS(p,n) { \
-    int i; \
-    for (i = 0; i < (n); i++) { \
-        if (*p != 0) { \
-            p++; \
-        } else { \
-           longjmp(jmpbuf, JMP_OUT_OF_RANGE); \
-        } \
-    } \
-}
-#define SKIP_CHARS_OR_BREAK(p,n) { \
-    int i; \
-    for (i = 0; i < (n); i++) { \
-        if (*p != 0) { \
-            p++; \
-        } else { \
-            break; \
-        } \
-    } \
-    if (i < (n)) { \
-        break; \
-    } \
-}
-
-/** Iterates through the null-terminated buffer (i.e., C string) and
- *  replaces all UTF-8 encoded character >255 with 255
- *
- *  UTF-8 encoding:
- *
- *   Range A:  0x0000 - 0x007F
- *                               0 | bits 0 - 7
- *   Range B : 0x0080 - 0x07FF  :
- *                               110 | bits 6 - 10
- *                               10  | bits 0 - 5
- *   Range C : 0x0800 - 0xFFFF  :
- *                               1110 | bits 12-15
- *                               10   | bits  6-11
- *                               10   | bits  0-5
- */
-static void RemoveNonAsciiUTF8FromBuffer(char *buf) {
-    char* p;
-    char* q;
-    char c;
-    p = q = buf;
-    // We are not using NEXT_CHAR() to check if *q is NULL, as q is output
-    // location and offset for q is smaller than for p.
-    while(*p != '\0') {
-        c = *p;
-        if ( (c & 0x80) == 0) {
-            /* Range A */
-            *q++ = *p;
-            NEXT_CHAR(p);
-        } else if ((c & 0xE0) == 0xC0){
-            /* Range B */
-            *q++ = (char)0xFF;
-            NEXT_CHAR(p);
-            NEXT_CHAR_OR_BREAK(p);
-        } else {
-            /* Range C */
-            *q++ = (char)0xFF;
-            NEXT_CHAR(p);
-            SKIP_CHARS_OR_BREAK(p, 2);
-        }
-    }
-    /* Null terminate string */
-    *q = '\0';
-}
-
-static TCHAR* SkipWhiteSpace(TCHAR *p) {
-    if (p != NULL) {
-        while(iswspace(*p))
-            NEXT_CHAR_OR_BREAK(p);
-    }
-    return p;
-}
-
-static TCHAR* SkipXMLName(TCHAR *p) {
-    TCHAR c = *p;
-    /* Check if start of token */
-    if ( ('a' <= c && c <= 'z') ||
-         ('A' <= c && c <= 'Z') ||
-         c == '_' || c == ':') {
-
-        while( ('a' <= c && c <= 'z') ||
-               ('A' <= c && c <= 'Z') ||
-               ('0' <= c && c <= '9') ||
-               c == '_' || c == ':' || c == '.' || c == '-' ) {
-            NEXT_CHAR(p);
-            c = *p;
-            if (c == '\0') break;
-        }
-    }
-    return p;
-}
-
-static TCHAR* SkipXMLComment(TCHAR *p) {
-    if (p != NULL) {
-        if (JPACKAGE_STRNCMP(p, _T("<!--"), 4) == 0) {
-            SKIP_CHARS(p, 4);
-            do {
-                if (JPACKAGE_STRNCMP(p, _T("-->"), 3) == 0) {
-                    SKIP_CHARS(p, 3);
-                    return p;
-                }
-                NEXT_CHAR(p);
-            } while(*p != '\0');
-        }
-    }
-    return p;
-}
-
-static TCHAR* SkipXMLDocType(TCHAR *p) {
-    if (p != NULL) {
-        if (JPACKAGE_STRNCMP(p, _T("<!"), 2) == 0) {
-            SKIP_CHARS(p, 2);
-            while (*p != '\0') {
-                if (*p == '>') {
-                    NEXT_CHAR(p);
-                    return p;
-                }
-                NEXT_CHAR(p);
-            }
-        }
-    }
-    return p;
-}
-
-static TCHAR* SkipXMLProlog(TCHAR *p) {
-    if (p != NULL) {
-        if (JPACKAGE_STRNCMP(p, _T("<?"), 2) == 0) {
-            SKIP_CHARS(p, 2);
-            do {
-                if (JPACKAGE_STRNCMP(p, _T("?>"), 2) == 0) {
-                    SKIP_CHARS(p, 2);
-                    return p;
-                }
-                NEXT_CHAR(p);
-            } while(*p != '\0');
-        }
-    }
-    return p;
-}
-
-/* Search for the built-in XML entities:
- * &amp; (&), &lt; (<), &gt; (>), &apos; ('), and &quote(")
- * and convert them to a real TCHARacter
- */
-static void ConvertBuiltInEntities(TCHAR* p) {
-    TCHAR* q;
-    q = p;
-    // We are not using NEXT_CHAR() to check if *q is NULL,
-    // as q is output location and offset for q is smaller than for p.
-    while(*p) {
-        if (IsPCData(p)) {
-            /* dont convert &xxx values within PData */
-            TCHAR *end;
-            end = SkipPCData(p);
-            while(p < end) {
-                *q++ = *p;
-                NEXT_CHAR(p);
-            }
-        } else {
-            if (JPACKAGE_STRNCMP(p, _T("&amp;"), 5) == 0) {
-                *q++ = '&';
-                SKIP_CHARS(p, 5);
-            } else if (JPACKAGE_STRNCMP(p, _T("&lt;"), 4)  == 0) {
-                *q = '<';
-                SKIP_CHARS(p, 4);
-            } else if (JPACKAGE_STRNCMP(p, _T("&gt;"), 4)  == 0) {
-                *q = '>';
-                SKIP_CHARS(p, 4);
-            } else if (JPACKAGE_STRNCMP(p, _T("&apos;"), 6)  == 0) {
-                *q = '\'';
-                SKIP_CHARS(p, 6);
-            } else if (JPACKAGE_STRNCMP(p, _T("&quote;"), 7)  == 0) {
-                *q = '\"';
-              SKIP_CHARS(p, 7);
-            } else {
-              *q++ = *p;
-              NEXT_CHAR(p);
-            }
-        }
-    }
-    *q = '\0';
-}
-
-/* ------------------------------------------------------------- */
-/* XML tokenizer */
-
-#define TOKEN_UNKNOWN             0
-#define TOKEN_BEGIN_TAG           1  /* <tag */
-#define TOKEN_END_TAG             2  /* </tag */
-#define TOKEN_CLOSE_BRACKET       3  /* >  */
-#define TOKEN_EMPTY_CLOSE_BRACKET 4  /* /> */
-#define TOKEN_PCDATA              5  /* pcdata */
-#define TOKEN_CDATA               6  /* cdata */
-#define TOKEN_EOF                 7
-
-static TCHAR* CurPos       = NULL;
-static TCHAR* CurTokenName        = NULL;
-static int   CurTokenType;
-static int   MaxTokenSize = -1;
-
-/* Copy token from buffer to Token variable */
-static void SetToken(int type, TCHAR* start, TCHAR* end) {
-    int len = end - start;
-    if (len > MaxTokenSize) {
-        if (CurTokenName != NULL) free(CurTokenName);
-        CurTokenName = (TCHAR *)malloc((len + 1) * sizeof(TCHAR));
-        if (CurTokenName == NULL ) {
-            return;
-        }
-        MaxTokenSize = len;
-    }
-
-    CurTokenType = type;
-    JPACKAGE_STRNCPY(CurTokenName, len + 1, start, len);
-    CurTokenName[len] = '\0';
-}
-
-/* Skip XML comments, doctypes, and prolog tags */
-static TCHAR* SkipFilling(void) {
-    TCHAR *q = CurPos;
-
-    /* Skip white space and comment sections */
-    do {
-        q = CurPos;
-        CurPos = SkipWhiteSpace(CurPos);
-        CurPos = SkipXMLComment(CurPos); /* Must be called befor DocTypes */
-        CurPos = SkipXMLDocType(CurPos); /* <! ... > directives */
-        CurPos = SkipXMLProlog(CurPos);   /* <? ... ?> directives */
-    } while(CurPos != q);
-
-    return CurPos;
-}
-
-/* Parses next token and initializes the global token variables above
-   The tokennizer automatically skips comments (<!-- comment -->) and
-   <! ... > directives.
-*/
-static void GetNextToken(void) {
-    TCHAR *p, *q;
-
-    /* Skip white space and comment sections */
-    p = SkipFilling();
-
-    if (p == NULL || *p == '\0') {
-        CurTokenType = TOKEN_EOF;
-        return;
-    } else if (p[0] == '<' && p[1] == '/') {
-        /* TOKEN_END_TAG */
-        q = SkipXMLName(p + 2);
-        SetToken(TOKEN_END_TAG, p + 2, q);
-        p = q;
-    } else  if (*p == '<') {
-        /* TOKEN_BEGIN_TAG */
-        q = SkipXMLName(p + 1);
-        SetToken(TOKEN_BEGIN_TAG, p + 1, q);
-        p = q;
-    } else if (p[0] == '>') {
-        CurTokenType = TOKEN_CLOSE_BRACKET;
-        NEXT_CHAR(p);
-    } else if (p[0] == '/' && p[1] == '>') {
-        CurTokenType = TOKEN_EMPTY_CLOSE_BRACKET;
-        SKIP_CHARS(p, 2);
-    } else {
-        /* Search for end of data */
-        q = p + 1;
-        while(*q && *q != '<') {
-            if (IsPCData(q)) {
-                q = SkipPCData(q);
-            } else {
-                NEXT_CHAR(q);
-            }
-        }
-        SetToken(TOKEN_PCDATA, p, q);
-        /* Convert all entities inside token */
-        ConvertBuiltInEntities(CurTokenName);
-        p = q;
-    }
-    /* Advance pointer to beginning of next token */
-    CurPos = p;
-}
-
-static XMLNode* CreateXMLNode(int type, TCHAR* name) {
-    XMLNode* node;
-    node  = (XMLNode*)malloc(sizeof(XMLNode));
-    if (node == NULL) {
-        return NULL;
-    }
-    node->_type = type;
-    node->_name = name;
-    node->_next = NULL;
-    node->_sub  = NULL;
-    node->_attributes = NULL;
-    return node;
-}
-
-static XMLAttribute* CreateXMLAttribute(TCHAR *name, TCHAR* value) {
-    XMLAttribute* attr;
-    attr = (XMLAttribute*)malloc(sizeof(XMLAttribute));
-    if (attr == NULL) {
-        return NULL;
-    }
-    attr->_name = name;
-    attr->_value = value;
-    attr->_next =  NULL;
-    return attr;
-}
-
-XMLNode* ParseXMLDocument(TCHAR* buf) {
-    XMLNode* root;
-    int err_code = setjmp(jmpbuf);
-    switch (err_code)
-    {
-    case JMP_NO_ERROR:
-#ifndef _UNICODE
-        /* Remove UTF-8 encoding from buffer */
-        RemoveNonAsciiUTF8FromBuffer(buf);
-#endif
-
-        /* Get first Token */
-        CurPos = buf;
-        GetNextToken();
-
-        /* Parse document*/
-        root =  ParseXMLElement();
-    break;
-    case JMP_OUT_OF_RANGE:
-        /* cleanup: */
-        if (root_node != NULL) {
-            FreeXMLDocument(root_node);
-            root_node = NULL;
-        }
-        if (CurTokenName != NULL) free(CurTokenName);
-        fprintf(stderr,"Error during parsing jnlp file...\n");
-        exit(-1);
-    break;
-    default:
-        root = NULL;
-    break;
-    }
-
-    return root;
-}
-
-static XMLNode* ParseXMLElement(void) {
-    XMLNode*  node     = NULL;
-    XMLNode*  subnode  = NULL;
-    XMLNode*  nextnode = NULL;
-    XMLAttribute* attr = NULL;
-
-    if (CurTokenType == TOKEN_BEGIN_TAG) {
-
-        /* Create node for new element tag */
-        node = CreateXMLNode(xmlTagType, JPACKAGE_STRDUP(CurTokenName));
-        /* We need to save root node pointer to be able to cleanup
-           if an error happens during parsing */
-        if(!root_node) {
-            root_node = node;
-        }
-        /* Parse attributes. This section eats a all input until
-           EOF, a > or a /> */
-        attr = ParseXMLAttribute();
-        while(attr != NULL) {
-          attr->_next = node->_attributes;
-          node->_attributes = attr;
-          attr = ParseXMLAttribute();
-        }
-
-        /* This will eihter be a TOKEN_EOF, TOKEN_CLOSE_BRACKET, or a
-         * TOKEN_EMPTY_CLOSE_BRACKET */
-        GetNextToken();
-
-        /* Skip until '>', '/>' or EOF. This should really be an error, */
-        /* but we are loose */
-//        if(CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET ||
-//               CurTokenType == TOKEN_CLOSE_BRACKET ||
-//               CurTokenType  == TOKEN_EOF) {
-//            println("XML Parsing error: wrong kind of token found");
-//            return NULL;
-//        }
-
-        if (CurTokenType == TOKEN_EMPTY_CLOSE_BRACKET) {
-            GetNextToken();
-            /* We are done with the sublevel - fall through to continue */
-            /* parsing tags at the same level */
-        } else if (CurTokenType == TOKEN_CLOSE_BRACKET) {
-            GetNextToken();
-
-            /* Parse until end tag if found */
-            node->_sub  = ParseXMLElement();
-
-            if (CurTokenType == TOKEN_END_TAG) {
-                /* Find closing bracket '>' for end tag */
-                do {
-                   GetNextToken();
-                } while(CurTokenType != TOKEN_EOF &&
-                        CurTokenType != TOKEN_CLOSE_BRACKET);
-                GetNextToken();
-            }
-        }
-
-        /* Continue parsing rest on same level */
-        if (CurTokenType != TOKEN_EOF) {
-            /* Parse rest of stream at same level */
-            node->_next = ParseXMLElement();
-        }
-        return node;
-
-    } else if (CurTokenType == TOKEN_PCDATA) {
-        /* Create node for pcdata */
-        node = CreateXMLNode(xmlPCDataType, JPACKAGE_STRDUP(CurTokenName));
-        /* We need to save root node pointer to be able to cleanup
-           if an error happens during parsing */
-        if(!root_node) {
-            root_node = node;
-        }
-        GetNextToken();
-        return node;
-    }
-
-    /* Something went wrong. */
-    return NULL;
-}
-
-/* Parses an XML attribute. */
-static XMLAttribute* ParseXMLAttribute(void) {
-    TCHAR* q = NULL;
-    TCHAR* name = NULL;
-    TCHAR* PrevPos = NULL;
-
-    do
-    {
-        /* We need to check this condition to avoid endless loop
-           in case if an error happend during parsing. */
-        if (PrevPos == CurPos) {
-            if (name != NULL) {
-                free(name);
-                name = NULL;
-            }
-
-            return NULL;
-        }
-
-        PrevPos = CurPos;
-
-        /* Skip whitespace etc. */
-        SkipFilling();
-
-        /* Check if we are done witht this attribute section */
-        if (CurPos[0] == '\0' ||
-            CurPos[0] == '>' ||
-            (CurPos[0] == '/' && CurPos[1] == '>')) {
-
-            if (name != NULL) {
-                free(name);
-                name = NULL;
-            }
-
-            return NULL;
-        }
-
-        /* Find end of name */
-        q = CurPos;
-        while(*q && !iswspace(*q) && *q !='=') NEXT_CHAR(q);
-
-        SetToken(TOKEN_UNKNOWN, CurPos, q);
-        if (name) {
-            free(name);
-            name = NULL;
-        }
-        name = JPACKAGE_STRDUP(CurTokenName);
-
-        /* Skip any whitespace */
-        CurPos = q;
-        CurPos = SkipFilling();
-
-        /* Next TCHARacter must be '=' for a valid attribute.
-           If it is not, this is really an error.
-           We ignore this, and just try to parse an attribute
-           out of the rest of the string.
-        */
-    } while(*CurPos != '=');
-
-    NEXT_CHAR(CurPos);
-    CurPos = SkipWhiteSpace(CurPos);
-    /* Parse CDATA part of attribute */
-    if ((*CurPos == '\"') || (*CurPos == '\'')) {
-        TCHAR quoteChar = *CurPos;
-        q = ++CurPos;
-        while(*q != '\0' && *q != quoteChar) NEXT_CHAR(q);
-        SetToken(TOKEN_CDATA, CurPos, q);
-        CurPos = q + 1;
-    } else {
-        q = CurPos;
-        while(*q != '\0' && !iswspace(*q)) NEXT_CHAR(q);
-        SetToken(TOKEN_CDATA, CurPos, q);
-        CurPos = q;
-    }
-
-    //Note: no need to free name and CurTokenName duplicate; they're assigned
-    // to an XMLAttribute structure in CreateXMLAttribute
-
-    return CreateXMLAttribute(name, JPACKAGE_STRDUP(CurTokenName));
-}
-
-void FreeXMLDocument(XMLNode* root) {
-    if (root == NULL) return;
-    FreeXMLDocument(root->_sub);
-    FreeXMLDocument(root->_next);
-    FreeXMLAttribute(root->_attributes);
-    free(root->_name);
-    free(root);
-}
-
-static void FreeXMLAttribute(XMLAttribute* attr) {
-    if (attr == NULL) return;
-    free(attr->_name);
-    free(attr->_value);
-    FreeXMLAttribute(attr->_next);
-    free(attr);
-}
-
-/* Find element at current level with a given name */
-XMLNode* FindXMLChild(XMLNode* root, const TCHAR* name) {
-    if (root == NULL) return NULL;
-
-    if (root->_type == xmlTagType && JPACKAGE_STRCMP(root->_name, name) == 0) {
-        return root;
-    }
-
-    return FindXMLChild(root->_next, name);
-}
-
-/* Search for an attribute with the given name and returns the contents. Returns NULL if
- * attribute is not found
- */
-TCHAR* FindXMLAttribute(XMLAttribute* attr, const TCHAR* name) {
-    if (attr == NULL) return NULL;
-    if (JPACKAGE_STRCMP(attr->_name, name) == 0) return attr->_value;
-    return FindXMLAttribute(attr->_next, name);
-}
-
-
-void PrintXMLDocument(XMLNode* node, int indt) {
-    if (node == NULL) return;
-
-    if (node->_type == xmlTagType) {
-        JPACKAGE_PRINTF(_T("\n"));
-        indent(indt);
-        JPACKAGE_PRINTF(_T("<%s"), node->_name);
-        PrintXMLAttributes(node->_attributes);
-        if (node->_sub == NULL) {
-            JPACKAGE_PRINTF(_T("/>\n"));
-        } else {
-            JPACKAGE_PRINTF(_T(">"));
-            PrintXMLDocument(node->_sub, indt + 1);
-            indent(indt);
-            JPACKAGE_PRINTF(_T("</%s>"), node->_name);
-        }
-    } else {
-        JPACKAGE_PRINTF(_T("%s"), node->_name);
-    }
-    PrintXMLDocument(node->_next, indt);
-}
-
-static void PrintXMLAttributes(XMLAttribute* attr) {
-    if (attr == NULL) return;
-
-    JPACKAGE_PRINTF(_T(" %s=\"%s\""), attr->_name, attr->_value);
-    PrintXMLAttributes(attr->_next);
-}
-
-static void indent(int indt) {
-    int i;
-    for(i = 0; i < indt; i++) {
-        JPACKAGE_PRINTF(_T("  "));
-    }
-}
-
-const TCHAR *CDStart = _T("<![CDATA[");
-const TCHAR *CDEnd = _T("]]>");
-
-
-static TCHAR* SkipPCData(TCHAR *p) {
-    TCHAR *end = JPACKAGE_STRSTR(p, CDEnd);
-    if (end != NULL) {
-        return end+sizeof(CDEnd);
-    }
-    return (++p);
-}
-
-static int IsPCData(TCHAR *p) {
-    const int size = sizeof(CDStart);
-    return (JPACKAGE_STRNCMP(CDStart, p, size) == 0);
-}
-
-namespace {
-    template<class funcType>
-    class DllFunction {
-        const Library& lib;
-        funcType funcPtr;
-        std::string theName;
-
-    public:
-        DllFunction(const Library& library,
-                const std::string &funcName): lib(library) {
-            funcPtr = reinterpret_cast<funcType>(lib.GetProcAddress(funcName));
-            if (!funcPtr) {
-                throw std::runtime_error("Failed to load function \""
-                        + funcName + "\" from \""
-                        + library.GetName() + "\" library");
-            }
-        }
-
-        operator funcType() const {
-            return funcPtr;
-        }
-    };
-} // namespace
-
-extern "C" {
-typedef Status (*XInitThreadsFuncPtr)();
-typedef Display* (*XOpenDisplayFuncPtr)(char *display_name);
-
-typedef Atom (*XInternAtomFuncPtr)(
-        Display *display, char *atom_name, Bool only_if_exists);
-
-typedef Window (*XDefaultRootWindowFuncPtr)(Display *display);
-
-typedef int (*XCloseDisplayFuncPtr)(Display *display);
-}
-
-ProcessReactivator::ProcessReactivator(pid_t pid): _pid(pid) {
-    const std::string libname = "libX11.so";
-    if(!libX11.Load(libname)) {
-        throw std::runtime_error("Failed to load \"" + libname + "\" library");
-    }
-
-    DllFunction<XInitThreadsFuncPtr> XInitThreadsFunc(libX11, "XInitThreads");
-
-    XInitThreadsFunc();
-
-    DllFunction<XOpenDisplayFuncPtr> XOpenDisplayFunc(libX11, "XOpenDisplay");
-
-    _display = XOpenDisplayFunc(NULL);
-
-    DllFunction<XInternAtomFuncPtr> XInternAtomFunc(libX11, "XInternAtom");
-
-    _atomPid = XInternAtomFunc(_display, (char*)"_NET_WM_PID", True);
-
-    if (_atomPid == None) {
-        return;
-    }
-
-    DllFunction<XDefaultRootWindowFuncPtr> XDefaultRootWindowFunc(libX11,
-            "XDefaultRootWindow");
-
-    searchWindowHelper(XDefaultRootWindowFunc(_display));
-
-    reactivateProcess();
-
-    DllFunction<XCloseDisplayFuncPtr> XCloseDisplayFunc(libX11,
-            "XCloseDisplay");
-
-    XCloseDisplayFunc(_display);
-}
-
-extern "C" {
-typedef int (*XGetWindowPropertyFuncPtr)(
-        Display *display, Window w, Atom property, long long_offset,
-        long long_length, Bool d, Atom req_type, Atom *actual_type_return,
-        int *actual_format_return, unsigned long *nitems_return,
-        unsigned long *bytes_after_return, unsigned char **prop_return);
-
-typedef Status (*XQueryTreeFuncPtr)(
-        Display *display, Window w, Window *root_return, Window *parent_return,
-         Window **children_return, unsigned int *nchildren_return);
-
-typedef int (*XFreeFuncPtr)(void *data);
-}
-
-void ProcessReactivator::searchWindowHelper(Window w) {
-
-    DllFunction<XGetWindowPropertyFuncPtr> XGetWindowPropertyFunc(libX11,
-            "XGetWindowProperty");
-
-    DllFunction<XFreeFuncPtr> XFreeFunc(libX11, "XFree");
-
-    Atom type;
-    int format;
-    unsigned long  num, bytesAfter;
-    unsigned char* propPid = 0;
-    if (Success == XGetWindowPropertyFunc(_display, w, _atomPid, 0, 1,
-            False, XA_CARDINAL, &type, &format, &num, &bytesAfter, &propPid)) {
-        if (propPid != 0) {
-            if (_pid == *((pid_t *)propPid)) {
-                _result.push_back(w);
-            }
-            XFreeFunc(propPid);
-        }
-    }
-
-    DllFunction<XQueryTreeFuncPtr> XQueryTreeFunc(libX11, "XQueryTree");
-
-    Window root, parent;
-    Window* child;
-    unsigned int numChildren;
-    if (0 != XQueryTreeFunc(_display, w, &root,
-            &parent, &child, &numChildren)) {
-        for (unsigned int i = 0; i < numChildren; i++) {
-            searchWindowHelper(child[i]);
-        }
-    }
-}
-
-
-extern "C" {
-typedef Status (*XGetWindowAttributesFuncPtr)(Display *display, Window w,
-        XWindowAttributes *window_attributes_return);
-
-typedef Status (*XSendEventFuncPtr)(Display *display, Window w, Bool propagate,
-        long event_mask, XEvent *event_send);
-
-typedef int (*XRaiseWindowFuncPtr)(Display *display, Window w);
-}
-
-void ProcessReactivator::reactivateProcess() {
-
-    DllFunction<XGetWindowAttributesFuncPtr> XGetWindowAttributesFunc(libX11,
-            "XGetWindowAttributes");
-
-    DllFunction<XSendEventFuncPtr> XSendEventFunc(libX11, "XSendEvent");
-
-    DllFunction<XRaiseWindowFuncPtr> XRaiseWindowFunc(libX11, "XRaiseWindow");
-
-    DllFunction<XInternAtomFuncPtr> XInternAtomFunc(libX11, "XInternAtom");
-
-    for (std::list<Window>::const_iterator it = _result.begin();
-            it != _result.end(); it++) {
-        // try sending an event to activate window,
-        // after that we can try to raise it.
-        XEvent xev;
-        Atom atom = XInternAtomFunc (
-                _display, (char*)"_NET_ACTIVE_WINDOW", False);
-        xev.xclient.type = ClientMessage;
-        xev.xclient.serial = 0;
-        xev.xclient.send_event = True;
-        xev.xclient.display = _display;
-        xev.xclient.window = *it;
-        xev.xclient.message_type = atom;
-        xev.xclient.format = 32;
-        xev.xclient.data.l[0] = 2;
-        xev.xclient.data.l[1] = 0;
-        xev.xclient.data.l[2] = 0;
-        xev.xclient.data.l[3] = 0;
-        xev.xclient.data.l[4] = 0;
-        XWindowAttributes attr;
-        XGetWindowAttributesFunc(_display, *it, &attr);
-        XSendEventFunc(_display, attr.root, False,
-            SubstructureRedirectMask | SubstructureNotifyMask, &xev);
-        XRaiseWindowFunc(_display, *it);
-    }
-}
-
-
-#endif // LINUX
--- a/src/jdk.jpackage/share/native/libapplauncher/LinuxPlatform.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef LINUX
-
-#ifndef LINUXPLATFORM_H
-#define LINUXPLATFORM_H
-
-#include "PosixPlatform.h"
-#include "GenericPlatform.h"
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <pthread.h>
-#include <list>
-
-
-class LinuxPlatform : virtual public Platform, GenericPlatform, PosixPlatform
-{
-private:
-    pthread_t FMainThread;
-
-protected:
-    virtual TString getTmpDirString();
-
-public:
-    LinuxPlatform(void);
-    virtual ~LinuxPlatform(void);
-
-    virtual void ShowMessage(TString title, TString description);
-    virtual void ShowMessage(TString description);
-
-    virtual TCHAR* ConvertStringToFileSystemString(
-            TCHAR* Source, bool &release);
-    virtual TCHAR* ConvertFileSystemStringToString(
-            TCHAR* Source, bool &release);
-
-    virtual void SetCurrentDirectory(TString Value);
-    virtual TString GetPackageRootDirectory();
-    virtual TString GetAppDataDirectory();
-
-    virtual TString GetModuleFileName();
-
-    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
-
-    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
-
-    virtual bool IsMainThread();
-    virtual TPlatformNumber GetMemorySize();
-
-#ifdef DEBUG
-    virtual bool IsNativeDebuggerPresent();
-    virtual int GetProcessID();
-#endif //DEBUG
-};
-
-class ProcessReactivator {
-private:
-    void searchWindowHelper(Window w);
-    void reactivateProcess();
-
-    Library libX11;
-
-    pid_t _pid;
-    Atom _atomPid;
-    Display* _display;
-    std::list<Window> _result;
-public:
-    explicit ProcessReactivator(pid_t pid);
-};
-
-#endif //LINUXPLATFORM_H
-
-#endif //LINUX
--- a/src/jdk.jpackage/share/native/libapplauncher/Lock.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Lock.h"
-
-
-Lock::Lock(void) {
-    Initialize();
-}
-
-Lock::Lock(bool Value) {
-    Initialize();
-
-    if (Value == true) {
-        Enter();
-    }
-}
-
-void Lock::Initialize() {
-#ifdef WINDOWS
-    InitializeCriticalSectionAndSpinCount(&FCriticalSection, 0x00000400);
-#endif // WINDOWS
-#ifdef MAC
-    // FMutex =  PTHREAD_RECURSIVE_MUTEX_INITIALIZER;
-#endif // MAC
-#ifdef LINUX
-    // FMutex =  PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
-#endif // LINUX
-}
-
-Lock::~Lock(void) {
-#ifdef WINDOWS
-    DeleteCriticalSection(&FCriticalSection);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_mutex_unlock(&FMutex);
-#endif // POSIX
-}
-
-void Lock::Enter() {
-#ifdef WINDOWS
-    EnterCriticalSection(&FCriticalSection);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_mutex_lock(&FMutex);
-#endif // POSIX
-}
-
-void Lock::Leave() {
-#ifdef WINDOWS
-    LeaveCriticalSection(&FCriticalSection);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_mutex_unlock(&FMutex);
-#endif // POSIX
-}
-
-bool Lock::TryEnter() {
-    bool result = false;
-#ifdef WINDOWS
-    if (TryEnterCriticalSection (&FCriticalSection) != 0)
-        result = true;
-#endif // WINDOWS
-#ifdef POSIX
-    if (pthread_mutex_lock(&FMutex) == 0)
-        result = true;
-#endif // POSIX
-    return result;
-}
--- a/src/jdk.jpackage/share/native/libapplauncher/Lock.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#ifndef LOCK_H
-#define LOCK_H
-
-#include "Platform.h"
-
-#ifdef POSIX
-#include <pthread.h>
-#endif //POSIX
-
-
-class Lock {
-private:
-#ifdef WINDOWS
-    CRITICAL_SECTION FCriticalSection;
-#endif //WINDOWS
-#ifdef POSIX
-    pthread_mutex_t FMutex;
-#endif //POSIX
-
-    void Initialize();
-
-public:
-    Lock(void);
-    Lock(bool Value);
-    ~Lock(void);
-
-    void Enter();
-    void Leave();
-    bool TryEnter();
-};
-
-#endif // LOCK_H
--- a/src/jdk.jpackage/share/native/libapplauncher/MacPlatform.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef MAC
-
-#ifndef MACPLATFORM_H
-#define MACPLATFORM_H
-
-#include "GenericPlatform.h"
-#include "PosixPlatform.h"
-
-
-class MacPlatform : virtual public Platform, GenericPlatform, PosixPlatform {
-private:
-    bool UsePListForConfigFile();
-
-protected:
-    virtual TString getTmpDirString();
-
-public:
-    MacPlatform(void);
-    virtual ~MacPlatform(void);
-
-public:
-    virtual void ShowMessage(TString title, TString description);
-    virtual void ShowMessage(TString description);
-
-    virtual TCHAR* ConvertStringToFileSystemString(
-            TCHAR* Source, bool &release);
-    virtual TCHAR* ConvertFileSystemStringToString(
-            TCHAR* Source, bool &release);
-
-    virtual void SetCurrentDirectory(TString Value);
-    virtual TString GetPackageRootDirectory();
-    virtual TString GetAppDataDirectory();
-    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
-    virtual TString GetAppName();
-
-    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
-    virtual TString GetModuleFileName();
-
-    virtual bool IsMainThread();
-    virtual TPlatformNumber GetMemorySize();
-
-    virtual std::map<TString, TString> GetKeys();
-
-#ifdef DEBUG
-    virtual bool IsNativeDebuggerPresent();
-    virtual int GetProcessID();
-#endif // DEBUG
-};
-
-
-#endif // MACPLATFORM_H
-
-#endif // MAC
--- a/src/jdk.jpackage/share/native/libapplauncher/Messages.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/Messages.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -25,13 +25,11 @@
 
 #include "Messages.h"
 #include "Platform.h"
-#include "Lock.h"
 #include "FilePath.h"
 #include "Helpers.h"
 #include "Macros.h"
 #include "JavaVirtualMachine.h"
 
-
 Messages::Messages(void) {
     FMessages.SetReadOnly(false);
     FMessages.SetValue(LIBRARY_NOT_FOUND, _T("Failed to find library."));
@@ -47,7 +45,6 @@
 }
 
 Messages& Messages::GetInstance() {
-    //Lock lock;
     static Messages instance;
     // Guaranteed to be destroyed. Instantiated on first use.
     return instance;
--- a/src/jdk.jpackage/share/native/libapplauncher/OrderedMap.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/OrderedMap.h	Sun Feb 17 14:08:26 2019 -0500
@@ -26,10 +26,6 @@
 #ifndef ORDEREDMAP_H
 #define ORDEREDMAP_H
 
-#ifdef WINDOWS
-#pragma warning(disable:4522)
-#endif
-
 #include <map>
 #include <vector>
 #include <assert.h>
@@ -37,9 +33,8 @@
 
 #include <iostream>
 
-
 template <typename _T1, typename _T2>
-struct pair
+struct JPPair
 {
     typedef _T1 first_type;
     typedef _T2 second_type;
@@ -47,7 +42,7 @@
     first_type first;
     second_type second;
 
-    pair(first_type Value1, second_type Value2) {
+    JPPair(first_type Value1, second_type Value2) {
         first = Value1;
         second = Value2;
     }
@@ -59,7 +54,7 @@
 public:
     typedef TKey key_type;
     typedef TValue mapped_type;
-    typedef pair<key_type, mapped_type> container_type;
+    typedef JPPair<key_type, mapped_type> container_type;
     typedef typename std::vector<container_type*>::iterator iterator;
     typedef typename std::vector<container_type*>::const_iterator const_iterator;
 
@@ -236,12 +231,6 @@
         return *this;
     }
 
-    OrderedMap& operator= (const OrderedMap &Value) {
-        Clear();
-        Append(Value);
-        return *this;
-    }
-
     size_t Count() {
         return FList.size();
     }
--- a/src/jdk.jpackage/share/native/libapplauncher/Package.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/Package.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -24,7 +24,6 @@
  */
 
 #include "Package.h"
-#include "Lock.h"
 #include "Helpers.h"
 #include "Macros.h"
 #include "IniFile.h"
--- a/src/jdk.jpackage/share/native/libapplauncher/Platform.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/Platform.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -24,20 +24,24 @@
  */
 
 #include "Platform.h"
-#include "Lock.h"
 #include "Messages.h"
+#include "PlatformString.h"
+#include "FilePath.h"
+
+#include <fstream>
+#include <locale>
 
+#ifdef WINDOWS
 #include "WindowsPlatform.h"
+#endif // WINDOWS
+#ifdef LINUX
 #include "LinuxPlatform.h"
+#endif // LINUX
+#ifdef MAC
 #include "MacPlatform.h"
-
-
-// Environment
-StaticReadProperty<TString, &Environment::GetNewLine> Environment::NewLine;
-
+#endif // MAC
 
 Platform& Platform::GetInstance() {
-
 #ifdef WINDOWS
     static WindowsPlatform instance;
 #endif // WINDOWS
@@ -49,133 +53,123 @@
 #ifdef MAC
     static MacPlatform instance;
 #endif // MAC
+
     return instance;
 }
 
-
-Library::Library() {
-    Initialize();
-}
-
-Library::Library(const TString &FileName) {
-    Initialize();
-    Load(FileName);
-}
+TString Platform::GetConfigFileName() {
+    TString result;
+    TString basedir = GetPackageAppDirectory();
 
-Library::~Library() {
-    Unload();
-}
-
-void Library::Initialize() {
-    FModule = NULL;
-    FDependentLibraryNames = NULL;
-    FDependenciesLibraries = NULL;
-}
+    if (basedir.empty() == false) {
+        basedir = FilePath::IncludeTrailingSeparator(basedir);
+        TString appConfig = basedir + GetAppName() + _T(".cfg");
 
-void Library::InitializeDependencies() {
-    if (FDependentLibraryNames == NULL) {
-        FDependentLibraryNames = new std::vector<TString>();
-    }
-
-    if (FDependenciesLibraries == NULL) {
-        FDependenciesLibraries = new std::vector<Library*>();
-    }
-}
+        if (FilePath::FileExists(appConfig) == true) {
+            result = appConfig;
+        }
+        else {
+            result = basedir + _T("package.cfg");
 
-void Library::LoadDependencies() {
-    if (FDependentLibraryNames != NULL && FDependenciesLibraries != NULL) {
-        for (std::vector<TString>::const_iterator iterator =
-                FDependentLibraryNames->begin();
-                iterator != FDependentLibraryNames->end(); iterator++) {
-            Library* library = new Library();
-
-            if (library->Load(*iterator) == true) {
-                FDependenciesLibraries->push_back(library);
+            if (FilePath::FileExists(result) == false) {
+                result = _T("");
             }
         }
+    }
 
-        delete FDependentLibraryNames;
-        FDependentLibraryNames = NULL;
-    }
+    return result;
 }
 
-void Library::UnloadDependencies() {
-    if (FDependenciesLibraries != NULL) {
-        for (std::vector<Library*>::const_iterator iterator =
-                FDependenciesLibraries->begin();
-                iterator != FDependenciesLibraries->end(); iterator++) {
-            Library* library = *iterator;
+std::list<TString> Platform::LoadFromFile(TString FileName) {
+    std::list<TString> result;
 
-            if (library != NULL) {
-                library->Unload();
-                delete library;
-            }
-        }
-
-        delete FDependenciesLibraries;
-        FDependenciesLibraries = NULL;
-    }
-}
+    if (FilePath::FileExists(FileName) == true) {
+        std::wifstream stream(FileName.data());
+        InitStreamLocale(&stream);
 
-Procedure Library::GetProcAddress(const std::string& MethodName) const {
-    Platform& platform = Platform::GetInstance();
-    return platform.GetProcAddress(FModule, MethodName);
-}
-
-bool Library::Load(const TString &FileName) {
-    bool result = true;
+        if (stream.is_open() == true) {
+            while (stream.eof() == false) {
+                std::wstring line;
+                std::getline(stream, line);
 
-    if (FModule == NULL) {
-        LoadDependencies();
-        Platform& platform = Platform::GetInstance();
-        FModule = platform.LoadLibrary(FileName);
-
-        if (FModule == NULL) {
-            Messages& messages = Messages::GetInstance();
-            platform.ShowMessage(messages.GetMessage(LIBRARY_NOT_FOUND),
-                    FileName);
-            result = false;
-        } else {
-            fname = PlatformString(FileName).toStdString();
+                // # at the first character will comment out the line.
+                if (line.empty() == false && line[0] != '#') {
+                    result.push_back(PlatformString(line).toString());
+                }
+            }
         }
     }
 
     return result;
 }
 
-bool Library::Unload() {
-    bool result = false;
+void Platform::SaveToFile(TString FileName, std::list<TString> Contents, bool ownerOnly) {
+    TString path = FilePath::ExtractFilePath(FileName);
 
-    if (FModule != NULL) {
-        Platform& platform = Platform::GetInstance();
-        platform.FreeLibrary(FModule);
-        FModule = NULL;
-        UnloadDependencies();
-        result = true;
+    if (FilePath::DirectoryExists(path) == false) {
+        FilePath::CreateDirectory(path, ownerOnly);
     }
 
-    return result;
-}
+    std::wofstream stream(FileName.data());
+    InitStreamLocale(&stream);
+
+    FilePath::ChangePermissions(FileName.data(), ownerOnly);
 
-void Library::AddDependency(const TString &FileName) {
-    InitializeDependencies();
-
-    if (FDependentLibraryNames != NULL) {
-        FDependentLibraryNames->push_back(FileName);
+    if (stream.is_open() == true) {
+        for (std::list<TString>::const_iterator iterator =
+                Contents.begin(); iterator != Contents.end(); iterator++) {
+            TString line = *iterator;
+            stream << PlatformString(line).toUnicodeString() << std::endl;
+        }
     }
 }
 
-void Library::AddDependencies(const std::vector<TString> &Dependencies) {
-    if (Dependencies.size() > 0) {
-        InitializeDependencies();
+std::map<TString, TString> Platform::GetKeys() {
+    std::map<TString, TString> keys;
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION,
+            _T("app.version")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY,
+            _T("app.mainjar")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINMODULE_KEY,
+            _T("app.mainmodule")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY,
+            _T("app.mainclass")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY,
+            _T("app.classpath")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_MODULEPATH_KEY,
+            _T("app.modulepath")));
+    keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY,
+            _T("app.name")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_ID_KEY,
+            _T("app.preferences.id")));
+    keys.insert(std::map<TString, TString>::value_type(JVM_RUNTIME_KEY,
+            _T("app.runtime")));
+    keys.insert(std::map<TString, TString>::value_type(JPACKAGE_APP_DATA_DIR,
+            _T("app.identifier")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_SPLASH_KEY,
+            _T("app.splash")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_MEMORY,
+            _T("app.memory")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_DEBUG,
+            _T("app.debug")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_APPLICATION_INSTANCE,
+            _T("app.application.instance")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_SECTION_APPLICATION,
+            _T("Application")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_SECTION_JVMOPTIONS,
+            _T("JVMOptions")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_SECTION_APPCDSJVMOPTIONS,
+            _T("AppCDSJVMOptions")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS,
+            _T("AppCDSGenerateCacheJVMOptions")));
+    keys.insert(std::map<TString,
+            TString>::value_type(CONFIG_SECTION_ARGOPTIONS,
+            _T("ArgOptions")));
 
-        if (FDependentLibraryNames != NULL) {
-            for (std::vector<TString>::const_iterator iterator =
-                    FDependentLibraryNames->begin();
-                iterator != FDependentLibraryNames->end(); iterator++) {
-                TString fileName = *iterator;
-                AddDependency(fileName);
-            }
-        }
-    }
+    return keys;
 }
--- a/src/jdk.jpackage/share/native/libapplauncher/Platform.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/Platform.h	Sun Feb 17 14:08:26 2019 -0500
@@ -26,7 +26,10 @@
 #ifndef PLATFORM_H
 #define PLATFORM_H
 
+#include "PlatformDefs.h"
+#include "Properties.h"
 #include "OrderedMap.h"
+#include "Library.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -35,85 +38,9 @@
 #include <map>
 #include <list>
 #include <vector>
-
-
-#ifdef WIN32
-#ifndef WINDOWS
-#define WINDOWS
-#endif
-#endif //WIN32
-
-#ifdef __APPLE__
-#define MAC
-#define POSIX
-#endif //__APPLE__
-
-
-#ifdef __linux
-#ifndef LINUX
-#define LINUX
-#endif
-#endif //__linux
-
-#ifdef LINUX
-#define POSIX
-#endif //LINUX
-
-
-
-#ifdef WINDOWS
-// Define Windows compatibility requirements XP or later
-#define WINVER 0x0600
-#define _WIN32_WINNT 0x0600
-
-#include <Windows.h>
-#include <tchar.h>
-#include <shlobj.h>
-#include <direct.h>
-#include <process.h>
-#include <malloc.h>
+#include <fstream>
 
-typedef std::wstring TString;
-#define StringLength wcslen
-
-#define TRAILING_PATHSEPARATOR '\\'
-#define BAD_TRAILING_PATHSEPARATOR '/'
-#define PATH_SEPARATOR ';'
-#define BAD_PATH_SEPARATOR ':'
-
-typedef ULONGLONG TPlatformNumber;
-typedef DWORD TProcessID;
-
-#endif //WINDOWS
-
-
-#ifdef POSIX
-#include <errno.h>
-#include <unistd.h>
-#include <sys/stat.h>
-#include <dlfcn.h>
-#include <libgen.h>
-
-#define _T(x) x
-
-typedef char TCHAR;
-typedef std::string TString;
-#define StringLength strlen
-
-typedef unsigned long DWORD;
-
-#define TRAILING_PATHSEPARATOR '/'
-#define BAD_TRAILING_PATHSEPARATOR '\\'
-#define PATH_SEPARATOR ':'
-#define BAD_PATH_SEPARATOR ';'
-#define MAX_PATH 1000
-
-typedef long TPlatformNumber;
-typedef pid_t TProcessID;
-
-#define HMODULE void*
-#endif //POSIX
-
+using namespace std;
 
 // Config file sections
 #define CONFIG_SECTION_APPLICATION       _T("CONFIG_SECTION_APPLICATION")
@@ -140,132 +67,20 @@
 #define JVM_RUNTIME_KEY           _T("JVM_RUNTIME_KEY")
 #define JPACKAGE_APP_DATA_DIR     _T("CONFIG_APP_IDENTIFIER")
 
-
-
-typedef void* Module;
-typedef void* Procedure;
-
-
-template <typename ObjectType, typename ValueType,
-        ValueType (ObjectType::*getter)(void),
-        void (ObjectType::*setter)(ValueType)>
-class Property {
-private:
-    ObjectType* FObject;
-
-public:
-    Property() {
-        FObject = NULL;
-    }
-
-    void SetInstance(ObjectType* Value) {
-        FObject = Value;
-    }
+struct WideString {
+    size_t length;
+    wchar_t* data;
 
-    // To set the value using the set method.
-    ValueType operator =(const ValueType& Value) {
-        assert(FObject != NULL);
-        (FObject->*setter)(Value);
-        return Value;
-    }
-
-    // The Property class is treated as the internal type.
-    operator ValueType() {
-        assert(FObject != NULL);
-        return (FObject->*getter)();
-    }
-};
-
-template <typename ObjectType, typename ValueType,
-        ValueType (ObjectType::*getter)(void)>
-class ReadProperty {
-private:
-    ObjectType* FObject;
-
-public:
-    ReadProperty() {
-        FObject = NULL;
-    }
-
-    void SetInstance(ObjectType* Value) {
-        FObject = Value;
-    }
-
-    // The Property class is treated as the internal type.
-    operator ValueType() {
-        assert(FObject != NULL);
-        return (FObject->*getter)();
-    }
+    WideString() { length = 0; data = NULL; }
 };
 
-template <typename ObjectType, typename ValueType,
-        void (ObjectType::*setter)(ValueType)>
-class WriteProperty {
-private:
-    ObjectType* FObject;
-
-public:
-    WriteProperty() {
-        FObject = NULL;
-    }
-
-    void SetInstance(ObjectType* Value) {
-        FObject = Value;
-    }
-
-    // To set the value using the set method.
-    ValueType operator =(const ValueType& Value) {
-        assert(FObject != NULL);
-        (FObject->*setter)(Value);
-        return Value;
-    }
-};
-
-template <typename ValueType,
-        ValueType (*getter)(void), void (*setter)(ValueType)>
-class StaticProperty {
-public:
-    StaticProperty() {
-    }
+struct MultibyteString {
+    size_t length;
+    char* data;
 
-    // To set the value using the set method.
-    ValueType operator =(const ValueType& Value) {
-        (*getter)(Value);
-        return Value;
-    }
-
-    // The Property class is treated as the internal type which is the getter.
-    operator ValueType() {
-        return (*setter)();
-    }
+    MultibyteString() { length = 0; data = NULL; }
 };
 
-template <typename ValueType, ValueType (*getter)(void)>
-class StaticReadProperty {
-public:
-    StaticReadProperty() {
-    }
-
-    // The Property class is treated as the internal type which is the getter.
-    operator ValueType() {
-        return (*getter)();
-    }
-};
-
-template <typename ValueType, void (*setter)(ValueType)>
-class StaticWriteProperty {
-public:
-    StaticWriteProperty() {
-    }
-
-    // To set the value using the set method.
-    ValueType operator =(const ValueType& Value) {
-        (*setter)(Value);
-        return Value;
-    }
-};
-
-
 class Process {
 protected:
     std::list<TString> FOutput;
@@ -335,47 +150,6 @@
     }
 };
 
-
-class IPropertyContainer {
-public:
-    IPropertyContainer(void) {}
-    virtual ~IPropertyContainer(void) {}
-
-    virtual bool GetValue(const TString Key, TString& Value) = 0;
-    virtual size_t GetCount() = 0;
-};
-
-class ISectionalPropertyContainer {
-public:
-    ISectionalPropertyContainer(void) {}
-    virtual ~ISectionalPropertyContainer(void) {}
-
-    virtual bool GetValue(const TString SectionName,
-            const TString Key, TString& Value) = 0;
-    virtual bool ContainsSection(const TString SectionName) = 0;
-    virtual bool GetSection(const TString SectionName,
-            OrderedMap<TString, TString> &Data) = 0;
-};
-
-class Environment {
-private:
-    Environment() {
-    }
-
-public:
-    static TString GetNewLine() {
-#ifdef WINDOWS
-        return _T("\r\n");
-#endif //WINDOWS
-#ifdef POSIX
-        return _T("\n");
-#endif //POSIX
-    }
-
-    static StaticReadProperty<TString, &Environment::GetNewLine> NewLine;
-};
-
-
 enum DebugState {dsNone, dsNative, dsJava};
 enum MessageResponse {mrOK, mrCancel};
 enum AppCDSState {cdsUninitialized, cdsDisabled,
@@ -424,7 +198,7 @@
     virtual TString GetPackageRuntimeBinDirectory() = 0;
     virtual TString GetAppName() = 0;
 
-    virtual TString GetConfigFileName() = 0;
+    virtual TString GetConfigFileName();
 
     virtual TString GetBundledJVMLibraryFileName(TString RuntimePath) = 0;
 
@@ -437,9 +211,6 @@
     virtual Module LoadLibrary(TString FileName) = 0;
     virtual void FreeLibrary(Module Module) = 0;
     virtual Procedure GetProcAddress(Module Module, std::string MethodName) = 0;
-    virtual std::vector<TString> GetLibraryImports(const TString FileName) = 0;
-    virtual std::vector<TString> FilterOutRuntimeDependenciesForPlatform(
-            std::vector<TString> Imports) = 0;
 
     // Caller must free result.
     virtual Process* CreateProcess() = 0;
@@ -449,14 +220,30 @@
     // Returns megabytes.
     virtual TPlatformNumber GetMemorySize() = 0;
 
-    virtual std::map<TString, TString> GetKeys() = 0;
+    virtual std::map<TString, TString> GetKeys();
 
-    virtual std::list<TString> LoadFromFile(TString FileName) = 0;
+    virtual void InitStreamLocale(wios *stream) = 0;
+    virtual std::list<TString> LoadFromFile(TString FileName);
     virtual void SaveToFile(TString FileName,
-             std::list<TString> Contents, bool ownerOnly) = 0;
+             std::list<TString> Contents, bool ownerOnly);
 
     virtual TString GetTempDirectory() = 0;
 
+    virtual void addPlatformDependencies(JavaLibrary *pJavaLibrary) = 0;
+
+public:
+    // String helpers
+    // Caller must free result using delete[].
+    static void CopyString(char *Destination,
+            size_t NumberOfElements, const char *Source);
+
+    // Caller must free result using delete[].
+    static void CopyString(wchar_t *Destination,
+            size_t NumberOfElements, const wchar_t *Source);
+
+    static WideString MultibyteStringToWideString(const char* value);
+    static MultibyteString WideStringToMultibyteString(const wchar_t* value);
+
 #ifdef DEBUG
     virtual DebugState GetDebugState() = 0;
     virtual int GetProcessID() = 0;
@@ -464,39 +251,6 @@
 #endif //DEBUG
 };
 
-
-class Library {
-private:
-    std::vector<TString> *FDependentLibraryNames;
-    std::vector<Library*> *FDependenciesLibraries;
-    Module FModule;
-    std::string fname;
-
-    void Initialize();
-    void InitializeDependencies();
-    void LoadDependencies();
-    void UnloadDependencies();
-
-public:
-    void* GetProcAddress(const std::string& MethodName) const;
-
-public:
-    Library();
-    Library(const TString &FileName);
-    ~Library();
-
-    bool Load(const TString &FileName);
-    bool Unload();
-
-    const std::string& GetName() const {
-        return fname;
-    }
-
-    void AddDependency(const TString &FileName);
-    void AddDependencies(const std::vector<TString> &Dependencies);
-};
-
-
 class Exception: public std::exception {
 private:
     TString FMessage;
@@ -516,9 +270,4 @@
     TString GetMessage() { return FMessage; }
 };
 
-class FileNotFoundException: public Exception {
-public:
-    explicit FileNotFoundException(const TString Message) : Exception(Message) {}
-};
-
 #endif // PLATFORM_H
--- a/src/jdk.jpackage/share/native/libapplauncher/PlatformString.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/PlatformString.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -25,7 +25,6 @@
 
 #include "PlatformString.h"
 
-#include "JavaTypes.h"
 #include "Helpers.h"
 
 #include <stdio.h>
@@ -37,78 +36,12 @@
 
 #include "jni.h"
 
-#ifdef MAC
-StringToFileSystemString::StringToFileSystemString(const TString &value) {
-    FRelease = false;
-    PlatformString lvalue = PlatformString(value);
-    Platform& platform = Platform::GetInstance();
-    FData = platform.ConvertStringToFileSystemString(lvalue, FRelease);
-}
-
-StringToFileSystemString::~StringToFileSystemString() {
-    if (FRelease == true) {
-        delete[] FData;
-    }
-}
-
-StringToFileSystemString::operator TCHAR* () {
-    return FData;
-}
-#endif //MAC
-
-#ifdef MAC
-FileSystemStringToString::FileSystemStringToString(const TCHAR* value) {
-    bool release = false;
-    PlatformString lvalue = PlatformString(value);
-    Platform& platform = Platform::GetInstance();
-    TCHAR* buffer = platform.ConvertFileSystemStringToString(lvalue, release);
-    FData = buffer;
-
-    if (buffer != NULL && release == true) {
-        delete[] buffer;
-    }
-}
-
-FileSystemStringToString::operator TString () {
-    return FData;
-}
-#endif //MAC
-
-
 void PlatformString::initialize() {
     FWideTStringToFree = NULL;
     FLength = 0;
     FData = NULL;
 }
 
-void PlatformString::CopyString(char *Destination,
-        size_t NumberOfElements, const char *Source) {
-#ifdef WINDOWS
-    strcpy_s(Destination, NumberOfElements, Source);
-#endif //WINDOWS
-#ifdef POSIX
-    strncpy(Destination, Source, NumberOfElements);
-#endif //POSIX
-
-    if (NumberOfElements > 0) {
-        Destination[NumberOfElements - 1] = '\0';
-    }
-}
-
-void PlatformString::CopyString(wchar_t *Destination,
-        size_t NumberOfElements, const wchar_t *Source) {
-#ifdef WINDOWS
-    wcscpy_s(Destination, NumberOfElements, Source);
-#endif //WINDOWS
-#ifdef POSIX
-    wcsncpy(Destination, Source, NumberOfElements);
-#endif //POSIX
-
-    if (NumberOfElements > 0) {
-        Destination[NumberOfElements - 1] = '\0';
-    }
-}
-
 PlatformString::PlatformString(void) {
     initialize();
 }
@@ -123,81 +56,18 @@
     }
 }
 
-// Owner must free the return value.
-MultibyteString PlatformString::WideStringToMultibyteString(
-        const wchar_t* value) {
-    MultibyteString result;
-    size_t count = 0;
-
-    if (value == NULL) {
-        return result;
-    }
-
-#ifdef WINDOWS
-    count = WideCharToMultiByte(CP_UTF8, 0, value, -1, NULL, 0, NULL, NULL);
-
-    if (count > 0) {
-        result.data = new char[count + 1];
-        result.length = WideCharToMultiByte(CP_UTF8, 0, value, -1,
-                result.data, (int)count, NULL, NULL);
-#endif //WINDOWS
-
-#ifdef POSIX
-    count = wcstombs(NULL, value, 0);
-
-    if (count > 0) {
-        result.data = new char[count + 1];
-        result.data[count] = '\0';
-        result.length = count;
-        wcstombs(result.data, value, count);
-#endif //POSIX
-    }
-
-    return result;
-}
-
-// Owner must free the return value.
-WideString PlatformString::MultibyteStringToWideString(const char* value) {
-    WideString result;
-    size_t count = 0;
-
-    if (value == NULL) {
-        return result;
-    }
-
-#ifdef WINDOWS
-    mbstowcs_s(&count, NULL, 0, value, _TRUNCATE);
-
-    if (count > 0) {
-        result.data = new wchar_t[count + 1];
-        mbstowcs_s(&result.length, result.data, count, value, count);
-#endif // WINDOWS
-#ifdef POSIX
-    count = mbstowcs(NULL, value, 0);
-
-    if (count > 0) {
-        result.data = new wchar_t[count + 1];
-        result.data[count] = '\0';
-        result.length = count;
-        mbstowcs(result.data, value, count);
-#endif //POSIX
-    }
-
-    return result;
-}
-
 PlatformString::PlatformString(const PlatformString &value) {
     initialize();
     FLength = value.FLength;
     FData = new char[FLength + 1];
-    PlatformString::CopyString(FData, FLength + 1, value.FData);
+    Platform::CopyString(FData, FLength + 1, value.FData);
 }
 
 PlatformString::PlatformString(const char* value) {
     initialize();
     FLength = strlen(value);
     FData = new char[FLength + 1];
-    PlatformString::CopyString(FData, FLength + 1, value);
+    Platform::CopyString(FData, FLength + 1, value);
 }
 
 PlatformString::PlatformString(size_t Value) {
@@ -210,12 +80,12 @@
 
     FLength = strlen(s.c_str());
     FData = new char[FLength + 1];
-    PlatformString::CopyString(FData, FLength + 1, s.c_str());
+    Platform::CopyString(FData, FLength + 1, s.c_str());
 }
 
 PlatformString::PlatformString(const wchar_t* value) {
     initialize();
-    MultibyteString temp = WideStringToMultibyteString(value);
+    MultibyteString temp = Platform::WideStringToMultibyteString(value);
     FLength = temp.length;
     FData = temp.data;
 }
@@ -225,46 +95,17 @@
     const char* lvalue = value.data();
     FLength = value.size();
     FData = new char[FLength + 1];
-    PlatformString::CopyString(FData, FLength + 1, lvalue);
+    Platform::CopyString(FData, FLength + 1, lvalue);
 }
 
 PlatformString::PlatformString(const std::wstring &value) {
     initialize();
     const wchar_t* lvalue = value.data();
-    MultibyteString temp = WideStringToMultibyteString(lvalue);
+    MultibyteString temp = Platform::WideStringToMultibyteString(lvalue);
     FLength = temp.length;
     FData = temp.data;
 }
 
-PlatformString::PlatformString(JNIEnv *env, jstring value) {
-    initialize();
-
-    if (env != NULL) {
-        const char* lvalue = env->GetStringUTFChars(value, JNI_FALSE);
-
-        if (lvalue == NULL || env->ExceptionCheck() == JNI_TRUE) {
-            throw JavaException();
-        }
-
-        if (lvalue != NULL) {
-            FLength = env->GetStringUTFLength(value);
-
-            if (env->ExceptionCheck() == JNI_TRUE) {
-                throw JavaException();
-            }
-
-            FData = new char[FLength + 1];
-            PlatformString::CopyString(FData, FLength + 1, lvalue);
-
-            env->ReleaseStringUTFChars(value, lvalue);
-
-            if (env->ExceptionCheck() == JNI_TRUE) {
-                throw JavaException();
-            }
-        }
-    }
-}
-
 TString PlatformString::Format(const TString value, ...) {
     TString result = value;
 
@@ -307,7 +148,7 @@
 }
 
 wchar_t* PlatformString::toWideString() {
-    WideString result = MultibyteStringToWideString(FData);
+    WideString result = Platform::MultibyteStringToWideString(FData);
 
     if (result.data != NULL) {
         if (FWideTStringToFree != NULL) {
@@ -343,20 +184,6 @@
     return result;
 }
 
-jstring PlatformString::toJString(JNIEnv *env) {
-    jstring result = NULL;
-
-    if (env != NULL) {
-        result = env->NewStringUTF(c_str());
-
-        if (result == NULL || env->ExceptionCheck() == JNI_TRUE) {
-            throw JavaException();
-        }
-    }
-
-    return result;
-}
-
 TCHAR* PlatformString::toPlatformString() {
 #ifdef _UNICODE
     return toWideString();
@@ -388,13 +215,13 @@
 char* PlatformString::duplicate(const char* Value) {
     size_t length = strlen(Value);
     char* result = new char[length + 1];
-    PlatformString::CopyString(result, length + 1, Value);
+    Platform::CopyString(result, length + 1, Value);
     return result;
 }
 
 wchar_t* PlatformString::duplicate(const wchar_t* Value) {
     size_t length = wcslen(Value);
     wchar_t* result = new wchar_t[length + 1];
-    PlatformString::CopyString(result, length + 1, Value);
+    Platform::CopyString(result, length + 1, Value);
     return result;
 }
--- a/src/jdk.jpackage/share/native/libapplauncher/PlatformString.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/PlatformString.h	Sun Feb 17 14:08:26 2019 -0500
@@ -36,21 +36,6 @@
 #include "Platform.h"
 
 
-struct WideString {
-    size_t length;
-    wchar_t* data;
-
-    WideString() { length = 0; data = NULL; }
-};
-
-struct MultibyteString {
-    size_t length;
-    char* data;
-
-    MultibyteString() { length = 0; data = NULL; }
-};
-
-
 template <typename T>
 class DynamicBuffer {
 private:
@@ -100,62 +85,6 @@
     }
 };
 
-
-#ifdef MAC
-// StringToFileSystemString is a stack object. It's usage is
-// simply inline to convert a
-// TString to a file system string. Example:
-//
-// return dlopen(StringToFileSystemString(FileName), RTLD_LAZY);
-//
-class StringToFileSystemString {
-    // Prohibit Heap-Based StringToFileSystemString
-private:
-    static void *operator new(size_t size);
-    static void operator delete(void *ptr);
-
-private:
-    TCHAR* FData;
-    bool FRelease;
-
-public:
-    StringToFileSystemString(const TString &value);
-    ~StringToFileSystemString();
-
-    operator TCHAR* ();
-};
-
-
-// FileSystemStringToString is a stack object. It's usage is
-// simply inline to convert a
-// file system string to a TString. Example:
-//
-// DynamicBuffer<TCHAR> buffer(MAX_PATH);
-// if (readlink("/proc/self/exe", buffer.GetData(), MAX_PATH) != -1)
-//    result = FileSystemStringToString(buffer.GetData());
-//
-class FileSystemStringToString {
-    // Prohibit Heap-Based FileSystemStringToString
-private:
-    static void *operator new(size_t size);
-    static void operator delete(void *ptr);
-
-private:
-    TString FData;
-
-public:
-    FileSystemStringToString(const TCHAR* value);
-
-    operator TString ();
-};
-#endif //MAC
-
-#ifdef LINUX
-#define StringToFileSystemString PlatformString
-#define FileSystemStringToString PlatformString
-#endif //LINUX
-
-
 class PlatformString {
 private:
     char* FData; // Stored as UTF-8
@@ -164,17 +93,6 @@
 
     void initialize();
 
-    // Caller must free result using delete[].
-    static void CopyString(char *Destination,
-            size_t NumberOfElements, const char *Source);
-
-    // Caller must free result using delete[].
-    static void CopyString(wchar_t *Destination,
-            size_t NumberOfElements, const wchar_t *Source);
-
-    static WideString MultibyteStringToWideString(const char* value);
-    static MultibyteString WideStringToMultibyteString(const wchar_t* value);
-
 // Prohibit Heap-Based PlatformStrings
 private:
     static void *operator new(size_t size);
@@ -187,7 +105,6 @@
     PlatformString(const wchar_t* value);
     PlatformString(const std::string &value);
     PlatformString(const std::wstring &value);
-    PlatformString(JNIEnv *env, jstring value);
     PlatformString(size_t Value);
 
     static TString Format(const TString value, ...);
@@ -201,7 +118,6 @@
     wchar_t* toWideString();
     std::wstring toUnicodeString();
     std::string toStdString();
-    jstring toJString(JNIEnv *env);
     TCHAR* toPlatformString();
     TString toString();
 
--- a/src/jdk.jpackage/share/native/libapplauncher/PlatformThread.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "PlatformThread.h"
-
-
-PlatformThread::PlatformThread(void) {
-}
-
-PlatformThread::~PlatformThread(void) {
-    Wait();
-    Terminate();
-}
-
-#ifdef WINDOWS
-DWORD WINAPI PlatformThread::Do(LPVOID Data) {
-    PlatformThread* self = (PlatformThread*)Data;
-    self->Execute();
-    return 0;
-}
-#endif // WINDOWS
-#ifdef POSIX
-void* PlatformThread::Do(void *Data) {
-    PlatformThread* self = (PlatformThread*)Data;
-    self->Execute();
-    pthread_exit(NULL);
-}
-#endif // POSIX
-
-void PlatformThread::Run() {
-#ifdef WINDOWS
-    FHandle = CreateThread(NULL, 0, Do, this, 0, &FThreadID);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_create(&FHandle, NULL, Do, this);
-#endif // POSIX
-}
-
-void PlatformThread::Terminate() {
-#ifdef WINDOWS
-    CloseHandle(FHandle);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_cancel(FHandle);
-#endif // POSIX
-}
-
-void PlatformThread::Wait() {
-#ifdef WINDOWS
-    WaitForSingleObject(FHandle, INFINITE);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_join(FHandle, NULL);
-#endif // POSIX
-}
--- a/src/jdk.jpackage/share/native/libapplauncher/PlatformThread.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifndef PLATFORMTHREAD_H
-#define PLATFORMTHREAD_H
-
-#ifdef POSIX
-#include <pthread.h>
-#endif // POSIX
-
-
-class PlatformThread {
-private:
-#ifdef WINDOWS
-    HANDLE FHandle;
-    DWORD FThreadID;
-    static DWORD WINAPI Do(LPVOID lpParam);
-#endif // WINDOWS
-#ifdef POSIX
-    pthread_t FHandle;
-    static void* Do(void *threadid);
-#endif // POSIX
-
-protected:
-    // Never call directly. Override this method and this is your code
-    // that runs in a thread.
-    virtual void Execute() = 0;
-
-public:
-    PlatformThread(void);
-    virtual ~PlatformThread(void);
-
-    void Run();
-    void Terminate();
-    void Wait();
-};
-
-#endif // PLATFORMTHREAD_H
--- a/src/jdk.jpackage/share/native/libapplauncher/PosixPlatform.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,374 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "PosixPlatform.h"
-
-#ifdef POSIX
-
-#include "PlatformString.h"
-#include "FilePath.h"
-#include "Helpers.h"
-
-#include <assert.h>
-#include <stdbool.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/sysctl.h>
-#include <sys/file.h>
-#include <sys/stat.h>
-#ifdef LINUX
-#include <sys/wait.h>
-#endif
-#include <errno.h>
-#include <limits.h>
-#include <pwd.h>
-#include <iostream>
-#include <algorithm>
-#include <dlfcn.h>
-#include <signal.h>
-
-
-PosixPlatform::PosixPlatform(void) {
-}
-
-PosixPlatform::~PosixPlatform(void) {
-}
-
-TString PosixPlatform::GetTempDirectory() {
-    struct passwd* pw = getpwuid(getuid());
-    TString homedir(pw->pw_dir);
-    homedir += getTmpDirString();
-    if (!FilePath::DirectoryExists(homedir)) {
-        if (!FilePath::CreateDirectory(homedir, false)) {
-            homedir.clear();
-        }
-    }
-
-    return homedir;
-}
-
-TString PosixPlatform::fixName(const TString& name) {
-    TString fixedName(name);
-    const TString chars("?:*<>/\\");
-    for (TString::const_iterator it = chars.begin(); it != chars.end(); it++) {
-        fixedName.erase(std::remove(fixedName.begin(),
-                fixedName.end(), *it), fixedName.end());
-    }
-    return fixedName;
-}
-
-MessageResponse PosixPlatform::ShowResponseMessage(TString title,
-        TString description) {
-    MessageResponse result = mrCancel;
-
-    printf("%s %s (Y/N)\n", PlatformString(title).toPlatformString(),
-            PlatformString(description).toPlatformString());
-    fflush(stdout);
-
-    std::string input;
-    std::cin >> input;
-
-    if (input == "Y") {
-        result = mrOK;
-    }
-
-    return result;
-}
-
-void PosixPlatform::SetCurrentDirectory(TString Value) {
-    chdir(StringToFileSystemString(Value));
-}
-
-Module PosixPlatform::LoadLibrary(TString FileName) {
-    return dlopen(StringToFileSystemString(FileName), RTLD_LAZY);
-}
-
-void PosixPlatform::FreeLibrary(Module AModule) {
-    dlclose(AModule);
-}
-
-Procedure PosixPlatform::GetProcAddress(Module AModule,
-        std::string MethodName) {
-    return dlsym(AModule, PlatformString(MethodName));
-}
-
-std::vector<std::string> PosixPlatform::GetLibraryImports(
-       const TString FileName) {
- std::vector<TString> result;
- return result;
-}
-
-std::vector<TString> PosixPlatform::FilterOutRuntimeDependenciesForPlatform(
-       std::vector<TString> Imports) {
- std::vector<TString> result;
- return result;
-}
-
-Process* PosixPlatform::CreateProcess() {
-    return new PosixProcess();
-}
-
-PosixProcess::PosixProcess() : Process() {
-    FChildPID = 0;
-    FRunning = false;
-    FOutputHandle = 0;
-    FInputHandle = 0;
-}
-
-PosixProcess::~PosixProcess() {
-    Terminate();
-}
-
-void PosixProcess::Cleanup() {
-    if (FOutputHandle != 0) {
-        close(FOutputHandle);
-        FOutputHandle = 0;
-    }
-
-    if (FInputHandle != 0) {
-        close(FInputHandle);
-        FInputHandle = 0;
-    }
-
-#ifdef MAC
-    sigaction(SIGINT, &savintr, (struct sigaction *)0);
-    sigaction(SIGQUIT, &savequit, (struct sigaction *)0);
-    sigprocmask(SIG_SETMASK, &saveblock, (sigset_t *)0);
-#endif //MAC
-}
-
-bool PosixProcess::ReadOutput() {
-    bool result = false;
-
-    if (FOutputHandle != 0 && IsRunning() == true) {
-        char buffer[4096] = {0};
-
-        ssize_t count = read(FOutputHandle, buffer, sizeof(buffer));
-
-        if (count == -1) {
-            if (errno == EINTR) {
-                // continue;
-            } else {
-                perror("read");
-                exit(1);
-            }
-        } else if (count == 0) {
-            // break;
-        } else {
-            if (buffer[count - 1] == EOF) {
-                buffer[count - 1] = '\0';
-            }
-
-            std::list<TString> output = Helpers::StringToArray(buffer);
-            FOutput.splice(FOutput.end(), output, output.begin(), output.end());
-            result = true;
-        }
-    }
-
-    return false;
-}
-
-bool PosixProcess::IsRunning() {
-    bool result = false;
-
-    if (kill(FChildPID, 0) == 0) {
-        result = true;
-    }
-
-    return result;
-}
-
-bool PosixProcess::Terminate() {
-    bool result = false;
-
-    if (IsRunning() == true && FRunning == true) {
-        FRunning = false;
-        Cleanup();
-        int status = kill(FChildPID, SIGTERM);
-
-        if (status == 0) {
-            result = true;
-        } else {
-#ifdef DEBUG
-            if (errno == EINVAL) {
-                printf("Kill error: The value of the sig argument is an invalid or unsupported signal number.");
-            } else if (errno == EPERM) {
-                printf("Kill error: The process does not have permission to send the signal to any receiving process.");
-            } else if (errno == ESRCH) {
-                printf("Kill error: No process or process group can be found corresponding to that specified by pid.");
-            }
-#endif // DEBUG
-            if (IsRunning() == true) {
-                status = kill(FChildPID, SIGKILL);
-
-                if (status == 0) {
-                    result = true;
-                }
-            }
-        }
-    }
-
-    return result;
-}
-
-#define PIPE_READ 0
-#define PIPE_WRITE 1
-
-bool PosixProcess::Execute(const TString Application,
-        const std::vector<TString> Arguments, bool AWait) {
-    bool result = false;
-
-    if (FRunning == false) {
-        FRunning = true;
-
-        int handles[2];
-
-        if (pipe(handles) == -1) {
-            return false;
-        }
-
-        struct sigaction sa;
-        sa.sa_handler = SIG_IGN;
-        sigemptyset(&sa.sa_mask);
-        sa.sa_flags = 0;
-#ifdef MAC
-        sigemptyset(&savintr.sa_mask);
-        sigemptyset(&savequit.sa_mask);
-        sigaction(SIGINT, &sa, &savintr);
-        sigaction(SIGQUIT, &sa, &savequit);
-        sigaddset(&sa.sa_mask, SIGCHLD);
-        sigprocmask(SIG_BLOCK, &sa.sa_mask, &saveblock);
-#endif // MAC
-        FChildPID = fork();
-
-        // PID returned by vfork is 0 for the child process and the
-        // PID of the child process for the parent.
-        if (FChildPID == -1) {
-            // Error
-            TString message = PlatformString::Format(
-                    _T("Error: Unable to create process %s"),
-                    Application.data());
-            throw Exception(message);
-        }
-        else if (FChildPID == 0) {
-            Cleanup();
-            TString command = Application;
-
-            for (std::vector<TString>::const_iterator iterator =
-                    Arguments.begin(); iterator != Arguments.end();
-                    iterator++) {
-                command += TString(_T(" ")) + *iterator;
-            }
-#ifdef DEBUG
-            printf("%s\n", command.data());
-#endif // DEBUG
-
-            dup2(handles[PIPE_READ], STDIN_FILENO);
-            dup2(handles[PIPE_WRITE], STDOUT_FILENO);
-
-            close(handles[PIPE_READ]);
-            close(handles[PIPE_WRITE]);
-
-            execl("/bin/sh", "sh", "-c", command.data(), (char *)0);
-
-            _exit(127);
-        } else {
-            FOutputHandle = handles[PIPE_READ];
-            FInputHandle = handles[PIPE_WRITE];
-
-            if (AWait == true) {
-                ReadOutput();
-                Wait();
-                Cleanup();
-                FRunning = false;
-                result = true;
-            }
-            else {
-                result = true;
-            }
-        }
-    }
-
-    return result;
-}
-
-bool PosixProcess::Wait() {
-    bool result = false;
-
-    int status = 0;
-    pid_t wpid = 0;
-
-#ifdef LINUX
-    wpid = wait(&status);
-#endif
-#ifdef MAC
-    wpid = wait(&status);
-#endif
-
-    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-        if (errno != EINTR){
-            status = -1;
-        }
-    }
-
-#ifdef DEBUG
-    if (WIFEXITED(status)) {
-        printf("child exited, status=%d\n", WEXITSTATUS(status));
-    } else if (WIFSIGNALED(status)) {
-        printf("child killed (signal %d)\n", WTERMSIG(status));
-    } else if (WIFSTOPPED(status)) {
-        printf("child stopped (signal %d)\n", WSTOPSIG(status));
-#ifdef WIFCONTINUED // Not all implementations support this
-    } else if (WIFCONTINUED(status)) {
-        printf("child continued\n");
-#endif // WIFCONTINUED
-    } else { // Non-standard case -- may never happen
-        printf("Unexpected status (0x%x)\n", status);
-    }
-#endif // DEBUG
-
-    if (wpid != -1) {
-        result = true;
-    }
-
-    return result;
-}
-
-TProcessID PosixProcess::GetProcessID() {
-    return FChildPID;
-}
-
-void PosixProcess::SetInput(TString Value) {
-    if (FInputHandle != 0) {
-        write(FInputHandle, Value.data(), Value.size());
-    }
-}
-
-std::list<TString> PosixProcess::GetOutput() {
-    ReadOutput();
-    return Process::GetOutput();
-}
-
-#endif // POSIX
--- a/src/jdk.jpackage/share/native/libapplauncher/PosixPlatform.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef POSIX
-
-#ifndef POSIXPLATFORM_H
-#define POSIXPLATFORM_H
-
-
-class PosixPlatform : virtual public Platform {
-protected:
-
-    TString fixName(const TString& name);
-
-    virtual TString getTmpDirString() = 0;
-
-public:
-    PosixPlatform(void);
-    virtual ~PosixPlatform(void);
-
-public:
-    virtual MessageResponse ShowResponseMessage(TString title,
-            TString description);
-
-    virtual void SetCurrentDirectory(TString Value);
-
-    virtual Module LoadLibrary(TString FileName);
-    virtual void FreeLibrary(Module AModule);
-    virtual Procedure GetProcAddress(Module AModule, std::string MethodName);
-    virtual std::vector<TString> GetLibraryImports(const TString FileName);
-    virtual std::vector<TString> FilterOutRuntimeDependenciesForPlatform(
-            std::vector<TString> Imports);
-
-    virtual Process* CreateProcess();
-    virtual TString GetTempDirectory();
-};
-
-
-class PosixProcess : public Process {
-private:
-    pid_t FChildPID;
-    sigset_t saveblock;
-    int FOutputHandle;
-    int FInputHandle;
-#ifdef MAC
-    struct sigaction savintr, savequit;
-#endif //MAC
-    bool FRunning;
-
-    void Cleanup();
-    bool ReadOutput();
-
-public:
-    PosixProcess();
-    virtual ~PosixProcess();
-
-    virtual bool IsRunning();
-    virtual bool Terminate();
-    virtual bool Execute(const TString Application,
-            const std::vector<TString> Arguments, bool AWait = false);
-    virtual bool Wait();
-    virtual TProcessID GetProcessID();
-    virtual void SetInput(TString Value);
-    virtual std::list<TString> GetOutput();
-};
-
-#endif // POSIXPLATFORM_H
-#endif // POSX
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/share/native/libapplauncher/Properties.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef PROPERTIES_H
+#define PROPERTIES_H
+
+#include "PlatformDefs.h"
+#include "OrderedMap.h"
+
+//#include <stdio.h>
+//#include <stdlib.h>
+//#include <memory.h>
+//#include <string>
+//#include <map>
+//#include <list>
+//#include <vector>
+//#include <fstream>
+
+//using namespace std;
+
+template <typename ObjectType, typename ValueType,
+        ValueType (ObjectType::*getter)(void),
+        void (ObjectType::*setter)(ValueType)>
+class Property {
+private:
+    ObjectType* FObject;
+
+public:
+    Property() {
+        FObject = NULL;
+    }
+
+    void SetInstance(ObjectType* Value) {
+        FObject = Value;
+    }
+
+    // To set the value using the set method.
+    ValueType operator =(const ValueType& Value) {
+        assert(FObject != NULL);
+        (FObject->*setter)(Value);
+        return Value;
+    }
+
+    // The Property class is treated as the internal type.
+    operator ValueType() {
+        assert(FObject != NULL);
+        return (FObject->*getter)();
+    }
+};
+
+template <typename ObjectType, typename ValueType,
+        ValueType (ObjectType::*getter)(void)>
+class ReadProperty {
+private:
+    ObjectType* FObject;
+
+public:
+    ReadProperty() {
+        FObject = NULL;
+    }
+
+    void SetInstance(ObjectType* Value) {
+        FObject = Value;
+    }
+
+    // The Property class is treated as the internal type.
+    operator ValueType() {
+        assert(FObject != NULL);
+        return (FObject->*getter)();
+    }
+};
+
+template <typename ObjectType, typename ValueType,
+        void (ObjectType::*setter)(ValueType)>
+class WriteProperty {
+private:
+    ObjectType* FObject;
+
+public:
+    WriteProperty() {
+        FObject = NULL;
+    }
+
+    void SetInstance(ObjectType* Value) {
+        FObject = Value;
+    }
+
+    // To set the value using the set method.
+    ValueType operator =(const ValueType& Value) {
+        assert(FObject != NULL);
+        (FObject->*setter)(Value);
+        return Value;
+    }
+};
+
+template <typename ValueType,
+        ValueType (*getter)(void), void (*setter)(ValueType)>
+class StaticProperty {
+public:
+    StaticProperty() {
+    }
+
+    // To set the value using the set method.
+    ValueType operator =(const ValueType& Value) {
+        (*getter)(Value);
+        return Value;
+    }
+
+    // The Property class is treated as the internal type which is the getter.
+    operator ValueType() {
+        return (*setter)();
+    }
+};
+
+template <typename ValueType, ValueType (*getter)(void)>
+class StaticReadProperty {
+public:
+    StaticReadProperty() {
+    }
+
+    // The Property class is treated as the internal type which is the getter.
+    operator ValueType() {
+        return (*getter)();
+    }
+};
+
+template <typename ValueType, void (*setter)(ValueType)>
+class StaticWriteProperty {
+public:
+    StaticWriteProperty() {
+    }
+
+    // To set the value using the set method.
+    ValueType operator =(const ValueType& Value) {
+        (*setter)(Value);
+        return Value;
+    }
+};
+
+class IPropertyContainer {
+public:
+    IPropertyContainer(void) {}
+    virtual ~IPropertyContainer(void) {}
+
+    virtual bool GetValue(const TString Key, TString& Value) = 0;
+    virtual size_t GetCount() = 0;
+};
+
+class ISectionalPropertyContainer {
+public:
+    ISectionalPropertyContainer(void) {}
+    virtual ~ISectionalPropertyContainer(void) {}
+
+    virtual bool GetValue(const TString SectionName,
+            const TString Key, TString& Value) = 0;
+    virtual bool ContainsSection(const TString SectionName) = 0;
+    virtual bool GetSection(const TString SectionName,
+            OrderedMap<TString, TString> &Data) = 0;
+};
+
+#endif // PROPERTIES_H
+
--- a/src/jdk.jpackage/share/native/libapplauncher/PropertyFile.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/PropertyFile.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -46,7 +46,7 @@
     FData.Append(Value);
 }
 
-PropertyFile::PropertyFile(const PropertyFile &Value) {
+PropertyFile::PropertyFile(PropertyFile &Value) {
     FData = Value.FData;
     FReadOnly = Value.FReadOnly;
     FModified = Value.FModified;
--- a/src/jdk.jpackage/share/native/libapplauncher/PropertyFile.h	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/PropertyFile.h	Sun Feb 17 14:08:26 2019 -0500
@@ -42,15 +42,13 @@
     PropertyFile(void);
     PropertyFile(const TString FileName);
     PropertyFile(OrderedMap<TString, TString> Value);
-    PropertyFile(const PropertyFile &Value);
+    PropertyFile(PropertyFile &Value);
     virtual ~PropertyFile(void);
 
     bool IsModified();
     bool GetReadOnly();
     void SetReadOnly(bool Value);
 
-    //void Assign(std::map<TString, TString> Value);
-
     bool LoadFromFile(const TString FileName);
     bool SaveToFile(const TString FileName, bool ownerOnly = true);
 
@@ -62,7 +60,6 @@
     // IPropertyContainer
     virtual bool GetValue(const TString Key, TString& Value);
     virtual size_t GetCount();
-    // virtual std::vector<TString> GetKeys();
 };
 
 #endif // PROPERTYFILE_H
--- a/src/jdk.jpackage/share/native/libapplauncher/WindowsPlatform.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,731 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef WINDOWS
-
-#include "JavaVirtualMachine.h"
-#include "WindowsPlatform.h"
-#include "Package.h"
-#include "Helpers.h"
-#include "PlatformString.h"
-#include "Macros.h"
-
-#include <map>
-#include <vector>
-#include <regex>
-
-#define WINDOWS_JPACKAGE_TMP_DIR \
-        L"\\AppData\\Local\\Java\\JPackage\\tmp"
-
-
-class Registry {
-private:
-    HKEY FKey;
-    HKEY FOpenKey;
-    bool FOpen;
-
-public:
-    Registry(HKEY Key) {
-        FOpen = false;
-        FKey = Key;
-    }
-
-    ~Registry() {
-        Close();
-    }
-
-    void Close() {
-        if (FOpen == true) {
-            RegCloseKey(FOpenKey);
-        }
-    }
-
-    bool Open(TString SubKey) {
-        bool result = false;
-        Close();
-
-        if (RegOpenKeyEx(FKey, SubKey.data(), 0, KEY_READ, &FOpenKey) ==
-                ERROR_SUCCESS) {
-            result = true;
-        }
-
-        return result;
-    }
-
-    std::list<TString> GetKeys() {
-        std::list<TString> result;
-        DWORD count;
-
-        if (RegQueryInfoKey(FOpenKey, NULL, NULL, NULL, NULL, NULL, NULL,
-                 &count, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
-
-            DWORD length = 255;
-            DynamicBuffer<TCHAR> buffer(length);
-            if (buffer.GetData() == NULL) {
-                return result;
-            }
-
-            for (unsigned int index = 0; index < count; index++) {
-                buffer.Zero();
-                DWORD status = RegEnumValue(FOpenKey, index, buffer.GetData(),
-                                            &length, NULL, NULL, NULL, NULL);
-
-                while (status == ERROR_MORE_DATA) {
-                    length = length * 2;
-                    if (!buffer.Resize(length)) {
-                        return result;
-                    }
-                    status = RegEnumValue(FOpenKey, index, buffer.GetData(),
-                                          &length, NULL, NULL, NULL, NULL);
-                }
-
-                if (status == ERROR_SUCCESS) {
-                    TString value = buffer.GetData();
-                    result.push_back(value);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    TString ReadString(TString Name) {
-        TString result;
-        DWORD length;
-        DWORD dwRet;
-        DynamicBuffer<wchar_t> buffer(0);
-        length = 0;
-
-        dwRet = RegQueryValueEx(FOpenKey, Name.data(), NULL, NULL, NULL,
-                &length);
-        if (dwRet == ERROR_MORE_DATA || dwRet == 0) {
-            if (!buffer.Resize(length + 1)) {
-                return result;
-            }
-            dwRet = RegQueryValueEx(FOpenKey, Name.data(), NULL, NULL,
-                    (LPBYTE)buffer.GetData(), &length);
-            result = buffer.GetData();
-        }
-
-        return result;
-    }
-};
-
-WindowsPlatform::WindowsPlatform(void) : Platform(), GenericPlatform() {
-    FMainThread = ::GetCurrentThreadId();
-}
-
-WindowsPlatform::~WindowsPlatform(void) {
-}
-
-TCHAR* WindowsPlatform::ConvertStringToFileSystemString(TCHAR* Source,
-        bool &release) {
-    // Not Implemented.
-    return NULL;
-}
-
-TCHAR* WindowsPlatform::ConvertFileSystemStringToString(TCHAR* Source,
-        bool &release) {
-    // Not Implemented.
-    return NULL;
-}
-
-void WindowsPlatform::SetCurrentDirectory(TString Value) {
-    _wchdir(Value.data());
-}
-
-TString WindowsPlatform::GetPackageRootDirectory() {
-    TString filename = GetModuleFileName();
-    return FilePath::ExtractFilePath(filename);
-}
-
-TString WindowsPlatform::GetAppDataDirectory() {
-    TString result;
-    TCHAR path[MAX_PATH];
-
-    if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, path) == S_OK) {
-        result = path;
-    }
-
-    return result;
-}
-
-void WindowsPlatform::ShowMessage(TString title, TString description) {
-    MessageBox(NULL, description.data(),
-            !title.empty() ? title.data() : description.data(),
-            MB_ICONERROR | MB_OK);
-}
-
-void WindowsPlatform::ShowMessage(TString description) {
-    TString appname = GetModuleFileName();
-    appname = FilePath::ExtractFileName(appname);
-    MessageBox(NULL, description.data(), appname.data(), MB_ICONERROR | MB_OK);
-}
-
-MessageResponse WindowsPlatform::ShowResponseMessage(TString title,
-        TString description) {
-    MessageResponse result = mrCancel;
-
-    if (::MessageBox(NULL, description.data(), title.data(), MB_OKCANCEL) ==
-            IDOK) {
-        result = mrOK;
-    }
-
-    return result;
-}
-
-TString WindowsPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
-    TString result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-        _T("jre\\bin\\jli.dll");
-
-    if (FilePath::FileExists(result) == false) {
-        result = FilePath::IncludeTrailingSeparator(RuntimePath) +
-            _T("bin\\jli.dll");
-    }
-
-    return result;
-}
-
-ISectionalPropertyContainer* WindowsPlatform::GetConfigFile(TString FileName) {
-    IniFile *result = new IniFile();
-    if (result == NULL) {
-        return NULL;
-    }
-
-    if (result->LoadFromFile(FileName) == false) {
-        // New property file format was not found,
-        // attempt to load old property file format.
-        Helpers::LoadOldConfigFile(FileName, result);
-    }
-
-    return result;
-}
-
-TString WindowsPlatform::GetModuleFileName() {
-    TString result;
-    DynamicBuffer<wchar_t> buffer(MAX_PATH);
-    if (buffer.GetData() == NULL) {
-        return result;
-    }
-
-    ::GetModuleFileName(NULL, buffer.GetData(),
-            static_cast<DWORD>(buffer.GetSize()));
-
-    while (ERROR_INSUFFICIENT_BUFFER == GetLastError()) {
-        if (!buffer.Resize(buffer.GetSize() * 2)) {
-            return result;
-        }
-        ::GetModuleFileName(NULL, buffer.GetData(),
-                static_cast<DWORD>(buffer.GetSize()));
-    }
-
-    result = buffer.GetData();
-    return result;
-}
-
-Module WindowsPlatform::LoadLibrary(TString FileName) {
-    return ::LoadLibrary(FileName.data());
-}
-
-void WindowsPlatform::FreeLibrary(Module AModule) {
-    ::FreeLibrary((HMODULE)AModule);
-}
-
-Procedure WindowsPlatform::GetProcAddress(Module AModule,
-        std::string MethodName) {
-    return ::GetProcAddress((HMODULE)AModule, MethodName.c_str());
-}
-
-bool WindowsPlatform::IsMainThread() {
-    bool result = (FMainThread == ::GetCurrentThreadId());
-    return result;
-}
-
-TString WindowsPlatform::GetTempDirectory() {
-    TString result;
-    PWSTR userDir = 0;
-
-    if (SUCCEEDED(SHGetKnownFolderPath(
-                    FOLDERID_Profile,
-                    0,
-                    NULL,
-                    &userDir))) {
-        result = userDir;
-        result += WINDOWS_JPACKAGE_TMP_DIR;
-        CoTaskMemFree(userDir);
-    }
-
-    return result;
-}
-
-static BOOL CALLBACK enumWindows(HWND winHandle, LPARAM lParam) {
-    DWORD pid = (DWORD)lParam, wPid = 0;
-    GetWindowThreadProcessId(winHandle, &wPid);
-    if (pid == wPid)  {
-        SetForegroundWindow(winHandle);
-        return FALSE;
-    }
-    return TRUE;
-}
-
-TPlatformNumber WindowsPlatform::GetMemorySize() {
-    SYSTEM_INFO si;
-    GetSystemInfo(&si);
-    size_t result = (size_t)si.lpMaximumApplicationAddress;
-    result = result / 1048576; // Convert from bytes to megabytes.
-    return result;
-}
-
-std::vector<TString> WindowsPlatform::GetLibraryImports(
-       const TString FileName) {
- std::vector<TString> result;
-    WindowsLibrary library(FileName);
-    result = library.GetImports();
- return result;
-}
-
-std::vector<TString> FilterList(std::vector<TString> &Items,
-        std::wregex Pattern) {
-    std::vector<TString> result;
-
-    for (std::vector<TString>::iterator it = Items.begin();
-            it != Items.end(); ++it) {
-        TString item = *it;
-        std::wsmatch match;
-
-        if (std::regex_search(item, match, Pattern)) {
-            result.push_back(item);
-        }
-    }
-    return result;
-}
-
-std::vector<TString> WindowsPlatform::FilterOutRuntimeDependenciesForPlatform(
-        std::vector<TString> Imports) {
-    std::vector<TString> result;
-    Package& package = Package::GetInstance();
-    Macros& macros = Macros::GetInstance();
-    TString runtimeDir = macros.ExpandMacros(package.GetJVMRuntimeDirectory());
-    std::vector<TString> filelist = FilterList(Imports,
-            std::wregex(_T("MSVCR.*.DLL"), std::regex_constants::icase));
-
-    for (std::vector<TString>::iterator it = filelist.begin();
-            it != filelist.end(); ++it) {
-        TString filename = *it;
-        TString msvcr100FileName = FilePath::IncludeTrailingSeparator(
-                runtimeDir) + _T("jre\\bin\\") + filename;
-
-        if (FilePath::FileExists(msvcr100FileName) == true) {
-            result.push_back(msvcr100FileName);
-            break;
-        }
-        else {
-            msvcr100FileName = FilePath::IncludeTrailingSeparator(runtimeDir)
-                    + _T("bin\\") + filename;
-
-            if (FilePath::FileExists(msvcr100FileName) == true) {
-                result.push_back(msvcr100FileName);
-                break;
-            }
-        }
-    }
-
- return result;
-}
-
-Process* WindowsPlatform::CreateProcess() {
-    return new WindowsProcess();
-}
-
-#ifdef DEBUG
-bool WindowsPlatform::IsNativeDebuggerPresent() {
-    bool result = false;
-
-    if (IsDebuggerPresent() == TRUE) {
-        result = true;
-    }
-
-    return result;
-}
-
-int WindowsPlatform::GetProcessID() {
-    int pid = GetProcessId(GetCurrentProcess());
-    return pid;
-}
-#endif //DEBUG
-
-
-FileHandle::FileHandle(std::wstring FileName) {
-    FHandle = ::CreateFile(FileName.data(), GENERIC_READ, FILE_SHARE_READ,
-            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
-}
-
-FileHandle::~FileHandle() {
-    if (IsValid() == true) {
-        ::CloseHandle(FHandle);
-    }
-}
-
-bool FileHandle::IsValid() {
-    return FHandle != INVALID_HANDLE_VALUE;
-}
-
-HANDLE FileHandle::GetHandle() {
-    return FHandle;
-}
-
-FileMappingHandle::FileMappingHandle(HANDLE FileHandle) {
-    FHandle = ::CreateFileMapping(FileHandle, NULL, PAGE_READONLY, 0, 0, NULL);
-}
-
-bool FileMappingHandle::IsValid() {
-    return FHandle != NULL;
-}
-
-FileMappingHandle::~FileMappingHandle() {
-    if (IsValid() == true) {
-        ::CloseHandle(FHandle);
-    }
-}
-
-HANDLE FileMappingHandle::GetHandle() {
-    return FHandle;
-}
-
-FileData::FileData(HANDLE Handle) {
-    FBaseAddress = ::MapViewOfFile(Handle, FILE_MAP_READ, 0, 0, 0);
-}
-
-FileData::~FileData() {
-    if (IsValid() == true) {
-        ::UnmapViewOfFile(FBaseAddress);
-    }
-}
-
-bool FileData::IsValid() {
-    return FBaseAddress != NULL;
-}
-
-LPVOID FileData::GetBaseAddress() {
-    return FBaseAddress;
-}
-
-
-WindowsLibrary::WindowsLibrary(std::wstring FileName) {
-    FFileName = FileName;
-}
-
-std::vector<TString> WindowsLibrary::GetImports() {
-    std::vector<TString> result;
-    FileHandle library(FFileName);
-
-    if (library.IsValid() == true) {
-        FileMappingHandle mapping(library.GetHandle());
-
-        if (mapping.IsValid() == true) {
-            FileData fileData(mapping.GetHandle());
-
-            if (fileData.IsValid() == true) {
-                PIMAGE_DOS_HEADER dosHeader =
-                        (PIMAGE_DOS_HEADER)fileData.GetBaseAddress();
-                PIMAGE_FILE_HEADER pImgFileHdr =
-                        (PIMAGE_FILE_HEADER)fileData.GetBaseAddress();
-                if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE) {
-                    result = DumpPEFile(dosHeader);
-                }
-            }
-        }
-    }
-
-    return result;
-}
-
-// Given an RVA, look up the section header that encloses it and return a
-// pointer to its IMAGE_SECTION_HEADER
-PIMAGE_SECTION_HEADER WindowsLibrary::GetEnclosingSectionHeader(DWORD rva,
-                                                PIMAGE_NT_HEADERS pNTHeader) {
-    PIMAGE_SECTION_HEADER result = 0;
-    PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
-
-    for (unsigned index = 0; index < pNTHeader->FileHeader.NumberOfSections;
-            index++, section++) {
-        // Is the RVA is within this section?
-        if ((rva >= section->VirtualAddress) &&
-            (rva < (section->VirtualAddress + section->Misc.VirtualSize))) {
-            result = section;
-        }
-    }
-
-    return result;
-}
-
-LPVOID WindowsLibrary::GetPtrFromRVA(DWORD rva, PIMAGE_NT_HEADERS pNTHeader,
-        DWORD imageBase) {
-    LPVOID result = 0;
-    PIMAGE_SECTION_HEADER pSectionHdr = GetEnclosingSectionHeader(rva,
-            pNTHeader);
-
-    if (pSectionHdr != NULL) {
-        INT delta = (INT)(
-                pSectionHdr->VirtualAddress-pSectionHdr->PointerToRawData);
-        DWORD_PTR dwp = (DWORD_PTR) (imageBase + rva - delta);
-        result = reinterpret_cast<LPVOID>(dwp); // VS2017 - FIXME
-    }
-
-    return result;
-}
-
-std::vector<TString> WindowsLibrary::GetImportsSection(DWORD base,
-        PIMAGE_NT_HEADERS pNTHeader) {
-    std::vector<TString> result;
-
-    // Look up where the imports section is located. Normally in
-    // the .idata section,
-    // but not necessarily so. Therefore, grab the RVA from the data dir.
-    DWORD importsStartRVA = pNTHeader->OptionalHeader.DataDirectory[
-            IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
-
-    if (importsStartRVA != NULL) {
-        // Get the IMAGE_SECTION_HEADER that contains the imports. This is
-        // usually the .idata section, but doesn't have to be.
-        PIMAGE_SECTION_HEADER pSection =
-                GetEnclosingSectionHeader(importsStartRVA, pNTHeader);
-
-        if (pSection != NULL) {
-            PIMAGE_IMPORT_DESCRIPTOR importDesc =
-                    (PIMAGE_IMPORT_DESCRIPTOR)GetPtrFromRVA(
-                    importsStartRVA, pNTHeader,base);
-
-            if (importDesc != NULL) {
-                while (true)
-                {
-                    // See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
-                    if ((importDesc->TimeDateStamp == 0) &&
-                            (importDesc->Name == 0)) {
-                        break;
-                    }
-
-                    std::string filename = (char*)GetPtrFromRVA(
-                            importDesc->Name, pNTHeader, base);
-                    result.push_back(PlatformString(filename));
-                    importDesc++;   // advance to next IMAGE_IMPORT_DESCRIPTOR
-                }
-            }
-        }
-    }
-
-    return result;
-}
-
-std::vector<TString> WindowsLibrary::DumpPEFile(PIMAGE_DOS_HEADER dosHeader) {
-    std::vector<TString> result;
-    // all of this is VS2017 - FIXME
-    DWORD_PTR dwDosHeaders = reinterpret_cast<DWORD_PTR>(dosHeader);
-    DWORD_PTR dwPIHeaders = dwDosHeaders + (DWORD)(dosHeader->e_lfanew);
-
-    PIMAGE_NT_HEADERS pNTHeader =
-                      reinterpret_cast<PIMAGE_NT_HEADERS>(dwPIHeaders);
-
-    // Verify that the e_lfanew field gave us a reasonable
-    // pointer and the PE signature.
-    // TODO: To really fix JDK-8131321 this condition needs to be changed.
-    // There is a matching change
-    // in JavaVirtualMachine.cpp that also needs to be changed.
-    if (pNTHeader->Signature == IMAGE_NT_SIGNATURE) {
-        DWORD base = (DWORD)(dwDosHeaders);
-        result = GetImportsSection(base, pNTHeader);
-    }
-
-    return result;
-}
-
-#include <TlHelp32.h>
-
-WindowsJob::WindowsJob() {
-    FHandle = NULL;
-}
-
-WindowsJob::~WindowsJob() {
-    if (FHandle != NULL) {
-        CloseHandle(FHandle);
-    }
-}
-
-HANDLE WindowsJob::GetHandle() {
-    if (FHandle == NULL) {
-        FHandle = CreateJobObject(NULL, NULL); // GLOBAL
-
-        if (FHandle == NULL)
-        {
-            ::MessageBox( 0, _T("Could not create job object"),
-                    _T("TEST"), MB_OK);
-        }
-        else
-        {
-            JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
-
-            // Configure all child processes associated with
-            // the job to terminate when the
-            jeli.BasicLimitInformation.LimitFlags =
-                    JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
-            if (0 == SetInformationJobObject(FHandle,
-                    JobObjectExtendedLimitInformation, &jeli, sizeof(jeli))) {
-                ::MessageBox( 0, _T("Could not SetInformationJobObject"),
-                        _T("TEST"), MB_OK);
-            }
-        }
-    }
-
-    return FHandle;
-}
-
-// Initialize static member of WindowsProcess
-WindowsJob WindowsProcess::FJob;
-
-WindowsProcess::WindowsProcess() : Process() {
-    FRunning = false;
-}
-
-WindowsProcess::~WindowsProcess() {
-    Terminate();
-}
-
-void WindowsProcess::Cleanup() {
-    CloseHandle(FProcessInfo.hProcess);
-    CloseHandle(FProcessInfo.hThread);
-}
-
-bool WindowsProcess::IsRunning() {
-    bool result = false;
-
-    HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
-    if (handle == INVALID_HANDLE_VALUE) {
-        return false;
-    }
-
-    PROCESSENTRY32 process = { 0 };
-    process.dwSize = sizeof(process);
-
-    if (::Process32First(handle, &process)) {
-        do {
-            if (process.th32ProcessID == FProcessInfo.dwProcessId) {
-                result = true;
-                break;
-            }
-        }
-        while (::Process32Next(handle, &process));
-    }
-
-    CloseHandle(handle);
-
-    return result;
-}
-
-bool WindowsProcess::Terminate() {
-    bool result = false;
-
-    if (IsRunning() == true && FRunning == true) {
-        FRunning = false;
-    }
-
-    return result;
-}
-
-bool WindowsProcess::Execute(const TString Application,
-        const std::vector<TString> Arguments, bool AWait) {
-    bool result = false;
-
-    if (FRunning == false) {
-        FRunning = true;
-
-        STARTUPINFO startupInfo;
-        ZeroMemory(&startupInfo, sizeof(startupInfo));
-        startupInfo.cb = sizeof(startupInfo);
-        ZeroMemory(&FProcessInfo, sizeof(FProcessInfo));
-
-        TString command = Application;
-
-        for (std::vector<TString>::const_iterator iterator = Arguments.begin();
-                iterator != Arguments.end(); iterator++) {
-            command += TString(_T(" ")) + *iterator;
-        }
-
-        if (::CreateProcess(Application.data(), (wchar_t*)command.data(), NULL,
-            NULL, FALSE, 0, NULL, NULL, &startupInfo, &FProcessInfo) == FALSE) {
-            TString message = PlatformString::Format(
-                    _T("Error: Unable to create process %s"),
-                     Application.data());
-            throw Exception(message);
-        }
-        else {
-            if (FJob.GetHandle() != NULL) {
-                if (::AssignProcessToJobObject(FJob.GetHandle(),
-                         FProcessInfo.hProcess) == 0) {
-                    // Failed to assign process to job. It doesn't prevent
-                    // anything from continuing so continue.
-                }
-            }
-
-            // Wait until child process exits.
-            if (AWait == true) {
-                Wait();
-                // Close process and thread handles.
-                Cleanup();
-            }
-        }
-    }
-
-    return result;
-}
-
-bool WindowsProcess::Wait() {
-    bool result = false;
-
-    WaitForSingleObject(FProcessInfo.hProcess, INFINITE);
-    return result;
-}
-
-TProcessID WindowsProcess::GetProcessID() {
-    return FProcessInfo.dwProcessId;
-}
-
-bool WindowsProcess::ReadOutput() {
-    bool result = false;
-    // TODO implement
-    return result;
-}
-
-void WindowsProcess::SetInput(TString Value) {
-    // TODO implement
-}
-
-std::list<TString> WindowsProcess::GetOutput() {
-    ReadOutput();
-    return Process::GetOutput();
-}
-
-#endif // WINDOWS
--- a/src/jdk.jpackage/share/native/libapplauncher/WindowsPlatform.h	Sun Feb 17 09:54:08 2019 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-#include "Platform.h"
-
-#ifdef WINDOWS
-
-#ifndef WINDOWSPLATFORM_H
-#define WINDOWSPLATFORM_H
-
-#include "GenericPlatform.h"
-
-#include <Windows.h>
-
-#pragma warning( push )
-// C4250 - 'class1' : inherits 'class2::member'
-#pragma warning( disable : 4250 )
-class WindowsPlatform : virtual public Platform, GenericPlatform {
-private:
-    DWORD FMainThread;
-
-public:
-    WindowsPlatform(void);
-    virtual ~WindowsPlatform(void);
-
-    virtual TCHAR* ConvertStringToFileSystemString(TCHAR* Source,
-            bool &release);
-    virtual TCHAR* ConvertFileSystemStringToString(TCHAR* Source,
-            bool &release);
-
-    virtual void ShowMessage(TString title, TString description);
-    virtual void ShowMessage(TString description);
-    virtual MessageResponse ShowResponseMessage(TString title,
-            TString description);
-    //virtual MessageResponse ShowResponseMessage(TString description);
-
-    virtual void SetCurrentDirectory(TString Value);
-    virtual TString GetPackageRootDirectory();
-    virtual TString GetAppDataDirectory();
-    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
-
-    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
-
-    virtual TString GetModuleFileName();
-    virtual Module LoadLibrary(TString FileName);
-    virtual void FreeLibrary(Module AModule);
-    virtual Procedure GetProcAddress(Module AModule, std::string MethodName);
-    virtual std::vector<TString> GetLibraryImports(const TString FileName);
-    virtual std::vector<TString> FilterOutRuntimeDependenciesForPlatform(
-            std::vector<TString> Imports);
-
-    virtual Process* CreateProcess();
-
-    virtual bool IsMainThread();
-    virtual TPlatformNumber GetMemorySize();
-
-    virtual TString GetTempDirectory();
-
-#ifdef DEBUG
-    virtual bool IsNativeDebuggerPresent();
-    virtual int GetProcessID();
-#endif //DEBUG
-};
-#pragma warning( pop ) // C4250
-
-
-class FileHandle {
-private:
-    HANDLE FHandle;
-
-public:
-    FileHandle(std::wstring FileName);
-    ~FileHandle();
-
-    bool IsValid();
-    HANDLE GetHandle();
-};
-
-
-class FileMappingHandle {
-private:
-    HANDLE FHandle;
-
-public:
-    FileMappingHandle(HANDLE FileHandle);
-    ~FileMappingHandle();
-
-    bool IsValid();
-    HANDLE GetHandle();
-};
-
-
-class FileData {
-private:
-    LPVOID FBaseAddress;
-
-public:
-    FileData(HANDLE Handle);
-    ~FileData();
-
-    bool IsValid();
-    LPVOID GetBaseAddress();
-};
-
-
-class WindowsLibrary {
-private:
-    TString FFileName;
-
-    // Given an RVA, look up the section header that encloses it and return a
-    // pointer to its IMAGE_SECTION_HEADER
-    static PIMAGE_SECTION_HEADER GetEnclosingSectionHeader(DWORD rva,
-            PIMAGE_NT_HEADERS pNTHeader);
-    static LPVOID GetPtrFromRVA(DWORD rva, PIMAGE_NT_HEADERS pNTHeader,
-            DWORD imageBase);
-    static std::vector<TString> GetImportsSection(DWORD base,
-            PIMAGE_NT_HEADERS pNTHeader);
-    static std::vector<TString> DumpPEFile(PIMAGE_DOS_HEADER dosHeader);
-
-public:
-    WindowsLibrary(const TString FileName);
-
-    std::vector<TString> GetImports();
-};
-
-
-class WindowsJob {
-private:
-    HANDLE FHandle;
-
-public:
-    WindowsJob();
-    ~WindowsJob();
-
-    HANDLE GetHandle();
-};
-
-
-class WindowsProcess : public Process {
-private:
-    bool FRunning;
-
-    PROCESS_INFORMATION FProcessInfo;
-    static WindowsJob FJob;
-
-    void Cleanup();
-    bool ReadOutput();
-
-public:
-    WindowsProcess();
-    virtual ~WindowsProcess();
-
-    virtual bool IsRunning();
-    virtual bool Terminate();
-    virtual bool Execute(const TString Application,
-            const std::vector<TString> Arguments, bool AWait = false);
-    virtual bool Wait();
-    virtual TProcessID GetProcessID();
-    virtual void SetInput(TString Value);
-    virtual std::list<TString> GetOutput();
-};
-
-
-
-
-#endif // WINDOWSPLATFORM_H
-
-#endif // WINDOWS
--- a/src/jdk.jpackage/share/native/libapplauncher/main.cpp	Sun Feb 17 09:54:08 2019 -0500
+++ b/src/jdk.jpackage/share/native/libapplauncher/main.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -29,16 +29,9 @@
 #include "PropertyFile.h"
 #include "JavaVirtualMachine.h"
 #include "Package.h"
-#include "PlatformThread.h"
 #include "Macros.h"
 #include "Messages.h"
 
-
-#ifdef WINDOWS
-#include <Shellapi.h>
-#endif
-
-
 #include <stdio.h>
 #include <signal.h>
 #include <stdlib.h>
@@ -68,13 +61,6 @@
 
 extern "C" {
 
-#ifdef WINDOWS
-    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
-            LPVOID lpvReserved) {
-        return true;
-    }
-#endif //WINDOWS
-
     JNIEXPORT bool start_launcher(int argc, TCHAR* argv[]) {
         bool result = false;
         bool parentProcess = true;
@@ -183,7 +169,7 @@
                                 messages.GetMessage(
                                 APPCDS_CACHE_FILE_NOT_FOUND),
                                 cacheFileName.data());
-                        throw FileNotFoundException(message);
+                        throw Exception(message);
                     }
                     break;
                 }
@@ -196,7 +182,7 @@
 
             // Run App
             result = RunVM();
-        } catch (FileNotFoundException &e) {
+        } catch (Exception &e) {
             platform.ShowMessage(e.GetMessage());
         }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/unix/native/libapplauncher/FileAttribute.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef FILEATTRIBUTE_H
+#define FILEATTRIBUTE_H
+
+enum FileAttribute {
+    faBlockSpecial,
+    faCharacterSpecial,
+    faFIFOSpecial,
+    faNormal,
+    faDirectory,
+    faSymbolicLink,
+    faSocket,
+
+    // Owner
+    faReadOnly,
+    faWriteOnly,
+    faReadWrite,
+    faExecute,
+
+    // Group
+    faGroupReadOnly,
+    faGroupWriteOnly,
+    faGroupReadWrite,
+    faGroupExecute,
+
+    // Others
+    faOthersReadOnly,
+    faOthersWriteOnly,
+    faOthersReadWrite,
+    faOthersExecute,
+
+    faHidden
+};
+
+#endif // FILEATTRIBUTE_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/unix/native/libapplauncher/FileAttributes.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,331 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "FileAttributes.h"
+
+#include <algorithm>
+#include <list>
+#include <sys/stat.h>
+
+FileAttributes::FileAttributes(const TString FileName, bool FollowLink) {
+    FFileName = FileName;
+    FFollowLink = FollowLink;
+    ReadAttributes();
+}
+
+bool FileAttributes::WriteAttributes() {
+    bool result = false;
+
+    mode_t attributes = 0;
+
+    for (std::vector<FileAttribute>::const_iterator iterator =
+            FAttributes.begin();
+            iterator != FAttributes.end(); iterator++) {
+        switch (*iterator) {
+            case faBlockSpecial:
+            {
+                attributes |= S_IFBLK;
+                break;
+            }
+            case faCharacterSpecial:
+            {
+                attributes |= S_IFCHR;
+                break;
+            }
+            case faFIFOSpecial:
+            {
+                attributes |= S_IFIFO;
+                break;
+            }
+            case faNormal:
+            {
+                attributes |= S_IFREG;
+                break;
+            }
+            case faDirectory:
+            {
+                attributes |= S_IFDIR;
+                break;
+            }
+            case faSymbolicLink:
+            {
+                attributes |= S_IFLNK;
+                break;
+            }
+            case faSocket:
+            {
+                attributes |= S_IFSOCK;
+                break;
+            }
+
+                // Owner
+            case faReadOnly:
+            {
+                attributes |= S_IRUSR;
+                break;
+            }
+            case faWriteOnly:
+            {
+                attributes |= S_IWUSR;
+                break;
+            }
+            case faReadWrite:
+            {
+                attributes |= S_IRUSR;
+                attributes |= S_IWUSR;
+                break;
+            }
+            case faExecute:
+            {
+                attributes |= S_IXUSR;
+                break;
+            }
+
+                // Group
+            case faGroupReadOnly:
+            {
+                attributes |= S_IRGRP;
+                break;
+            }
+            case faGroupWriteOnly:
+            {
+                attributes |= S_IWGRP;
+                break;
+            }
+            case faGroupReadWrite:
+            {
+                attributes |= S_IRGRP;
+                attributes |= S_IWGRP;
+                break;
+            }
+            case faGroupExecute:
+            {
+                attributes |= S_IXGRP;
+                break;
+            }
+
+                // Others
+            case faOthersReadOnly:
+            {
+                attributes |= S_IROTH;
+                break;
+            }
+            case faOthersWriteOnly:
+            {
+                attributes |= S_IWOTH;
+                break;
+            }
+            case faOthersReadWrite:
+            {
+                attributes |= S_IROTH;
+                attributes |= S_IWOTH;
+                break;
+            }
+            case faOthersExecute:
+            {
+                attributes |= S_IXOTH;
+                break;
+            }
+            default:
+                break;
+        }
+    }
+
+    if (chmod(FFileName.data(), attributes) == 0) {
+        result = true;
+    }
+
+    return result;
+}
+
+#define S_ISRUSR(m)    (((m) & S_IRWXU) == S_IRUSR)
+#define S_ISWUSR(m)    (((m) & S_IRWXU) == S_IWUSR)
+#define S_ISXUSR(m)    (((m) & S_IRWXU) == S_IXUSR)
+
+#define S_ISRGRP(m)    (((m) & S_IRWXG) == S_IRGRP)
+#define S_ISWGRP(m)    (((m) & S_IRWXG) == S_IWGRP)
+#define S_ISXGRP(m)    (((m) & S_IRWXG) == S_IXGRP)
+
+#define S_ISROTH(m)    (((m) & S_IRWXO) == S_IROTH)
+#define S_ISWOTH(m)    (((m) & S_IRWXO) == S_IWOTH)
+#define S_ISXOTH(m)    (((m) & S_IRWXO) == S_IXOTH)
+
+bool FileAttributes::ReadAttributes() {
+    bool result = false;
+
+    struct stat status;
+
+    if (stat(StringToFileSystemString(FFileName), &status) == 0) {
+        result = true;
+
+        if (S_ISBLK(status.st_mode) != 0) {
+            FAttributes.push_back(faBlockSpecial);
+        }
+        if (S_ISCHR(status.st_mode) != 0) {
+            FAttributes.push_back(faCharacterSpecial);
+        }
+        if (S_ISFIFO(status.st_mode) != 0) {
+            FAttributes.push_back(faFIFOSpecial);
+        }
+        if (S_ISREG(status.st_mode) != 0) {
+            FAttributes.push_back(faNormal);
+        }
+        if (S_ISDIR(status.st_mode) != 0) {
+            FAttributes.push_back(faDirectory);
+        }
+        if (S_ISLNK(status.st_mode) != 0) {
+            FAttributes.push_back(faSymbolicLink);
+        }
+        if (S_ISSOCK(status.st_mode) != 0) {
+            FAttributes.push_back(faSocket);
+        }
+
+        // Owner
+        if (S_ISRUSR(status.st_mode) != 0) {
+            if (S_ISWUSR(status.st_mode) != 0) {
+                FAttributes.push_back(faReadWrite);
+            } else {
+                FAttributes.push_back(faReadOnly);
+            }
+        } else if (S_ISWUSR(status.st_mode) != 0) {
+            FAttributes.push_back(faWriteOnly);
+        }
+
+        if (S_ISXUSR(status.st_mode) != 0) {
+            FAttributes.push_back(faExecute);
+        }
+
+        // Group
+        if (S_ISRGRP(status.st_mode) != 0) {
+            if (S_ISWGRP(status.st_mode) != 0) {
+                FAttributes.push_back(faGroupReadWrite);
+            } else {
+                FAttributes.push_back(faGroupReadOnly);
+            }
+        } else if (S_ISWGRP(status.st_mode) != 0) {
+            FAttributes.push_back(faGroupWriteOnly);
+        }
+
+        if (S_ISXGRP(status.st_mode) != 0) {
+            FAttributes.push_back(faGroupExecute);
+        }
+
+
+        // Others
+        if (S_ISROTH(status.st_mode) != 0) {
+            if (S_ISWOTH(status.st_mode) != 0) {
+                FAttributes.push_back(faOthersReadWrite);
+            } else {
+                FAttributes.push_back(faOthersReadOnly);
+            }
+        } else if (S_ISWOTH(status.st_mode) != 0) {
+            FAttributes.push_back(faOthersWriteOnly);
+        }
+
+        if (S_ISXOTH(status.st_mode) != 0) {
+            FAttributes.push_back(faOthersExecute);
+        }
+
+        if (FFileName.size() > 0 && FFileName[0] == '.') {
+            FAttributes.push_back(faHidden);
+        }
+    }
+
+    return result;
+}
+
+bool FileAttributes::Valid(const FileAttribute Value) {
+    bool result = false;
+
+    switch (Value) {
+        case faReadWrite:
+        case faWriteOnly:
+        case faExecute:
+
+        case faGroupReadWrite:
+        case faGroupWriteOnly:
+        case faGroupReadOnly:
+        case faGroupExecute:
+
+        case faOthersReadWrite:
+        case faOthersWriteOnly:
+        case faOthersReadOnly:
+        case faOthersExecute:
+
+        case faReadOnly:
+            result = true;
+            break;
+
+        default:
+            break;
+    }
+
+    return result;
+}
+
+void FileAttributes::Append(FileAttribute Value) {
+    if (Valid(Value) == true) {
+        if ((Value == faReadOnly && Contains(faWriteOnly) == true) ||
+                (Value == faWriteOnly && Contains(faReadOnly) == true)) {
+            Value = faReadWrite;
+        }
+
+        FAttributes.push_back(Value);
+        WriteAttributes();
+    }
+}
+
+bool FileAttributes::Contains(FileAttribute Value) {
+    bool result = false;
+
+    std::vector<FileAttribute>::const_iterator iterator =
+            std::find(FAttributes.begin(), FAttributes.end(), Value);
+
+    if (iterator != FAttributes.end()) {
+        result = true;
+    }
+
+    return result;
+}
+
+void FileAttributes::Remove(FileAttribute Value) {
+    if (Valid(Value) == true) {
+        if (Value == faReadOnly && Contains(faReadWrite) == true) {
+            Append(faWriteOnly);
+            Remove(faReadWrite);
+        } else if (Value == faWriteOnly && Contains(faReadWrite) == true) {
+            Append(faReadOnly);
+            Remove(faReadWrite);
+        }
+
+        std::vector<FileAttribute>::iterator iterator =
+                std::find(FAttributes.begin(), FAttributes.end(), Value);
+
+        if (iterator != FAttributes.end()) {
+            FAttributes.erase(iterator);
+            WriteAttributes();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/unix/native/libapplauncher/FilePath.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "PlatformDefs.h"
+#include "FilePath.h"
+
+#include <algorithm>
+#include <list>
+#include <sys/stat.h>
+
+bool FilePath::FileExists(const TString FileName) {
+    bool result = false;
+    struct stat buf;
+
+    if ((stat(StringToFileSystemString(FileName), &buf) == 0) &&
+            (S_ISREG(buf.st_mode) != 0)) {
+        result = true;
+    }
+
+    return result;
+}
+
+bool FilePath::DirectoryExists(const TString DirectoryName) {
+    bool result = false;
+
+    struct stat buf;
+
+    if ((stat(StringToFileSystemString(DirectoryName), &buf) == 0) &&
+            (S_ISDIR(buf.st_mode) != 0)) {
+        result = true;
+    }
+
+    return result;
+}
+
+bool FilePath::DeleteFile(const TString FileName) {
+    bool result = false;
+
+    if (FileExists(FileName) == true) {
+        if (unlink(StringToFileSystemString(FileName)) == 0) {
+            result = true;
+        }
+    }
+
+    return result;
+}
+
+bool FilePath::DeleteDirectory(const TString DirectoryName) {
+    bool result = false;
+
+    if (DirectoryExists(DirectoryName) == true) {
+        if (unlink(StringToFileSystemString(DirectoryName)) == 0) {
+            result = true;
+        }
+    }
+
+    return result;
+}
+
+TString FilePath::IncludeTrailingSeparator(const TString value) {
+    TString result = value;
+
+    if (value.size() > 0) {
+        TString::iterator i = result.end();
+        i--;
+
+        if (*i != TRAILING_PATHSEPARATOR) {
+            result += TRAILING_PATHSEPARATOR;
+        }
+    }
+
+    return result;
+}
+
+TString FilePath::IncludeTrailingSeparator(const char* value) {
+    TString lvalue = PlatformString(value).toString();
+    return IncludeTrailingSeparator(lvalue);
+}
+
+TString FilePath::IncludeTrailingSeparator(const wchar_t* value) {
+    TString lvalue = PlatformString(value).toString();
+    return IncludeTrailingSeparator(lvalue);
+}
+
+TString FilePath::ExtractFilePath(TString Path) {
+    return dirname(StringToFileSystemString(Path));
+}
+
+TString FilePath::ExtractFileExt(TString Path) {
+    TString result;
+    size_t dot = Path.find_last_of('.');
+
+    if (dot != TString::npos) {
+        result = Path.substr(dot, Path.size() - dot);
+    }
+
+    return result;
+}
+
+TString FilePath::ExtractFileName(TString Path) {
+    return basename(StringToFileSystemString(Path));
+}
+
+TString FilePath::ChangeFileExt(TString Path, TString Extension) {
+    TString result;
+    size_t dot = Path.find_last_of('.');
+
+    if (dot != TString::npos) {
+        result = Path.substr(0, dot) + Extension;
+    }
+
+    if (result.empty() == true) {
+        result = Path;
+    }
+
+    return result;
+}
+
+TString FilePath::FixPathForPlatform(TString Path) {
+    TString result = Path;
+    std::replace(result.begin(), result.end(),
+            BAD_TRAILING_PATHSEPARATOR, TRAILING_PATHSEPARATOR);
+    return result;
+}
+
+TString FilePath::FixPathSeparatorForPlatform(TString Path) {
+    TString result = Path;
+    std::replace(result.begin(), result.end(),
+            BAD_PATH_SEPARATOR, PATH_SEPARATOR);
+    return result;
+}
+
+TString FilePath::PathSeparator() {
+    TString result;
+    result = PATH_SEPARATOR;
+    return result;
+}
+
+bool FilePath::CreateDirectory(TString Path, bool ownerOnly) {
+    bool result = false;
+
+    std::list<TString> paths;
+    TString lpath = Path;
+
+    while (lpath.empty() == false && DirectoryExists(lpath) == false) {
+        paths.push_front(lpath);
+        lpath = ExtractFilePath(lpath);
+    }
+
+    for (std::list<TString>::iterator iterator = paths.begin();
+            iterator != paths.end(); iterator++) {
+        lpath = *iterator;
+
+        mode_t mode = S_IRWXU;
+        if (!ownerOnly) {
+            mode |= S_IRWXG | S_IROTH | S_IXOTH;
+        }
+        if (mkdir(StringToFileSystemString(lpath), mode) == 0) {
+            result = true;
+        } else {
+            result = false;
+            break;
+        }
+    }
+
+    return result;
+}
+
+void FilePath::ChangePermissions(TString FileName, bool ownerOnly) {
+    mode_t mode = S_IRWXU;
+    if (!ownerOnly) {
+        mode |= S_IRWXG | S_IROTH | S_IXOTH;
+    }
+    chmod(FileName.data(), mode);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/unix/native/libapplauncher/PosixPlatform.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "PosixPlatform.h"
+
+#include "PlatformString.h"
+#include "FilePath.h"
+#include "Helpers.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include <limits.h>
+#include <pwd.h>
+#include <iostream>
+#include <algorithm>
+#include <dlfcn.h>
+#include <signal.h>
+
+using namespace std;
+
+PosixPlatform::PosixPlatform(void) {
+}
+
+PosixPlatform::~PosixPlatform(void) {
+}
+
+TString PosixPlatform::GetTempDirectory() {
+    struct passwd* pw = getpwuid(getuid());
+    TString homedir(pw->pw_dir);
+    homedir += getTmpDirString();
+    if (!FilePath::DirectoryExists(homedir)) {
+        if (!FilePath::CreateDirectory(homedir, false)) {
+            homedir.clear();
+        }
+    }
+
+    return homedir;
+}
+
+TString PosixPlatform::fixName(const TString& name) {
+    TString fixedName(name);
+    const TString chars("?:*<>/\\");
+    for (TString::const_iterator it = chars.begin(); it != chars.end(); it++) {
+        fixedName.erase(std::remove(fixedName.begin(),
+                fixedName.end(), *it), fixedName.end());
+    }
+    return fixedName;
+}
+
+MessageResponse PosixPlatform::ShowResponseMessage(TString title,
+        TString description) {
+    MessageResponse result = mrCancel;
+
+    printf("%s %s (Y/N)\n", PlatformString(title).toPlatformString(),
+            PlatformString(description).toPlatformString());
+    fflush(stdout);
+
+    std::string input;
+    std::cin >> input;
+
+    if (input == "Y") {
+        result = mrOK;
+    }
+
+    return result;
+}
+
+void PosixPlatform::SetCurrentDirectory(TString Value) {
+    chdir(StringToFileSystemString(Value));
+}
+
+Module PosixPlatform::LoadLibrary(TString FileName) {
+    return dlopen(StringToFileSystemString(FileName), RTLD_LAZY);
+}
+
+void PosixPlatform::FreeLibrary(Module AModule) {
+    dlclose(AModule);
+}
+
+Procedure PosixPlatform::GetProcAddress(Module AModule,
+        std::string MethodName) {
+    return dlsym(AModule, PlatformString(MethodName));
+}
+
+Process* PosixPlatform::CreateProcess() {
+    return new PosixProcess();
+}
+
+void PosixPlatform::addPlatformDependencies(JavaLibrary *pJavaLibrary) {
+}
+
+void Platform::CopyString(char *Destination,
+        size_t NumberOfElements, const char *Source) {
+    strncpy(Destination, Source, NumberOfElements);
+
+    if (NumberOfElements > 0) {
+        Destination[NumberOfElements - 1] = '\0';
+    }
+}
+
+void Platform::CopyString(wchar_t *Destination,
+        size_t NumberOfElements, const wchar_t *Source) {
+    wcsncpy(Destination, Source, NumberOfElements);
+
+    if (NumberOfElements > 0) {
+        Destination[NumberOfElements - 1] = '\0';
+    }
+}
+
+// Owner must free the return value.
+
+MultibyteString Platform::WideStringToMultibyteString(
+        const wchar_t* value) {
+    MultibyteString result;
+    size_t count = 0;
+
+    if (value == NULL) {
+        return result;
+    }
+
+    count = wcstombs(NULL, value, 0);
+    if (count > 0) {
+        result.data = new char[count + 1];
+        result.data[count] = '\0';
+        result.length = count;
+        wcstombs(result.data, value, count);
+    }
+
+    return result;
+}
+
+// Owner must free the return value.
+
+WideString Platform::MultibyteStringToWideString(const char* value) {
+    WideString result;
+    size_t count = 0;
+
+    if (value == NULL) {
+        return result;
+    }
+
+    count = mbstowcs(NULL, value, 0);
+    if (count > 0) {
+        result.data = new wchar_t[count + 1];
+        result.data[count] = '\0';
+        result.length = count;
+        mbstowcs(result.data, value, count);
+    }
+
+    return result;
+}
+
+void PosixPlatform::InitStreamLocale(wios *stream) {
+    // Nothing to do for POSIX platforms.
+}
+
+PosixProcess::PosixProcess() : Process() {
+    FChildPID = 0;
+    FRunning = false;
+    FOutputHandle = 0;
+    FInputHandle = 0;
+}
+
+PosixProcess::~PosixProcess() {
+    Terminate();
+}
+
+bool PosixProcess::ReadOutput() {
+    bool result = false;
+
+    if (FOutputHandle != 0 && IsRunning() == true) {
+        char buffer[4096] = {0};
+
+        ssize_t count = read(FOutputHandle, buffer, sizeof (buffer));
+
+        if (count == -1) {
+            if (errno == EINTR) {
+                // continue;
+            } else {
+                perror("read");
+                exit(1);
+            }
+        } else if (count == 0) {
+            // break;
+        } else {
+            if (buffer[count - 1] == EOF) {
+                buffer[count - 1] = '\0';
+            }
+
+            std::list<TString> output = Helpers::StringToArray(buffer);
+            FOutput.splice(FOutput.end(), output, output.begin(), output.end());
+            result = true;
+        }
+    }
+
+    return false;
+}
+
+bool PosixProcess::IsRunning() {
+    bool result = false;
+
+    if (kill(FChildPID, 0) == 0) {
+        result = true;
+    }
+
+    return result;
+}
+
+bool PosixProcess::Terminate() {
+    bool result = false;
+
+    if (IsRunning() == true && FRunning == true) {
+        FRunning = false;
+        Cleanup();
+        int status = kill(FChildPID, SIGTERM);
+
+        if (status == 0) {
+            result = true;
+        } else {
+#ifdef DEBUG
+            if (errno == EINVAL) {
+                printf("Kill error: The value of the sig argument is an invalid or unsupported signal number.");
+            } else if (errno == EPERM) {
+                printf("Kill error: The process does not have permission to send the signal to any receiving process.");
+            } else if (errno == ESRCH) {
+                printf("Kill error: No process or process group can be found corresponding to that specified by pid.");
+            }
+#endif // DEBUG
+            if (IsRunning() == true) {
+                status = kill(FChildPID, SIGKILL);
+
+                if (status == 0) {
+                    result = true;
+                }
+            }
+        }
+    }
+
+    return result;
+}
+
+bool PosixProcess::Wait() {
+    bool result = false;
+
+    int status = 0;
+    pid_t wpid = 0;
+
+    wpid = wait(&status);
+    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+        if (errno != EINTR) {
+            status = -1;
+        }
+    }
+
+#ifdef DEBUG
+    if (WIFEXITED(status)) {
+        printf("child exited, status=%d\n", WEXITSTATUS(status));
+    } else if (WIFSIGNALED(status)) {
+        printf("child killed (signal %d)\n", WTERMSIG(status));
+    } else if (WIFSTOPPED(status)) {
+        printf("child stopped (signal %d)\n", WSTOPSIG(status));
+#ifdef WIFCONTINUED // Not all implementations support this
+    } else if (WIFCONTINUED(status)) {
+        printf("child continued\n");
+#endif // WIFCONTINUED
+    } else { // Non-standard case -- may never happen
+        printf("Unexpected status (0x%x)\n", status);
+    }
+#endif // DEBUG
+
+    if (wpid != -1) {
+        result = true;
+    }
+
+    return result;
+}
+
+TProcessID PosixProcess::GetProcessID() {
+    return FChildPID;
+}
+
+void PosixProcess::SetInput(TString Value) {
+    if (FInputHandle != 0) {
+        write(FInputHandle, Value.data(), Value.size());
+    }
+}
+
+std::list<TString> PosixProcess::GetOutput() {
+    ReadOutput();
+    return Process::GetOutput();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/unix/native/libapplauncher/PosixPlatform.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef POSIXPLATFORM_H
+#define POSIXPLATFORM_H
+
+#include "Platform.h"
+#include <signal.h>
+
+class PosixPlatform : virtual public Platform {
+protected:
+
+    TString fixName(const TString& name);
+
+    virtual TString getTmpDirString() = 0;
+
+public:
+    PosixPlatform(void);
+    virtual ~PosixPlatform(void);
+
+public:
+    virtual MessageResponse ShowResponseMessage(TString title,
+            TString description);
+
+    virtual void SetCurrentDirectory(TString Value);
+
+    virtual Module LoadLibrary(TString FileName);
+    virtual void FreeLibrary(Module AModule);
+    virtual Procedure GetProcAddress(Module AModule, std::string MethodName);
+
+    virtual Process* CreateProcess();
+    virtual TString GetTempDirectory();
+    void InitStreamLocale(wios *stream);
+    void addPlatformDependencies(JavaLibrary *pJavaLibrary);
+};
+
+class PosixProcess : public Process {
+private:
+    pid_t FChildPID;
+    sigset_t saveblock;
+    int FOutputHandle;
+    int FInputHandle;
+    struct sigaction savintr, savequit;
+    bool FRunning;
+
+    void Cleanup();
+    bool ReadOutput();
+
+public:
+    PosixProcess();
+    virtual ~PosixProcess();
+
+    virtual bool IsRunning();
+    virtual bool Terminate();
+    virtual bool Execute(const TString Application,
+            const std::vector<TString> Arguments, bool AWait = false);
+    virtual bool Wait();
+    virtual TProcessID GetProcessID();
+    virtual void SetInput(TString Value);
+    virtual std::list<TString> GetOutput();
+};
+
+#endif // POSIXPLATFORM_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/DllMain.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <windows.h>
+
+extern "C" {
+
+    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
+            LPVOID lpvReserved) {
+        return true;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/FileAttribute.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef FILEATTRIBUTE_H
+#define FILEATTRIBUTE_H
+
+enum FileAttribute {
+    faArchive = FILE_ATTRIBUTE_ARCHIVE,
+    faCompressed = FILE_ATTRIBUTE_COMPRESSED,
+    faDevice = FILE_ATTRIBUTE_DEVICE,
+    faDirectory = FILE_ATTRIBUTE_DIRECTORY,
+    faEncrypted = FILE_ATTRIBUTE_ENCRYPTED,
+    faHidden = FILE_ATTRIBUTE_HIDDEN,
+    //faIntegrityStream = FILE_ATTRIBUTE_INTEGRITY_STREAM,
+    faNormal = FILE_ATTRIBUTE_NORMAL,
+    faNotContentIndexed = FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
+    //faNoScrubData = FILE_ATTRIBUTE_NO_SCRUB_DATA,
+    faOffline = FILE_ATTRIBUTE_OFFLINE,
+    faSystem = FILE_ATTRIBUTE_SYSTEM,
+    faSymbolicLink = FILE_ATTRIBUTE_REPARSE_POINT,
+    faSparceFile = FILE_ATTRIBUTE_SPARSE_FILE,
+    faReadOnly = FILE_ATTRIBUTE_READONLY,
+    faTemporary = FILE_ATTRIBUTE_TEMPORARY,
+    faVirtual = FILE_ATTRIBUTE_VIRTUAL
+};
+
+#endif // FILEATTRIBUTE_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/FilePath.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,473 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "FilePath.h"
+
+#include <algorithm>
+#include <list>
+#include <ShellAPI.h>
+
+bool FilePath::FileExists(const TString FileName) {
+    bool result = false;
+    WIN32_FIND_DATA FindFileData;
+    TString fileName = FixPathForPlatform(FileName);
+    HANDLE handle = FindFirstFile(fileName.data(), &FindFileData);
+
+    if (handle != INVALID_HANDLE_VALUE) {
+        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
+            result = true;
+        }
+        else {
+            result = true;
+        }
+
+        FindClose(handle);
+    }
+    return result;
+}
+
+bool FilePath::DirectoryExists(const TString DirectoryName) {
+    bool result = false;
+    WIN32_FIND_DATA FindFileData;
+    TString directoryName = FixPathForPlatform(DirectoryName);
+    HANDLE handle = FindFirstFile(directoryName.data(), &FindFileData);
+
+    if (handle != INVALID_HANDLE_VALUE) {
+        if (FILE_ATTRIBUTE_DIRECTORY & FindFileData.dwFileAttributes) {
+            result = true;
+        }
+
+        FindClose(handle);
+    }
+    return result;
+}
+
+std::string GetLastErrorAsString() {
+    // Get the error message, if any.
+    DWORD errorMessageID = ::GetLastError();
+
+    if (errorMessageID == 0) {
+        return "No error message has been recorded";
+    }
+
+    LPSTR messageBuffer = NULL;
+    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
+            | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+            NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL,
+            SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
+
+    std::string message(messageBuffer, size);
+
+    // Free the buffer.
+    LocalFree(messageBuffer);
+
+    return message;
+}
+
+bool FilePath::DeleteFile(const TString FileName) {
+    bool result = false;
+
+    if (FileExists(FileName) == true) {
+        TString lFileName = FixPathForPlatform(FileName);
+        FileAttributes attributes(lFileName);
+
+        if (attributes.Contains(faReadOnly) == true) {
+            attributes.Remove(faReadOnly);
+        }
+
+        result = ::DeleteFile(lFileName.data()) == TRUE;
+    }
+
+    return result;
+}
+
+bool FilePath::DeleteDirectory(const TString DirectoryName) {
+    bool result = false;
+
+    if (DirectoryExists(DirectoryName) == true) {
+        SHFILEOPSTRUCTW fos = {0};
+        TString directoryName = FixPathForPlatform(DirectoryName);
+        DynamicBuffer<TCHAR> lDirectoryName(directoryName.size() + 2);
+        if (lDirectoryName.GetData() == NULL) {
+            return false;
+        }
+        memcpy(lDirectoryName.GetData(), directoryName.data(), (directoryName.size() + 2) * sizeof(TCHAR));
+        lDirectoryName[directoryName.size() + 1] = NULL;
+        // Double null terminate for SHFileOperation.
+
+        // Delete the folder and everything inside.
+        fos.wFunc = FO_DELETE;
+        fos.pFrom = lDirectoryName.GetData();
+        fos.fFlags = FOF_NO_UI;
+        result = SHFileOperation(&fos) == 0;
+    }
+
+    return result;
+}
+
+TString FilePath::IncludeTrailingSeparator(const TString value) {
+    TString result = value;
+
+    if (value.size() > 0) {
+        TString::iterator i = result.end();
+        i--;
+
+        if (*i != TRAILING_PATHSEPARATOR) {
+            result += TRAILING_PATHSEPARATOR;
+        }
+    }
+
+    return result;
+}
+
+TString FilePath::IncludeTrailingSeparator(const char* value) {
+    TString lvalue = PlatformString(value).toString();
+    return IncludeTrailingSeparator(lvalue);
+}
+
+TString FilePath::IncludeTrailingSeparator(const wchar_t* value) {
+    TString lvalue = PlatformString(value).toString();
+    return IncludeTrailingSeparator(lvalue);
+}
+
+TString FilePath::ExtractFilePath(TString Path) {
+    TString result;
+    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
+    if (slash != TString::npos)
+        result = Path.substr(0, slash);
+    return result;
+}
+
+TString FilePath::ExtractFileExt(TString Path) {
+    TString result;
+    size_t dot = Path.find_last_of('.');
+
+    if (dot != TString::npos) {
+        result  = Path.substr(dot, Path.size() - dot);
+    }
+
+    return result;
+}
+
+TString FilePath::ExtractFileName(TString Path) {
+    TString result;
+
+    size_t slash = Path.find_last_of(TRAILING_PATHSEPARATOR);
+    if (slash != TString::npos)
+        result = Path.substr(slash + 1, Path.size() - slash - 1);
+
+    return result;
+}
+
+TString FilePath::ChangeFileExt(TString Path, TString Extension) {
+    TString result;
+    size_t dot = Path.find_last_of('.');
+
+    if (dot != TString::npos) {
+        result = Path.substr(0, dot) + Extension;
+    }
+
+    if (result.empty() == true) {
+        result = Path;
+    }
+
+    return result;
+}
+
+TString FilePath::FixPathForPlatform(TString Path) {
+    TString result = Path;
+    std::replace(result.begin(), result.end(),
+            BAD_TRAILING_PATHSEPARATOR, TRAILING_PATHSEPARATOR);
+    // The maximum path that does not require long path prefix. On Windows the
+    // maximum path is 260 minus 1 (NUL) but for directories it is 260 minus
+    // 12 minus 1 (to allow for the creation of a 8.3 file in the directory).
+    const int maxPath = 247;
+    if (result.length() > maxPath &&
+        result.find(_T("\\\\?\\")) == TString::npos &&
+        result.find(_T("\\\\?\\UNC")) == TString::npos) {
+        const TString prefix(_T("\\\\"));
+        if (!result.compare(0, prefix.size(), prefix)) {
+            // UNC path, converting to UNC path in long notation
+            result = _T("\\\\?\\UNC") + result.substr(1, result.length());
+        } else {
+            // converting to non-UNC path in long notation
+            result = _T("\\\\?\\") + result;
+        }
+    }
+    return result;
+}
+
+TString FilePath::FixPathSeparatorForPlatform(TString Path) {
+    TString result = Path;
+    std::replace(result.begin(), result.end(),
+            BAD_PATH_SEPARATOR, PATH_SEPARATOR);
+    return result;
+}
+
+TString FilePath::PathSeparator() {
+    TString result;
+    result = PATH_SEPARATOR;
+    return result;
+}
+
+bool FilePath::CreateDirectory(TString Path, bool ownerOnly) {
+    bool result = false;
+
+    std::list<TString> paths;
+    TString lpath = Path;
+
+    while (lpath.empty() == false && DirectoryExists(lpath) == false) {
+        paths.push_front(lpath);
+        lpath = ExtractFilePath(lpath);
+    }
+
+    for (std::list<TString>::iterator iterator = paths.begin();
+            iterator != paths.end(); iterator++) {
+        lpath = *iterator;
+
+        if (_wmkdir(lpath.data()) == 0) {
+            result = true;
+        } else {
+            result = false;
+            break;
+        }
+    }
+
+    return result;
+}
+
+void FilePath::ChangePermissions(TString FileName, bool ownerOnly) {
+}
+
+#include <algorithm>
+
+FileAttributes::FileAttributes(const TString FileName, bool FollowLink) {
+    FFileName = FileName;
+    FFollowLink = FollowLink;
+    ReadAttributes();
+}
+
+bool FileAttributes::WriteAttributes() {
+    bool result = false;
+
+    DWORD attributes = 0;
+
+    for (std::vector<FileAttribute>::const_iterator iterator =
+            FAttributes.begin();
+        iterator != FAttributes.end(); iterator++) {
+        switch (*iterator) {
+            case faArchive: {
+                attributes = attributes & FILE_ATTRIBUTE_ARCHIVE;
+                break;
+            }
+            case faCompressed: {
+                attributes = attributes & FILE_ATTRIBUTE_COMPRESSED;
+                break;
+            }
+            case faDevice: {
+                attributes = attributes & FILE_ATTRIBUTE_DEVICE;
+                break;
+            }
+            case faDirectory: {
+                attributes = attributes & FILE_ATTRIBUTE_DIRECTORY;
+                break;
+            }
+            case faEncrypted: {
+                attributes = attributes & FILE_ATTRIBUTE_ENCRYPTED;
+                break;
+            }
+            case faHidden: {
+                attributes = attributes & FILE_ATTRIBUTE_HIDDEN;
+                break;
+            }
+            case faNormal: {
+                attributes = attributes & FILE_ATTRIBUTE_NORMAL;
+                break;
+            }
+            case faNotContentIndexed: {
+                attributes = attributes & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
+                break;
+            }
+            case faOffline: {
+                attributes = attributes & FILE_ATTRIBUTE_OFFLINE;
+                break;
+            }
+            case faSystem: {
+                attributes = attributes & FILE_ATTRIBUTE_SYSTEM;
+                break;
+            }
+            case faSymbolicLink: {
+                attributes = attributes & FILE_ATTRIBUTE_REPARSE_POINT;
+                break;
+            }
+            case faSparceFile: {
+                attributes = attributes & FILE_ATTRIBUTE_SPARSE_FILE;
+                break;
+            }
+            case faReadOnly: {
+                attributes = attributes & FILE_ATTRIBUTE_READONLY;
+                break;
+            }
+            case faTemporary: {
+                attributes = attributes & FILE_ATTRIBUTE_TEMPORARY;
+                break;
+            }
+            case faVirtual: {
+                attributes = attributes & FILE_ATTRIBUTE_VIRTUAL;
+                break;
+            }
+        }
+    }
+
+    if (::SetFileAttributes(FFileName.data(), attributes) != 0) {
+        result = true;
+    }
+
+    return result;
+}
+
+#define S_ISRUSR(m)    (((m) & S_IRWXU) == S_IRUSR)
+#define S_ISWUSR(m)    (((m) & S_IRWXU) == S_IWUSR)
+#define S_ISXUSR(m)    (((m) & S_IRWXU) == S_IXUSR)
+
+#define S_ISRGRP(m)    (((m) & S_IRWXG) == S_IRGRP)
+#define S_ISWGRP(m)    (((m) & S_IRWXG) == S_IWGRP)
+#define S_ISXGRP(m)    (((m) & S_IRWXG) == S_IXGRP)
+
+#define S_ISROTH(m)    (((m) & S_IRWXO) == S_IROTH)
+#define S_ISWOTH(m)    (((m) & S_IRWXO) == S_IWOTH)
+#define S_ISXOTH(m)    (((m) & S_IRWXO) == S_IXOTH)
+
+bool FileAttributes::ReadAttributes() {
+    bool result = false;
+
+    DWORD attributes = ::GetFileAttributes(FFileName.data());
+
+    if (attributes != INVALID_FILE_ATTRIBUTES) {
+        result = true;
+
+        if (attributes | FILE_ATTRIBUTE_ARCHIVE) {
+            FAttributes.push_back(faArchive);
+        }
+        if (attributes | FILE_ATTRIBUTE_COMPRESSED) {
+            FAttributes.push_back(faCompressed);
+        }
+        if (attributes | FILE_ATTRIBUTE_DEVICE) {
+            FAttributes.push_back(faDevice);
+        }
+        if (attributes | FILE_ATTRIBUTE_DIRECTORY) {
+            FAttributes.push_back(faDirectory);
+        }
+        if (attributes | FILE_ATTRIBUTE_ENCRYPTED) {
+            FAttributes.push_back(faEncrypted);
+        }
+        if (attributes | FILE_ATTRIBUTE_HIDDEN) {
+            FAttributes.push_back(faHidden);
+        }
+        // if (attributes | FILE_ATTRIBUTE_INTEGRITY_STREAM) {
+        //     FAttributes.push_back(faIntegrityStream);
+        // }
+        if (attributes | FILE_ATTRIBUTE_NORMAL) {
+            FAttributes.push_back(faNormal);
+        }
+        if (attributes | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) {
+            FAttributes.push_back(faNotContentIndexed);
+        }
+        // if (attributes | FILE_ATTRIBUTE_NO_SCRUB_DATA) {
+        //     FAttributes.push_back(faNoScrubData);
+        // }
+        if (attributes | FILE_ATTRIBUTE_SYSTEM) {
+            FAttributes.push_back(faSystem);
+        }
+        if (attributes | FILE_ATTRIBUTE_OFFLINE) {
+            FAttributes.push_back(faOffline);
+        }
+        if (attributes | FILE_ATTRIBUTE_REPARSE_POINT) {
+            FAttributes.push_back(faSymbolicLink);
+        }
+        if (attributes | FILE_ATTRIBUTE_SPARSE_FILE) {
+            FAttributes.push_back(faSparceFile);
+        }
+        if (attributes | FILE_ATTRIBUTE_READONLY ) {
+            FAttributes.push_back(faReadOnly);
+        }
+        if (attributes | FILE_ATTRIBUTE_TEMPORARY) {
+            FAttributes.push_back(faTemporary);
+        }
+        if (attributes | FILE_ATTRIBUTE_VIRTUAL) {
+            FAttributes.push_back(faVirtual);
+        }
+    }
+
+    return result;
+}
+
+bool FileAttributes::Valid(const FileAttribute Value) {
+    bool result = false;
+
+    switch (Value) {
+        case faHidden:
+        case faReadOnly: {
+            result = true;
+            break;
+        }
+        default:
+            break;
+    }
+
+    return result;
+}
+
+void FileAttributes::Append(FileAttribute Value) {
+    if (Valid(Value) == true) {
+        FAttributes.push_back(Value);
+        WriteAttributes();
+    }
+}
+
+bool FileAttributes::Contains(FileAttribute Value) {
+    bool result = false;
+
+    std::vector<FileAttribute>::const_iterator iterator =
+            std::find(FAttributes.begin(), FAttributes.end(), Value);
+
+    if (iterator != FAttributes.end()) {
+        result = true;
+    }
+
+    return result;
+}
+
+void FileAttributes::Remove(FileAttribute Value) {
+    if (Valid(Value) == true) {
+        std::vector<FileAttribute>::iterator iterator =
+            std::find(FAttributes.begin(), FAttributes.end(), Value);
+
+        if (iterator != FAttributes.end()) {
+            FAttributes.erase(iterator);
+            WriteAttributes();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/PlatformDefs.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef PLATFORM_DEFS_H
+#define PLATFORM_DEFS_H
+
+// Define Windows compatibility requirements XP or later
+#define WINVER 0x0600
+#define _WIN32_WINNT 0x0600
+
+#include <Windows.h>
+#include <tchar.h>
+#include <shlobj.h>
+#include <direct.h>
+#include <process.h>
+#include <malloc.h>
+#include <string>
+
+using namespace std;
+
+#ifndef WINDOWS
+#define WINDOWS
+#endif
+
+typedef std::wstring TString;
+#define StringLength wcslen
+
+#define TRAILING_PATHSEPARATOR '\\'
+#define BAD_TRAILING_PATHSEPARATOR '/'
+#define PATH_SEPARATOR ';'
+#define BAD_PATH_SEPARATOR ':'
+
+typedef ULONGLONG TPlatformNumber;
+typedef DWORD TProcessID;
+
+typedef void* Module;
+typedef void* Procedure;
+
+#endif // PLATFORM_DEFS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.cpp	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,782 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "Platform.h"
+
+#include "JavaVirtualMachine.h"
+#include "WindowsPlatform.h"
+#include "Package.h"
+#include "Helpers.h"
+#include "PlatformString.h"
+#include "Macros.h"
+
+#include <map>
+#include <vector>
+#include <regex>
+#include <fstream>
+#include <locale>
+#include <codecvt>
+
+using namespace std;
+
+#define WINDOWS_JPACKAGE_TMP_DIR \
+        L"\\AppData\\Local\\Java\\JPackage\\tmp"
+
+class Registry {
+private:
+    HKEY FKey;
+    HKEY FOpenKey;
+    bool FOpen;
+
+public:
+
+    Registry(HKEY Key) {
+        FOpen = false;
+        FKey = Key;
+    }
+
+    ~Registry() {
+        Close();
+    }
+
+    void Close() {
+        if (FOpen == true) {
+            RegCloseKey(FOpenKey);
+        }
+    }
+
+    bool Open(TString SubKey) {
+        bool result = false;
+        Close();
+
+        if (RegOpenKeyEx(FKey, SubKey.data(), 0, KEY_READ, &FOpenKey) ==
+                ERROR_SUCCESS) {
+            result = true;
+        }
+
+        return result;
+    }
+
+    std::list<TString> GetKeys() {
+        std::list<TString> result;
+        DWORD count;
+
+        if (RegQueryInfoKey(FOpenKey, NULL, NULL, NULL, NULL, NULL, NULL,
+                &count, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
+
+            DWORD length = 255;
+            DynamicBuffer<TCHAR> buffer(length);
+            if (buffer.GetData() == NULL) {
+                return result;
+            }
+
+            for (unsigned int index = 0; index < count; index++) {
+                buffer.Zero();
+                DWORD status = RegEnumValue(FOpenKey, index, buffer.GetData(),
+                        &length, NULL, NULL, NULL, NULL);
+
+                while (status == ERROR_MORE_DATA) {
+                    length = length * 2;
+                    if (!buffer.Resize(length)) {
+                        return result;
+                    }
+                    status = RegEnumValue(FOpenKey, index, buffer.GetData(),
+                            &length, NULL, NULL, NULL, NULL);
+                }
+
+                if (status == ERROR_SUCCESS) {
+                    TString value = buffer.GetData();
+                    result.push_back(value);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    TString ReadString(TString Name) {
+        TString result;
+        DWORD length;
+        DWORD dwRet;
+        DynamicBuffer<wchar_t> buffer(0);
+        length = 0;
+
+        dwRet = RegQueryValueEx(FOpenKey, Name.data(), NULL, NULL, NULL,
+                &length);
+        if (dwRet == ERROR_MORE_DATA || dwRet == 0) {
+            if (!buffer.Resize(length + 1)) {
+                return result;
+            }
+            dwRet = RegQueryValueEx(FOpenKey, Name.data(), NULL, NULL,
+                    (LPBYTE) buffer.GetData(), &length);
+            result = buffer.GetData();
+        }
+
+        return result;
+    }
+};
+
+WindowsPlatform::WindowsPlatform(void) : Platform() {
+    FMainThread = ::GetCurrentThreadId();
+}
+
+WindowsPlatform::~WindowsPlatform(void) {
+}
+
+TString WindowsPlatform::GetPackageAppDirectory() {
+    return FilePath::IncludeTrailingSeparator(
+            GetPackageRootDirectory()) + _T("app");
+}
+
+TString WindowsPlatform::GetPackageLauncherDirectory() {
+    return GetPackageRootDirectory();
+}
+
+TString WindowsPlatform::GetPackageRuntimeBinDirectory() {
+    return FilePath::IncludeTrailingSeparator(GetPackageRootDirectory()) + _T("runtime\\bin");
+}
+
+TCHAR* WindowsPlatform::ConvertStringToFileSystemString(TCHAR* Source,
+        bool &release) {
+    // Not Implemented.
+    return NULL;
+}
+
+TCHAR* WindowsPlatform::ConvertFileSystemStringToString(TCHAR* Source,
+        bool &release) {
+    // Not Implemented.
+    return NULL;
+}
+
+void WindowsPlatform::SetCurrentDirectory(TString Value) {
+    _wchdir(Value.data());
+}
+
+TString WindowsPlatform::GetPackageRootDirectory() {
+    TString filename = GetModuleFileName();
+    return FilePath::ExtractFilePath(filename);
+}
+
+TString WindowsPlatform::GetAppDataDirectory() {
+    TString result;
+    TCHAR path[MAX_PATH];
+
+    if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, path) == S_OK) {
+        result = path;
+    }
+
+    return result;
+}
+
+TString WindowsPlatform::GetAppName() {
+    TString result = GetModuleFileName();
+    result = FilePath::ExtractFileName(result);
+    result = FilePath::ChangeFileExt(result, _T(""));
+    return result;
+}
+
+void WindowsPlatform::ShowMessage(TString title, TString description) {
+    MessageBox(NULL, description.data(),
+            !title.empty() ? title.data() : description.data(),
+            MB_ICONERROR | MB_OK);
+}
+
+void WindowsPlatform::ShowMessage(TString description) {
+    TString appname = GetModuleFileName();
+    appname = FilePath::ExtractFileName(appname);
+    MessageBox(NULL, description.data(), appname.data(), MB_ICONERROR | MB_OK);
+}
+
+MessageResponse WindowsPlatform::ShowResponseMessage(TString title,
+        TString description) {
+    MessageResponse result = mrCancel;
+
+    if (::MessageBox(NULL, description.data(), title.data(), MB_OKCANCEL) ==
+            IDOK) {
+        result = mrOK;
+    }
+
+    return result;
+}
+
+TString WindowsPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
+    TString result = FilePath::IncludeTrailingSeparator(RuntimePath) +
+            _T("jre\\bin\\jli.dll");
+
+    if (FilePath::FileExists(result) == false) {
+        result = FilePath::IncludeTrailingSeparator(RuntimePath) +
+                _T("bin\\jli.dll");
+    }
+
+    return result;
+}
+
+ISectionalPropertyContainer* WindowsPlatform::GetConfigFile(TString FileName) {
+    IniFile *result = new IniFile();
+    if (result == NULL) {
+        return NULL;
+    }
+
+    if (result->LoadFromFile(FileName) == false) {
+        // New property file format was not found,
+        // attempt to load old property file format.
+        Helpers::LoadOldConfigFile(FileName, result);
+    }
+
+    return result;
+}
+
+TString WindowsPlatform::GetModuleFileName() {
+    TString result;
+    DynamicBuffer<wchar_t> buffer(MAX_PATH);
+    if (buffer.GetData() == NULL) {
+        return result;
+    }
+
+    ::GetModuleFileName(NULL, buffer.GetData(),
+            static_cast<DWORD> (buffer.GetSize()));
+
+    while (ERROR_INSUFFICIENT_BUFFER == GetLastError()) {
+        if (!buffer.Resize(buffer.GetSize() * 2)) {
+            return result;
+        }
+        ::GetModuleFileName(NULL, buffer.GetData(),
+                static_cast<DWORD> (buffer.GetSize()));
+    }
+
+    result = buffer.GetData();
+    return result;
+}
+
+Module WindowsPlatform::LoadLibrary(TString FileName) {
+    return ::LoadLibrary(FileName.data());
+}
+
+void WindowsPlatform::FreeLibrary(Module AModule) {
+    ::FreeLibrary((HMODULE) AModule);
+}
+
+Procedure WindowsPlatform::GetProcAddress(Module AModule,
+        std::string MethodName) {
+    return ::GetProcAddress((HMODULE) AModule, MethodName.c_str());
+}
+
+bool WindowsPlatform::IsMainThread() {
+    bool result = (FMainThread == ::GetCurrentThreadId());
+    return result;
+}
+
+TString WindowsPlatform::GetTempDirectory() {
+    TString result;
+    PWSTR userDir = 0;
+
+    if (SUCCEEDED(SHGetKnownFolderPath(
+            FOLDERID_Profile,
+            0,
+            NULL,
+            &userDir))) {
+        result = userDir;
+        result += WINDOWS_JPACKAGE_TMP_DIR;
+        CoTaskMemFree(userDir);
+    }
+
+    return result;
+}
+
+static BOOL CALLBACK enumWindows(HWND winHandle, LPARAM lParam) {
+    DWORD pid = (DWORD) lParam, wPid = 0;
+    GetWindowThreadProcessId(winHandle, &wPid);
+    if (pid == wPid) {
+        SetForegroundWindow(winHandle);
+        return FALSE;
+    }
+    return TRUE;
+}
+
+TPlatformNumber WindowsPlatform::GetMemorySize() {
+    SYSTEM_INFO si;
+    GetSystemInfo(&si);
+    size_t result = (size_t) si.lpMaximumApplicationAddress;
+    result = result / 1048576; // Convert from bytes to megabytes.
+    return result;
+}
+
+std::vector<TString> FilterList(std::vector<TString> &Items,
+        std::wregex Pattern) {
+    std::vector<TString> result;
+
+    for (std::vector<TString>::iterator it = Items.begin();
+            it != Items.end(); ++it) {
+        TString item = *it;
+        std::wsmatch match;
+
+        if (std::regex_search(item, match, Pattern)) {
+            result.push_back(item);
+        }
+    }
+    return result;
+}
+
+Process* WindowsPlatform::CreateProcess() {
+    return new WindowsProcess();
+}
+
+void WindowsPlatform::InitStreamLocale(wios *stream) {
+    const std::locale empty_locale = std::locale::empty();
+    const std::locale utf8_locale =
+                std::locale(empty_locale, new std::codecvt_utf8<wchar_t>());
+    stream->imbue(utf8_locale);
+}
+
+void WindowsPlatform::addPlatformDependencies(JavaLibrary *pJavaLibrary) {
+    if (pJavaLibrary == NULL) {
+        return;
+    }
+
+    if (FilePath::FileExists(_T("msvcr100.dll")) == true) {
+        pJavaLibrary->AddDependency(_T("msvcr100.dll"));
+    }
+
+    TString runtimeBin = GetPackageRuntimeBinDirectory();
+    SetDllDirectory(runtimeBin.c_str());
+}
+
+void Platform::CopyString(char *Destination,
+        size_t NumberOfElements, const char *Source) {
+    strcpy_s(Destination, NumberOfElements, Source);
+
+    if (NumberOfElements > 0) {
+        Destination[NumberOfElements - 1] = '\0';
+    }
+}
+
+void Platform::CopyString(wchar_t *Destination,
+        size_t NumberOfElements, const wchar_t *Source) {
+    wcscpy_s(Destination, NumberOfElements, Source);
+
+    if (NumberOfElements > 0) {
+        Destination[NumberOfElements - 1] = '\0';
+    }
+}
+
+// Owner must free the return value.
+MultibyteString Platform::WideStringToMultibyteString(
+        const wchar_t* value) {
+    MultibyteString result;
+    size_t count = 0;
+
+    if (value == NULL) {
+        return result;
+    }
+
+    count = WideCharToMultiByte(CP_UTF8, 0, value, -1, NULL, 0, NULL, NULL);
+
+    if (count > 0) {
+        result.data = new char[count + 1];
+        result.length = WideCharToMultiByte(CP_UTF8, 0, value, -1,
+                result.data, (int)count, NULL, NULL);
+    }
+
+    return result;
+}
+
+// Owner must free the return value.
+WideString Platform::MultibyteStringToWideString(const char* value) {
+    WideString result;
+    size_t count = 0;
+
+    if (value == NULL) {
+        return result;
+    }
+
+    mbstowcs_s(&count, NULL, 0, value, _TRUNCATE);
+
+    if (count > 0) {
+        result.data = new wchar_t[count + 1];
+        mbstowcs_s(&result.length, result.data, count, value, count);
+    }
+
+    return result;
+}
+
+#ifdef DEBUG
+bool WindowsPlatform::IsNativeDebuggerPresent() {
+    bool result = false;
+
+    if (IsDebuggerPresent() == TRUE) {
+        result = true;
+    }
+
+    return result;
+}
+
+int WindowsPlatform::GetProcessID() {
+    int pid = GetProcessId(GetCurrentProcess());
+    return pid;
+}
+#endif //DEBUG
+
+FileHandle::FileHandle(std::wstring FileName) {
+    FHandle = ::CreateFile(FileName.data(), GENERIC_READ, FILE_SHARE_READ,
+            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
+}
+
+FileHandle::~FileHandle() {
+    if (IsValid() == true) {
+        ::CloseHandle(FHandle);
+    }
+}
+
+bool FileHandle::IsValid() {
+    return FHandle != INVALID_HANDLE_VALUE;
+}
+
+HANDLE FileHandle::GetHandle() {
+    return FHandle;
+}
+
+FileMappingHandle::FileMappingHandle(HANDLE FileHandle) {
+    FHandle = ::CreateFileMapping(FileHandle, NULL, PAGE_READONLY, 0, 0, NULL);
+}
+
+bool FileMappingHandle::IsValid() {
+    return FHandle != NULL;
+}
+
+FileMappingHandle::~FileMappingHandle() {
+    if (IsValid() == true) {
+        ::CloseHandle(FHandle);
+    }
+}
+
+HANDLE FileMappingHandle::GetHandle() {
+    return FHandle;
+}
+
+FileData::FileData(HANDLE Handle) {
+    FBaseAddress = ::MapViewOfFile(Handle, FILE_MAP_READ, 0, 0, 0);
+}
+
+FileData::~FileData() {
+    if (IsValid() == true) {
+        ::UnmapViewOfFile(FBaseAddress);
+    }
+}
+
+bool FileData::IsValid() {
+    return FBaseAddress != NULL;
+}
+
+LPVOID FileData::GetBaseAddress() {
+    return FBaseAddress;
+}
+
+WindowsLibrary::WindowsLibrary(std::wstring FileName) {
+    FFileName = FileName;
+}
+
+std::vector<TString> WindowsLibrary::GetImports() {
+    std::vector<TString> result;
+    FileHandle library(FFileName);
+
+    if (library.IsValid() == true) {
+        FileMappingHandle mapping(library.GetHandle());
+
+        if (mapping.IsValid() == true) {
+            FileData fileData(mapping.GetHandle());
+
+            if (fileData.IsValid() == true) {
+                PIMAGE_DOS_HEADER dosHeader =
+                        (PIMAGE_DOS_HEADER) fileData.GetBaseAddress();
+                PIMAGE_FILE_HEADER pImgFileHdr =
+                        (PIMAGE_FILE_HEADER) fileData.GetBaseAddress();
+                if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE) {
+                    result = DumpPEFile(dosHeader);
+                }
+            }
+        }
+    }
+
+    return result;
+}
+
+// Given an RVA, look up the section header that encloses it and return a
+// pointer to its IMAGE_SECTION_HEADER
+
+PIMAGE_SECTION_HEADER WindowsLibrary::GetEnclosingSectionHeader(DWORD rva,
+        PIMAGE_NT_HEADERS pNTHeader) {
+    PIMAGE_SECTION_HEADER result = 0;
+    PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
+
+    for (unsigned index = 0; index < pNTHeader->FileHeader.NumberOfSections;
+            index++, section++) {
+        // Is the RVA is within this section?
+        if ((rva >= section->VirtualAddress) &&
+                (rva < (section->VirtualAddress + section->Misc.VirtualSize))) {
+            result = section;
+        }
+    }
+
+    return result;
+}
+
+LPVOID WindowsLibrary::GetPtrFromRVA(DWORD rva, PIMAGE_NT_HEADERS pNTHeader,
+        DWORD imageBase) {
+    LPVOID result = 0;
+    PIMAGE_SECTION_HEADER pSectionHdr = GetEnclosingSectionHeader(rva,
+            pNTHeader);
+
+    if (pSectionHdr != NULL) {
+        INT delta = (INT) (
+                pSectionHdr->VirtualAddress - pSectionHdr->PointerToRawData);
+        DWORD_PTR dwp = (DWORD_PTR) (imageBase + rva - delta);
+        result = reinterpret_cast<LPVOID> (dwp); // VS2017 - FIXME
+    }
+
+    return result;
+}
+
+std::vector<TString> WindowsLibrary::GetImportsSection(DWORD base,
+        PIMAGE_NT_HEADERS pNTHeader) {
+    std::vector<TString> result;
+
+    // Look up where the imports section is located. Normally in
+    // the .idata section,
+    // but not necessarily so. Therefore, grab the RVA from the data dir.
+    DWORD importsStartRVA = pNTHeader->OptionalHeader.DataDirectory[
+            IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
+
+    if (importsStartRVA != NULL) {
+        // Get the IMAGE_SECTION_HEADER that contains the imports. This is
+        // usually the .idata section, but doesn't have to be.
+        PIMAGE_SECTION_HEADER pSection =
+                GetEnclosingSectionHeader(importsStartRVA, pNTHeader);
+
+        if (pSection != NULL) {
+            PIMAGE_IMPORT_DESCRIPTOR importDesc =
+                    (PIMAGE_IMPORT_DESCRIPTOR) GetPtrFromRVA(
+                    importsStartRVA, pNTHeader, base);
+
+            if (importDesc != NULL) {
+                while (true) {
+                    // See if we've reached an empty IMAGE_IMPORT_DESCRIPTOR
+                    if ((importDesc->TimeDateStamp == 0) &&
+                            (importDesc->Name == 0)) {
+                        break;
+                    }
+
+                    std::string filename = (char*) GetPtrFromRVA(
+                            importDesc->Name, pNTHeader, base);
+                    result.push_back(PlatformString(filename));
+                    importDesc++; // advance to next IMAGE_IMPORT_DESCRIPTOR
+                }
+            }
+        }
+    }
+
+    return result;
+}
+
+std::vector<TString> WindowsLibrary::DumpPEFile(PIMAGE_DOS_HEADER dosHeader) {
+    std::vector<TString> result;
+    // all of this is VS2017 - FIXME
+    DWORD_PTR dwDosHeaders = reinterpret_cast<DWORD_PTR> (dosHeader);
+    DWORD_PTR dwPIHeaders = dwDosHeaders + (DWORD) (dosHeader->e_lfanew);
+
+    PIMAGE_NT_HEADERS pNTHeader =
+            reinterpret_cast<PIMAGE_NT_HEADERS> (dwPIHeaders);
+
+    // Verify that the e_lfanew field gave us a reasonable
+    // pointer and the PE signature.
+    // TODO: To really fix JDK-8131321 this condition needs to be changed.
+    // There is a matching change
+    // in JavaVirtualMachine.cpp that also needs to be changed.
+    if (pNTHeader->Signature == IMAGE_NT_SIGNATURE) {
+        DWORD base = (DWORD) (dwDosHeaders);
+        result = GetImportsSection(base, pNTHeader);
+    }
+
+    return result;
+}
+
+#include <TlHelp32.h>
+
+WindowsJob::WindowsJob() {
+    FHandle = NULL;
+}
+
+WindowsJob::~WindowsJob() {
+    if (FHandle != NULL) {
+        CloseHandle(FHandle);
+    }
+}
+
+HANDLE WindowsJob::GetHandle() {
+    if (FHandle == NULL) {
+        FHandle = CreateJobObject(NULL, NULL); // GLOBAL
+
+        if (FHandle == NULL) {
+            ::MessageBox(0, _T("Could not create job object"),
+                    _T("TEST"), MB_OK);
+        } else {
+            JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = {0};
+
+            // Configure all child processes associated with
+            // the job to terminate when the
+            jeli.BasicLimitInformation.LimitFlags =
+                    JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
+            if (0 == SetInformationJobObject(FHandle,
+                    JobObjectExtendedLimitInformation, &jeli, sizeof (jeli))) {
+                ::MessageBox(0, _T("Could not SetInformationJobObject"),
+                        _T("TEST"), MB_OK);
+            }
+        }
+    }
+
+    return FHandle;
+}
+
+// Initialize static member of WindowsProcess
+WindowsJob WindowsProcess::FJob;
+
+WindowsProcess::WindowsProcess() : Process() {
+    FRunning = false;
+}
+
+WindowsProcess::~WindowsProcess() {
+    Terminate();
+}
+
+void WindowsProcess::Cleanup() {
+    CloseHandle(FProcessInfo.hProcess);
+    CloseHandle(FProcessInfo.hThread);
+}
+
+bool WindowsProcess::IsRunning() {
+    bool result = false;
+
+    HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
+    if (handle == INVALID_HANDLE_VALUE) {
+        return false;
+    }
+
+    PROCESSENTRY32 process = {0};
+    process.dwSize = sizeof (process);
+
+    if (::Process32First(handle, &process)) {
+        do {
+            if (process.th32ProcessID == FProcessInfo.dwProcessId) {
+                result = true;
+                break;
+            }
+        } while (::Process32Next(handle, &process));
+    }
+
+    CloseHandle(handle);
+
+    return result;
+}
+
+bool WindowsProcess::Terminate() {
+    bool result = false;
+
+    if (IsRunning() == true && FRunning == true) {
+        FRunning = false;
+    }
+
+    return result;
+}
+
+bool WindowsProcess::Execute(const TString Application,
+        const std::vector<TString> Arguments, bool AWait) {
+    bool result = false;
+
+    if (FRunning == false) {
+        FRunning = true;
+
+        STARTUPINFO startupInfo;
+        ZeroMemory(&startupInfo, sizeof (startupInfo));
+        startupInfo.cb = sizeof (startupInfo);
+        ZeroMemory(&FProcessInfo, sizeof (FProcessInfo));
+
+        TString command = Application;
+
+        for (std::vector<TString>::const_iterator iterator = Arguments.begin();
+                iterator != Arguments.end(); iterator++) {
+            command += TString(_T(" ")) + *iterator;
+        }
+
+        if (::CreateProcess(Application.data(), (wchar_t*)command.data(), NULL,
+                NULL, FALSE, 0, NULL, NULL, &startupInfo, &FProcessInfo) == FALSE) {
+            TString message = PlatformString::Format(
+                    _T("Error: Unable to create process %s"),
+                    Application.data());
+            throw Exception(message);
+        } else {
+            if (FJob.GetHandle() != NULL) {
+                if (::AssignProcessToJobObject(FJob.GetHandle(),
+                        FProcessInfo.hProcess) == 0) {
+                    // Failed to assign process to job. It doesn't prevent
+                    // anything from continuing so continue.
+                }
+            }
+
+            // Wait until child process exits.
+            if (AWait == true) {
+                Wait();
+                // Close process and thread handles.
+                Cleanup();
+            }
+        }
+    }
+
+    return result;
+}
+
+bool WindowsProcess::Wait() {
+    bool result = false;
+
+    WaitForSingleObject(FProcessInfo.hProcess, INFINITE);
+    return result;
+}
+
+TProcessID WindowsProcess::GetProcessID() {
+    return FProcessInfo.dwProcessId;
+}
+
+bool WindowsProcess::ReadOutput() {
+    bool result = false;
+    // TODO implement
+    return result;
+}
+
+void WindowsProcess::SetInput(TString Value) {
+    // TODO implement
+}
+
+std::list<TString> WindowsProcess::GetOutput() {
+    ReadOutput();
+    return Process::GetOutput();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.h	Sun Feb 17 14:08:26 2019 -0500
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef WINDOWSPLATFORM_H
+#define WINDOWSPLATFORM_H
+
+#include <Windows.h>
+#include "Platform.h"
+
+class WindowsPlatform : virtual public Platform {
+private:
+    DWORD FMainThread;
+
+public:
+    WindowsPlatform(void);
+    virtual ~WindowsPlatform(void);
+
+    virtual TCHAR* ConvertStringToFileSystemString(TCHAR* Source,
+            bool &release);
+    virtual TCHAR* ConvertFileSystemStringToString(TCHAR* Source,
+            bool &release);
+
+    virtual void ShowMessage(TString title, TString description);
+    virtual void ShowMessage(TString description);
+    virtual MessageResponse ShowResponseMessage(TString title,
+            TString description);
+
+    virtual void SetCurrentDirectory(TString Value);
+    virtual TString GetPackageRootDirectory();
+    virtual TString GetAppDataDirectory();
+    virtual TString GetAppName();
+    virtual TString GetBundledJVMLibraryFileName(TString RuntimePath);
+    TString GetPackageAppDirectory();
+    TString GetPackageLauncherDirectory();
+    TString GetPackageRuntimeBinDirectory();
+
+    virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
+
+    virtual TString GetModuleFileName();
+    virtual Module LoadLibrary(TString FileName);
+    virtual void FreeLibrary(Module AModule);
+    virtual Procedure GetProcAddress(Module AModule, std::string MethodName);
+
+    virtual Process* CreateProcess();
+
+    virtual bool IsMainThread();
+    virtual TPlatformNumber GetMemorySize();
+
+    virtual TString GetTempDirectory();
+    void InitStreamLocale(wios *stream);
+    void addPlatformDependencies(JavaLibrary *pJavaLibrary);
+};
+
+class FileHandle {
+private:
+    HANDLE FHandle;
+
+public:
+    FileHandle(std::wstring FileName);
+    ~FileHandle();
+
+    bool IsValid();
+    HANDLE GetHandle();
+};
+
+
+class FileMappingHandle {
+private:
+    HANDLE FHandle;
+
+public:
+    FileMappingHandle(HANDLE FileHandle);
+    ~FileMappingHandle();
+
+    bool IsValid();
+    HANDLE GetHandle();
+};
+
+
+class FileData {
+private:
+    LPVOID FBaseAddress;
+
+public:
+    FileData(HANDLE Handle);
+    ~FileData();
+
+    bool IsValid();
+    LPVOID GetBaseAddress();
+};
+
+
+class WindowsLibrary {
+private:
+    TString FFileName;
+
+    // Given an RVA, look up the section header that encloses it and return a
+    // pointer to its IMAGE_SECTION_HEADER
+    static PIMAGE_SECTION_HEADER GetEnclosingSectionHeader(DWORD rva,
+            PIMAGE_NT_HEADERS pNTHeader);
+    static LPVOID GetPtrFromRVA(DWORD rva, PIMAGE_NT_HEADERS pNTHeader,
+            DWORD imageBase);
+    static std::vector<TString> GetImportsSection(DWORD base,
+            PIMAGE_NT_HEADERS pNTHeader);
+    static std::vector<TString> DumpPEFile(PIMAGE_DOS_HEADER dosHeader);
+
+public:
+    WindowsLibrary(const TString FileName);
+
+    std::vector<TString> GetImports();
+};
+
+
+class WindowsJob {
+private:
+    HANDLE FHandle;
+
+public:
+    WindowsJob();
+    ~WindowsJob();
+
+    HANDLE GetHandle();
+};
+
+
+class WindowsProcess : public Process {
+private:
+    bool FRunning;
+
+    PROCESS_INFORMATION FProcessInfo;
+    static WindowsJob FJob;
+
+    void Cleanup();
+    bool ReadOutput();
+
+public:
+    WindowsProcess();
+    virtual ~WindowsProcess();
+
+    virtual bool IsRunning();
+    virtual bool Terminate();
+    virtual bool Execute(const TString Application,
+            const std::vector<TString> Arguments, bool AWait = false);
+    virtual bool Wait();
+    virtual TProcessID GetProcessID();
+    virtual void SetInput(TString Value);
+    virtual std::list<TString> GetOutput();
+};
+
+#endif // WINDOWSPLATFORM_H