blob: f78983f7b2fe01d90b2526426a3bb48b8fc272db [file] [log] [blame]
// 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;
}
}