cui/source/options/optjava.cxx |   21 +++++++++++++++++++--
 jvmfwk/source/framework.cxx    |    5 ++++-
 2 files changed, 23 insertions(+), 3 deletions(-)

New commits:
commit cfc2376f804f13eb562f39182cb24fe7dc61d6ef
Author:     Samuel Mehrbrodt <[email protected]>
AuthorDate: Thu May 25 13:41:16 2023 +0200
Commit:     Samuel Mehrbrodt <[email protected]>
CommitDate: Thu May 25 16:19:00 2023 +0200

    Allow bootstrap variables in Java user classpath settings
    
    This allows for relative paths to be configured as Java class path.
    
    Change-Id: Ie3e6bc3836fb316457e5c9f11dfb77d2fcd49ad4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152271
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <[email protected]>

diff --git a/cui/source/options/optjava.cxx b/cui/source/options/optjava.cxx
index c1528138f326..631d085c3bfb 100644
--- a/cui/source/options/optjava.cxx
+++ b/cui/source/options/optjava.cxx
@@ -944,13 +944,30 @@ void SvxJavaClassPathDlg::SetClassPath( const OUString& 
_rPath )
         sal_Int32 nIdx = 0;
         do
         {
-            OUString sToken = _rPath.getToken( 0, CLASSPATH_DELIMITER, nIdx );
+            sal_Int32 nextColon = _rPath.indexOf(CLASSPATH_DELIMITER, nIdx);
+            OUString sToken(
+                _rPath.subView(nIdx, nextColon > 0 ? nextColon - nIdx : 
_rPath.getLength() - nIdx));
+
+            // Detect open bootstrap variables - they might contain colons - 
we need to skip those.
+            sal_Int32 nBootstrapVarStart = sToken.indexOf("${");
+            if (nBootstrapVarStart >= 0)
+            {
+                sal_Int32 nBootstrapVarEnd = sToken.indexOf("}");
+                if (nBootstrapVarEnd == -1)
+                {
+                    // Current colon is part of bootstrap variable - skip it!
+                    nextColon = _rPath.indexOf(CLASSPATH_DELIMITER, nextColon 
+ 1);
+                    sToken = _rPath.subView(nIdx, nextColon > 0 ? nextColon - 
nIdx
+                                                                : 
_rPath.getLength() - nIdx);
+                }
+            }
             OUString sURL;
             osl::FileBase::getFileURLFromSystemPath(sToken, sURL); // best 
effort
             INetURLObject aURL( sURL );
             m_xPathList->append("", sToken, 
SvFileInformationManager::GetImageId(aURL));
+            nIdx = nextColon + 1;
         }
-        while (nIdx>=0);
+        while (nIdx > 0);
         // select first entry
         m_xPathList->select(0);
     }
diff --git a/jvmfwk/source/framework.cxx b/jvmfwk/source/framework.cxx
index 5f83e7be739e..33b61f1622fd 100644
--- a/jvmfwk/source/framework.cxx
+++ b/jvmfwk/source/framework.cxx
@@ -185,7 +185,10 @@ javaFrameworkError jfw_startVM(
                     return JFW_E_NEED_RESTART;
 
                 vmParams = settings.getVmParametersUtf8();
-                sUserClassPath = 
jfw::makeClassPathOption(settings.getUserClassPath());
+                // Expand user classpath (might contain bootstrap vars)
+                OUString sUserPath(settings.getUserClassPath());
+                rtl::Bootstrap::expandMacros(sUserPath);
+                sUserClassPath = jfw::makeClassPathOption(sUserPath);
             } // end mode FWK_MODE_OFFICE
             else if (mode == jfw::JFW_MODE_DIRECT)
             {

Reply via email to