de.tuttas.restful.AnwesenheitsManager.java Source code

Java tutorial

Introduction

Here is the source code for de.tuttas.restful.AnwesenheitsManager.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 de.tuttas.restful;

import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.MetadataException;
import de.tuttas.config.Config;
import de.tuttas.entities.Anwesenheit;
import de.tuttas.entities.AnwesenheitId;
import de.tuttas.entities.Bemerkung;
import de.tuttas.entities.BemerkungId;
import de.tuttas.restful.Data.AnwesenheitEintrag;

import de.tuttas.restful.Data.AnwesenheitObjekt;
import de.tuttas.restful.Data.ResultObject;
import de.tuttas.util.ImageUtil;
import de.tuttas.util.Log;
import de.tuttas.util.VerspaetungsUtil;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Date;
import java.sql.Timestamp;

import java.util.ArrayList;
import java.util.Calendar;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.imageio.ImageIO;
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 javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import org.apache.commons.io.IOUtils;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;

/**
 * Restful Service zum Verwalten der Anwesenheit (/api/v1/anwesenheit)
 *
 * @author Jrg
 *
 */
@Path("anwesenheit")
@Stateless
public class AnwesenheitsManager {

    /**
     * Injection des EntityManagers
     */
    @PersistenceContext(unitName = "DiklabuPU")
    EntityManager em;

    /**
     * Lschen eines Anwesenhietseintrages Adresse
     * /api/v1/anwesenheit/{ids}/{datum}
     *
     * @param ids ID des Schlers
     * @param dat Datum des Anwesenheit
     * @return Anwesenheit die gelscht wurde, oder null bei Fehler
     */
    @DELETE
    @Path("/{ids}/{datum}")
    public Anwesenheit delAnwesenheit(@PathParam("ids") Integer ids, @PathParam("datum") Date dat) {
        Log.d("ids=" + ids + " Datum=" + dat);
        Anwesenheit a = em.find(Anwesenheit.class, new AnwesenheitId(ids, new Timestamp(dat.getTime())));
        if (a != null) {
            em.remove(a);
        } else {
            Log.d("Kann Anwesenheit nicht finden!");
        }
        return a;
    }

    /**
     * Krankmeldung herunterladen
     * @param filename
     * @return 
     */
    @GET
    @Path("/schueler/{filename}")
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response getFile(@PathParam("filename") String filename) {
        File file = new File(Config.getInstance().ATEST_FILE_PATH + "/" + filename);
        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition", "attachment; filename=" + filename);
        return response.build();
    }

