package org.netomi.tracker.orekit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URISyntaxException; import java.net.URL; import org.apache.http.HttpEntity; 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.netomi.tracker.model.Satellite; import org.netomi.tracker.model.TleEntry; import org.netomi.tracker.service.SatelliteService; import org.orekit.errors.OrekitException; import org.orekit.propagation.analytical.tle.TLE; import org.orekit.time.TimeScalesFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; /** * Fetches latest TLE data from celestrak.com for configured satellites. */ @Configurable(preConstruction = true) public class TleFetcher { private final static Logger logger = LoggerFactory.getLogger(TleFetcher.class); @Autowired private transient SatelliteService satService; public void fetchData() throws IOException, URISyntaxException, OrekitException { String[] urls = { "http://www.celestrak.com/NORAD/elements/stations.txt", "http://www.celestrak.com/NORAD/elements/gps-ops.txt" }; for (String url : urls) { HttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(new URL(url).toURI()); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { InputStreamReader reader = new InputStreamReader(entity.getContent()); BufferedReader is = new BufferedReader(reader); readTleStream(is); } } } private void readTleStream(final BufferedReader is) throws IOException, OrekitException { int lineCount = 0; String line; String identifier = null; String line1 = null, line2 = null; while ((line = is.readLine()) != null) { switch (lineCount % 3) { case 0: identifier = line; break; case 1: line1 = line; break; case 2: line2 = line; break; } if (lineCount % 3 == 2) { TLE tle = new TLE(line1, line2); Satellite sat = satService.getSatellite(tle.getSatelliteNumber()); if (sat != null) { logger.info("found entry for identifier " + identifier); TleEntry entry = new TleEntry(); entry.setEpoch(tle.getDate().toDate(TimeScalesFactory.getUTC())); entry.setLine1(tle.getLine1()); entry.setLine2(tle.getLine2()); entry.setSatellite(sat); satService.updateTleEntry(entry); } } lineCount++; } logger.info("added " + (lineCount / 3) + " TLE entries"); } }