| // 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); | 
 |   } | 
 | } |