    /**
     * Krankmeldung hochladen
     *
     * @param idschueler
     * @param uploadedInputStream
     * @param fileDetail
     */
    @POST
    @Path("/schueler/{idschueler}")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public ResultObject uploadFile(@PathParam("idschueler") int idschueler,
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {

        ResultObject r = new ResultObject();
        if (fileDetail.getFileName().endsWith(".pdf") || fileDetail.getFileName().endsWith(".jpg")) {
            String suffix = fileDetail.getFileName().substring(fileDetail.getFileName().lastIndexOf("."));
            String filename = idschueler + "_" + System.currentTimeMillis() + suffix;
            String fileLocation = Config.getInstance().ATEST_FILE_PATH + filename;
            Log.d("upload  File for " + idschueler + " file=" + fileDetail.getFileName());
            try {
                // save it
                writeToFile(uploadedInputStream, fileLocation);
                r.setSuccess(true);
                r.setMsg(filename);
            } catch (IOException ex) {
                r.setSuccess(false);
                r.setMsg(ex.getMessage());
                Logger.getLogger(AnwesenheitsManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            r.setSuccess(false);
            r.setMsg("Nur pdf oder jpg ist erlaubt!");
        }
        return r;
    }

    // save uploaded file to new location
    private void writeToFile(InputStream uploadedInputStream, String uploadedFileLocation)
            throws FileNotFoundException, IOException {

        OutputStream out = new FileOutputStream(new File(uploadedFileLocation));
        int read = 0;
        byte[] bytes = new byte[1024];

        out = new FileOutputStream(new File(uploadedFileLocation));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        out.flush();
        out.close();

    }

    /**
     * Lschen einer Krankmeldung
     *
     * @param ids ID des Schlers
     * @param dat Datum der Krankmeldung
     * @return Anwesenheitseintrag
     */
    @DELETE
    @Path("/schueler/{ids}/{datum}")
    public ResultObject delKrankmeldung(@PathParam("ids") Integer ids, @PathParam("datum") Date dat) {
        Log.d("ids=" + ids + " Datum=" + dat);
        ResultObject ro = new ResultObject();
        Anwesenheit a = em.find(Anwesenheit.class, new AnwesenheitId(ids, new Timestamp(dat.getTime())));
        if (a != null) {
            a.setKRANKMELDUNG(null);
            em.merge(a);
            ro.setSuccess(true);
            ro.setMsg("Krankmeldung von " + a.getID_SCHUELER() + " am " + dat + " gelscht!");
        } else {
            Log.d("Kann Anwesenheit nicht finden!");
            ro.setSuccess(false);
            ro.setMsg("Kann keinen Anwesenheitseintrag vom Schler mit ID " + ids + " am " + dat + " finden!");
        }
        return ro;
    }

    @PUT
    @Path("/schueler/{ids}/{datum}")
    public ResultObject setKrankmeldung(@PathParam("ids") Integer ids, @PathParam("datum") Date dat,
            String krankmeldung) {
        Log.d("ids=" + ids + " Datum=" + dat);
        ResultObject ro = new ResultObject();
        Anwesenheit a = em.find(Anwesenheit.class, new AnwesenheitId(ids, new Timestamp(dat.getTime())));
        if (a != null) {
            a.setKRANKMELDUNG(krankmeldung);
            em.merge(a);
            ro.setSuccess(true);
            ro.setMsg("Krankmeldung von Schler mit ID " + a.getID_SCHUELER() + " am " + dat + " hinzugefgt");
        } else {
            Log.d("Kann Anwesenheit nicht finden!");
            ro.setSuccess(false);
            ro.setMsg("Kann keinen Anwesenheitseintrag vom Schler mit ID " + ids + " am " + dat + " finden!");
        }
        return ro;
    }

    /**
     * Setzen eines Anwesenheitseintrages
     *
     * @param ae der Anwesenheitseintrag
     * @return der Anwesenheitseintrag oder null bei Fehler
     */
    @POST
    public AnwesenheitEintrag addAnwesenheit(AnwesenheitEintrag ae) {
        Log.d("POST Anwesenheitseintrag = " + ae.toString());
        Anwesenheit a = em.find(Anwesenheit.class, new AnwesenheitId(ae.getID_SCHUELER(), ae.getDATUM()));

        if (a != null) {
            Log.d("Es gibt schon einen Eintrag, also updaten");

            if (ae.getID_LEHRER() != null) {
                a.setID_LEHRER(ae.getID_LEHRER());
            }
            if (ae.getVERMERK() != null) {
                a.setVERMERK(ae.getVERMERK());
            }
            if (ae.getKRANKMELDUNG() != null) {
                a.setKRANKMELDUNG(ae.getKRANKMELDUNG());
            }
            em.merge(a);
            Log.d(a.toString());
        } else {
            Log.d("Ein neuer Eintrag");
            a = new Anwesenheit(ae.getID_SCHUELER(), ae.getDATUM());
            if (ae.getID_LEHRER() != null) {
                a.setID_LEHRER(ae.getID_LEHRER());
            }
            if (ae.getVERMERK() != null) {
                a.setVERMERK(ae.getVERMERK());
            }
            if (ae.getKRANKMELDUNG() != null) {
                a.setKRANKMELDUNG(ae.getKRANKMELDUNG());
            }
            em.persist(a);
        }
        if (ae.getBEMERKUNG() != null) {
            Log.d("Es gibt eine Bemerkung");
            BemerkungId bemId = new BemerkungId(ae.getDATUM(), ae.getID_SCHUELER());

            Bemerkung fb = em.find(Bemerkung.class, bemId);
            if (fb == null) {
                Log.d("eine neue Bemerkung");
                Bemerkung b = new Bemerkung(ae.getDATUM(), ae.getID_SCHUELER());
                b.setID_LEHRER(ae.getID_LEHRER());
                b.setBEMERKUNG(ae.getBEMERKUNG());
                em.persist(b);
            } else {
                Log.d("eine alte Bemerkung also update");
                fb.setID_LEHRER(ae.getID_LEHRER());
                fb.setBEMERKUNG(ae.getBEMERKUNG());
                em.merge(fb);
            }
        } else {
            Log.d("Es gibt KEINE Bemerkung,schauen ob es eine alte Bemerkung gibt");
            BemerkungId bemId = new BemerkungId(ae.getDATUM(), ae.getID_SCHUELER());
            Bemerkung fb = em.find(Bemerkung.class, bemId);
            if (fb != null) {
                Log.d("ja es gab eine alte Bemerkung, diese lschen!");
                em.remove(fb);
            }
        }
        ae.setParseError(!VerspaetungsUtil.isValid(ae));
        return ae;
    }

    /**
     * Heutige Anwesenheit einer Klasse Adresse /api/v1/anwesenheit/{Name der
     * Klasse}
     *
     * @param kl Name der Klasse
     * @return Liste von AnwesenheitsObjekten
     */
    @GET
    @Path("/{klasse}")
    public List<AnwesenheitObjekt> getAnwesenheit(@PathParam("klasse") String kl) {
        em.getEntityManagerFactory().getCache().evictAll();

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        Date d1 = new Date(cal.getTimeInMillis());
        Date d2 = new Date(cal.getTimeInMillis() + (1000 * 60 * 60 * 24));

        Log.d("Webservice Anwesenheit GET from Date=" + d1.toString() + " To " + d2.toString() + " klasse=" + kl);
        TypedQuery<AnwesenheitEintrag> query = em.createNamedQuery("findAnwesenheitbyKlasse",
                AnwesenheitEintrag.class);
        query.setParameter("paramKName", kl);
        query.setParameter("paramFromDate", d1);
        query.setParameter("paramToDate", d2);
        List<AnwesenheitEintrag> anwesenheit = query.getResultList();

        Query qb = em.createNamedQuery("findBemerkungbyDate");
        qb.setParameter("paramFromDate", d1);
        qb.setParameter("paramToDate", d2);

        List<String> ids = new ArrayList<>();
        for (AnwesenheitEintrag ae : anwesenheit) {
            ids.add("" + ae.getID_SCHUELER());
        }
        List<Bemerkung> bemerkungen = null;
        qb.setParameter("idList", ids);
        if (ids.size() > 0) {
            bemerkungen = qb.getResultList();
            Log.d("Result List Bemerkunken:" + bemerkungen);
        }
        return getData(anwesenheit, bemerkungen);
    }

    /**
     * Anwesenheit einer Klasse an einem bestimmten Tag abfragen Adresse
     * /api/v1/anwesenheit/{Name der Klasse}/{Datum}
     *
     * @param kl Name der Klasse
     * @param from Das Datum
     * @return Liste von Anwesenheitsobjekten
     */
    @GET
    @Path("/{klasse}/{from}")
    public List<AnwesenheitObjekt> getAnwesenheit(@PathParam("klasse") String kl, @PathParam("from") Date from) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        Date d = new Date(from.getTime() + 1000 * 60 * 60 * 24 - 1);
        Log.d("Webservice Anwesenheit GET klasse=" + kl + " from=" + from + " to=" + d);
        TypedQuery<AnwesenheitEintrag> query = em.createNamedQuery("findAnwesenheitbyKlasse",
                AnwesenheitEintrag.class);
        query.setParameter("paramKName", kl);
        query.setParameter("paramFromDate", from);
        query.setParameter("paramToDate", d);
        List<AnwesenheitEintrag> anwesenheit = query.getResultList();

        Query qb = em.createNamedQuery("findBemerkungbyDate");
        qb.setParameter("paramFromDate", from);
        qb.setParameter("paramToDate", d);

        List<String> ids = new ArrayList<>();
        for (AnwesenheitEintrag ae : anwesenheit) {
            ids.add("" + ae.getID_SCHUELER());
        }
        List<Bemerkung> bemerkungen = null;
        qb.setParameter("idList", ids);
        if (ids.size() > 0) {
            bemerkungen = qb.getResultList();
            Log.d("Result List Bemerkunken:" + bemerkungen);
        }
        return getData(anwesenheit, bemerkungen);

    }

    /**
     * Liste der Anwesenheit einer Klasse ber einen Bereich Adresse
     * /api/v1/anwesenheit/{Name der Klasse}/{von Datum}/{bis Datum}
     *
     * @param kl Name der Klasse
     * @param from Startdatum (inclusiv)
     * @param to EndDatum (inclusiv)
     * @return Liste der Anwesenheitsobjekte
     */
    @GET
    @Path("/{klasse}/{from}/{to}")
    public List<AnwesenheitObjekt> getAnwesenheit(@PathParam("klasse") String kl, @PathParam("from") Date from,
            @PathParam("to") Date to) {
        to = new Date(to.getTime() + 24 * 60 * 60 * 1000);
        Log.d("Webservice Anwesenheit GET from=" + from + " to=" + to);
        TypedQuery<AnwesenheitEintrag> query = em.createNamedQuery("findAnwesenheitbyKlasse",
                AnwesenheitEintrag.class);
        query.setParameter("paramKName", kl);
        query.setParameter("paramFromDate", from);
        query.setParameter("paramToDate", to);

        List<AnwesenheitEintrag> anwesenheit = query.getResultList();

        Query qb = em.createNamedQuery("findBemerkungbyDate");
        qb.setParameter("paramFromDate", from);
        qb.setParameter("paramToDate", to);

        List<String> ids = new ArrayList<>();
        for (AnwesenheitEintrag ae : anwesenheit) {
            ids.add("" + ae.getID_SCHUELER());
        }
        List<Bemerkung> bemerkungen = null;
        qb.setParameter("idList", ids);
        if (ids.size() > 0) {
            bemerkungen = qb.getResultList();
            Log.d("Result List Bemerkunken:" + bemerkungen);
        }
        return getData(anwesenheit, bemerkungen);
    }

    private List<AnwesenheitObjekt> getData(List<AnwesenheitEintrag> anwesenheit, List<Bemerkung> bemerkungen) {

        //Log.d("Results:="+anwesenheit);
        List<AnwesenheitObjekt> anw = new ArrayList();
        int id = 0;
        AnwesenheitObjekt ao = new AnwesenheitObjekt();
        for (int i = 0; i < anwesenheit.size(); i++) {
            if (anwesenheit.get(i).getID_SCHUELER() != id) {
                id = anwesenheit.get(i).getID_SCHUELER();
                ao = new AnwesenheitObjekt(id);
                anw.add(ao);
            }
            anwesenheit.get(i).setParseError(!VerspaetungsUtil.isValid(anwesenheit.get(i)));
            ao.getEintraege().add(anwesenheit.get(i));
        }

        for (AnwesenheitObjekt ano : anw) {
            ano = VerspaetungsUtil.parse(ano);
        }

        if (bemerkungen != null) {
            for (AnwesenheitObjekt anwo : anw) {
                List<AnwesenheitEintrag> eintr = anwo.getEintraege();
                for (AnwesenheitEintrag anwe : eintr) {
                    int ids = anwe.getID_SCHUELER();
                    Timestamp ts = anwe.getDATUM();
                    for (Bemerkung bem : bemerkungen) {
                        if (bem.getID_SCHUELER() == ids && bem.getDATUM().equals(ts)) {
                            Log.d("Habe eine Bemerkung zum Anwesenheitseintrag gefunden");
                            anwe.setBEMERKUNG(bem.getBEMERKUNG());
                        }
                    }
                }
            }
        }
        return anw;
    }

    /**
     * Liste der Fehltage fr einen Schler ber einen Bereich
     *
     * @param httpHeaders auth_key zur Verifikation
     * @param sid ID des Schlers
     * @param from Bereich von
     * @param to Bereich bis
     * @return Liste von Anwesenheitsobjekten
     */
    @GET
    @Path("schueler/{sid}/{from}/{to}")
    public List<AnwesenheitObjekt> getAnwesenheit(@PathParam("sid") int sid, @PathParam("from") Date from,
            @PathParam("to") Date to) {
        to = new Date(to.getTime() + 24 * 60 * 60 * 1000);
        Log.d("Webservice Anwesenheit GET from=" + from + " to=" + to);
        TypedQuery<AnwesenheitEintrag> query = em.createNamedQuery("findAnwesenheitbySchueler",
                AnwesenheitEintrag.class);
        query.setParameter("paramIdSchueler", sid);
        query.setParameter("paramFromDate", from);
        query.setParameter("paramToDate", to);
        List<AnwesenheitEintrag> anwesenheit = query.getResultList();

        Query qb = em.createNamedQuery("findBemerkungbyDate");
        qb.setParameter("paramFromDate", from);
        qb.setParameter("paramToDate", to);
        List<String> ids = new ArrayList<>();
        ids.add("" + sid);
        qb.setParameter("idList", ids);
        List<Bemerkung> bem = qb.getResultList();
        Log.d("Bemerkungen=" + bem);
        return getDataf(anwesenheit, bem);
    }

    private List<AnwesenheitObjekt> getDataf(List<AnwesenheitEintrag> anwesenheit, List<Bemerkung> bem) {
        //Log.d("Results:="+anwesenheit);
        List<AnwesenheitObjekt> anw = new ArrayList();
        int id = 0;
        AnwesenheitObjekt ao = new AnwesenheitObjekt();
        for (int i = 0; i < anwesenheit.size(); i++) {
            if (!anwesenheit.get(i).getVERMERK().startsWith("a")) {
                if (anwesenheit.get(i).getID_SCHUELER() != id) {
                    id = anwesenheit.get(i).getID_SCHUELER();
                    ao = new AnwesenheitObjekt(id);
                    anw.add(ao);

                }

                anwesenheit.get(i).setParseError(!VerspaetungsUtil.isValid(anwesenheit.get(i)));
                for (Bemerkung b : bem) {
                    //Log.d("Teste "+b.getDATUM()+" ist "+anwesenheit.get(i).getDATUM()+" und ID="+b.getID_SCHUELER()+" ist "+anwesenheit.get(i).getID_SCHUELER());
                    if (b.getID_SCHUELER() == anwesenheit.get(i).getID_SCHUELER()
                            && b.getDATUM().equals(anwesenheit.get(i).getDATUM())) {
                        anwesenheit.get(i).setBEMERKUNG(b.getBEMERKUNG());
                        //Log.d("sertze Bemerkung auf "+b.getBEMERKUNG());
                    }
                }
                //anwesenheit.get(i).setBEMERKUNG(null);
                ao.getEintraege().add(anwesenheit.get(i));
            }
        }

        for (AnwesenheitObjekt ano : anw) {
            ano = VerspaetungsUtil.parse(ano);
        }
        return anw;
    }

}