class DynamoDBJSONRootWorker implements Callable<Map<String, String>> {

    public static Map<String, String> getMissionToManifestMap(final URL rootJsonUrl, final int connectTimeout)
        throws IOException {
        final Map<String, String> map = new HashMap<String, String>();
        // Retrieve JSON
        final JsonNode root = JSONParser.getJSONFromURL(rootJsonUrl, connectTimeout);
        final Iterator<Entry<String, JsonNode>> it = root.fields();
        // Top level is array of mission names
        while (it.hasNext()) {
            final Entry<String, JsonNode> pair = it.next();
            final String mission = pair.getKey();
            if (pair.getKey() == null) {
                // Log error and skip mission
                LOGGER.warning("Null mission name");
                continue;
            }
            final JsonNode missionObject = pair.getValue();
            if (missionObject == null) {
                // Log error and skip mission
                LOGGER.warning("Null mission object for: " + mission);
                continue;
            }
            if (!missionObject.has(IMAGE_RESOURCE_KEY)) {
                // Log error and skip mission
                LOGGER.warning("Missing mission manifest for " + mission + ": " + missionObject.toString());
                continue;
            }
            // Image manifest key has URL
            final String manifestValue = missionObject.get(IMAGE_RESOURCE_KEY).asText();
            map.put(mission, manifestValue);
        }
        return map;
    }

    public  DynamoDBJSONRootWorker(final String rootURL, final int connectTimeout);

}