| // 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); | 
 |       } | 
 |     } | 
 |  | 
 |     public String getStringWithRuntimeException() { | 
 |       try { | 
 |         return getString(); | 
 |       } catch (ResourceException e) { | 
 |         throw new RuntimeException(e); | 
 |       } | 
 |     } | 
 |   } | 
 | } |