// Path: src/main/java/wdawson/samples/dropwizard/api/UserInfo.java
// public class UserInfo {
// 
//     @Min(1)
//     private long id;
// 
//     private String name;
// 
//     public UserInfo() {
//         // Jackson deserialization
//     }
// 
//     public UserInfo(long id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     @JsonProperty
//     public long getId() {
//         return id;
//     }
// 
//     @JsonProperty
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
//         UserInfo userInfo = (UserInfo) o;
//         return id == userInfo.id &&
//                 Objects.equals(name, userInfo.name);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(id, name);
//     }
// 
//     @Override
//     public String toString() {
//         return "UserInfo{" +
//                 "id=" + id +
//                 ", name='" + name + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/auth/Role.java
// public interface Role {
//     String USER_READ_ONLY = "USER_READ_ONLY";
//     String ADMIN = "ADMIN";
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/auth/User.java
// public final class User implements Principal {
// 
//     private final String id;
//     private final String orgId;
//     private final Set<String> roles;
// 
//     /*
//      * Constructors
//      */
// 
//     private User(Builder builder) {
//         id = builder.id;
//         orgId = builder.orgId;
//         roles = builder.roles;
//     }
// 
//     public static Builder newBuilder() {
//         return new Builder();
//     }
// 
//     public static Builder newBuilder(User copy) {
//         Builder builder = new Builder();
//         builder.id = copy.id;
//         builder.orgId = copy.orgId;
//         builder.roles = copy.roles;
//         return builder;
//     }
// 
//     /*
//      * Implement Principal interface
//      */
// 
//     @Override
//     public String getName() {
//         return id;
//     }
// 
//     /*
//      * Getters
//      */
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getOrgId() {
//         return orgId;
//     }
// 
//     public Set<String> getRoles() {
//         return roles;
//     }
// 
//     /*
//      * Builder
//      */
// 
//     public static final class Builder {
//         private String id;
//         private String orgId;
//         private Set<String> roles;
// 
//         private Builder() {
//         }
// 
//         public Builder withId(String val) {
//             id = val;
//             return this;
//         }
// 
//         public Builder withOrgId(String val) {
//             orgId = val;
//             return this;
//         }
// 
//         public Builder withRoles(Set<String> val) {
//             roles = val;
//             return this;
//         }
// 
//         public User build() {
//             return new User(this);
//         }
//     }
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/util/resources/ResourceUtils.java
// public class ResourceUtils {
// 
//     /**
//      * Reads the lines from a resource given it's location on the classpath
//      *
//      * @param resourceName The location of the resource on the classpath
//      * @return The lines in the resource as a List of Strings
//      * @throws IllegalArgumentException If the resource could not be found or parsed
//      */
//     public static List<String> readLinesFromResource(String resourceName) {
//         URL namesResourceURL = Resources.getResource(resourceName);
//         try {
//             return Resources.readLines(namesResourceURL, Charsets.UTF_8);
//         } catch (IOException e) {
//             throw new IllegalArgumentException("Some I/O error occurred when reading " + resourceName);
//         }
//     }
// 
// }


import com.codahale.metrics.annotation.Timed;
import com.google.common.annotations.VisibleForTesting;
import io.dropwizard.auth.Auth;
import wdawson.samples.dropwizard.api.UserInfo;
import wdawson.samples.dropwizard.auth.Role;
import wdawson.samples.dropwizard.auth.User;
import wdawson.samples.dropwizard.util.resources.ResourceUtils;
import javax.annotation.security.RolesAllowed;
import javax.validation.constraints.Min;
import javax.ws.rs.GET;
import javax.ws.rs.NotAuthorizedException;
import javax.ws.rs.NotFoundException;
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 java.util.LinkedList;
import java.util.List;
import static java.lang.String.format;
package wdawson.samples.dropwizard.resources;




/**
 * Resource for user info
 *
 * @author wdawson
 */
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public class UserInfoResource {

    private final List<String> names;

    public UserInfoResource(String namesResource) {
        names = ResourceUtils.readLinesFromResource(namesResource);
    }

    /**
     * Gets the info about a user given their ID
     *
     * @param id The id of the user to fetch
     * @return The user
     */
    @GET
    @Path(("/{id}"))
    @Timed
// Path: src/main/java/wdawson/samples/dropwizard/api/UserInfo.java
// public class UserInfo {
// 
//     @Min(1)
//     private long id;
// 
//     private String name;
// 
//     public UserInfo() {
//         // Jackson deserialization
//     }
// 
//     public UserInfo(long id, String name) {
//         this.id = id;
//         this.name = name;
//     }
// 
//     @JsonProperty
//     public long getId() {
//         return id;
//     }
// 
//     @JsonProperty
//     public String getName() {
//         return name;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) {
//             return true;
//         }
//         if (o == null || getClass() != o.getClass()) {
//             return false;
//         }
//         UserInfo userInfo = (UserInfo) o;
//         return id == userInfo.id &&
//                 Objects.equals(name, userInfo.name);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(id, name);
//     }
// 
//     @Override
//     public String toString() {
//         return "UserInfo{" +
//                 "id=" + id +
//                 ", name='" + name + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/auth/Role.java
// public interface Role {
//     String USER_READ_ONLY = "USER_READ_ONLY";
//     String ADMIN = "ADMIN";
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/auth/User.java
// public final class User implements Principal {
// 
//     private final String id;
//     private final String orgId;
//     private final Set<String> roles;
// 
//     /*
//      * Constructors
//      */
// 
//     private User(Builder builder) {
//         id = builder.id;
//         orgId = builder.orgId;
//         roles = builder.roles;
//     }
// 
//     public static Builder newBuilder() {
//         return new Builder();
//     }
// 
//     public static Builder newBuilder(User copy) {
//         Builder builder = new Builder();
//         builder.id = copy.id;
//         builder.orgId = copy.orgId;
//         builder.roles = copy.roles;
//         return builder;
//     }
// 
//     /*
//      * Implement Principal interface
//      */
// 
//     @Override
//     public String getName() {
//         return id;
//     }
// 
//     /*
//      * Getters
//      */
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getOrgId() {
//         return orgId;
//     }
// 
//     public Set<String> getRoles() {
//         return roles;
//     }
// 
//     /*
//      * Builder
//      */
// 
//     public static final class Builder {
//         private String id;
//         private String orgId;
//         private Set<String> roles;
// 
//         private Builder() {
//         }
// 
//         public Builder withId(String val) {
//             id = val;
//             return this;
//         }
// 
//         public Builder withOrgId(String val) {
//             orgId = val;
//             return this;
//         }
// 
//         public Builder withRoles(Set<String> val) {
//             roles = val;
//             return this;
//         }
// 
//         public User build() {
//             return new User(this);
//         }
//     }
// }
// 
// Path: src/main/java/wdawson/samples/dropwizard/util/resources/ResourceUtils.java
// public class ResourceUtils {
// 
//     /**
//      * Reads the lines from a resource given it's location on the classpath
//      *
//      * @param resourceName The location of the resource on the classpath
//      * @return The lines in the resource as a List of Strings
//      * @throws IllegalArgumentException If the resource could not be found or parsed
//      */
//     public static List<String> readLinesFromResource(String resourceName) {
//         URL namesResourceURL = Resources.getResource(resourceName);
//         try {
//             return Resources.readLines(namesResourceURL, Charsets.UTF_8);
//         } catch (IOException e) {
//             throw new IllegalArgumentException("Some I/O error occurred when reading " + resourceName);
//         }
//     }
// 
// }


// Path: src/main/java/wdawson/samples/dropwizard/resources/UserInfoResource.java
import com.codahale.metrics.annotation.Timed;
import com.google.common.annotations.VisibleForTesting;
import io.dropwizard.auth.Auth;
import wdawson.samples.dropwizard.api.UserInfo;
import wdawson.samples.dropwizard.auth.Role;
import wdawson.samples.dropwizard.auth.User;
import wdawson.samples.dropwizard.util.resources.ResourceUtils;
import javax.annotation.security.RolesAllowed;
import javax.validation.constraints.Min;
import javax.ws.rs.GET;
import javax.ws.rs.NotAuthorizedException;
import javax.ws.rs.NotFoundException;
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 java.util.LinkedList;
import java.util.List;
import static java.lang.String.format;

package wdawson.samples.dropwizard.resources;




/**
 * Resource for user info
 *
 * @author wdawson
 */
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
public class UserInfoResource {

    private final List<String> names;

    public UserInfoResource(String namesResource) {
        names = ResourceUtils.readLinesFromResource(namesResource);
    }

    /**
     * Gets the info about a user given their ID
     *
     * @param id The id of the user to fetch
     * @return The user
     */
    @GET
    @Path(("/{id}"))
    @Timed
    @RolesAllowed({Role.USER_READ_ONLY, Role.ADMIN})