// Path: src/main/java/es/tid/fiware/iot/ac/dao/PolicyDao.java
// public interface PolicyDao {
// 
//     Policy createPolicy(Policy policy);
// 
//     Policy loadPolicy(String tenant, String subject, String id);
// 
//     Collection<Policy> getPolicies(String tenant, String subject);
// 
//     Policy updatePolicy(Policy policy);
// 
//     Policy deletePolicy(Policy policy);
// 
//     /**
//      * Removes the Tenant and all related objects: Tenant's Subjects and
//      * Policies.
//      */
//     void deleteFromTenant(String tenant);
// 
//     /**
//      * Removes the Subject from the Tenant, and its Policies.
//      */
//     void deleteFromSubject(String tenant, String subject);
// }
// 
// Path: src/main/java/es/tid/fiware/iot/ac/model/Policy.java
// @Entity
// public class Policy {
// 
//     @Embeddable
//     public static class PolicyId implements Serializable {
//         private String id;
//         private String tenant;
//         
//         public PolicyId() {
//             
//         }
//         
//         public PolicyId(String tenant, String id) {
//             this.id = id;
//             this.tenant = tenant;
//         }
//         
//         public String getId() {
//             return id;
//         }
//         
//         public String getTenant() {
//             return tenant;
//         }
//     }
//     
//     @EmbeddedId
//     private PolicyId internalId;
//     private String subject;
// 
//     private String policy;
// 
//     public Policy() {
//         
//     }
// 
//     public Policy(String id, String tenant, String subject, String policy) {
//         this.internalId = new PolicyId(tenant, id);
//         this.subject = subject;
//         this.policy = policy;
//     }
// 
//     public String getId() {
//         return internalId.getId();
//     }
// 
//     public PolicyId getInternalId() {
//         return internalId;
//     }
// 
//     public void setInternalId(PolicyId id) {
//         internalId = id;
//     }
//     
//     public String getTenant() {
//         return internalId.getTenant();
//     }
// 
//     public String getSubject() {
//         return subject;
//     }
// 
//     public String getPolicy() {
//         return policy;
//     }
// 
// }


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.tid.fiware.iot.ac.dao.PolicyDao;
import es.tid.fiware.iot.ac.model.Policy;
import es.tid.fiware.iot.ac.rs.Tenant;
import es.tid.fiware.iot.ac.rs.Correlator;
import io.dropwizard.hibernate.UnitOfWork;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
    }

    @GET
    @UnitOfWork
    public Response getPolicy(@Tenant String tenant,
                              @Correlator String correlator,
                              @PathParam("subject") String subject,
                              @PathParam("policyId") String policyId) {
        
        LOGGER.debug("Getting policy with id [{}] for [{}] and subject [{}]", policyId, tenant, subject);
        
        String id = URLEncoding.decode(policyId);

        Policy p = dao.loadPolicy(tenant, subject, id);
        if (p != null) {
            return Response.ok(p.getPolicy()).build();
        } else {
            return Response.status(404).build();
        }
    }

    @DELETE
    @UnitOfWork
    @Correlator
    public Response deletePolicy(@Tenant String tenant,
                                 @Correlator String correlator,
                                 @PathParam("subject") String subject,
                                 @PathParam("policyId") String policyId) {

        String id = URLEncoding.decode(policyId);
// Path: src/main/java/es/tid/fiware/iot/ac/dao/PolicyDao.java
// public interface PolicyDao {
// 
//     Policy createPolicy(Policy policy);
// 
//     Policy loadPolicy(String tenant, String subject, String id);
// 
//     Collection<Policy> getPolicies(String tenant, String subject);
// 
//     Policy updatePolicy(Policy policy);
// 
//     Policy deletePolicy(Policy policy);
// 
//     /**
//      * Removes the Tenant and all related objects: Tenant's Subjects and
//      * Policies.
//      */
//     void deleteFromTenant(String tenant);
// 
//     /**
//      * Removes the Subject from the Tenant, and its Policies.
//      */
//     void deleteFromSubject(String tenant, String subject);
// }
// 
// Path: src/main/java/es/tid/fiware/iot/ac/model/Policy.java
// @Entity
// public class Policy {
// 
//     @Embeddable
//     public static class PolicyId implements Serializable {
//         private String id;
//         private String tenant;
//         
//         public PolicyId() {
//             
//         }
//         
//         public PolicyId(String tenant, String id) {
//             this.id = id;
//             this.tenant = tenant;
//         }
//         
//         public String getId() {
//             return id;
//         }
//         
//         public String getTenant() {
//             return tenant;
//         }
//     }
//     
//     @EmbeddedId
//     private PolicyId internalId;
//     private String subject;
// 
//     private String policy;
// 
//     public Policy() {
//         
//     }
// 
//     public Policy(String id, String tenant, String subject, String policy) {
//         this.internalId = new PolicyId(tenant, id);
//         this.subject = subject;
//         this.policy = policy;
//     }
// 
//     public String getId() {
//         return internalId.getId();
//     }
// 
//     public PolicyId getInternalId() {
//         return internalId;
//     }
// 
//     public void setInternalId(PolicyId id) {
//         internalId = id;
//     }
//     
//     public String getTenant() {
//         return internalId.getTenant();
//     }
// 
//     public String getSubject() {
//         return subject;
//     }
// 
//     public String getPolicy() {
//         return policy;
//     }
// 
// }


// Path: src/main/java/es/tid/fiware/iot/ac/pap/PoliciesEndpoint.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import es.tid.fiware.iot.ac.dao.PolicyDao;
import es.tid.fiware.iot.ac.model.Policy;
import es.tid.fiware.iot.ac.rs.Tenant;
import es.tid.fiware.iot.ac.rs.Correlator;
import io.dropwizard.hibernate.UnitOfWork;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

    }

    @GET
    @UnitOfWork
    public Response getPolicy(@Tenant String tenant,
                              @Correlator String correlator,
                              @PathParam("subject") String subject,
                              @PathParam("policyId") String policyId) {
        
        LOGGER.debug("Getting policy with id [{}] for [{}] and subject [{}]", policyId, tenant, subject);
        
        String id = URLEncoding.decode(policyId);

        Policy p = dao.loadPolicy(tenant, subject, id);
        if (p != null) {
            return Response.ok(p.getPolicy()).build();
        } else {
            return Response.status(404).build();
        }
    }

    @DELETE
    @UnitOfWork
    @Correlator
    public Response deletePolicy(@Tenant String tenant,
                                 @Correlator String correlator,
                                 @PathParam("subject") String subject,
                                 @PathParam("policyId") String policyId) {

        String id = URLEncoding.decode(policyId);
        LOGGER.debug("Removing policy with id [{}] for [{}] and subject [{}]", policyId, tenant, subject);