// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/configuration/LocateApiConfiguration.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class LocateApiConfiguration extends Configuration {
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private MongoConfiguration mongoConfiguration = new MongoConfiguration();
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private Integer maxRequestsPerDay;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private String encryptionKey;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private Boolean encrypted;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private String allowedOrigins;
// 
//     public MongoConfiguration getMongoConfiguration() {
//         return mongoConfiguration;
//     }
// 
//     public Integer getMaxRequestsPerDay() {
//         return maxRequestsPerDay;
//     }
// 
//     public String getEncryptionKey() {
//         return encryptionKey;
//     }
// 
//     public Boolean getEncrypted() {
//         return encrypted;
//     }
// 
//     public String getAllowedOrigins() {
//         return allowedOrigins;
//     }
// 
//     @Override
//     public String toString() {
//         return "LocateApiConfiguration{" +
//                 "mongoConfiguration=" + mongoConfiguration +
//                 ", maxRequestsPerDay=" + maxRequestsPerDay +
//                 ", encryptionKey='" + encryptionKey + '\'' +
//                 ", encrypted=" + encrypted +
//                 ", allowedOrigins='" + allowedOrigins + '\'' +
//                 '}';
//     }
// }
// 
// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/dao/UsageDao.java
// public class UsageDao {
// 
//     private final JacksonDBCollection<Usage, String> collection;
// 
//     public UsageDao(JacksonDBCollection<Usage, String> collection) {
//         this.collection = collection;
//     }
// 
//     @Timed
//     public Optional<Usage> findUsageByIdentifier(String identifier) {
//         return Optional.fromNullable(collection.findAndModify(new BasicDBObject("identifier", identifier), new DBUpdate.Builder().inc("count")));
//     }
// 
//     @Timed
//     public Boolean create(String identifier) {
//         Date expiry = DateTime.now().withZone(DateTimeZone.UTC).withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withMillisOfSecond(999).toDate();
//         return collection.insert(new Usage(org.bson.types.ObjectId.get().toString(), identifier, 1, expiry)).getN() == 1;
//     }
// 
//     @Timed
//     public void applyIndexes() {
//         collection.ensureIndex(new BasicDBObject("identifier", 1), "identifier_index", true);
//         collection.ensureIndex(new BasicDBObject("expireAt", 1), new BasicDBObject("expireAfterSeconds", 0));
//     }
// }
// 
// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/model/AuthorizationToken.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class AuthorizationToken {
// 
//     @JsonProperty("_id")
//     @ObjectId
//     private String id;
// 
//     @JsonProperty("name")
//     private String name;
// 
//     @JsonProperty("identifier")
//     private String identifier;
// 
//     @JsonProperty("organisation")
//     private String organisation;
// 
//     @JsonProperty("token")
//     private String token;
// 
//     public AuthorizationToken() {
//     }
// 
//     public AuthorizationToken(String id, String name, String identifier, String organisation, String token) {
//         this.id = id;
//         this.name = name;
//         this.identifier = identifier;
//         this.organisation = organisation;
//         this.token = token;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getIdentifier() {
//         return identifier;
//     }
// 
//     public String getOrganisation() {
//         return organisation;
//     }
// 
//     public String getToken() {
//         return token;
//     }
// 
//     @Override
//     public String toString() {
//         return "AuthorizationToken{" +
//                 "id='" + id + '\'' +
//                 ", name='" + name + '\'' +
//                 ", identifier='" + identifier + '\'' +
//                 ", organisation='" + organisation + '\'' +
//                 ", token='" + token + '\'' +
//                 '}';
//     }
// }


import com.sun.jersey.api.model.Parameter;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
import com.yammer.dropwizard.auth.Auth;
import com.yammer.dropwizard.auth.Authenticator;
import uk.gov.gds.locate.api.configuration.LocateApiConfiguration;
import uk.gov.gds.locate.api.dao.UsageDao;
import uk.gov.gds.locate.api.model.AuthorizationToken;
package uk.gov.gds.locate.api.authentication;


public class BearerTokenAuthProvider implements InjectableProvider<Auth, Parameter> {

