Kaydet (Commit) 3d27b2fa authored tarafından Stephan Bergmann's avatar Stephan Bergmann

tdf#124503: Support JRE installations with unknown java.vendor property

After recent additions of 61c4f96d "Support
AdoptOpenJDK" and 41507db5 "Support Amazon
Corretto" to our hard-coded list, there is now reports that at least Debian and
Ubuntu tried to distribute versions of OpenJDK with the java.vendor propety set
to string like "Debian" or "Ubuntu".  Instead of trying to catch up with an
ever-growing hard-coded list, it is probably better to stop relying exclusively
on such a hard-coded list, and for unknown vendor values, try out whether the
SunInfo backend (which supports the "generic" OpenJDK) would be able to handle
the given JRE.  (For simplicity, assume that any versions of such JREs are
supported.  Our baseline is Java 6, and there are unlikely any older versions of
JREs from unknown vendors out there.  If this turns out to be problematic, we
could include information about problematic vendors after all, or add a general
check that JREs from unknown vendors are at least Java 6.)

Many functions in jvmfwk/inc/vendorplugin.hxx that used to take a set of
sVendor/sMinVersion/sMaxVerison/arExcludeList paramters had to be revised to
take a vendorSettings parameter instead, and
VendorSettings::getVersionInformation has been changed to return a
boost::optional, so that unknown vendors can be handled gracefully.

