I have a simple java application ClientApp which has Java Security Manager enable. This application is trying to call method of Test jar which fetches "os.arch" System property. Since it is time consuming we are invoking a new thread using Completable task.
This gives exception
java.util.concurrent.ExecutionException: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "os.arch" "read")
at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
at SecurityApplication.ClientApp.main(ClientApp.java:23)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "os.arch" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:717)
at com.ravindra.CustomSupplier.get(CustomSupplier.java:10)
at com.ravindra.CustomSupplier.get(CustomSupplier.java:5)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
ClientApp :
import com.test.App;
public class ClientApp
{
public static void main(String[] args)
{
//Enable security
SecurityManager securityManager = new SecurityManager();
System.setSecurityManager(securityManager);
TestApp app = new TestApp();
Future<String> future = app.getOsArchitecture();
try
{
// blocking Aysnc get Future call for result
System.out.println(future.get());
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Test.jar has below 2 class file
Test.java
final public class TestApp
{
public Future<String> getOsArchitecture()
{
CompletableFuture<String> completableFuture
= CompletableFuture.supplyAsync(new CustomSupplier());
return completableFuture;
}
}
CustomSupplier.java
public class CustomSupplier implements Supplier<String> {
public CustomSupplier() {
}
public String get() {
//Time consuming complex Task and finally return "os.arch"
//...
//...
//...
return System.getProperty("os.arch");
}
}
However, when we disable the Java Security Manager, the program runs correctly.
Any help is kindly appreciated.