public static List<String> fetchCloudStorageUris(String bucketName, String startKey, String endKey, HttpRequestFactory requestFactory) throws IOException {
		List<String> result = new ArrayList<String>();
		
		String bucketUri = "http://commondatastorage.googleapis.com/" + bucketName;
		HttpRequest request = requestFactory.buildGetRequest(new GenericUrl(bucketUri + "?marker=" + startKey));
		HttpResponse response = request.execute();

		try {
			Document responseDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(response.getContent());
			XPath xPath = XPathFactory.newInstance().newXPath();
			NodeList nodes = (NodeList) xPath.evaluate("//Contents/Key/text()", responseDoc, XPathConstants.NODESET);
			for (int i = 0; i < nodes.getLength(); i++) {
				String key = nodes.item(i).getNodeValue();
				if (key.compareTo(endKey) >= 0) {
					break;
				}
				if (key.endsWith(".schema.json")) {
					continue;
				}
				result.add("gs://" + bucketName + "/" + key);
			} 
		} catch (SAXException e) {
			throw new IOException("Error parsing cloud storage response", e);
		} catch (ParserConfigurationException e) {
			throw new IOException("Error configuring cloud storage parser", e);
		} catch (XPathExpressionException e) {
			throw new IOException("Error finding keys", e);
		}
		
		return result;
	}