| // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8; | |
| import java.io.File; | |
| import java.io.FileInputStream; | |
| import java.io.FileOutputStream; | |
| import java.io.IOException; | |
| import java.io.OutputStream; | |
| import java.net.URI; | |
| import java.nio.file.FileSystem; | |
| import java.nio.file.LinkOption; | |
| import java.nio.file.Path; | |
| // Mock Path since Path is not present before Dex-8. | |
| // File is present and it contains most of the utilities. | |
| public class MockedPath implements Path { | |
| private MockedPath(File file) { | |
| this.wrappedFile = file; | |
| } | |
| public static Path of(File file, String... more) { | |
| // Delegate to File separator management. | |
| File current = file; | |
| for (String s : more) { | |
| current = new File(current.getPath(), s); | |
| } | |
| return new MockedPath(current); | |
| } | |
| public static Path of(String first, String... more) { | |
| return of(new File(first), more); | |
| } | |
| // MockedPath wraps the path in a file. | |
| private File wrappedFile; | |
| @Override | |
| public FileSystem getFileSystem() { | |
| throw new RuntimeException("Mocked Path does not implement getFileSystem"); | |
| } | |
| @Override | |
| public boolean isAbsolute() { | |
| throw new RuntimeException("Mocked Path does not implement isAbsolute"); | |
| } | |
| @Override | |
| public Path getRoot() { | |
| throw new RuntimeException("Mocked Path does not implement getRoot"); | |
| } | |
| @Override | |
| public Path getFileName() { | |
| return of(wrappedFile.getName()); | |
| } | |
| @Override | |
| public Path getParent() { | |
| return of(wrappedFile.getParent()); | |
| } | |
| @Override | |
| public int getNameCount() { | |
| throw new RuntimeException("Mocked Path does not implement getNameCount"); | |
| } | |
| @Override | |
| public Path getName(int index) { | |
| throw new RuntimeException("Mocked Path does not implement getName"); | |
| } | |
| @Override | |
| public Path subpath(int beginIndex, int endIndex) { | |
| throw new RuntimeException("Mocked Path does not implement subpath"); | |
| } | |
| @Override | |
| public boolean startsWith(Path other) { | |
| throw new RuntimeException("Mocked Path does not implement startsWith"); | |
| } | |
| @Override | |
| public boolean endsWith(Path other) { | |
| throw new RuntimeException("Mocked Path does not implement endswith"); | |
| } | |
| @Override | |
| public Path normalize() { | |
| throw new RuntimeException("Mocked Path does not implement normalize"); | |
| } | |
| @Override | |
| public Path resolve(Path other) { | |
| return new MockedPath(new File(wrappedFile.getPath(), other.toString())); | |
| } | |
| @Override | |
| public Path resolve(String other) { | |
| return new MockedPath(new File(wrappedFile.getPath(), other)); | |
| } | |
| @Override | |
| public Path relativize(Path other) { | |
| throw new RuntimeException("Mocked Path does not implement relativize"); | |
| } | |
| @Override | |
| public URI toUri() { | |
| throw new RuntimeException("Mocked Path does not implement toUri"); | |
| } | |
| @Override | |
| public Path toAbsolutePath() { | |
| throw new RuntimeException("Mocked Path does not implement toAbsolutePath"); | |
| } | |
| @Override | |
| public Path toRealPath(LinkOption... options) throws IOException { | |
| throw new RuntimeException("Mocked Path does not implement toRealPath"); | |
| } | |
| @Override | |
| public int compareTo(Path other) { | |
| throw new RuntimeException("Mocked Path does not implement compareTo"); | |
| } | |
| @Override | |
| public String toString() { | |
| return wrappedFile.toString(); | |
| } | |
| @Override | |
| public File toFile() { | |
| return wrappedFile; | |
| } | |
| // Compatibility with Files. | |
| public byte[] getAllBytes() throws IOException { | |
| FileInputStream fileInputStream = new FileInputStream(wrappedFile); | |
| // In android the result of file.length() is long | |
| // byte count of the file-content | |
| long byteLength = wrappedFile.length(); | |
| byte[] filecontent = new byte[(int) byteLength]; | |
| fileInputStream.read(filecontent, 0, (int) byteLength); | |
| return filecontent; | |
| } | |
| public OutputStream newOutputStream(boolean append) throws IOException { | |
| return new FileOutputStream(wrappedFile, append); | |
| } | |
| } |