public abstract class ApiRequest<T> {
    
    private String apiKey;
    private String baseUrl;
    private Properties query;
    private String url;
    
    private T request;
    
    private String id;
    
    protected abstract String getApiKey();
    
    protected abstract String getBaseUrl();
    
    protected abstract Properties getQuery();
    
    protected abstract Class<?> getJsonClass();
    
    private String assembleUrl() {
        StringJoiner url = new StringJoiner("&", baseUrl + '?', "");
        for (String name : query.keySet()) {
            url.add(name + '=' + query.getProperty(name));
        }
        return url.toString();
    }
    
    public ApiRequest() {
        apiKey = getApiKey();
        query = getQuery();
        query.setProperty("key", apiKey);
        
        url = assembleUrl();
    }
    
    protected abstract T parseRequest(Reader reader);
    
    private Reader getHttpRequestReader() {
        return Internet.getBufferedReader(url);
    }
    
    private Reader getCachedRequestReader() {
        
    }
    
    private boolean isCached() {
        
    }
    
    public T get() {
        if (request == null) {
            Reader requestReader;
            if (isCached()) {
                requestReader = getCachedRequestReader();
            } else {
                requestReader = getHttpRequestReader();
            }
            request = parseRequest(requestReader);
        }
        return request;
    }
    
}

@@ -32,24 +32,142 @@
 t%3CT%3E %7B%0A    %0A
+    private static final Map%3CString, String%3E id2pathMap = new ConcurrentHashMap%3C%3E();%0A    static %7B%0A        %0A    %7D%0A    %0A
     private 
@@ -1168,32 +1168,94 @@
 der() %7B%0A        
+return Files.newBufferedReader(Paths.get(id2pathMap.get(id)));
 %0A    %7D%0A    %0A    
@@ -1283,32 +1283,66 @@
 hed() %7B%0A        
+return id2pathMap.containsKey(id);
 %0A    %7D%0A    %0A    

Update ApiRequest.java