Java Reference

Java Reference

Loader.java
Go to the documentation of this file.
1 package com.google.ortools;
2 
3 import com.sun.jna.Platform;
4 import java.io.IOException;
5 import java.net.URI;
6 import java.net.URISyntaxException;
7 import java.net.URL;
8 import java.nio.file.FileSystem;
9 import java.nio.file.FileSystems;
10 import java.nio.file.FileVisitResult;
11 import java.nio.file.Files;
12 import java.nio.file.Path;
13 import java.nio.file.SimpleFileVisitor;
14 import java.nio.file.attribute.BasicFileAttributes;
15 import java.util.Collections;
16 import java.util.Objects;
17 
19 public class Loader {
21  private static URI getNativeResourceURI() throws IOException {
22  ClassLoader loader = Loader.class.getClassLoader();
23  String resource = Platform.RESOURCE_PREFIX + "/";
24  URL resourceURL = loader.getResource(resource);
25  Objects.requireNonNull(resourceURL,
26  String.format("Resource %s was not found in ClassLoader %s", resource, loader));
27 
28  URI resourceURI;
29  try {
30  resourceURI = resourceURL.toURI();
31  } catch (URISyntaxException e) {
32  throw new IOException(e);
33  }
34  return resourceURI;
35  }
36 
37  @FunctionalInterface
38  private interface PathConsumer<T extends IOException> {
39  void accept(Path path) throws T;
40  }
41 
47  private static Path unpackNativeResources(URI resourceURI) throws IOException {
48  Path tempPath;
49  tempPath = Files.createTempDirectory("ortools-java");
50  tempPath.toFile().deleteOnExit();
51 
52  PathConsumer<?> visitor;
53  visitor = (Path sourcePath) -> Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
54  @Override
55  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
56  Path newPath = tempPath.resolve(sourcePath.getParent().relativize(file).toString());
57  Files.copy(file, newPath);
58  newPath.toFile().deleteOnExit();
59  return FileVisitResult.CONTINUE;
60  }
61 
62  @Override
63  public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
64  throws IOException {
65  Path newPath = tempPath.resolve(sourcePath.getParent().relativize(dir).toString());
66  Files.copy(dir, newPath);
67  newPath.toFile().deleteOnExit();
68  return FileVisitResult.CONTINUE;
69  }
70  });
71 
72  FileSystem fs = FileSystems.newFileSystem(resourceURI, Collections.emptyMap());
73  Path p = fs.provider().getPath(resourceURI);
74  visitor.accept(p);
75  return tempPath;
76  }
77 
79  private static boolean loaded = false;
80  public static void loadNativeLibraries() {
81  if (!loaded) {
82  try {
83  URI resourceURI = getNativeResourceURI();
84  Path tempPath = unpackNativeResources(resourceURI);
85  // Load the native library
86  System.load(tempPath.resolve(Platform.RESOURCE_PREFIX)
87  .resolve(System.mapLibraryName("jniortools"))
88  .toString());
89  loaded = true;
90  } catch (IOException e) {
91  throw new RuntimeException(e);
92  }
93  }
94  }
95 }
static void loadNativeLibraries()
Definition: Loader.java:80
Load native libraries needed for using ortools-java.
Definition: Loader.java:19