package se.kodapan.osm.data.planet;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import se.kodapan.osm.OsmCommonTest;
import se.kodapan.osm.parser.xml.instantiated.InstantiatedOsmXmlParser;
import se.kodapan.osm.services.changesetstore.ChangesetStore;
import se.kodapan.osm.services.changesetstore.ChangesetStoreState;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* This test downloads a dump of malta since a few days back and then applies the changesets.
* <p/>
* todo this fails some days, that data i dump has a greater version than data in changeset.
* todo is this due to osm-common not supporting such a feature (multiple changes merged to a single one in daily changeset?)
* todo or is it due to geofrabrik not doing the right thing? probably not the latter.
*
* @author kalle
* @since 2013-05-04 15:05
*/
public class TestPlanetIntegration extends OsmCommonTest {
private static Logger log = LoggerFactory.getLogger(TestPlanetIntegration.class);
public void test() throws Exception {
InstantiatedOsmXmlParser parser = InstantiatedOsmXmlParser.newInstance();
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse;
Date dateDaysAgo;
int daysAgo = 3;
while (true) {
daysAgo++;
dateDaysAgo = new Date(System.currentTimeMillis() - (1000 * 60 * 60 * 24 * daysAgo));
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append("http://download.geofabrik.de/europe/malta-");
urlBuilder.append(new SimpleDateFormat("yyMMdd").format(dateDaysAgo));
urlBuilder.append(".osm.bz2");
HttpGet get = new HttpGet(urlBuilder.toString());
httpResponse = httpClient.execute(get);
if (httpResponse.getStatusLine().getStatusCode() != 200) {
if (daysAgo > 10) {
fail("Server does not contain enough old data for test to run.");
}
}
Reader reader;
try {
reader = new InputStreamReader(new BZip2CompressorInputStream(httpResponse.getEntity().getContent()), "UTF8");
parser.parse(reader);
reader.close();
break;
} catch (IOException e) {
log.warn("Ignoring bad file found at " + get.getURI(), e);
continue;
} finally {
EntityUtils.consume(httpResponse.getEntity());
}
}
ChangesetStore changesetStore = new ChangesetStore();
setUserAgent(changesetStore);
changesetStore.setBaseURL("http://download.geofabrik.de/europe/malta-updates");
changesetStore.setHttpClient(httpClient);
for (ChangesetStoreState state : changesetStore.findChangesetStatesSince(dateDaysAgo.getTime())) {
Reader changeset = changesetStore.getChangeset(state.getSequenceNumber());
try {
parser.parse(changeset);
} finally {
changeset.close();
}
}
// todo it would be nice if the test also downloaded the dump representing after applying the changesets and assert they equal.
}
}