|  | // Copyright (c) 2017, 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 com.android.tools.r8.origin.Origin; | 
|  | import com.android.tools.r8.origin.PathOrigin; | 
|  | import com.android.tools.r8.utils.FileUtils; | 
|  | import java.io.IOException; | 
|  | import java.nio.charset.Charset; | 
|  | import java.nio.charset.StandardCharsets; | 
|  | import java.nio.file.Path; | 
|  |  | 
|  | public interface StringResource extends Resource { | 
|  |  | 
|  | /** | 
|  | * Create a string resource from a string. | 
|  | * | 
|  | * <p>The origin of the resource must be supplied upon construction. If no reasonable origin | 
|  | * exits, use {@link Origin#unknown()}. | 
|  | * | 
|  | * @param content String content for the string resource. | 
|  | * @param origin Origin of the string resource. | 
|  | */ | 
|  | static StringResource fromString(String content, Origin origin) { | 
|  | return new StringContentResource(origin, content); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Create a string resource for the contents of a given UTF-8 encoded text file. | 
|  | * | 
|  | * <p>The origin of the resource is the path of the file. | 
|  | * | 
|  | * @param file Path of file with UTF-8 encoded text. | 
|  | */ | 
|  | static FileResource fromFile(Path file) { | 
|  | return fromFile(file, StandardCharsets.UTF_8); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Create a string resource for the contents of a given file. | 
|  | * | 
|  | * <p>The origin of the resource is the path of the file. | 
|  | * | 
|  | * @param file Path of file. | 
|  | * @param charset Charset coding of file. | 
|  | */ | 
|  | static FileResource fromFile(Path file, Charset charset) { | 
|  | return new FileResource(file, charset); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Get the string content of the string resource. | 
|  | * | 
|  | * @return The string content of the resource. | 
|  | * @throws ResourceException Exception thrown if the resource fails to produce its content. | 
|  | */ | 
|  | String getString() throws ResourceException; | 
|  |  | 
|  | class StringContentResource implements StringResource { | 
|  | private final Origin origin; | 
|  | private final String content; | 
|  |  | 
|  | private StringContentResource(Origin origin, String content) { | 
|  | assert origin != null; | 
|  | assert content != null; | 
|  | this.origin = origin; | 
|  | this.content = content; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Origin getOrigin() { | 
|  | return origin; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public String getString() { | 
|  | return content; | 
|  | } | 
|  | } | 
|  |  | 
|  | class FileResource implements StringResource { | 
|  | private final Path file; | 
|  | private final Charset charset; | 
|  | private final Origin origin; | 
|  |  | 
|  | private FileResource(Path file, Charset charset) { | 
|  | assert file != null; | 
|  | assert charset != null; | 
|  | this.file = file; | 
|  | this.charset = charset; | 
|  | origin = new PathOrigin(file); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Origin getOrigin() { | 
|  | return origin; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public String getString() throws ResourceException { | 
|  | try { | 
|  | return FileUtils.readTextFile(file, charset); | 
|  | } catch (IOException e) { | 
|  | throw new ResourceException(origin, e); | 
|  | } | 
|  | } | 
|  | } | 
|  | } |