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 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.Ausbilder; import de.tuttas.entities.Bemerkung; import de.tuttas.entities.Betrieb; import de.tuttas.entities.Klasse; import de.tuttas.entities.LoginSchueler; import de.tuttas.entities.Noten; import de.tuttas.restful.Data.SchuelerObject; import de.tuttas.entities.Schueler; import de.tuttas.entities.Schueler_Klasse; import de.tuttas.restful.Data.AnwesenheitEintrag; import de.tuttas.restful.Data.AnwesenheitObjekt; import de.tuttas.restful.Data.BildObject; import de.tuttas.restful.Data.KlasseDetails; import de.tuttas.restful.Data.PsResultObject; import de.tuttas.restful.Data.ResultObject; import de.tuttas.restful.auth.Authenticator; import de.tuttas.restful.auth.HTTPHeaderNames; import de.tuttas.util.DatumUtil; import de.tuttas.util.ImageUtil; import de.tuttas.util.Log; import de.tuttas.util.StringUtil; import de.tuttas.util.VerspaetungsUtil; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.sql.Date; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; 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.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.io.IOUtils; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; /** * Webservice zum Verwalten der Schler * @author Jrg */ @Path("schueler") @Stateless public class SchuelerManager { /** * Injection des EntityManagers */ @PersistenceContext(unitName = "DiklabuPU") EntityManager em; /** * Abfrage der Klassen eines Schlers * @param sid ID des Schlers * @return Liste von Klassen / Kursen in denen der Schler ist */ @GET @Path("/member/{id}") @Produces({ "application/json; charset=iso-8859-1" }) public List<KlasseDetails> getMembership(@PathParam("id") int sid) { Log.d("Webservice member schueler GET: schueler=" + sid); Query query = em.createNamedQuery("findKlasseEinesSchuelers"); query.setParameter("paramSchuelerId", sid); List<KlasseDetails> klassen = query.getResultList(); Log.d("Result List:" + klassen); return klassen; } /** * Einen Schler finden * @param toFind Zeichenkette aus Vorname NachName und Geburtsdatum (z.B. ThomasMustermann1993-12-01) * @param lDist Lefenshtein Distanz fr die Suchen * @return Liste von Schlern die dem Kriterium entsprechen */ @GET @Produces({ "application/json; charset=iso-8859-1" }) @Path("{tofind}/{ldist}") public List<SchuelerObject> searchSchueler(@PathParam("tofind") String toFind, @PathParam("ldist") int lDist) { Query query = em.createNamedQuery("findSchueler"); List<Schueler> schueler = query.getResultList(); List<SchuelerObject> sol = new ArrayList<>(); for (Schueler s : schueler) { String d = ""; if (s.getGEBDAT() != null) { d = s.getGEBDAT().toString(); } int l = StringUtil.levenshteinDistance(toFind, s.getVNAME() + s.getNNAME() + d); if (l <= lDist) { //Log.d("l="+l); SchuelerObject so = new SchuelerObject(); so.setLdist(l); so.setId(s.getId()); so.setEmail(s.getEMAIL()); so.setName(s.getNNAME()); so.setVorname(s.getVNAME()); sol.add(so); } } Collections.sort(sol); return sol; } /** * Alle Schler abfragen * @return Liste aller Schler */ @GET @Produces({ "application/json; charset=iso-8859-1" }) public List<Schueler> getPupils() { Query query = em.createNamedQuery("findSchueler"); List<Schueler> schueler = query.getResultList(); return schueler; } /** * Bemerkungen eines Schlers ndern * @param idschueler ID des Schlers * @param so Schler Objekt mit neuen Schlerdaten * @return gendertes Schlerobjekt */ @POST @Path("/{idschueler}") public SchuelerObject setPupil(@PathParam("idschueler") int idschueler, SchuelerObject so) { em.getEntityManagerFactory().getCache().evictAll(); Schueler s = em.find(Schueler.class, idschueler); if (s == null) { return null; } s.setINFO(so.getInfo()); em.merge(s); return so; } /** * Einen neuen Schler anlegen * @param s Das Schlerobjekt * @return Das Schlerobjekt mit vergebener ID */ @POST @Produces({ "application/json; charset=iso-8859-1" }) @Path("/admin") public Schueler addSchueler(Schueler s) { Log.d("add Schuler " + s.toString()); em.getEntityManagerFactory().getCache().evictAll(); em.persist(s); em.flush(); return s; } /** * Attribute fr einen Schler ndern * @param sid ID des Schlers * @param s das Schlerobjekt * @return das Schlerobjekt */ @POST @Produces({ "application/json; charset=iso-8859-1" }) @Path("verwaltung/{idschueler}") public Schueler setPupil(@PathParam("idschueler") int sid, Schueler s) { Log.d("set Schuler " + s); Schueler sl = em.find(Schueler.class, sid); if (sl != null) { if (s.getABGANG() != null) sl.setABGANG(s.getABGANG()); if (s.getEMAIL() != null) sl.setEMAIL(s.getEMAIL()); if (s.getGEBDAT() != null) sl.setGEBDAT(s.getGEBDAT()); if (s.getID_AUSBILDER() != null) sl.setID_AUSBILDER(s.getID_AUSBILDER()); if (s.getINFO() != null) sl.setINFO(s.getINFO()); if (s.getNNAME() != null) sl.setNNAME(s.getNNAME()); if (s.getVNAME() != null) sl.setVNAME(s.getVNAME()); if (s.getID_MMBBS() != null) sl.setID_MMBBS(s.getID_MMBBS()); em.merge(sl); } return sl; } /** * Schler anhang von Vorname, Nachname und Geburtsdatum suchen * @param c Schlerobjekt mit den notwendigen Daten * @return Liste der Schler auf die die Suche zutrifft */ @POST @Path("/info/") @Produces({ "application/json; charset=iso-8859-1" }) public List<Schueler> getPupilbyCredential(Schueler c) { Log.d("gesucht wird " + c); em.getEntityManagerFactory().getCache().evictAll(); Query query = em.createNamedQuery("findSchuelerbyCredentials"); query.setParameter("paramName", c.getNNAME()); query.setParameter("paramVorname", c.getVNAME()); query.setParameter("paramGebDatum", c.getGEBDAT()); List<Schueler> pupils = query.getResultList(); Log.d("Schuler gefunden:" + pupils); return pupils; } /** * Einen Schler lschen * @param sid ID des Schlers * @return Ergebnis Objekt mit Meldungen */ @DELETE @Path("/admin/{idschueler}") @Produces({ "application/json; charset=iso-8859-1" }) public PsResultObject deleteSchueler(@PathParam("idschueler") int sid) { em.getEntityManagerFactory().getCache().evictAll(); Log.d("Webservice delete Schueler:" + sid); PsResultObject ro = new PsResultObject(); Schueler s = em.find(Schueler.class, sid); if (s != null) { Query query = em.createNamedQuery("findKlassenids"); query.setParameter("paramidSchueler", sid); List<Schueler_Klasse> sk = query.getResultList(); if (sk.size() != 0) { ro.setMsg("Schler " + s.getVNAME() + " " + s.getNNAME() + " kann nicht gelscht werden, da er sich noch in Klassenn befindet"); ro.setSuccess(false); int[] ids = new int[sk.size()]; for (int i = 0; i < sk.size(); i++) { ids[i] = sk.get(i).getID_KLASSE(); } ro.setIds(ids); } else { query = em.createNamedQuery("findAnwesenheitByidSchueler"); query.setParameter("paramidSchueler", sid); List<Anwesenheit> anw = query.getResultList(); for (Anwesenheit a : anw) { Log.d("Lsche Anwesenheitseintrag " + a); em.remove(a); } query = em.createNamedQuery("findNoteByIDSchueler"); query.setParameter("paramSchuelerID", sid); List<Noten> noten = query.getResultList(); for (Noten n : noten) { Log.d("Lsche Note " + n); em.remove(n); } query = em.createNamedQuery("findBemerkungbySchuelerId"); query.setParameter("paramSchuelerId", sid); List<Bemerkung> bem = query.getResultList(); for (Bemerkung b : bem) { Log.d("Lsche Bemerkung " + b); em.remove(b); } em.flush(); em.remove(s); ro.setMsg("Schler " + s.getVNAME() + " " + s.getNNAME() + " gelscht"); ro.setSuccess(true); } } else { ro.setMsg("Kann Schler mit id=" + sid + " nicht finden"); ro.setSuccess(false); } return ro; } /** * Details zu einem Schler abfragen * @param idschueler ID des Schlers * @return SchlerObjekt */ @GET @Path("/{idschueler}") @Produces({ "application/json; charset=iso-8859-1" }) public SchuelerObject getPupil(@PathParam("idschueler") int idschueler) { Log.d("Abfrage Schueler mit der ID " + idschueler); Schueler s = em.find(Schueler.class, idschueler); if (s != null) { SchuelerObject so = new SchuelerObject(); so.setId(idschueler); so.setGebDatum(s.getGEBDAT()); so.setName(s.getNNAME()); so.setVorname(s.getVNAME()); so.setEmail(s.getEMAIL()); so.setInfo(s.getINFO()); so.setAbgang(s.getABGANG()); so.setID_MMBBS(s.getID_MMBBS()); Query query = em.createNamedQuery("findKlassenbySchuelerID"); query.setParameter("paramIDSchueler", so.getId()); List<Klasse> klassen = query.getResultList(); Log.d("Result List:" + klassen); so.setKlassen(klassen); LoginSchueler ls = em.find(LoginSchueler.class, idschueler); if (ls != null) so.setEduplazaMail(ls.getLOGIN() + "@mmbbs.eduplaza.de"); if (s.getID_AUSBILDER() != null) { Ausbilder a = em.find(Ausbilder.class, s.getID_AUSBILDER()); so.setAusbilder(a); if (a != null) { Betrieb b = em.find(Betrieb.class, a.getID_BETRIEB()); so.setBetrieb(b); } } return so; } return null; } /** * Details zu einem Schler anhand ID_MMBBS abfragen * @param idschueler ID des Schlers * @return SchlerObjekt */ @GET @Path("/bbsplan/{idschueler}") @Produces({ "application/json; charset=iso-8859-1" }) public List<Schueler> getBbsPlanPupil(@PathParam("idschueler") int idschueler) { Log.d("Abfrage Schueler mit der BBS-PLAN ID " + idschueler); Query query = em.createNamedQuery("findSchuelerByID_MMBBS"); query.setParameter("paramID_MMBBS", idschueler); List<Schueler> pupils = query.getResultList(); return pupils; } /** * Bild eines Schlers lschen * @param idschueler ID des Schlers * @return Ergebnisobjekt mit Meldungen */ @DELETE @Path("/bild/{idschueler}") public ResultObject deteleImage(@PathParam("idschueler") int idschueler) { ResultObject ro = new ResultObject(); String filename = Config.getInstance().IMAGE_FILE_PATH + idschueler + ".jpg"; try { File file = new File(filename); if (file.delete()) { ro.setSuccess(true); ro.setMsg("Bild gelscht"); Log.d(file.getName() + " is deleted!"); } else { ro.setSuccess(false); ro.setMsg("Bild konnte nicht gelscht werden"); Log.d("Delete operation is failed."); } } catch (Exception e) { ro.setSuccess(false); ro.setMsg(e.getMessage()); } return ro; } /** * Bild eines Schlers abfragen * @param idschueler ID des Schlers * @return Bild als JPG */ @GET @Path("/bild/{idschueler}") @Produces("image/jpg") public Response getImage(@PathParam("idschueler") int idschueler) { String filename = Config.getInstance().IMAGE_FILE_PATH + idschueler + ".jpg"; Log.d("Lade file " + filename); File file = new File(filename); if (!file.exists()) { return Response.status(Response.Status.NOT_FOUND).build(); } return Response.status(Response.Status.OK).build(); } /** * Bild eines Schlers Abfragen als BASE64 * @param idschueler ID des Schlers * @return BildObjekt */ @GET @Path("/bild64/{idschueler}") public BildObject getImage64(@PathParam("idschueler") int idschueler) { BildObject bo = new BildObject(); bo.setId(idschueler); String filename = Config.getInstance().IMAGE_FILE_PATH + idschueler + ".jpg"; Log.d("Lade file " + filename); File file = new File(filename); if (!file.exists()) { return null; } BufferedImage img = null; try { img = ImageIO.read(file); bo.setBase64(ImageUtil.encodeToString(img, "jpeg")); return bo; } catch (IOException e) { return bo; } } /** * Bild eines Schlers hochladen * @param idschueler ID des Schlers (wird zum Filenamen) * @param uploadedInputStream InputStream * @param fileDetail Original File Name etc. * @return Ergebnisobjekt mit Meldungen */ @POST @Path("/bild/{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(); String fileLocation = Config.getInstance().IMAGE_FILE_PATH + idschueler + ".jpg"; Log.d("upload File for " + idschueler); try { byte[] imageBytes = IOUtils.toByteArray(uploadedInputStream); int i = uploadedInputStream.read(imageBytes); Log.d("habe " + i + " bytes gelesen!"); InputStream myInputStream = new ByteArrayInputStream(imageBytes); Image image = ImageIO.read(myInputStream); Log.d("Image gelesen =" + image); InputStream myExifInputStream = new ByteArrayInputStream(imageBytes); int orientation = ImageUtil.getImageOrientation(myExifInputStream); BufferedImage bImage = ImageUtil.toBufferedImage(image); Log.d("Image hat w=" + bImage.getWidth() + " h=" + bImage.getHeight()); bImage = ImageUtil.transformImage(bImage, ImageUtil.getExifTransformation(orientation, image.getWidth(null), image.getHeight(null))); Log.d("Image hat nach Transformation w=" + bImage.getWidth() + " h=" + bImage.getHeight()); if (image != null) { int originalWidth = bImage.getWidth(); int originalHeight = bImage.getHeight(); int newWidth = 200; int newHeight = Math.round(newWidth * ((float) originalHeight / originalWidth)); BufferedImage bi = this.createResizedCopy(bImage, newWidth, newHeight, true); ImageIO.write(bi, "jpg", new File(Config.getInstance().IMAGE_FILE_PATH + idschueler + ".jpg")); r.setMsg("Bild erfolgreich hochgeladen!"); r.setSuccess(true); } else { r.setMsg("Fehler beim Hochladen des Bildes!"); r.setSuccess(false); } } catch (IOException e) { Log.d("Error"); r.setMsg(e.getMessage()); r.setSuccess(false); } catch (MetadataException ex) { Logger.getLogger(SchuelerManager.class.getName()).log(Level.SEVERE, null, ex); } catch (ImageProcessingException ex) { Logger.getLogger(SchuelerManager.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(SchuelerManager.class.getName()).log(Level.SEVERE, null, ex); } return r; } private BufferedImage createResizedCopy(Image originalImage, int scaledWidth, int scaledHeight, boolean preserveAlpha) { int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB; BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType); Graphics2D g = scaledBI.createGraphics(); if (preserveAlpha) { g.setComposite(AlphaComposite.Src); } g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); g.dispose(); return scaledBI; } }