// Path: telemetry-example/src/main/java/com/yammer/telemetry/example/core/Nap.java
// @Entity
// @Table(name = "naps")
// @NamedQueries({
//     @NamedQuery(
//         name = "com.yammer.telemetry.example.core.Nap.findAll",
//         query = "SELECT n FROM Nap n"
//     ),
//     @NamedQuery(
//         name = "com.yammer.telemetry.example.core.Nap.findById",
//         query = "SELECT n FROM Nap n WHERE n.id = :id"
//     )
// })
// public class Nap {
//     @Id
//     @GeneratedValue(strategy = GenerationType.IDENTITY)
//     private long id;
// 
//     @Column(name = "start", nullable = false)
//     private long start;
// 
//     @Column(name = "duration", nullable = false)
//     private long duration;
// 
//     public Nap() {
//     }
// 
//     public Nap(long start, long duration) {
//         this.start = start;
//         this.duration = duration;
//     }
// 
//     public long getStart() {
//         return start;
//     }
// 
//     public void setStart(long start) {
//         this.start = start;
//     }
// 
//     public long getDuration() {
//         return duration;
//     }
// 
//     public void setDuration(long duration) {
//         this.duration = duration;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public String toString() {
//         return "Nap{" +
//                 "id=" + id +
//                 ", start=" + start +
//                 ", duration=" + duration +
//                 '}';
//     }
// }
// 
// Path: telemetry-example/src/main/java/com/yammer/telemetry/example/db/NapDAO.java
// public class NapDAO extends AbstractDAO<Nap> {
//     public NapDAO(SessionFactory sessionFactory) {
//         super(sessionFactory);
//     }
// 
//     public Optional<Nap> findById(long id) {
//         return Optional.fromNullable(get(id));
//     }
// 
//     public Nap create(Nap nap) {
//         return persist(nap);
//     }
// 
//     public List<Nap> findAll() {
//         return list(namedQuery("com.yammer.telemetry.example.core.Nap.findAll"));
//     }
// }


import com.yammer.dropwizard.hibernate.UnitOfWork;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.annotation.Timed;
import com.yammer.metrics.core.Meter;
import com.yammer.telemetry.example.core.Nap;
import com.yammer.telemetry.example.db.NapDAO;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.concurrent.TimeUnit;
package com.yammer.telemetry.example.resources;



@Path("/nap/{duration}")
@Produces(MediaType.TEXT_PLAIN)
public class NapResource {
    private final NapDAO napDAO;
    private final Meter sleepsTaken = Metrics.newMeter(NapResource.class, "sleeps", "taken", TimeUnit.MILLISECONDS);
    private final Meter sleepsDuration = Metrics.newMeter(NapResource.class, "sleeps", "duration", TimeUnit.MILLISECONDS);

    public NapResource(NapDAO napDAO) {
        this.napDAO = napDAO;
    }

    @GET
    @UnitOfWork
    @Timed
    public String nap(@PathParam("duration") DurationParam duration) throws InterruptedException {
// Path: telemetry-example/src/main/java/com/yammer/telemetry/example/core/Nap.java
// @Entity
// @Table(name = "naps")
// @NamedQueries({
//     @NamedQuery(
//         name = "com.yammer.telemetry.example.core.Nap.findAll",
//         query = "SELECT n FROM Nap n"
//     ),
//     @NamedQuery(
//         name = "com.yammer.telemetry.example.core.Nap.findById",
//         query = "SELECT n FROM Nap n WHERE n.id = :id"
//     )
// })
// public class Nap {
//     @Id
//     @GeneratedValue(strategy = GenerationType.IDENTITY)
//     private long id;
// 
//     @Column(name = "start", nullable = false)
//     private long start;
// 
//     @Column(name = "duration", nullable = false)
//     private long duration;
// 
//     public Nap() {
//     }
// 
//     public Nap(long start, long duration) {
//         this.start = start;
//         this.duration = duration;
//     }
// 
//     public long getStart() {
//         return start;
//     }
// 
//     public void setStart(long start) {
//         this.start = start;
//     }
// 
//     public long getDuration() {
//         return duration;
//     }
// 
//     public void setDuration(long duration) {
//         this.duration = duration;
//     }
// 
//     public long getId() {
//         return id;
//     }
// 
//     public void setId(long id) {
//         this.id = id;
//     }
// 
//     @Override
//     public String toString() {
//         return "Nap{" +
//                 "id=" + id +
//                 ", start=" + start +
//                 ", duration=" + duration +
//                 '}';
//     }
// }
// 
// Path: telemetry-example/src/main/java/com/yammer/telemetry/example/db/NapDAO.java
// public class NapDAO extends AbstractDAO<Nap> {
//     public NapDAO(SessionFactory sessionFactory) {
//         super(sessionFactory);
//     }
// 
//     public Optional<Nap> findById(long id) {
//         return Optional.fromNullable(get(id));
//     }
// 
//     public Nap create(Nap nap) {
//         return persist(nap);
//     }
// 
//     public List<Nap> findAll() {
//         return list(namedQuery("com.yammer.telemetry.example.core.Nap.findAll"));
//     }
// }


// Path: telemetry-example/src/main/java/com/yammer/telemetry/example/resources/NapResource.java
import com.yammer.dropwizard.hibernate.UnitOfWork;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.annotation.Timed;
import com.yammer.metrics.core.Meter;
import com.yammer.telemetry.example.core.Nap;
import com.yammer.telemetry.example.db.NapDAO;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.concurrent.TimeUnit;

package com.yammer.telemetry.example.resources;



@Path("/nap/{duration}")
@Produces(MediaType.TEXT_PLAIN)
public class NapResource {
    private final NapDAO napDAO;
    private final Meter sleepsTaken = Metrics.newMeter(NapResource.class, "sleeps", "taken", TimeUnit.MILLISECONDS);
    private final Meter sleepsDuration = Metrics.newMeter(NapResource.class, "sleeps", "duration", TimeUnit.MILLISECONDS);

    public NapResource(NapDAO napDAO) {
        this.napDAO = napDAO;
    }

    @GET
    @UnitOfWork
    @Timed
    public String nap(@PathParam("duration") DurationParam duration) throws InterruptedException {
        final Nap nap = new Nap(System.currentTimeMillis(), duration.getDuration().toMilliseconds());