Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Avoid explicit call to close() on an auto-closeable resource.
[simgrid.git] / src / bindings / java / org / simgrid / NativeLib.java
index 11578d490b8d83e6f14f70f54769270e63f3bbb4..3db622c0718da378cf117802db70b0e253f991b8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2014-2018. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -13,22 +13,22 @@ import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
-/** Helper class loading the native functions of SimGrid that we use for downcalls 
- * 
- * Almost all org.simgrid.msg.* classes contain a static bloc (thus executed when the class is loaded) 
+/** Helper class loading the native functions of SimGrid that we use for downcalls
+ *
+ * Almost all org.simgrid.msg.* classes contain a static bloc (thus executed when the class is loaded)
  * containing a call to this.
  */
 public final class NativeLib {
        private static boolean isNativeInited = false;
-       static Path tempDir = null; // where the embeeded libraries are unpacked before loading them
+       private static Path tempDir = null; // where the embeeded libraries are unpacked before loading them
 
        /** A static-only "class" don't need no constructor */
        private NativeLib() {
                throw new IllegalAccessError("Utility class");
        }
 
-       /** Hidden debug main() function 
-        * 
+       /** Hidden debug main() function
+        *
         * It is not the Main-Class defined in src/bindings/java/MANIFEST.in (org.simgrid.msg.Msg is),
         * so it won't get executed by default. But that's helpful to debug linkage errors, if you
         * know that it exists. It's used by cmake during the configure, to inform the user.
@@ -96,13 +96,14 @@ public final class NativeLib {
                }
                
                /* For each possible filename of the given library on all possible OSes, try it */
-               for (String filename : new String[] 
-                  { name, 
+               for (String filename : new String[]
+                  { name,
                     "lib"+name+".so",               /* linux */
                     name+".dll", "lib"+name+".dll", /* windows (pure and mingw) */
                     "lib"+name+".dylib"             /* mac osx */}) {
                                                
                        File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename);
+                       boolean done = false;
                        try ( // Try-with-resources. These stream will be autoclosed when needed.
                                InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(path+filename);
                                OutputStream out = new FileOutputStream(fileOut);
@@ -110,20 +111,20 @@ public final class NativeLib {
                                if (in == null)
                                        continue; // Try the next name: no such file found
                                
-                               /* copy the library in position */  
-                               byte[] buffer = new byte[4096]; 
-                               int bytesRead; 
+                               /* copy the library in position */
+                               byte[] buffer = new byte[4096];
+                               int bytesRead;
                                while ((bytesRead = in.read(buffer)) != -1)     // Read until EOF
-                                       out.write(buffer, 0, bytesRead); 
-                               
-                               out.close(); // Windows cannot open it twice, so close it first. Shame.
+                                       out.write(buffer, 0, bytesRead);
                                
+                               done = true;
+                       }
+                       if (done) {
                                /* load that shit */
                                System.load(fileOut.getAbsolutePath());
                                
                                /* It loaded! we're good */
                                return true;
-                               
                        }
                }
                
@@ -169,7 +170,7 @@ public final class NativeLib {
                                if (! dir.delete() && !dir.getAbsolutePath().contains("appveyor") )
                                        System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown.");                                
                        } catch(Exception e) {
-                               System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause());
+                               System.out.println("Error while cleaning temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause());
                                e.printStackTrace();
                        }
                }