1 package com.google.ortools;
3 import com.sun.jna.Platform;
4 import java.io.IOException;
6 import java.net.URISyntaxException;
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;
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",
32 resourceURI = resourceURL.toURI();
33 }
catch (URISyntaxException e) {
34 throw new IOException(e);
40 private interface PathConsumer<T
extends IOException> {
41 void accept(Path path)
throws T;
48 private static Path unpackNativeResources(URI resourceURI)
throws IOException {
50 tempPath = Files.createTempDirectory(
"ortools-java");
51 tempPath.toFile().deleteOnExit();
53 PathConsumer<?> visitor;
54 visitor = (Path sourcePath) -> Files.walkFileTree(sourcePath,
new SimpleFileVisitor<Path>() {
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;
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;
72 FileSystem fs = FileSystems.newFileSystem(resourceURI, Collections.emptyMap());
73 Path p = fs.provider().getPath(resourceURI);
81 URI resourceURI = getNativeResourceURI();
82 Path tempPath = unpackNativeResources(resourceURI);
85 tempPath.resolve(Platform.RESOURCE_PREFIX)
86 .resolve(System.mapLibraryName(
"jniortools"))
88 }
catch (IOException e) {
89 throw new RuntimeException(e);