Change-Id: Ibf915f2ddd59e09b77e2c03be688cac0547b9ac9
Reviewed-on: https://gerrit.libreoffice.org/70460
Tested-by: Jenkins
Reviewed-by: 's avatarStephan Bergmann <sbergman@redhat.com>
üst d38f9934
...@@ -16,10 +16,15 @@ ...@@ -16,10 +16,15 @@
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 . * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/ */
#ifndef INCLUDED_JVMFWK_SOURCE_FWKBASE_HXX #ifndef INCLUDED_JVMFWK_INC_FWKBASE_HXX
#define INCLUDED_JVMFWK_SOURCE_FWKBASE_HXX #define INCLUDED_JVMFWK_INC_FWKBASE_HXX
#include <sal/config.h>
#include <boost/optional.hpp>
#include <rtl/ustring.hxx> #include <rtl/ustring.hxx>
#include "elements.hxx"
#include "libxmlutil.hxx" #include "libxmlutil.hxx"
namespace jfw namespace jfw
...@@ -34,7 +39,7 @@ class VendorSettings ...@@ -34,7 +39,7 @@ class VendorSettings
public: public:
VendorSettings(); VendorSettings();
VersionInfo getVersionInformation(const OUString & sVendor) const; boost::optional<VersionInfo> getVersionInformation(const OUString & sVendor) const;
::std::vector< OUString> getSupportedVendors() const; ::std::vector< OUString> getSupportedVendors() const;
}; };
......
...@@ -16,8 +16,8 @@ ...@@ -16,8 +16,8 @@
* except in compliance with the License. You may obtain a copy of * except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 . * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/ */
#ifndef INCLUDED_JVMFWK_SOURCE_LIBXMLUTIL_HXX #ifndef INCLUDED_JVMFWK_INC_LIBXMLUTIL_HXX
#define INCLUDED_JVMFWK_SOURCE_LIBXMLUTIL_HXX #define INCLUDED_JVMFWK_INC_LIBXMLUTIL_HXX
#include <libxml/parser.h> #include <libxml/parser.h>
#include <libxml/xpath.h> #include <libxml/xpath.h>
......
...@@ -28,10 +28,10 @@ ...@@ -28,10 +28,10 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <utility>
#include "elements.hxx"
#include "vendorbase.hxx" #include "vendorbase.hxx"
namespace jfw { class VendorSettings; }
/** /**
@file @file
<p> <p>
...@@ -56,7 +56,6 @@ enum class javaPluginError ...@@ -56,7 +56,6 @@ enum class javaPluginError
WrongVersionFormat, WrongVersionFormat,
FailedVersion, FailedVersion,
NoJre, NoJre,
WrongVendor,
WrongArch, WrongArch,
VmCreationFailed VmCreationFailed
}; };
...@@ -64,26 +63,14 @@ enum class javaPluginError ...@@ -64,26 +63,14 @@ enum class javaPluginError
/** obtains information about installations of Java Runtime Environments (JREs). /** obtains information about installations of Java Runtime Environments (JREs).
<p>The function gathers information about available JREs which have the same <p>The function gathers information about available JREs. Only information
vendor as determined by the <code>sVendor</code> parameter. Only information
about those JREs which match the version requirements are returned. These about those JREs which match the version requirements are returned. These
requirements are specified by the parameters <code>sMinVersion</code>, requirements are specified by the parameter <code>vendorSettings</code>.
<code>sMaxVersion</code> and <code>arExcludeList</code>.
</p> </p>
<p> <p>
The JavaInfo structures returned in <code>parJavaInfo</code> should be ordered The JavaInfo structures returned in <code>parJavaInfo</code> should be ordered
according to their version. The one, representing a JRE with the highest according to their version. The one, representing a JRE with the highest
version should be the first in the array. </p> version should be the first in the array. </p>
@param sVendor
[in] only JREs from this vendor are examined. This parameter always contains
a vendor string. That is, the string it is not empty.
@param sMinVersion
[in] represents the minimum version of a JRE. The string can be empty.
@param sMaxVersion
[in] represents the maximum version of a JRE. The string can be empty.
@param arExcludeList
[in] contains a list of &quot;bad&quot; versions. JREs which have one of these
versions must not be returned by this function.
@param parJavaInfo @param parJavaInfo
[out] if the function runs successfully then <code>parJavaInfo</code> contains [out] if the function runs successfully then <code>parJavaInfo</code> contains
on return a vector of pointers to <code>JavaInfo</code> objects. on return a vector of pointers to <code>JavaInfo</code> objects.
...@@ -91,40 +78,25 @@ enum class javaPluginError ...@@ -91,40 +78,25 @@ enum class javaPluginError
@return @return
javaPluginError::NONE the function ran successfully.</br> javaPluginError::NONE the function ran successfully.</br>
javaPluginError::Error an error occurred during execution.</br> javaPluginError::Error an error occurred during execution.</br>
javaPluginError::InvalidArg an argument was not valid.</br>
javaPluginError::WrongVersionFormat the version strings in javaPluginError::WrongVersionFormat the version strings in
<code>sMinVersion,sMaxVersion,arExcludeList</code> are not recognized as valid <code>vendorSettings</code> are not recognized as valid
version strings. version strings.
*/ */
javaPluginError jfw_plugin_getAllJavaInfos( javaPluginError jfw_plugin_getAllJavaInfos(
bool checkJavaHomeAndPath, bool checkJavaHomeAndPath,
OUString const& sVendor, jfw::VendorSettings const & vendorSettings,
OUString const& sMinVersion,
OUString const& sMaxVersion,
std::vector<OUString> const & arExcludeList,
std::vector<std::unique_ptr<JavaInfo>> * parJavaInfo, std::vector<std::unique_ptr<JavaInfo>> * parJavaInfo,
std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos);
/** obtains information for a JRE at a given location. /** obtains information for a JRE at a given location.
<p>If the given location belongs to a JRE whoose vendor matches the <p>If the given location belongs to a JRE
sVendor argument and the JRE has a version which meets the requirements as and the JRE has a version which meets the requirements as
specified by <code>sMinVersion, sMaxVersion, arExcludeList</code> then specified by <code>vendorSettings</code> then
this function shall return a JavaInfo object for this JRE if this implementation this function shall return a JavaInfo object for this JRE.</p>
supports this vendor.</p>
@param sLocation @param sLocation
[in] a file URL to the directory of the JRE. [in] a file URL to the directory of the JRE.
@param sVendor
[in] a name of a vendor. This parameter always contains
a vendor string. That is, the string it is not empty.
@param sMinVersion
[in] represents the minimum version of a JRE.
@param sMaxVersion
[in] represents the maximum version of a JRE.
@param arExcludeList
[in] contains a list of &quot;bad&quot; versions. JREs which have one of these
versions must not be returned by this function.
@param ppInfo @param ppInfo
[out] if the function runs successfully then <code>ppInfo</code> contains [out] if the function runs successfully then <code>ppInfo</code> contains
on return a pointer to a <code>JavaInfo</code> object. on return a pointer to a <code>JavaInfo</code> object.
...@@ -134,37 +106,23 @@ javaPluginError jfw_plugin_getAllJavaInfos( ...@@ -134,37 +106,23 @@ javaPluginError jfw_plugin_getAllJavaInfos(
javaPluginError::Error an error occurred during execution.</br> javaPluginError::Error an error occurred during execution.</br>
javaPluginError::InvalidArg an argument was not valid. For example, sLocation javaPluginError::InvalidArg an argument was not valid. For example, sLocation
is an empty string.</br> is an empty string.</br>
javaPluginError::WrongVersionFormat the version strings in
<code>sMinVersion,sMaxVersion,arExcludeList</code> are not recognized as valid
version strings.
javaPluginError::FailedVersion there is a JRE at the given location but it does not javaPluginError::FailedVersion there is a JRE at the given location but it does not
meet the version requirements. meet the version requirements.
javaPluginError::NoJre no JRE could be detected at the given location. However, that javaPluginError::NoJre no JRE could be detected at the given location.
does not mean necessarily that there is no JRE. There could be a JRE but it has
a vendor which is not supported by this API implementation.
*/ */
javaPluginError jfw_plugin_getJavaInfoByPath( javaPluginError jfw_plugin_getJavaInfoByPath(
OUString const& sLocation, OUString const& sLocation,
OUString const& sVendor, jfw::VendorSettings const & vendorSettings,
OUString const& sMinVersion,
OUString const& sMaxVersion,
std::vector<OUString> const &arExcludeList,
std::unique_ptr<JavaInfo> * ppInfo); std::unique_ptr<JavaInfo> * ppInfo);
/** obtains information for a JRE referenced by the JAVA_HOME environment variable. /** obtains information for a JRE referenced by the JAVA_HOME environment variable.
<p>If the JAVA_HOME environment variable is set and points to a JRE whoose vendor <p>If the JAVA_HOME environment variable is set and points to a JRE that
matches the requirements given by vecVendorInfos (i.e. it has a vendor that is matches the requirements given by vendorSettings (i.e.
given in vecVendorInfos and the version requirements for the vendor are met), the version requirements, if any, for the vendor are met),
then this function shall return a JavaInfo object for this JRE.</p> then this function shall return a JavaInfo object for this JRE.</p>
@param vecVendorInfos
[in] vector specifying the vendor and version requirements that the JRE must fulfill.
The vector contains pairs of vendors and the respective version requirements
for those vendors. The JRE must support the requirements of one given pair in the
vector (i.e. it must be of one of the vendors and meet the version requirements
- minVersion, maxVersion, excludeVersions - for that specific vendor).
@param ppInfo @param ppInfo
[out] if the JAVA_HOME environment variable is set and points to a suitable [out] if the JAVA_HOME environment variable is set and points to a suitable
JRE, then <code>ppInfo</code> contains JRE, then <code>ppInfo</code> contains
...@@ -173,12 +131,12 @@ javaPluginError jfw_plugin_getJavaInfoByPath( ...@@ -173,12 +131,12 @@ javaPluginError jfw_plugin_getJavaInfoByPath(
@return @return
javaPluginError::NONE the function ran successfully.</br> javaPluginError::NONE the function ran successfully.</br>
javaPluginError::NoJre no suitable JRE could be detected at the given location. However, that javaPluginError::NoJre no suitable JRE could be detected at the given location. However, that
does not mean necessarily that there is no JRE. There could be a JRE but it has does not mean necessarily that there is no JRE. There could be a JRE but
a vendor which is not supported by this API implementation or it does not it does not
meet the version requirements. meet the version requirements.
*/ */
javaPluginError jfw_plugin_getJavaInfoFromJavaHome( javaPluginError jfw_plugin_getJavaInfoFromJavaHome(
std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, jfw::VendorSettings const & vendorSettings,
std::unique_ptr<JavaInfo> * ppInfo, std::unique_ptr<JavaInfo> * ppInfo,
std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos);
...@@ -187,20 +145,14 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( ...@@ -187,20 +145,14 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome(
whose executable is in the PATH. whose executable is in the PATH.
<p>The function gathers information about available JREs which are on the PATH <p>The function gathers information about available JREs which are on the PATH
(PATH environment variable) and meet the vendor and version requirements given by (PATH environment variable) and meet the version requirements given by
<code>vecVendorInfos</code> (i.e. they have a vendor that is given in <code>vendorSettings</code> (i.e.
<code>vecVendorInfos</code> and the version requirements for the vendor are met). the version requirements, if any, for the vendor are met).
</p> </p>
<p> <p>
The JavaInfo structures returned in <code>vecJavaInfosFromPath</code> should be ordered The JavaInfo structures returned in <code>vecJavaInfosFromPath</code> should be ordered
according to their occurrence in the PATH. The one that is the first one on the PATH according to their occurrence in the PATH. The one that is the first one on the PATH
is also the first element in the vector.</p> is also the first element in the vector.</p>
@param vecVendorInfos
[in] vector specifying the vendor and version requirements that the JRE must fulfill.
The vector contains pairs of vendors and the respective version requirements
for those vendors. The JRE must support the requirements of one given pair in the
vector (i.e. it must be of one of the vendors and meet the version requirements
- minVersion, maxVersion, excludeVersions - for that specific vendor).
@param vecJavaInfosFromPath @param vecJavaInfosFromPath
[out] if the function runs successfully then <code>vecJavaInfosFromPath</code> [out] if the function runs successfully then <code>vecJavaInfosFromPath</code>
contains on return a vector of pointers to <code>JavaInfo</code> objects. contains on return a vector of pointers to <code>JavaInfo</code> objects.
...@@ -216,7 +168,7 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( ...@@ -216,7 +168,7 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome(
*/ */
javaPluginError jfw_plugin_getJavaInfosFromPath( javaPluginError jfw_plugin_getJavaInfosFromPath(
std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, jfw::VendorSettings const & vendorSettings,
std::vector<std::unique_ptr<JavaInfo>> & vecJavaInfosFromPath, std::vector<std::unique_ptr<JavaInfo>> & vecJavaInfosFromPath,
std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos); std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos);
...@@ -256,8 +208,6 @@ javaPluginError jfw_plugin_getJavaInfosFromPath( ...@@ -256,8 +208,6 @@ javaPluginError jfw_plugin_getJavaInfosFromPath(
@return @return
javaPluginError::NONE the function ran successfully.</br> javaPluginError::NONE the function ran successfully.</br>
javaPluginError::Error an error occurred during execution.</br> javaPluginError::Error an error occurred during execution.</br>
javaPluginError::WrongVendor the <code>JavaInfo</code> object was not created
in by this library and the VM cannot be started.</br>
JFW_PLUGIN_E_VM_CREATION_FAILED a VM could not be created. The error was caused JFW_PLUGIN_E_VM_CREATION_FAILED a VM could not be created. The error was caused
by the JRE. by the JRE.
*/ */
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include <jni.h> #include <jni.h>
#include <rtl/byteseq.hxx> #include <rtl/byteseq.hxx>
#include <fwkbase.hxx>
#include <vendorplugin.hxx> #include <vendorplugin.hxx>
#include "util.hxx" #include "util.hxx"
#include "sunversion.hxx" #include "sunversion.hxx"
...@@ -296,19 +297,12 @@ javaPluginError checkJavaVersionRequirements( ...@@ -296,19 +297,12 @@ javaPluginError checkJavaVersionRequirements(
javaPluginError jfw_plugin_getAllJavaInfos( javaPluginError jfw_plugin_getAllJavaInfos(
bool checkJavaHomeAndPath, bool checkJavaHomeAndPath,
OUString const& sVendor, jfw::VendorSettings const & vendorSettings,
OUString const& sMinVersion,
OUString const& sMaxVersion,
std::vector<OUString> const &arExcludeList,
std::vector<std::unique_ptr<JavaInfo>>* parJavaInfo, std::vector<std::unique_ptr<JavaInfo>>* parJavaInfo,
std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos) std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos)
{ {
assert(parJavaInfo); assert(parJavaInfo);
OSL_ASSERT(!sVendor.isEmpty());
if (sVendor.isEmpty())
return javaPluginError::InvalidArg;
//Find all JREs //Find all JREs
vector<rtl::Reference<VendorBase> > vecInfos = vector<rtl::Reference<VendorBase> > vecInfos =
addAllJREInfos(checkJavaHomeAndPath, infos); addAllJREInfos(checkJavaHomeAndPath, infos);
...@@ -316,17 +310,16 @@ javaPluginError jfw_plugin_getAllJavaInfos( ...@@ -316,17 +310,16 @@ javaPluginError jfw_plugin_getAllJavaInfos(
for (auto const& vecInfo : vecInfos) for (auto const& vecInfo : vecInfos)
{ {
if (auto const versionInfo = vendorSettings.getVersionInformation(vecInfo->getVendor()))
{
javaPluginError err = checkJavaVersionRequirements(
vecInfo, versionInfo->sMinVersion, versionInfo->sMaxVersion, versionInfo->vecExcludeVersions);
if (sVendor != vecInfo->getVendor()) if (err == javaPluginError::FailedVersion || err == javaPluginError::WrongArch)
continue; continue;
else if (err == javaPluginError::WrongVersionFormat)
javaPluginError err = checkJavaVersionRequirements( return err;
vecInfo, sMinVersion, sMaxVersion, arExcludeList); }
if (err == javaPluginError::FailedVersion || err == javaPluginError::WrongArch)
continue;
else if (err == javaPluginError::WrongVersionFormat)
return err;
vecVerifiedInfos.push_back(vecInfo); vecVerifiedInfos.push_back(vecInfo);
} }
...@@ -343,10 +336,7 @@ javaPluginError jfw_plugin_getAllJavaInfos( ...@@ -343,10 +336,7 @@ javaPluginError jfw_plugin_getAllJavaInfos(
javaPluginError jfw_plugin_getJavaInfoByPath( javaPluginError jfw_plugin_getJavaInfoByPath(
OUString const& sPath, OUString const& sPath,
OUString const& sVendor, jfw::VendorSettings const & vendorSettings,
OUString const& sMinVersion,
OUString const& sMaxVersion,
std::vector<OUString> const &arExcludeList,
std::unique_ptr<JavaInfo> * ppInfo) std::unique_ptr<JavaInfo> * ppInfo)
{ {
assert(ppInfo != nullptr); assert(ppInfo != nullptr);
...@@ -354,19 +344,17 @@ javaPluginError jfw_plugin_getJavaInfoByPath( ...@@ -354,19 +344,17 @@ javaPluginError jfw_plugin_getJavaInfoByPath(
if (sPath.isEmpty()) if (sPath.isEmpty())
return javaPluginError::InvalidArg; return javaPluginError::InvalidArg;
OSL_ASSERT(!sVendor.isEmpty());
if (sVendor.isEmpty())
return javaPluginError::InvalidArg;
rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath(sPath); rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath(sPath);
if (!aVendorInfo.is()) if (!aVendorInfo.is())
return javaPluginError::NoJre; return javaPluginError::NoJre;
//Check if the detected JRE matches the version requirements //Check if the detected JRE matches the version requirements
if (sVendor != aVendorInfo->getVendor()) javaPluginError errorcode = javaPluginError::NONE;
return javaPluginError::NoJre; if (auto const versionInfo = vendorSettings.getVersionInformation(aVendorInfo->getVendor()))
javaPluginError errorcode = checkJavaVersionRequirements( {
aVendorInfo, sMinVersion, sMaxVersion, arExcludeList); errorcode = checkJavaVersionRequirements(
aVendorInfo, versionInfo->sMinVersion, versionInfo->sMaxVersion, versionInfo->vecExcludeVersions);
}
if (errorcode == javaPluginError::NONE) if (errorcode == javaPluginError::NONE)
*ppInfo = createJavaInfo(aVendorInfo); *ppInfo = createJavaInfo(aVendorInfo);
...@@ -375,7 +363,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath( ...@@ -375,7 +363,7 @@ javaPluginError jfw_plugin_getJavaInfoByPath(
} }
javaPluginError jfw_plugin_getJavaInfoFromJavaHome( javaPluginError jfw_plugin_getJavaInfoFromJavaHome(
std::vector<pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, jfw::VendorSettings const & vendorSettings,
std::unique_ptr<JavaInfo> * ppInfo, std::unique_ptr<JavaInfo> * ppInfo,
std::vector<rtl::Reference<VendorBase>> & infos) std::vector<rtl::Reference<VendorBase>> & infos)
{ {
...@@ -389,32 +377,24 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome( ...@@ -389,32 +377,24 @@ javaPluginError jfw_plugin_getJavaInfoFromJavaHome(
assert(infoJavaHome.size() == 1); assert(infoJavaHome.size() == 1);
//Check if the detected JRE matches the version requirements //Check if the detected JRE matches the version requirements
for (auto const& vendorInfo : vecVendorInfos) auto const versionInfo = vendorSettings.getVersionInformation(infoJavaHome[0]->getVendor());
{ if (!versionInfo
const OUString& vendor = vendorInfo.first; || (checkJavaVersionRequirements(
jfw::VersionInfo versionInfo = vendorInfo.second;
if (vendor == infoJavaHome[0]->getVendor())
{
javaPluginError errorcode = checkJavaVersionRequirements(
infoJavaHome[0], infoJavaHome[0],
versionInfo.sMinVersion, versionInfo->sMinVersion,
versionInfo.sMaxVersion, versionInfo->sMaxVersion,
versionInfo.vecExcludeVersions); versionInfo->vecExcludeVersions)
== javaPluginError::NONE))
if (errorcode == javaPluginError::NONE) {
{ *ppInfo = createJavaInfo(infoJavaHome[0]);
*ppInfo = createJavaInfo(infoJavaHome[0]); return javaPluginError::NONE;
return javaPluginError::NONE;
}
}
} }
return javaPluginError::NoJre; return javaPluginError::NoJre;
} }
javaPluginError jfw_plugin_getJavaInfosFromPath( javaPluginError jfw_plugin_getJavaInfosFromPath(
std::vector<std::pair<OUString, jfw::VersionInfo>> const& vecVendorInfos, jfw::VendorSettings const & vendorSettings,
std::vector<std::unique_ptr<JavaInfo>> & javaInfosFromPath, std::vector<std::unique_ptr<JavaInfo>> & javaInfosFromPath,
std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos) std::vector<rtl::Reference<jfw_plugin::VendorBase>> & infos)
{ {
...@@ -427,24 +407,16 @@ javaPluginError jfw_plugin_getJavaInfosFromPath( ...@@ -427,24 +407,16 @@ javaPluginError jfw_plugin_getJavaInfosFromPath(
// copy infos of JREs that meet version requirements to vecVerifiedInfos // copy infos of JREs that meet version requirements to vecVerifiedInfos
for (auto const& infosFromPath : vecInfosFromPath) for (auto const& infosFromPath : vecInfosFromPath)
{ {
for (auto const& vendorInfo : vecVendorInfos) auto const versionInfo = vendorSettings.getVersionInformation(infosFromPath->getVendor());
{ if (!versionInfo
const OUString& vendor = vendorInfo.first; || (checkJavaVersionRequirements(
jfw::VersionInfo const & versionInfo = vendorInfo.second;
if (vendor == infosFromPath->getVendor())
{
javaPluginError errorcode = checkJavaVersionRequirements(
infosFromPath, infosFromPath,
versionInfo.sMinVersion, versionInfo->sMinVersion,
versionInfo.sMaxVersion, versionInfo->sMaxVersion,
versionInfo.vecExcludeVersions); versionInfo->vecExcludeVersions)
== javaPluginError::NONE))
if (errorcode == javaPluginError::NONE) {
{ vecVerifiedInfos.push_back(createJavaInfo(infosFromPath));
vecVerifiedInfos.push_back(createJavaInfo(infosFromPath));
}
}
} }
} }
...@@ -621,9 +593,6 @@ javaPluginError jfw_plugin_startJavaVirtualMachine( ...@@ -621,9 +593,6 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
// unless errorcode is volatile the following warning occurs on gcc: // unless errorcode is volatile the following warning occurs on gcc:
// warning: variable 'errorcode' might be clobbered by `longjmp' or `vfork' // warning: variable 'errorcode' might be clobbered by `longjmp' or `vfork'
volatile javaPluginError errorcode = javaPluginError::NONE; volatile javaPluginError errorcode = javaPluginError::NONE;
//Check if the Vendor (pInfo->sVendor) is supported by this plugin
if ( ! isVendorSupported(pInfo->sVendor))
return javaPluginError::WrongVendor;
#ifdef MACOSX #ifdef MACOSX
rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath( pInfo->sLocation ); rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath( pInfo->sLocation );
if ( !aVendorInfo.is() || aVendorInfo->compareVersions( pInfo->sVersion ) < 0 ) if ( !aVendorInfo.is() || aVendorInfo->compareVersions( pInfo->sVersion ) < 0 )
......
...@@ -1032,6 +1032,7 @@ rtl::Reference<VendorBase> getJREInfoByPath( ...@@ -1032,6 +1032,7 @@ rtl::Reference<VendorBase> getJREInfoByPath(
} }
} }
auto knownVendor = false;
if (!sVendorName.isEmpty()) if (!sVendorName.isEmpty())
{ {
//find the creator func for the respective vendor name //find the creator func for the respective vendor name
...@@ -1043,10 +1044,16 @@ rtl::Reference<VendorBase> getJREInfoByPath( ...@@ -1043,10 +1044,16 @@ rtl::Reference<VendorBase> getJREInfoByPath(
if (sNameMap == sVendorName) if (sNameMap == sVendorName)
{ {
ret = createInstance(gVendorMap[c].createFunc, props); ret = createInstance(gVendorMap[c].createFunc, props);
knownVendor = true;
break; break;
} }
} }
} }
// For unknown vendors, try SunInfo as fallback:
if (!knownVendor)
{
ret = createInstance(SunInfo::createInstance, props);
}
if (!ret.is()) if (!ret.is())
{ {
vecBadPaths.push_back(sFilePath); vecBadPaths.push_back(sFilePath);
......
...@@ -22,10 +22,6 @@ ...@@ -22,10 +22,6 @@
#include "gnujre.hxx" #include "gnujre.hxx"
#include "sunjre.hxx" #include "sunjre.hxx"
#include "otherjre.hxx" #include "otherjre.hxx"
#include <osl/thread.h>
#include <stdio.h>
#include <sal/log.hxx>
namespace jfw_plugin namespace jfw_plugin
{ {
...@@ -54,20 +50,6 @@ VendorSupportMapEntry const gVendorMap[] ={ ...@@ -54,20 +50,6 @@ VendorSupportMapEntry const gVendorMap[] ={
VENDOR_MAP_ENTRY<OtherInfo>("Azul Systems, Inc."), VENDOR_MAP_ENTRY<OtherInfo>("Azul Systems, Inc."),
{nullptr, nullptr, nullptr} }; {nullptr, nullptr, nullptr} };
bool isVendorSupported(const OUString& sVendor)
{
const size_t count = SAL_N_ELEMENTS(gVendorMap) - 1;
for ( size_t pos = 0; pos < count; ++pos )
{
if (sVendor.equalsAscii(gVendorMap[pos].sVendorName))
return true;
}
SAL_INFO(
"jfw.level2", "sunjavaplugin does not support vendor: " << sVendor);
return false;
}
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -41,11 +41,6 @@ template<typename y> constexpr VendorSupportMapEntry VENDOR_MAP_ENTRY(char const ...@@ -41,11 +41,6 @@ template<typename y> constexpr VendorSupportMapEntry VENDOR_MAP_ENTRY(char const
return {x, & y::getJavaExePaths, & y::createInstance}; return {x, & y::getJavaExePaths, & y::createInstance};
} }
/* Examines if the vendor supplied in parameter sVendor is part of the
list of supported vendors. That is the arry of VendorSupportMapEntry
is search for an respective entry.
*/
bool isVendorSupported(const OUString & sVendor);
} }
#endif #endif
......
...@@ -27,9 +27,9 @@ ...@@ -27,9 +27,9 @@
#include <osl/mutex.hxx> #include <osl/mutex.hxx>
#include <osl/file.hxx> #include <osl/file.hxx>
#include <fwkutil.hxx> #include <fwkutil.hxx>
#include "fwkbase.hxx" #include <fwkbase.hxx>
#include "framework.hxx" #include "framework.hxx"
#include "libxmlutil.hxx" #include <libxmlutil.hxx>
#include <osl/thread.hxx> #include <osl/thread.hxx>
#include <algorithm> #include <algorithm>
#include <libxml/parser.h> #include <libxml/parser.h>
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include "framework.hxx" #include "framework.hxx"
#include <fwkutil.hxx> #include <fwkutil.hxx>
#include <elements.hxx> #include <elements.hxx>
#include "fwkbase.hxx" #include <fwkbase.hxx>
namespace { namespace {
...@@ -59,8 +59,6 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI ...@@ -59,8 +59,6 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI
osl::MutexGuard guard(jfw::FwkMutex::get()); osl::MutexGuard guard(jfw::FwkMutex::get());
jfw::VendorSettings aVendorSettings; jfw::VendorSettings aVendorSettings;
std::vector<OUString> vecVendors =
aVendorSettings.getSupportedVendors();
//Add the JavaInfos found by jfw_plugin_getAllJavaInfos to the vector //Add the JavaInfos found by jfw_plugin_getAllJavaInfos to the vector
std::vector<std::unique_ptr<JavaInfo>> vecInfo; std::vector<std::unique_ptr<JavaInfo>> vecInfo;
//get the list of paths to jre locations which have been //get the list of paths to jre locations which have been
...@@ -68,69 +66,47 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI ...@@ -68,69 +66,47 @@ javaFrameworkError jfw_findAllJREs(std::vector<std::unique_ptr<JavaInfo>> *pparI
const jfw::MergedSettings settings; const jfw::MergedSettings settings;
const std::vector<OUString>& vecJRELocations = const std::vector<OUString>& vecJRELocations =
settings.getJRELocations(); settings.getJRELocations();
//Use every plug-in library to get Java installations. //Use all plug-in libraries to get Java installations.
for (auto const & vendor: vecVendors) std::vector<std::unique_ptr<JavaInfo>> arInfos;
{ std::vector<rtl::Reference<jfw_plugin::VendorBase>> infos;
jfw::VersionInfo versionInfo = javaPluginError plerr = jfw_plugin_getAllJavaInfos(
aVendorSettings.getVersionInformation(vendor); true,
aVendorSettings,
& arInfos,
infos);
//get all installations of one vendor according to minVersion, if (plerr != javaPluginError::NONE)
//maxVersion and excludeVersions return JFW_E_ERROR;
std::vector<std::unique_ptr<JavaInfo>> arInfos;
std::vector<rtl::Reference<jfw_plugin::VendorBase>> infos;
javaPluginError plerr = jfw_plugin_getAllJavaInfos(
true,
vendor,
versionInfo.sMinVersion,
versionInfo.sMaxVersion,
versionInfo.vecExcludeVersions,
& arInfos,
infos);
if (plerr != javaPluginError::NONE) for (auto & j: arInfos)
return JFW_E_ERROR; vecInfo.push_back(std::move(j));
for (auto & j: arInfos) //Check if any plugin can detect JREs at the location
vecInfo.push_back(std::move(j)); // of the paths added by jfw_addJRELocation
//Check every manually added location
for (auto const & ii: vecJRELocations)
{
std::unique_ptr<JavaInfo> aInfo;
plerr = jfw_plugin_getJavaInfoByPath(
ii,
aVendorSettings,
&aInfo);
if (plerr == javaPluginError::NoJre)
continue;
if (plerr == javaPluginError::FailedVersion)
continue;
else if (plerr != javaPluginError::NONE)
return JFW_E_ERROR;
//Check if the current plugin can detect JREs at the location // Was this JRE already added?
// of the paths added by jfw_addJRELocation if (std::none_of(
//Check every manually added location vecInfo.begin(), vecInfo.end(),
for (auto const & ii: vecJRELocations) [&aInfo](std::unique_ptr<JavaInfo> const & info) {
return areEqualJavaInfo(
info.get(), aInfo.get());
}))
{ {
std::unique_ptr<JavaInfo> aInfo; vecInfo.push_back(std::move(aInfo));
plerr = jfw_plugin_getJavaInfoByPath(
ii,
vendor,
versionInfo.sMinVersion,
versionInfo.sMaxVersion,
versionInfo.vecExcludeVersions,
&aInfo);
if (plerr == javaPluginError::NoJre)
continue;
if (plerr == javaPluginError::FailedVersion)
continue;
else if (plerr != javaPluginError::NONE)
return JFW_E_ERROR;
// Was this JRE already added? Different plugins could detect
// the same JRE. Also make sure vecInfo contains only JavaInfos
// for the vendors for which there is a javaSelection/plugins/
// library entry in the javavendors.xml; jfw_getJavaInfoByPath
// can return a JavaInfo of any vendor:
if ((std::none_of(
vecInfo.begin(), vecInfo.end(),
[&aInfo](std::unique_ptr<JavaInfo> const & info) {
return areEqualJavaInfo(
info.get(), aInfo.get());
}))
&& (std::find(
vecVendors.begin(), vecVendors.end(),
aInfo->sVendor)
!= vecVendors.end()))
{
vecInfo.push_back(std::move(aInfo));
}
} }
} }
...@@ -304,7 +280,6 @@ javaFrameworkError jfw_startVM( ...@@ -304,7 +280,6 @@ javaFrameworkError jfw_startVM(
g_pJavaVM = pVm; g_pJavaVM = pVm;
*ppVM = pVm; *ppVM = pVm;
} }
OSL_ASSERT(plerr != javaPluginError::WrongVendor);
} }
catch (const jfw::FrameworkException& e) catch (const jfw::FrameworkException& e)
{ {
...@@ -343,25 +318,13 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -343,25 +318,13 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
// get list of vendors for Java installations // get list of vendors for Java installations
jfw::VendorSettings aVendorSettings; jfw::VendorSettings aVendorSettings;
std::vector<OUString> vecVendors =
aVendorSettings.getSupportedVendors();
// save vendors and respective version requirements pair-wise in a vector
std::vector<std::pair<OUString, jfw::VersionInfo>> versionInfos;
for (auto const & vendor : vecVendors)
{
jfw::VersionInfo versionInfo =
aVendorSettings.getVersionInformation(vendor);
versionInfos.emplace_back(vendor, versionInfo);
}
std::vector<rtl::Reference<jfw_plugin::VendorBase>> infos; std::vector<rtl::Reference<jfw_plugin::VendorBase>> infos;
// first inspect Java installation that the JAVA_HOME // first inspect Java installation that the JAVA_HOME
// environment variable points to (if it is set) // environment variable points to (if it is set)
if (jfw_plugin_getJavaInfoFromJavaHome( if (jfw_plugin_getJavaInfoFromJavaHome(
versionInfos, &aCurrentInfo, infos) aVendorSettings, &aCurrentInfo, infos)
== javaPluginError::NONE) == javaPluginError::NONE)
{ {
// compare features // compare features
...@@ -379,7 +342,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -379,7 +342,7 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
{ {
std::vector<std::unique_ptr<JavaInfo>> vecJavaInfosFromPath; std::vector<std::unique_ptr<JavaInfo>> vecJavaInfosFromPath;
if (jfw_plugin_getJavaInfosFromPath( if (jfw_plugin_getJavaInfosFromPath(
versionInfos, vecJavaInfosFromPath, infos) aVendorSettings, vecJavaInfosFromPath, infos)
== javaPluginError::NONE) == javaPluginError::NONE)
{ {
for (auto & pJInfo: vecJavaInfosFromPath) for (auto & pJInfo: vecJavaInfosFromPath)
...@@ -405,31 +368,20 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -405,31 +368,20 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
// if no suitable Java installation has been found yet: // if no suitable Java installation has been found yet:
// first iterate over all vendors to find a suitable Java installation, // first use jfw_plugin_getAllJavaInfos to find a suitable Java installation,
// then try paths that have been added manually // then try paths that have been added manually
if (!bInfoFound) if (!bInfoFound)
{ {
//Use every vendor to get Java installations. At the first usable //get all installations
//Java the loop will break std::vector<std::unique_ptr<JavaInfo>> arInfos;
for (auto const & vendor : vecVendors) javaPluginError plerr = jfw_plugin_getAllJavaInfos(
false,
aVendorSettings,
& arInfos,
infos);
if (plerr == javaPluginError::NONE)
{ {
jfw::VersionInfo versionInfo =
aVendorSettings.getVersionInformation(vendor);
//get all installations of one vendor according to minVersion,
//maxVersion and excludeVersions
std::vector<std::unique_ptr<JavaInfo>> arInfos;
javaPluginError plerr = jfw_plugin_getAllJavaInfos(
false,
vendor,
versionInfo.sMinVersion,
versionInfo.sMaxVersion,
versionInfo.vecExcludeVersions,
& arInfos,
infos);
if (plerr != javaPluginError::NONE)
continue;
//iterate over all installations to find the best which has //iterate over all installations to find the best which has
//all features //all features
for (auto & pJInfo: arInfos) for (auto & pJInfo: arInfos)
...@@ -442,7 +394,6 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -442,7 +394,6 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
//the just found Java implements all required features //the just found Java implements all required features
//currently there is only accessibility!!! //currently there is only accessibility!!!
aCurrentInfo = std::move(pJInfo); aCurrentInfo = std::move(pJInfo);
bInfoFound = true;
break; break;
} }
else if (!aCurrentInfo) else if (!aCurrentInfo)
...@@ -452,12 +403,8 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -452,12 +403,8 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
aCurrentInfo = std::move(pJInfo); aCurrentInfo = std::move(pJInfo);
} }
} }
if (bInfoFound)
break;
//All Java installations found by the current plug-in lib
//do not provide the required features. Try the next plug-in
} }
if (!aCurrentInfo) if (!aCurrentInfo)
{//The plug-ins did not find a suitable Java. Now try the paths which have been {//The plug-ins did not find a suitable Java. Now try the paths which have been
//added manually. //added manually.
...@@ -466,53 +413,41 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo) ...@@ -466,53 +413,41 @@ javaFrameworkError jfw_findAndSelectJRE(std::unique_ptr<JavaInfo> *pInfo)
//node.loadFromSettings(); //node.loadFromSettings();
const std::vector<OUString> & vecJRELocations = const std::vector<OUString> & vecJRELocations =
settings.getJRELocations(); settings.getJRELocations();
//use every plug-in to determine the JavaInfo objects //use all plug-ins to determine the JavaInfo objects
for (auto const & vendor : vecVendors) for (auto const & JRELocation : vecJRELocations)
{ {
jfw::VersionInfo versionInfo = std::unique_ptr<JavaInfo> aInfo;
aVendorSettings.getVersionInformation(vendor); javaPluginError err = jfw_plugin_getJavaInfoByPath(
JRELocation,
for (auto const & JRELocation : vecJRELocations) aVendorSettings,
&aInfo);
if (err == javaPluginError::NoJre)
continue;
if (err == javaPluginError::FailedVersion)
continue;
else if (err !=javaPluginError::NONE)
return JFW_E_ERROR;
if (aInfo)
{ {
std::unique_ptr<JavaInfo> aInfo; // compare features
javaPluginError err = jfw_plugin_getJavaInfoByPath( // If the user does not require any features (nFeatureFlags = 0)
JRELocation, // then the first installation is used
vendor, if ((aInfo->nFeatures & nFeatureFlags) == nFeatureFlags)
versionInfo.sMinVersion,
versionInfo.sMaxVersion,
versionInfo.vecExcludeVersions,
&aInfo);
if (err == javaPluginError::NoJre)
continue;
if (err == javaPluginError::FailedVersion)
continue;
else if (err !=javaPluginError::NONE)
return JFW_E_ERROR;
if (aInfo)
{ {
// compare features //the just found Java implements all required features
// If the user does not require any features (nFeatureFlags = 0) //currently there is only accessibility!!!
// then the first installation is used aCurrentInfo = std::move(aInfo);
if ((aInfo->nFeatures & nFeatureFlags) == nFeatureFlags) break;
{
//the just found Java implements all required features
//currently there is only accessibility!!!
aCurrentInfo = std::move(aInfo);
bInfoFound = true;
break;
}
else if (!aCurrentInfo)
{
// We remember the very first installation in
// aCurrentInfo:
aCurrentInfo = std::move(aInfo);
}
} }
}//end iterate over paths else if (!aCurrentInfo)
if (bInfoFound) {
break; // We remember the very first installation in
}// end iterate plug-ins // aCurrentInfo:
aCurrentInfo = std::move(aInfo);
}
}
}//end iterate over paths
} }
} }
if (aCurrentInfo) if (aCurrentInfo)
...@@ -623,43 +558,21 @@ javaFrameworkError jfw_getJavaInfoByPath(OUString const & pPath, std::unique_ptr ...@@ -623,43 +558,21 @@ javaFrameworkError jfw_getJavaInfoByPath(OUString const & pPath, std::unique_ptr
osl::MutexGuard guard(jfw::FwkMutex::get()); osl::MutexGuard guard(jfw::FwkMutex::get());
jfw::VendorSettings aVendorSettings; jfw::VendorSettings aVendorSettings;
std::vector<OUString> vecVendors =
aVendorSettings.getSupportedVendors();
//Use every plug-in library to determine if the path represents a //ask all plugins if this is a JRE.
//JRE. If a plugin recognized it then the loop will break //If so check if it meets the version requirements.
for (auto const & vendor : vecVendors) //Only if it does return a JavaInfo
{ javaPluginError plerr = jfw_plugin_getJavaInfoByPath(
jfw::VersionInfo versionInfo = pPath,
aVendorSettings.getVersionInformation(vendor); aVendorSettings,
ppInfo);
//ask the plugin if this is a JRE.
//If so check if it meets the version requirements.
//Only if it does return a JavaInfo
javaPluginError plerr = jfw_plugin_getJavaInfoByPath(
pPath,
vendor,
versionInfo.sMinVersion,
versionInfo.sMaxVersion,
versionInfo.vecExcludeVersions,
ppInfo);
if (plerr == javaPluginError::NONE) if(plerr == javaPluginError::FailedVersion)
{ {//found JRE but it has the wrong version
break; ppInfo->reset();
} errcode = JFW_E_FAILED_VERSION;
else if(plerr == javaPluginError::FailedVersion)
{//found JRE but it has the wrong version
ppInfo->reset();
errcode = JFW_E_FAILED_VERSION;
break;
}
else if (plerr == javaPluginError::NoJre)
{// plugin does not recognize this path as belonging to JRE
continue;
}
OSL_ASSERT(false);
} }
OSL_ASSERT(plerr == javaPluginError::NONE || plerr == javaPluginError::NoJre);
if (!*ppInfo && errcode != JFW_E_FAILED_VERSION) if (!*ppInfo && errcode != JFW_E_FAILED_VERSION)
errcode = JFW_E_NOT_RECOGNIZED; errcode = JFW_E_NOT_RECOGNIZED;
} }
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "framework.hxx" #include "framework.hxx"
#include <fwkutil.hxx> #include <fwkutil.hxx>
#include <elements.hxx> #include <elements.hxx>
#include "fwkbase.hxx" #include <fwkbase.hxx>
using namespace osl; using namespace osl;
...@@ -116,11 +116,23 @@ VendorSettings::VendorSettings(): ...@@ -116,11 +116,23 @@ VendorSettings::VendorSettings():
} }
} }
VersionInfo VendorSettings::getVersionInformation(const OUString & sVendor) const boost::optional<VersionInfo> VendorSettings::getVersionInformation(const OUString & sVendor) const
{ {
OSL_ASSERT(!sVendor.isEmpty()); OSL_ASSERT(!sVendor.isEmpty());
VersionInfo aVersionInfo;
OString osVendor = OUStringToOString(sVendor, RTL_TEXTENCODING_UTF8); OString osVendor = OUStringToOString(sVendor, RTL_TEXTENCODING_UTF8);
CXPathObjectPtr pathObject;
pathObject = xmlXPathEvalExpression(
reinterpret_cast<xmlChar const *>(
OString(
"/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"" + osVendor
+ "\"]/jf:minVersion").getStr()),
m_xmlPathContextVendorSettings);
if (xmlXPathNodeSetIsEmpty(pathObject->nodesetval))
{
return {};
}
VersionInfo aVersionInfo;
//Get minVersion //Get minVersion
OString sExpression = OString( OString sExpression = OString(
"/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"") + "/jf:javaSelection/jf:vendorInfos/jf:vendor[@name=\"") +
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 . * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/ */
#include "libxmlutil.hxx" #include <libxmlutil.hxx>
namespace jfw namespace jfw
{ {
......
...@@ -8139,7 +8139,9 @@ jvmaccess/workbench/exceptiontest1.cxx ...@@ -8139,7 +8139,9 @@ jvmaccess/workbench/exceptiontest1.cxx
jvmaccess/workbench/exceptiontest2.cxx jvmaccess/workbench/exceptiontest2.cxx
jvmaccess/workbench/javainfo/javainfotest.cxx jvmaccess/workbench/javainfo/javainfotest.cxx
jvmfwk/inc/elements.hxx jvmfwk/inc/elements.hxx
jvmfwk/inc/fwkbase.hxx
jvmfwk/inc/fwkutil.hxx jvmfwk/inc/fwkutil.hxx
jvmfwk/inc/libxmlutil.hxx
jvmfwk/inc/vendorbase.hxx jvmfwk/inc/vendorbase.hxx
jvmfwk/inc/vendorplugin.hxx jvmfwk/inc/vendorplugin.hxx
jvmfwk/plugins/sunmajor/javaenvsetup/javaldx.cxx jvmfwk/plugins/sunmajor/javaenvsetup/javaldx.cxx
...@@ -8163,10 +8165,8 @@ jvmfwk/source/elements.cxx ...@@ -8163,10 +8165,8 @@ jvmfwk/source/elements.cxx
jvmfwk/source/framework.cxx jvmfwk/source/framework.cxx
jvmfwk/source/framework.hxx jvmfwk/source/framework.hxx
jvmfwk/source/fwkbase.cxx jvmfwk/source/fwkbase.cxx
jvmfwk/source/fwkbase.hxx
jvmfwk/source/fwkutil.cxx jvmfwk/source/fwkutil.cxx
jvmfwk/source/libxmlutil.cxx jvmfwk/source/libxmlutil.cxx
jvmfwk/source/libxmlutil.hxx
l10ntools/inc/cfglex.hxx l10ntools/inc/cfglex.hxx
l10ntools/inc/cfgmerge.hxx l10ntools/inc/cfgmerge.hxx
l10ntools/inc/common.hxx l10ntools/inc/common.hxx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment