Skip to content

Commit

Permalink
Merge pull request hazelcast#14835 from mmedenjak/openj9-module-log-m…
Browse files Browse the repository at this point in the history
…aintenance

Log a warning for illegal reflective access operation in Java9+ OpenJ9
  • Loading branch information
mmedenjak committed Apr 3, 2019
2 parents c66bffb + 53b9dad commit b9a0672
Show file tree
Hide file tree
Showing 3 changed files with 155 additions and 13 deletions.
62 changes: 62 additions & 0 deletions hazelcast/src/main/java/com/hazelcast/internal/util/JavaVm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright (c) 2008-2019, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hazelcast.internal.util;

import java.util.Properties;

/**
* Utility for checking runtime Java VM.
*
*/
public enum JavaVm {
UNKNOWN,
HOTSPOT,
OPENJ9;

public static final JavaVm CURRENT_VM = detectCurrentVM();

private static JavaVm detectCurrentVM() {
Properties properties = System.getProperties();
return parse(properties);
}

static JavaVm parse(Properties properties) {
String vmName = properties.getProperty("java.vm.name");
if (vmName == null) {
return UNKNOWN;
}
// Oracle JDK 'java.vm.name': Java HotSpot(TM) 64-Bit Server VM
// Oracle JDK 'sun.management.compiler': HotSpot 64-Bit Tiered Compilers
if (vmName.contains("HotSpot")) {
return HOTSPOT;
}
// Eclipse OpenJ9 'java.vm.name': Eclipse OpenJ9 VM
if (vmName.contains("OpenJ9")) {
return OPENJ9;
}
String prop = properties.getProperty("sun.management.compiler");
if (prop == null) {
return UNKNOWN;
}
// HotSpot based OpenJDK builds 'java.vm.name': OpenJDK 64-Bit Server VM.
// HotSpot based OpenJDK builds 'sun.management.compiler': HotSpot 64-Bit Tiered Compilers
if (prop.contains("HotSpot")) {
return HOTSPOT;
}
return UNKNOWN;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@

package com.hazelcast.internal.util;

import static com.hazelcast.internal.util.ModularJavaUtils.PackageAccessRequirement.createRequirement;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.logging.ILogger;
import com.hazelcast.logging.Logger;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.hazelcast.core.Hazelcast;
import com.hazelcast.logging.ILogger;
import com.hazelcast.logging.Logger;
import static com.hazelcast.internal.util.ModularJavaUtils.PackageAccessRequirement.createRequirement;

/**
* Helper class for simplify work with Java module system (Java 9+) in older Java versions.
Expand Down Expand Up @@ -71,13 +71,20 @@ public static void checkJavaInternalAccess(ILogger logger) {
createRequirement(true, "java.nio"),
createRequirement(true, "sun.nio.ch")
});
requirements.put("jdk.management",
new PackageAccessRequirement[] { createRequirement(true, "com.sun.management.internal") });
requirements.put("jdk.management", getJdkManagementRequirements());
requirements.put("java.management", new PackageAccessRequirement[] { createRequirement(true, "sun.management") });
checkPackageRequirements(logger, requirements);
}

protected static void checkPackageRequirements(ILogger logger, Map<String, PackageAccessRequirement[]> requirements) {
private static PackageAccessRequirement[] getJdkManagementRequirements() {
if (JavaVm.CURRENT_VM == JavaVm.OPENJ9) {
return new PackageAccessRequirement[] {createRequirement(true, "com.sun.management.internal"),
createRequirement(true, "com.ibm.lang.management.internal")};
}
return new PackageAccessRequirement[] {createRequirement(true, "com.sun.management.internal")};
}

static void checkPackageRequirements(ILogger logger, Map<String, PackageAccessRequirement[]> requirements) {
if (!hasHazelcastPackageAccess(requirements)) {
String hazelcastModule = getHazelcastModuleName();
if (hazelcastModule == null) {
Expand Down Expand Up @@ -131,14 +138,14 @@ private static String createOpenPackageJavaArguments(String hzModuleName,
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, PackageAccessRequirement[]> moduleEntry : requirements.entrySet()) {
for (PackageAccessRequirement requirement : moduleEntry.getValue()) {
sb.append((requirement.forReflection ? " --add-opens " : " --add-exports ") + moduleEntry.getKey() + "/"
+ requirement.packageName + "=" + hzModuleName);
sb.append(requirement.forReflection ? " --add-opens " : " --add-exports ").append(moduleEntry.getKey())
.append("/").append(requirement.packageName).append("=").append(hzModuleName);
}
}
return sb.toString();
}

public static final class PackageAccessRequirement {
static final class PackageAccessRequirement {
private final String packageName;
private final boolean forReflection;

Expand All @@ -147,15 +154,15 @@ private PackageAccessRequirement(boolean forReflection, String packageName) {
this.forReflection = forReflection;
}

public static PackageAccessRequirement createRequirement(boolean forReflection, String packageName) {
static PackageAccessRequirement createRequirement(boolean forReflection, String packageName) {
return new PackageAccessRequirement(forReflection, packageName);
}

public String getPackageName() {
String getPackageName() {
return packageName;
}

public boolean isForReflection() {
boolean isForReflection() {
return forReflection;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2008-2019, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.hazelcast.internal.util;

import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.annotation.ParallelTest;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

import java.util.Properties;

import static org.junit.Assert.assertEquals;


@RunWith(HazelcastSerialClassRunner.class)
@Category({QuickTest.class, ParallelTest.class})
public class JavaVmTest {

@Test
public void parseOracleJdkProps() {
Properties props = new Properties();
props.put("java.vm.name", "Java HotSpot(TM) 64-Bit Server VM");
props.put("sun.management.compiler", "HotSpot 64-Bit Tiered Compilers");

JavaVm javaVm = JavaVm.parse(props);
assertEquals(JavaVm.HOTSPOT, javaVm);
}

@Test
public void parseZuluOpenJdkProps() {
Properties props = new Properties();
props.put("java.vm.name", "OpenJDK 64-Bit Server VM");
props.put("sun.management.compiler", "HotSpot 64-Bit Tiered Compilers");

JavaVm javaVm = JavaVm.parse(props);
assertEquals(JavaVm.HOTSPOT, javaVm);
}

@Test
public void parseEclipseOpenJdkProps() {
Properties props = new Properties();
props.put("java.vm.name", "OpenJDK 64-Bit Server VM");
props.put("sun.management.compiler", "HotSpot 64-Bit Tiered Compilers");

JavaVm javaVm = JavaVm.parse(props);
assertEquals(JavaVm.HOTSPOT, javaVm);
}

@Test
public void parseEclipseOpenJ9OpenJdkProps() {
Properties props = new Properties();
props.put("java.vm.name", "Eclipse OpenJ9 VM");

JavaVm javaVm = JavaVm.parse(props);
assertEquals(JavaVm.OPENJ9, javaVm);
}
}

0 comments on commit b9a0672

Please sign in to comment.