restclient.service.RecordFacadeREST.java Source code

Java tutorial

Introduction

Here is the source code for restclient.service.RecordFacadeREST.java

Source

/*
 * 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;
    }

}