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",
27  resource,
28  loader));
29 
30  URI resourceURI;
31  try {
32  resourceURI = resourceURL.toURI();
33  } catch (URISyntaxException e) {
34  throw new IOException(e);
35  }
36  return resourceURI;
37  }
38 
39  @FunctionalInterface
40  private interface PathConsumer<T extends IOException> {
41  void accept(Path path) throws T;
42  }
43 
48  private static Path unpackNativeResources(URI resourceURI) throws IOException {
49  Path tempPath;
50  tempPath = Files.createTempDirectory("ortools-java");
51  tempPath.toFile().deleteOnExit();
52 
53  PathConsumer<?> visitor;
54  visitor = (Path sourcePath) -> Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {
55  @Override
56  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
57  Path newPath = tempPath.resolve(sourcePath.getParent().relativize(file).toString());
58  Files.copy(file, newPath);
59  newPath.toFile().deleteOnExit();
60  return FileVisitResult.CONTINUE;
61  }
62 
63  @Override
64  public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) 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  public static void loadNativeLibraries() {
80  try {
81  URI resourceURI = getNativeResourceURI();
82  Path tempPath = unpackNativeResources(resourceURI);
83  // Load the native library
84  System.load(
85  tempPath.resolve(Platform.RESOURCE_PREFIX)
86  .resolve(System.mapLibraryName("jniortools"))
87  .toString());
88  } catch (IOException e) {
89  throw new RuntimeException(e);
90  }
91  }
92 }
93 
static void loadNativeLibraries()
Unpack and Load the native libraries needed for using ortools-java.
Definition: Loader.java:79
Load native libraries needed for using ortools-java.
Definition: Loader.java:19