| // Copyright (c) 2018, 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.utils; |
| |
| import com.android.tools.r8.ByteDataView; |
| import com.android.tools.r8.DataEntryResource; |
| import com.android.tools.r8.DiagnosticsHandler; |
| import com.android.tools.r8.ResourceException; |
| import com.android.tools.r8.origin.Origin; |
| import com.android.tools.r8.origin.PathOrigin; |
| import com.google.common.io.ByteStreams; |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| |
| public class DirectoryBuilder implements OutputBuilder { |
| private final Path root; |
| private final Origin origin; |
| |
| public DirectoryBuilder(Path root) { |
| this.root = root; |
| origin = new PathOrigin(root); |
| } |
| |
| @Override |
| public void open() { |
| } |
| |
| @Override |
| public void close(DiagnosticsHandler handler) { |
| } |
| |
| @Override |
| public void addDirectory(String name, DiagnosticsHandler handler) { |
| Path target = root.resolve(name.replace(NAME_SEPARATOR, File.separatorChar)); |
| try { |
| Files.createDirectories(target); |
| } catch (IOException e) { |
| handler.error(new ExceptionDiagnostic(e, new PathOrigin(target))); |
| } |
| } |
| |
| @Override |
| public void addFile(String name, DataEntryResource content, DiagnosticsHandler handler) { |
| try (InputStream in = content.getByteStream()) { |
| addFile(name, ByteDataView.of(ByteStreams.toByteArray(in)), handler); |
| } catch (IOException e) { |
| handler.error(new ExceptionDiagnostic(e, content.getOrigin())); |
| } catch (ResourceException e) { |
| handler.error(new StringDiagnostic("Failed to open input: " + e.getMessage(), |
| content.getOrigin())); |
| } |
| } |
| |
| @Override |
| public synchronized void addFile(String name, ByteDataView content, DiagnosticsHandler handler) { |
| Path target = root.resolve(name.replace(NAME_SEPARATOR, File.separatorChar)); |
| try { |
| Files.createDirectories(target.getParent()); |
| FileUtils.writeToFile(target, null, content); |
| } catch (IOException e) { |
| handler.error(new ExceptionDiagnostic(e, new PathOrigin(target))); |
| } |
| } |
| |
| @Override |
| public void addIndexedClassFile( |
| int index, String name, ByteDataView content, DiagnosticsHandler handler) { |
| addFile(name, content, handler); |
| } |
| |
| @Override |
| public Origin getOrigin() { |
| return origin; |
| } |
| |
| @Override |
| public Path getPath() { |
| return root; |
| } |
| } |