    private final LocateApiConfiguration configuration;
    private final UsageDao usageDao;
    private final Authenticator<String, AuthorizationToken> authenticator;


// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/configuration/LocateApiConfiguration.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class LocateApiConfiguration extends Configuration {
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private MongoConfiguration mongoConfiguration = new MongoConfiguration();
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private Integer maxRequestsPerDay;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private String encryptionKey;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private Boolean encrypted;
// 
//     @Valid
//     @NotNull
//     @JsonProperty
//     private String allowedOrigins;
// 
//     public MongoConfiguration getMongoConfiguration() {
//         return mongoConfiguration;
//     }
// 
//     public Integer getMaxRequestsPerDay() {
//         return maxRequestsPerDay;
//     }
// 
//     public String getEncryptionKey() {
//         return encryptionKey;
//     }
// 
//     public Boolean getEncrypted() {
//         return encrypted;
//     }
// 
//     public String getAllowedOrigins() {
//         return allowedOrigins;
//     }
// 
//     @Override
//     public String toString() {
//         return "LocateApiConfiguration{" +
//                 "mongoConfiguration=" + mongoConfiguration +
//                 ", maxRequestsPerDay=" + maxRequestsPerDay +
//                 ", encryptionKey='" + encryptionKey + '\'' +
//                 ", encrypted=" + encrypted +
//                 ", allowedOrigins='" + allowedOrigins + '\'' +
//                 '}';
//     }
// }
// 
// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/dao/UsageDao.java
// public class UsageDao {
// 
//     private final JacksonDBCollection<Usage, String> collection;
// 
//     public UsageDao(JacksonDBCollection<Usage, String> collection) {
//         this.collection = collection;
//     }
// 
//     @Timed
//     public Optional<Usage> findUsageByIdentifier(String identifier) {
//         return Optional.fromNullable(collection.findAndModify(new BasicDBObject("identifier", identifier), new DBUpdate.Builder().inc("count")));
//     }
// 
//     @Timed
//     public Boolean create(String identifier) {
//         Date expiry = DateTime.now().withZone(DateTimeZone.UTC).withHourOfDay(23).withMinuteOfHour(59).withSecondOfMinute(59).withMillisOfSecond(999).toDate();
//         return collection.insert(new Usage(org.bson.types.ObjectId.get().toString(), identifier, 1, expiry)).getN() == 1;
//     }
// 
//     @Timed
//     public void applyIndexes() {
//         collection.ensureIndex(new BasicDBObject("identifier", 1), "identifier_index", true);
//         collection.ensureIndex(new BasicDBObject("expireAt", 1), new BasicDBObject("expireAfterSeconds", 0));
//     }
// }
// 
// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/model/AuthorizationToken.java
// @JsonIgnoreProperties(ignoreUnknown = true)
// public class AuthorizationToken {
// 
//     @JsonProperty("_id")
//     @ObjectId
//     private String id;
// 
//     @JsonProperty("name")
//     private String name;
// 
//     @JsonProperty("identifier")
//     private String identifier;
// 
//     @JsonProperty("organisation")
//     private String organisation;
// 
//     @JsonProperty("token")
//     private String token;
// 
//     public AuthorizationToken() {
//     }
// 
//     public AuthorizationToken(String id, String name, String identifier, String organisation, String token) {
//         this.id = id;
//         this.name = name;
//         this.identifier = identifier;
//         this.organisation = organisation;
//         this.token = token;
//     }
// 
//     public String getId() {
//         return id;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getIdentifier() {
//         return identifier;
//     }
// 
//     public String getOrganisation() {
//         return organisation;
//     }
// 
//     public String getToken() {
//         return token;
//     }
// 
//     @Override
//     public String toString() {
//         return "AuthorizationToken{" +
//                 "id='" + id + '\'' +
//                 ", name='" + name + '\'' +
//                 ", identifier='" + identifier + '\'' +
//                 ", organisation='" + organisation + '\'' +
//                 ", token='" + token + '\'' +
//                 '}';
//     }
// }


// Path: locate-api-service/src/main/java/uk/gov/gds/locate/api/authentication/BearerTokenAuthProvider.java
import com.sun.jersey.api.model.Parameter;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
import com.yammer.dropwizard.auth.Auth;
import com.yammer.dropwizard.auth.Authenticator;
import uk.gov.gds.locate.api.configuration.LocateApiConfiguration;
import uk.gov.gds.locate.api.dao.UsageDao;
import uk.gov.gds.locate.api.model.AuthorizationToken;

package uk.gov.gds.locate.api.authentication;


public class BearerTokenAuthProvider implements InjectableProvider<Auth, Parameter> {

    private final LocateApiConfiguration configuration;
    private final UsageDao usageDao;
    private final Authenticator<String, AuthorizationToken> authenticator;


    public BearerTokenAuthProvider(LocateApiConfiguration configuration, UsageDao usageDao, Authenticator<String, AuthorizationToken> bearerTokenAuthenticator) {