@GET
  @Path("list")
  @Produces(MediaType.APPLICATION_JSON)
  public Response list(@Context HttpServletRequest req) {

    JsonResponse json = new JsonResponse();

    Principal principal = req.getUserPrincipal();
    if (principal == null) {
      json.setStatus("FAILED");
      json.setErrorMsg("User not logged");
      return Response.ok().entity(json).build();
    }

    User user = userBean.find(principal.getName());

    List<Ticket> list = ticketBean.findAll(user.getCompany());

    json.setData(list);

    json.setStatus("SUCCESS");

    return Response.ok().entity(json).build();
  }
  @POST
  @Path("newticket")
  @Produces(MediaType.APPLICATION_JSON)
  @TransactionAttribute(TransactionAttributeType.NEVER)
  public Response newticket(
      @FormParam("noiselogger") String noiselogger, @Context HttpServletRequest req)
      throws AddressException, MessagingException {
    Date date = new Date();

    TicketDTO newTicket = new TicketDTO();

    JsonResponse json = new JsonResponse();
    json.setData(newTicket); // just return the date we received

    Principal principal = req.getUserPrincipal();
    // only login if not already logged in...
    if (principal == null) {
      json.setStatus("FAILED");
      json.setErrorMsg("Authentication failed");
      return Response.ok().entity(json).build();
    }

    // Retrive info for the noise logger selected
    String path = "/Users/pelldav/University/Tesi/SmartWaterProject/web/file/Noise_loggers.kml";
    Kml kml = Kml.unmarshal(new File(path));
    Document document = (Document) kml.getFeature(); // Get the document features
    Iterator<Feature> iterator =
        document.getFeature().iterator(); // Create an iterator for the placemark
    Feature feature = null;
    while (iterator.hasNext()) {
      feature = iterator.next();
      if (feature.getName().compareTo(noiselogger) == 0) {
        break;
      }
    }
    req.getServletContext().log("ECCOLOOOOOO: " + feature.getDescription());
    String[] description = feature.getDescription().split("<br>");
    String battery = description[1].split("<b>")[1].split("%")[0];
    String status = description[2].split("<b>")[1].split("</b>")[0];

    // set the Company name
    User user = userBean.find(principal.getName());
    newTicket.setCompany(user.getCompany());

    // set the id
    newTicket.setId("" + date.getTime());

    // set the noise logger id
    newTicket.setNoiselogger(noiselogger);

    // retrive state and info from kml
    if (status.compareTo("OK") != 0) { // Error on network sensor
      newTicket.setInfo("Richiesta verifica rete noise loggers");
    } else { // Low battery
      newTicket.setInfo("Richiesta sostituzione batteria - Livello: " + battery + "%");
    }

    // set stato - initial state is always "attivo"
    newTicket.setStato("attivo");

    req.getServletContext().log("ticket creato" + newTicket);

    json.setData(newTicket); // just return the date we received

    Ticket ticket = new Ticket(newTicket);

    // this could cause a runtime exception, i.e. in case the user already exists
    // such exceptions will be caught by our ExceptionMapper, i.e.
    // javax.transaction.RollbackException
    ticketBean.save(
        ticket); // this would use the clients transaction which is committed after save() has
                 // finished

    // Send email to user
    String host = "smtp.gmail.com";
    String from = "*****@*****.**";
    String pass = "******";
    Properties props = System.getProperties();
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.user", from);
    props.put("mail.smtp.password", pass);
    props.put("mail.smtp.port", "587");
    props.put("mail.smtp.auth", "true");

    String[] to = {user.getEmail()};

    Session session = Session.getDefaultInstance(props, null);
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));

    InternetAddress[] toAddress = new InternetAddress[to.length];

    for (int i = 0; i < to.length; i++) { // To get the array of addresses
      toAddress[i] = new InternetAddress(to[i]);
    }
    System.out.println(Message.RecipientType.TO);

    for (int i = 0; i < toAddress.length; i++) {
      message.addRecipient(Message.RecipientType.TO, toAddress[i]);
    }
    message.setSubject("Smart Leak Detection - Richiesta Manutenzione");
    message.setContent(
        "<h1>Smart Leak Detection</h1> <br> <div> Registrazione di manutenzione inviata <br>"
            + newTicket.toString()
            + "</div>",
        "text/html");
    Transport transport = session.getTransport("smtp");
    transport.connect(host, from, pass);
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
    req.getServletContext().log("Email sent to: '" + user.getEmail());

    json.setStatus("SUCCESS");

    req.getServletContext()
        .log(
            "successfully added new ticket: '"
                + newTicket.getCompany()
                + "':'"
                + newTicket.getId()
                + "'");

    return Response.ok().entity(json).build();
  }