package pl.relationsystems.citynav.server.servlets;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import pl.relationsystems.citynav.parser.zdium.Dzien;
import pl.relationsystems.citynav.parser.zdium.Godz;
import pl.relationsystems.citynav.parser.zdium.Linia;
import pl.relationsystems.citynav.parser.zdium.Linie;
import pl.relationsystems.citynav.parser.zdium.Min;
import pl.relationsystems.citynav.parser.zdium.Przystanek;
import pl.relationsystems.citynav.parser.zdium.Tabliczka;
import pl.relationsystems.citynav.parser.zdium.Wariant;
import pl.relationsystems.citynav.server.model.DayTypeMapping;
import pl.relationsystems.citynav.server.model.Departure;
import pl.relationsystems.citynav.server.model.Hub;
import pl.relationsystems.citynav.server.model.Line;
import pl.relationsystems.citynav.server.model.Stop;
import pl.relationsystems.citynav.server.model.TransportTypeMapping;
import pl.relationsystems.citynav.server.model.Variant;
import pl.relationsystems.citynav.server.model.VariantStop;
import pl.relationsystems.citynav.server.model.Enums.DayType;
import pl.relationsystems.citynav.server.model.Enums.TransportType;
import pl.relationsystems.citynav.server.utils.PMF;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
@SuppressWarnings("serial")
public class ReadScheduleWorker extends HttpServlet {
// private static final String STOPOVERS_FILE = "/zdik/0023/0023.xml";
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String fileName = null;
String pline = req.getParameter("line");
if (pline != null && pline.length() > 0) {
fileName = "/zdik/" + pline + "/" + pline + ".xml";
}
resp.getWriter().println("Trying to read " + fileName);
InputStream is = null;
is = getServletContext().getResourceAsStream(fileName);
if (is != null) {
resp.getWriter().println("Looks ok");
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
JAXBContext jc = JAXBContext
.newInstance("pl.relationsystems.citynav.parser.zdium");
Unmarshaller u = jc.createUnmarshaller();
Linie tlines = (Linie) u.unmarshal(is);
Linia tlinia = tlines.getLinia();
Key k = KeyFactory.createKey(Line.class.getSimpleName(), tlinia
.getNazwa().toString());
Line line;
try {
line = pm.getObjectById(Line.class, k);
} catch (JDOObjectNotFoundException e) {
line = new Line();
}
if (line == null) {
line = new Line();
}
line.setLineId(tlinia.getNazwa().toString());
line.setTransportType(getTransportTypeForString(pm, line
.getLineId()));
Query query = pm.newQuery(Variant.class);
query.setFilter("line == lineParam");
query.declareParameters("String lineParam");
try {
List<Variant> results = (List<Variant>) query.execute(line
.getLineId());
pm.deletePersistentAll(results);
} finally {
query.closeAll();
}
query = pm.newQuery(VariantStop.class);
query.setFilter("line == lineParam");
query.declareParameters("String lineParam");
try {
List<Variant> results = (List<Variant>) query.execute(line
.getLineId());
pm.deletePersistentAll(results);
} finally {
query.closeAll();
}
Map<String, List<Integer>> claimedTimes = new HashMap<String, List<Integer>>();
Integer vcounter = 0;
for (Wariant twariant : tlinia.getWariant()) {
List<VariantStop> variantStops = new ArrayList<VariantStop>();
Variant variant = new Variant();
variant.setName(twariant.getNazwa());
variant.setLine(line);
variant.setNth(vcounter);
pm.makePersistent(variant);
resp.getWriter().println(variant.toString());
Integer vscounter = 0;
for (Przystanek tprzystanek : twariant.getPrzystanek()) {
Tabliczka ttabliczka = tprzystanek.getTabliczka();
if (ttabliczka == null)
continue;
Long id = null;
try {
String _id = tprzystanek.getId();
_id = _id.split("-")[0];
id = Long.decode(_id);
} catch (Exception exception) {
}
VariantStop vs = new VariantStop();
Stop s = Stop.retrieveByPk(id);
if (s == null) {
resp.getWriter().println(tprzystanek.toString());
s = new Stop();
s.setId(id);
s.setDescription(tprzystanek.getUlica());
s.setName(tprzystanek.getNazwa());
s.setHub(Hub.retrieveOrCreate(s.getName())
.getName());
pm.makePersistent(s);
}
List<Integer> claimed = claimedTimes.get(id.toString());
if(claimed==null)
{
claimed = new ArrayList<Integer>();
}
vs.setId(variant.getVariantId() + ":"
+ vscounter.toString());
vs.setNth(vscounter);
vs.setLine(line);
vs.setVariant(variant);
vs.setStop(s);
Hub hub = Hub.retrieveOrCreate(s.getHub());
hub.setIsActive(true);
vs.setHub(hub.getName());
pm.makePersistent(hub);
for (Dzien tdzien : ttabliczka.getDzien()) {
List<Integer> pdeps = new ArrayList<Integer>();
DayType dayType = DayTypeMapping.retrieveOrCreate(
tdzien.getNazwa()).getType();
for (Godz tgodzina : tdzien.getGodz()) {
for (Min tmin : tgodzina.getMin()) {
Integer t = Departure.getTime(tgodzina
.getH().intValue(), tmin.getM()
.intValue());
if(claimed.contains(t)) continue;
if (!pdeps.contains(t))
{
pdeps.add(t);
claimed.add(t);
}
}
}
int[] ret = new int[pdeps.size()];
int i = 0;
for (Integer n : pdeps) {
ret[i] = n;
i++;
}
vs.setDepartures(dayType, ret);
}
claimedTimes.put(id.toString(), claimed);
variantStops.add(vs);
pm.makePersistent(vs);
vscounter++;
}
vcounter++;
}
pm.makePersistent(line);
resp.setContentType("text/plain");
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
pm.close();
}
} else {
resp.getWriter().println("Nope");
}
}
private TransportType getTransportTypeForString(PersistenceManager pm,
String nazwa) {
Key k = KeyFactory.createKey(
TransportTypeMapping.class.getSimpleName(), nazwa);
TransportTypeMapping mapping = null;
try {
mapping = pm.getObjectById(TransportTypeMapping.class, k);
} catch (JDOObjectNotFoundException e) {
}
if (mapping == null) {
TransportType type = TransportType.Unknown;
try {
Integer t = Integer.getInteger(nazwa);
if (t != null) {
if (t < 100) {
type = TransportType.Tram;
} else {
type = TransportType.Bus;
}
}
log(nazwa);
} catch (Exception e) {
if (nazwa.matches("[a-zA-Z]*")) {
type = TransportType.Bus;
}
}
mapping = new TransportTypeMapping();
mapping.setKey(nazwa);
mapping.setType(type);
pm.makePersistent(mapping);
}
return mapping.getType();
}
}