| // 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.utils; | 
 |  | 
 | import com.android.tools.r8.ClassFileResourceProvider; | 
 | import com.android.tools.r8.ProgramResource; | 
 | import com.android.tools.r8.ProgramResource.Kind; | 
 | import com.android.tools.r8.origin.Origin; | 
 | import com.google.common.collect.Sets; | 
 | import java.util.Collections; | 
 | import java.util.HashMap; | 
 | import java.util.Map; | 
 | import java.util.Set; | 
 |  | 
 | /** | 
 |  * Lazy Java class file resource provider based on preloaded/prebuilt context. | 
 |  */ | 
 | public final class PreloadedClassFileProvider implements ClassFileResourceProvider { | 
 |  | 
 |   private static class ClassDescriptorOrigin extends Origin { | 
 |     private final String descriptor; | 
 |  | 
 |     public ClassDescriptorOrigin(String descriptor) { | 
 |       super(Origin.unknown()); | 
 |       this.descriptor = descriptor; | 
 |     } | 
 |  | 
 |     @Override | 
 |     public String part() { | 
 |       return descriptor; | 
 |     } | 
 |   } | 
 |  | 
 |   private final Map<String, byte[]> content; | 
 |  | 
 |   private PreloadedClassFileProvider(Map<String, byte[]> content) { | 
 |     this.content = content; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public Set<String> getClassDescriptors() { | 
 |     return Sets.newHashSet(content.keySet()); | 
 |   } | 
 |  | 
 |   @Override | 
 |   public ProgramResource getProgramResource(String descriptor) { | 
 |     byte[] bytes = content.get(descriptor); | 
 |     if (bytes == null) { | 
 |       return null; | 
 |     } | 
 |     return ProgramResource.fromBytes( | 
 |         new ClassDescriptorOrigin(descriptor), Kind.CF, bytes, Collections.singleton(descriptor)); | 
 |   } | 
 |  | 
 |   public static ClassFileResourceProvider fromClassData(String descriptor, byte[] data) { | 
 |     Builder builder = builder(); | 
 |     builder.addResource(descriptor, data); | 
 |     return builder.build(); | 
 |   } | 
 |  | 
 |   @Override | 
 |   public String toString() { | 
 |     return content.size() + " preloaded resources"; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Create a new empty builder. | 
 |    */ | 
 |   public static Builder builder() { | 
 |     return new Builder(); | 
 |   } | 
 |  | 
 |   public static final class Builder { | 
 |  | 
 |     private Map<String, byte[]> content = new HashMap<>(); | 
 |  | 
 |     private Builder() { | 
 |     } | 
 |  | 
 |     public Builder addResource(String descriptor, byte[] bytes) { | 
 |       assert content != null; | 
 |       assert descriptor != null; | 
 |       assert bytes != null; | 
 |       assert !content.containsKey(descriptor); | 
 |       content.put(descriptor, bytes); | 
 |       return this; | 
 |     } | 
 |  | 
 |     public PreloadedClassFileProvider build() { | 
 |       assert content != null; | 
 |       PreloadedClassFileProvider provider = new PreloadedClassFileProvider(content); | 
 |       content = null; | 
 |       return provider; | 
 |     } | 
 |   } | 
 | } |