Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package restclient.service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import restclient.Correlation; import restclient.PainResult; import restclient.PlocationFrequency; import restclient.Record; import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.stat.correlation.PearsonsCorrelation; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; /** * * @author kashinying */ @Stateless @Path("restclient.record") public class RecordFacadeREST extends AbstractFacade<Record> { @PersistenceContext(unitName = "MPDPU") private EntityManager em; public RecordFacadeREST() { super(Record.class); } @POST @Override @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public void create(Record entity) { super.create(entity); } @PUT @Path("{id}") @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public void edit(@PathParam("id") Integer id, Record entity) { super.edit(entity); } @DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); } @GET @Path("{id}") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public Record find(@PathParam("id") Integer id) { return super.find(id); } @GET @Override @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public List<Record> findAll() { return super.findAll(); } @GET @Path("{from}/{to}") @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) public List<Record> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[] { from, to }); } @GET @Path("count") @Produces(MediaType.TEXT_PLAIN) public String countREST() { return String.valueOf(super.count()); } @GET //findByPrid @Path("findByPrid/{prid}") @Produces({ "application/json" }) public List<Record> findByPrid(@PathParam("prid") Integer prid) { Query query = em.createNamedQuery("Record.findByPrid"); query.setParameter("prid", prid); return query.getResultList(); } @GET //findByPlevel @Path("findByPlevel/{plevel}") @Produces({ "application/json" }) public List<Record> findByPlevel(@PathParam("plevel") Integer plevel) { Query query = em.createNamedQuery("Record.findByPlevel"); query.setParameter("plevel", plevel); return query.getResultList(); } @GET //findByPlocation @Path("findByPlocation/{plocation}") @Produces({ "application/json" }) public List<Record> findByPlocation(@PathParam("plocation") String plocation) { Query query = em.createNamedQuery("Record.findByPlocation"); query.setParameter("plocation", plocation); return query.getResultList(); } @GET //findByMoodlevel @Path("findByMoodlevel/{moodlevel}") @Produces({ "application/json" }) public List<Record> findByMoodlevel(@PathParam("moodlevel") String moodlevel) { Query query = em.createNamedQuery("Record.findByMoodlevel"); query.setParameter("moodlevel", moodlevel); return query.getResultList(); } @GET //findByPtrigger @Path("findByPtrigger/{ptrigger}") @Produces({ "application/json" }) public List<Record> findByPtrigger(@PathParam("ptrigger") String ptrigger) { Query query = em.createNamedQuery("Record.findByPtrigger"); query.setParameter("ptrigger", ptrigger); return query.getResultList(); } @GET //findByLat @Path("findByLat/{lat}") @Produces({ "application/json" }) public List<Record> findByLat(@PathParam("lat") double lat) { Query query = em.createNamedQuery("Record.findByLat"); query.setParameter("lat", lat); return query.getResultList(); } @GET //findByLng @Path("findByLng/{lng}") @Produces({ "application/json" }) public List<Record> findByLng(@PathParam("lng") double lng) { Query query = em.createNamedQuery("Record.findByLng"); query.setParameter("lng", lng); return query.getResultList(); } @GET //findByTemp @Path("findByTemp/{temp}") @Produces({ "application/json" }) public List<Record> findByTemp(@PathParam("temp") double temp) { Query query = em.createNamedQuery("Record.findByTemp"); query.setParameter("temp", temp); return query.getResultList(); } @GET //findByHumidity @Path("findByHumidity/{humidity}") @Produces({ "application/json" }) public List<Record> findByHumidity(@PathParam("humidity") double humidity) { Query query = em.createNamedQuery("Record.findByHumidity"); query.setParameter("humidity", humidity); return query.getResultList(); } @GET //findByWindspeed @Path("findByWindspeed/{windspeed}") @Produces({ "application/json" }) public List<Record> findByWindspeed(@PathParam("windspeed") double windspeed) { Query query = em.createNamedQuery("Record.findByWindspeed"); query.setParameter("windspeed", windspeed); return query.getResultList(); } @GET //findByPressure @Path("findByPressure/{pressure}") @Produces({ "application/json" }) public List<Record> findByPressure(@PathParam("pressure") double pressure) { Query query = em.createNamedQuery("Record.findByPressure"); query.setParameter("pressure", pressure); return query.getResultList(); } @GET //findByUid @Path("findByUid/{uid}") @Produces({ "application/json" }) public List<Record> findByUid(@PathParam("uid") Integer uid) { Query query = em.createNamedQuery("Record.findByUid"); query.setParameter("uid", uid); return query.getResultList(); } @GET //findByDate @Path("findByDate/{date}") @Produces({ "application/json" }) public List<Record> findByDate(@PathParam("date") String date) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date rdate = sdf.parse(date); Query query = em.createNamedQuery("Record.findByDate"); query.setParameter("date", rdate); return query.getResultList(); } @GET //findByTime @Path("findByTime/{time}") @Produces({ "application/json" }) public List<Record> findByTime(@PathParam("time") String dtime) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); Date time = sdf.parse(dtime); Query query = em.createNamedQuery("Record.findByTime"); query.setParameter("time", time); return query.getResultList(); } @GET //dynamic query on record table @Path("findByDateANDPlevel/{date}/{plevel}") @Produces({ "application/json" }) public List<Record> findByDateANDPlevel(@PathParam("date") String date, @PathParam("plevel") Integer plevel) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date rdate = sdf.parse(date); TypedQuery<Record> q = em.createQuery("SELECT r FROM Record r WHERE r.date = :date AND r.plevel = :plevel", Record.class); q.setParameter("date", rdate); q.setParameter("plevel", plevel); return q.getResultList(); } @GET //dynamic query on record and patient table @Path("findByDateANDGender/{date}/{gender}") @Produces({ "application/json" }) public List<Record> findByDateANDGender(@PathParam("date") String date, @PathParam("gender") String gender) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date rdate = sdf.parse(date); TypedQuery<Record> q = em.createQuery( "SELECT r FROM Record r WHERE r.date = :date AND r.uid.gender = :gender", Record.class); q.setParameter("date", rdate); q.setParameter("gender", gender); return q.getResultList(); } @GET //explicit join on record and patient tables @Path("findByPlocationANDFirstname/{plocation}/{firstname}") @Produces({ "application/json" }) public List<Record> findByPlocationANDFirstname(@PathParam("plocation") String plocation, @PathParam("firstname") String firstname) { Query query = em.createNamedQuery("Record.findByPlocationANDFirstname"); query.setParameter("plocation", plocation); query.setParameter("firstname", firstname); return query.getResultList(); } @GET @Path("findByWvariable/{sdate}/{edate}/{wvariable}") @Produces({ "application/json" }) public List<PainResult> findByWvariable(@PathParam("sdate") String date1, @PathParam("edate") String date2, @PathParam("wvariable") String wv) throws ParseException { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy"); Date sdate = sdf1.parse(date1); Date edate = sdf1.parse(date2); TypedQuery<Record> q = em.createQuery( "SELECT r FROM Record r WHERE r.date >= :sdate AND r.date <= :edate order by r.date ASC", Record.class); q.setParameter("sdate", sdate); q.setParameter("edate", edate); List<Record> qr = q.getResultList(); List<PainResult> re = new ArrayList<PainResult>(); for (int i = 0; i < qr.size(); ++i) { Record r = qr.get(i); PainResult pr = new PainResult(); pr.setPlevel(r.getPlevel()); pr.setDate(sdf2.format(r.getDate())); if (wv.equals("temperature")) { pr.setWeathervariable(r.getTemp()); } else if (wv.equals("humidity")) { pr.setWeathervariable(r.getHumidity()); } else if (wv.equals("windspeed")) { pr.setWeathervariable(r.getWindspeed()); } else { pr.setWeathervariable(r.getPressure()); } re.add(pr); } return re; } @GET @Path("findPlocationFrequency/{sdate}/{edate}") @Produces({ "application/json" }) public List<PlocationFrequency> findPlocationFrequency(@PathParam("sdate") String date1, @PathParam("edate") String date2) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date sdate = sdf.parse(date1); Date edate = sdf.parse(date2); TypedQuery<PlocationFrequency> q = em.createQuery( "SELECT NEW restclient.PlocationFrequency(r.plocation, COUNT(r)) FROM Record r WHERE r.date >= :sdate AND r.date <= :edate GROUP BY r.plocation", PlocationFrequency.class); q.setParameter("sdate", sdate); q.setParameter("edate", edate); return q.getResultList(); } @GET @Path("findPlocationFrequencyByUid/{uid}/{sdate}/{edate}") @Produces({ "application/json" }) public List<PlocationFrequency> findPlocationFrequencyByUid(@PathParam("uid") Integer uid, @PathParam("sdate") String date1, @PathParam("edate") String date2) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date sdate = sdf.parse(date1); Date edate = sdf.parse(date2); TypedQuery<PlocationFrequency> q = em.createQuery( "SELECT NEW restclient.PlocationFrequency(r.plocation, COUNT(r)) FROM Record r WHERE r.date >= :sdate AND r.date <= :edate AND r.uid.uid = :uid GROUP BY r.plocation", PlocationFrequency.class); q.setParameter("uid", uid); q.setParameter("sdate", sdate); q.setParameter("edate", edate); return q.getResultList(); } @GET @Path("findRecordByUid/{uid}/{sdate}/{edate}/{wvariable}") @Produces({ "application/json" }) public List<PainResult> findRecordByUid(@PathParam("uid") Integer uid, @PathParam("sdate") String date1, @PathParam("edate") String date2, @PathParam("wvariable") String wv) throws ParseException { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy"); Date sdate = sdf1.parse(date1); Date edate = sdf1.parse(date2); TypedQuery<Record> q = em.createQuery( "SELECT r FROM Record r WHERE r.date >= :sdate AND r.date <= :edate AND r.uid.uid = :uid order by r.date ASC", Record.class); q.setParameter("uid", uid); q.setParameter("sdate", sdate); q.setParameter("edate", edate); List<Record> qr = q.getResultList(); List<PainResult> re = new ArrayList<PainResult>(); for (int i = 0; i < qr.size(); ++i) { Record r = qr.get(i); PainResult pr = new PainResult(); pr.setPlevel(r.getPlevel()); pr.setDate(sdf2.format(r.getDate())); if (wv.equals("temperature")) { pr.setWeathervariable(r.getTemp()); } else if (wv.equals("humidity")) { pr.setWeathervariable(r.getHumidity()); } else if (wv.equals("windspeed")) { pr.setWeathervariable(r.getWindspeed()); } else { pr.setWeathervariable(r.getPressure()); } re.add(pr); } return re; } @GET @Path("findCorrelation/{uid}/{sdate}/{edate}/{wvariable}") @Produces({ "application/json" }) public List<Correlation> findCorrelation(@PathParam("uid") Integer uid, @PathParam("sdate") String date1, @PathParam("edate") String date2, @PathParam("wvariable") String wv) throws ParseException { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy"); Date sdate = sdf1.parse(date1); Date edate = sdf1.parse(date2); TypedQuery<Record> q = em.createQuery( "SELECT r FROM Record r WHERE r.date >= :sdate AND r.date <= :edate AND r.uid.uid = :uid order by r.date ASC", Record.class); q.setParameter("uid", uid); q.setParameter("sdate", sdate); q.setParameter("edate", edate); List<Record> qr = q.getResultList(); List<Correlation> re = new ArrayList<Correlation>(); Correlation cl = new Correlation(); double data[][] = new double[qr.size()][2]; for (int i = 0; i < qr.size(); ++i) { Record r = qr.get(i); data[i][0] = r.getPlevel(); if (wv.equals("temperature")) { data[i][1] = r.getTemp(); } else if (wv.equals("humidity")) { data[i][1] = r.getHumidity(); } else if (wv.equals("windspeed")) { data[i][1] = r.getWindspeed(); } else { data[i][1] = r.getPressure(); } } RealMatrix m = MatrixUtils.createRealMatrix(data); PearsonsCorrelation pc = new PearsonsCorrelation(m); RealMatrix corM = pc.getCorrelationMatrix(); cl.setRvalue(corM.getEntry(0, 1)); RealMatrix pM = pc.getCorrelationPValues(); cl.setSvalue(pM.getEntry(0, 1)); re.add(cl); return re; } @Override protected EntityManager getEntityManager() { return em; } }