content: package com.airbnb.airpal.resources;
  
  import com.airbnb.airpal.core.store.files.ExpiringFileStore;
  import com.google.common.io.ByteStreams;
  import com.google.inject.Inject;
  
  import javax.ws.rs.GET;
  import javax.ws.rs.Path;
  import javax.ws.rs.PathParam;
  import javax.ws.rs.Produces;
  import javax.ws.rs.WebApplicationException;
  import javax.ws.rs.core.MediaType;
  import javax.ws.rs.core.Response;
  import javax.ws.rs.core.StreamingOutput;
  
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  
  @Path("/api/files")
  public class FilesResource
  {
      private final ExpiringFileStore fileStore;
  
      @Inject
      public FilesResource(ExpiringFileStore fileStore)
      {
          this.fileStore = fileStore;
      }
  
      @GET
      @Path("/{fileName}")
      @Produces(MediaType.APPLICATION_OCTET_STREAM)
      public Response getFile(@PathParam("fileName") String fileName)
      {
          final File file = fileStore.get(fileName);
  
          if (file == null) {
              return Response.status(Response.Status.NOT_FOUND).build();
          } else {
              return Response.ok(new StreamingOutput() {
                  @Override
                  public void write(OutputStream output)
                          throws IOException, WebApplicationException
                  {
                      // TODO: Make this use chunked encoding?
                      try (FileInputStream inputStream = new FileInputStream(file)) {
                          ByteStreams.copy(inputStream, output);
                      } finally {
                          output.close();
                      }
                  }
              }).build();
          }
      }
  }
  