// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/BasicSObjectInformation.java
// public interface BasicSObjectInformation extends Serializable {
//     BasicSObjectDescription getBasicObjectDescribe();
// 
//     List<Map<String, ?>> getRecentItems();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/GlobalDescription.java
// public interface GlobalDescription extends Serializable {
//     String getEncoding();
// 
//     Integer getMaxBatchSize();
// 
//     List<BasicSObjectDescription> getSObjects();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/QueryResult.java
// public interface QueryResult extends Serializable {
// 
//     public int getTotalSize();
// 
//     public boolean isDone();
// 
//     public List<Map<String, ?>> getRecords();
// 
//     public String getNextRecordsUrl();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/SObjectDescription.java
// public interface SObjectDescription extends BasicSObjectDescription, Serializable {
// 
//     List<? extends Field> getFields();
// 
//     List<? extends ChildEntity> getChildRelationships();
// 
//     static interface Field extends Serializable {
//         Integer getLength();
// 
//         String getName();
// 
//         String getType();
// 
//         String getSoapType();
// 
//         String getDefaultValue();
// 
//         String getLabel();
// 
//         Boolean isUpdateable();
// 
//         Boolean isCalculated();
// 
//         Boolean isUnique();
// 
//         Boolean isNillable();
// 
//         Boolean isCaseSensitive();
// 
//         String getInlineHelpText();
// 
//         Boolean isNameField();
// 
//         Boolean isExternalId();
// 
//         Boolean isIdLookup();
// 
//         Boolean isFilterable();
// 
//         Boolean isCreateable();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isAutoNumber();
// 
//         Boolean isDefaultedOnCreate();
// 
//         Boolean isGroupable();
// 
//         String getRelationshipName();
// 
//         List<String> getReferenceTo();
// 
//         Boolean isRestrictedPicklist();
// 
//         Boolean isNamePointing();
// 
//         Boolean isCustom();
// 
//         Boolean isHtmlFormatted();
// 
//         Boolean isDependentPicklist();
// 
//         Boolean isWriteRequiresMasterRead();
// 
//         Boolean isSortable();
//     }
// 
//     static interface ChildEntity extends Serializable {
//         String getField();
// 
//         String getChildSObject();
// 
//         String getRelationshipName();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isCascadeDelete();
//     }
// }


import com.github.ryanbrainard.richsobjects.api.model.BasicSObjectInformation;
import com.github.ryanbrainard.richsobjects.api.model.GlobalDescription;
import com.github.ryanbrainard.richsobjects.api.model.QueryResult;
import com.github.ryanbrainard.richsobjects.api.model.SObjectDescription;
import java.util.Map;
    }

    public String createSObject(String type, Map<String, ?> record) {
        return api.createSObject(type, record);
    }

    public void updateSObject(String type, String id, Map<String, ?> record) {
        cachedSObjects.remove(id);
        api.updateSObject(type, id, record);
    }

    public void deleteSObject(String type, String id) {
        cachedSObjects.remove(id);
        api.deleteSObject(type, id);
    }

    public Map<String, ?> getSObject(String type, String id) {
        if (cachedSObjects.containsKey(id)) {
            return cachedSObjects.get(id);
        } else {
            final Map<String, ?> value = api.getSObject(type, id);
            cachedSObjects.put(id, value);
            return value;
        }
    }

    public QueryResult query(String soql) {
        return api.query(soql);
    }

// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/BasicSObjectInformation.java
// public interface BasicSObjectInformation extends Serializable {
//     BasicSObjectDescription getBasicObjectDescribe();
// 
//     List<Map<String, ?>> getRecentItems();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/GlobalDescription.java
// public interface GlobalDescription extends Serializable {
//     String getEncoding();
// 
//     Integer getMaxBatchSize();
// 
//     List<BasicSObjectDescription> getSObjects();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/QueryResult.java
// public interface QueryResult extends Serializable {
// 
//     public int getTotalSize();
// 
//     public boolean isDone();
// 
//     public List<Map<String, ?>> getRecords();
// 
//     public String getNextRecordsUrl();
// }
// 
// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/SObjectDescription.java
// public interface SObjectDescription extends BasicSObjectDescription, Serializable {
// 
//     List<? extends Field> getFields();
// 
//     List<? extends ChildEntity> getChildRelationships();
// 
//     static interface Field extends Serializable {
//         Integer getLength();
// 
//         String getName();
// 
//         String getType();
// 
//         String getSoapType();
// 
//         String getDefaultValue();
// 
//         String getLabel();
// 
//         Boolean isUpdateable();
// 
//         Boolean isCalculated();
// 
//         Boolean isUnique();
// 
//         Boolean isNillable();
// 
//         Boolean isCaseSensitive();
// 
//         String getInlineHelpText();
// 
//         Boolean isNameField();
// 
//         Boolean isExternalId();
// 
//         Boolean isIdLookup();
// 
//         Boolean isFilterable();
// 
//         Boolean isCreateable();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isAutoNumber();
// 
//         Boolean isDefaultedOnCreate();
// 
//         Boolean isGroupable();
// 
//         String getRelationshipName();
// 
//         List<String> getReferenceTo();
// 
//         Boolean isRestrictedPicklist();
// 
//         Boolean isNamePointing();
// 
//         Boolean isCustom();
// 
//         Boolean isHtmlFormatted();
// 
//         Boolean isDependentPicklist();
// 
//         Boolean isWriteRequiresMasterRead();
// 
//         Boolean isSortable();
//     }
// 
//     static interface ChildEntity extends Serializable {
//         String getField();
// 
//         String getChildSObject();
// 
//         String getRelationshipName();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isCascadeDelete();
//     }
// }


// Path: richsobjects-cache-simple/src/main/java/com/github/ryanbrainard/richsobjects/api/client/SimpleInMemoryUserCache.java
import com.github.ryanbrainard.richsobjects.api.model.BasicSObjectInformation;
import com.github.ryanbrainard.richsobjects.api.model.GlobalDescription;
import com.github.ryanbrainard.richsobjects.api.model.QueryResult;
import com.github.ryanbrainard.richsobjects.api.model.SObjectDescription;
import java.util.Map;

    }

    public String createSObject(String type, Map<String, ?> record) {
        return api.createSObject(type, record);
    }

    public void updateSObject(String type, String id, Map<String, ?> record) {
        cachedSObjects.remove(id);
        api.updateSObject(type, id, record);
    }

    public void deleteSObject(String type, String id) {
        cachedSObjects.remove(id);
        api.deleteSObject(type, id);
    }

    public Map<String, ?> getSObject(String type, String id) {
        if (cachedSObjects.containsKey(id)) {
            return cachedSObjects.get(id);
        } else {
            final Map<String, ?> value = api.getSObject(type, id);
            cachedSObjects.put(id, value);
            return value;
        }
    }

    public QueryResult query(String soql) {
        return api.query(soql);
    }

    public QueryResult queryMore(String nextRecordsUrl) {