package services;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import models.bus.Agency;
import models.bus.AgencyListHandler;
import models.bus.Route;
@Service
@Transactional
public class AgencyServiceImpl implements AgencyService {
@PersistenceContext
private EntityManager em;
@Autowired
private ExternalCallService externalCallService;
/* ======================================================
* AgencyList Related Methods
* ======================================================
*/
@Override
public List<Agency> getAllAgencies() {
// Query db for all agencies
CriteriaQuery<Agency> c = em.getCriteriaBuilder().createQuery(Agency.class);
c.from(Agency.class);
List<Agency> list = em.createQuery(c).getResultList();
// Doesn't exist in db
if (list.size() != 0) return list;
// Call external url to get xml, then parse them
list = AgencyListHandler.parseAgencyListXml(externalCallService.getAgencyListXml());
// Persist in db
addAgencies(list);
return list;
}
@Override
public List<Agency> getAgenciesByRegion(String region) {
// Query db for all agencies
CriteriaQuery<Agency> c = em.getCriteriaBuilder().createQuery(Agency.class);
c.from(Agency.class);
List<Agency> list = em.createQuery(c).setParameter("regionTitle", region).getResultList();
// Doesn't exist in db
if (list.size() != 0) return list;
// Call external url to get xml, then parse them
list = AgencyListHandler.parseAgencyListXml(externalCallService.getAgencyListXml());
List<Agency> res = new ArrayList<Agency>();
// Persist in db
addAgencies(list);
for (Agency a: list) {
if (a.regionTitle.equalsIgnoreCase(region)) {
res.add(a);
}
}
return res;
}
@Override
public void addAgencies(List<Agency> list) {
for (Agency a: list) {
em.persist(a);
}
}
@Override
public void addAgency(Agency agency) {
em.persist(agency);
}
/* ======================================================
* RouteList Related Methods
* ======================================================
*/
@Override
public List<Route> getAllRoutes() {
// Query db for all routes
CriteriaQuery<Route> c = em.getCriteriaBuilder().createQuery(Route.class);
c.from(Route.class);
List<Route> list = em.createQuery(c).getResultList();
if (list.size() != 0) return list;
List<Agency> allAgencies = this.getAllAgencies();
for (Agency agency: allAgencies) {
Document xml = externalCallService.getRouteListXml(agency.tag);
list.addAll(AgencyListHandler.parseRouteListXml(xml, agency));
}
addRoutes(list);
return list;
}
@Override
public List<Route> getRoutesByAgency(Agency agency) {
CriteriaQuery<Route> c = em.getCriteriaBuilder().createQuery(Route.class);
c.from(Route.class);
List<Route> list = em.createQuery(c).setParameter("agency", agency.tag).getResultList();
if (list.size() != 0) return list;
Document xml = externalCallService.getRouteListXml(agency.tag);
list.addAll(AgencyListHandler.parseRouteListXml(xml, agency));
if (list.size() != 0) {
addRoutes(list);
} else {
play.Logger.error("AgencyService.getRoutesByAgency recevied empty list of agencies");
}
return list;
}
@Override
public void addRoute(Route route) {
em.persist(route);
}
@Override
public void addRoutes(List<Route> list) {
for (Route r: list)
em.persist(r);
}
}