From bc2cedc83f6353259ea1364f98ce60bf11d7ecf4 Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Thu, 23 Oct 2014 12:06:14 +0000
Subject: [PATCH] #2021 feature - Upgtaded Jackson annotations version and added request data hash management

---
 securis/src/main/java/net/curisit/securis/db/BlockedRequest.java                          |   31 ++++-
 securis/src/main/java/net/curisit/securis/db/User.java                                    |   11 +-
 securis/src/main/java/net/curisit/securis/db/Application.java                             |   18 +-
 securis/src/main/java/net/curisit/securis/db/PackStatus.java                              |    4 
 securis/src/main/java/net/curisit/securis/db/LicenseTypeMetadata.java                     |   19 +--
 securis/src/main/java/net/curisit/securis/db/ApplicationMetadata.java                     |   22 ++--
 securis/src/main/java/net/curisit/securis/db/Pack.java                                    |   13 +-
 securis/src/main/java/net/curisit/securis/services/PackResource.java                      |    1 
 securis/src/main/java/net/curisit/securis/db/License.java                                 |   38 ++++++-
 securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java               |    1 
 securis/src/main/resources/lic_email.template.en                                          |    9 +
 securis/src/main/java/net/curisit/securis/db/Organization.java                            |   12 +-
 securis/src/main/java/net/curisit/securis/db/LicenseStatus.java                           |    4 
 securis/src/main/java/net/curisit/securis/db/LicenseHistory.java                          |   13 +-
 securis/src/main/java/net/curisit/securis/services/LicenseResource.java                   |   46 ++++++---
 securis/src/main/java/net/curisit/securis/db/LicenseType.java                             |   26 ++--
 securis/src/main/java/net/curisit/securis/db/PackMetadata.java                            |   20 ++--
 securis/src/main/java/net/curisit/securis/services/exception/SeCurisServiceException.java |    3 
 securis/src/main/resources/db/schema.sql                                                  |    9 +
 19 files changed, 186 insertions(+), 114 deletions(-)

diff --git a/securis/src/main/java/net/curisit/securis/db/Application.java b/securis/src/main/java/net/curisit/securis/db/Application.java
index 566398a..46d896d 100644
--- a/securis/src/main/java/net/curisit/securis/db/Application.java
+++ b/securis/src/main/java/net/curisit/securis/db/Application.java
@@ -14,18 +14,18 @@
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: application
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "application")
 @NamedQueries({
@@ -113,13 +113,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof Application))
             return false;
-        Application other = (Application)obj; 
+        Application other = (Application) obj;
         return id.equals(other.id);
     }
-    
+
     @Override
     public int hashCode() {
-     
+
         return (id == null ? 0 : id.hashCode());
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/db/ApplicationMetadata.java b/securis/src/main/java/net/curisit/securis/db/ApplicationMetadata.java
index 7431471..634cf10 100644
--- a/securis/src/main/java/net/curisit/securis/db/ApplicationMetadata.java
+++ b/securis/src/main/java/net/curisit/securis/db/ApplicationMetadata.java
@@ -5,7 +5,6 @@
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
@@ -13,17 +12,18 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: application_metadata
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "application_metadata")
 @NamedQueries({
@@ -49,7 +49,6 @@
     @Column(name = "creation_timestamp")
     private Date creationTimestamp;
 
-
     public String getKey() {
         return key;
     }
@@ -73,7 +72,6 @@
     public void setCreationTimestamp(Date creationTimestamp) {
         this.creationTimestamp = creationTimestamp;
     }
-
 
     @JsonProperty("application_id")
     public Integer getApplicationId() {
@@ -105,18 +103,18 @@
     public void setMandatory(boolean mandatory) {
         this.mandatory = mandatory;
     }
-    
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof ApplicationMetadata))
             return false;
-        ApplicationMetadata other = (ApplicationMetadata)obj; 
+        ApplicationMetadata other = (ApplicationMetadata) obj;
         return key.equals(other.key) && (application == null || application.equals(other.application));
     }
-    
+
     @Override
     public int hashCode() {
-     
+
         return key.hashCode() + (application == null ? 0 : application.hashCode());
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/db/BlockedRequest.java b/securis/src/main/java/net/curisit/securis/db/BlockedRequest.java
index 2233432..51eac7e 100644
--- a/securis/src/main/java/net/curisit/securis/db/BlockedRequest.java
+++ b/securis/src/main/java/net/curisit/securis/db/BlockedRequest.java
@@ -5,23 +5,27 @@
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityManager;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import net.curisit.integrity.commons.Utils;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: pack
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "blocked_request")
 @JsonIgnoreProperties(ignoreUnknown = true)
@@ -58,7 +62,7 @@
         if (!(obj instanceof BlockedRequest))
             return false;
         BlockedRequest other = (BlockedRequest) obj;
-        return hash.equals(other.hash);
+        return (hash == null && other.hash == null) || hash.equals(other.hash);
     }
 
     @Override
@@ -73,6 +77,7 @@
 
     public void setRequestData(String requestData) {
         this.requestData = requestData;
+        this.hash = generateHash(this.requestData);
     }
 
     public User getBlockedBy() {
@@ -82,4 +87,16 @@
     public void setBlockedBy(User blockedBy) {
         this.blockedBy = blockedBy;
     }
+
+    public static String generateHash(String reqData) {
+        String hash = reqData != null ? Utils.sha256(reqData) : null;
+        return hash;
+    }
+
+    public static boolean isRequestBlocked(String requestData, EntityManager em) {
+        String hash = generateHash(requestData);
+        BlockedRequest br = em.find(BlockedRequest.class, hash);
+        return br != null;
+    }
+
 }
diff --git a/securis/src/main/java/net/curisit/securis/db/License.java b/securis/src/main/java/net/curisit/securis/db/License.java
index 239797c..e8ce296 100644
--- a/securis/src/main/java/net/curisit/securis/db/License.java
+++ b/securis/src/main/java/net/curisit/securis/db/License.java
@@ -8,6 +8,7 @@
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityManager;
 import javax.persistence.FetchType;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
@@ -17,14 +18,15 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import javax.persistence.TypedQuery;
 
 import net.curisit.integrity.commons.Utils;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 
 /**
  * Entity implementation class for Entity: license
@@ -36,7 +38,8 @@
 @Table(name = "license")
 @JsonIgnoreProperties(ignoreUnknown = true)
 @NamedQueries({
-    @NamedQuery(name = "list-licenses-by-pack", query = "SELECT l FROM License l where l.pack.id = :packId")
+        @NamedQuery(name = "list-licenses-by-pack", query = "SELECT l FROM License l where l.pack.id = :packId"),
+        @NamedQuery(name = "list-active-licenses-by-req-data", query = "SELECT l FROM License l where l.reqDataHash = :hash and l.status in ('AC', 'PA')")
 })
 public class License implements Serializable {
 
@@ -74,6 +77,10 @@
     @Column(name = "request_data")
     @JsonProperty("request_data")
     private String requestData;
+
+    @Column(name = "request_data_hash")
+    @JsonIgnore
+    private String reqDataHash;
 
     @Column(name = "license_data")
     @JsonProperty("license_data")
@@ -286,6 +293,7 @@
         public static final int DOWNLOAD = 5;
         public static final int CANCEL = 6;
         public static final int DELETE = 7;
+        public static final int BLOCK = 8;
     }
 
     public static class Status {
@@ -296,8 +304,8 @@
                 Action.SEND, Arrays.asList(LicenseStatus.ACTIVE, LicenseStatus.PRE_ACTIVE), //
                 Action.DOWNLOAD, Arrays.asList(LicenseStatus.ACTIVE, LicenseStatus.PRE_ACTIVE), //
                 Action.CANCEL, Arrays.asList(LicenseStatus.ACTIVE, LicenseStatus.PRE_ACTIVE, LicenseStatus.REQUESTED, LicenseStatus.EXPIRED), //
-                Action.DELETE, Arrays.asList(LicenseStatus.CANCELLED, LicenseStatus.CREATED) //
-
+                Action.DELETE, Arrays.asList(LicenseStatus.CANCELLED, LicenseStatus.CREATED), //
+                Action.BLOCK, Arrays.asList(LicenseStatus.CANCELLED) //
                 );
 
         /**
@@ -314,4 +322,18 @@
             return validStatuses != null && validStatuses.contains(currentStatus);
         }
     }
+
+    public License findLicenseByRequestData(String requestData, EntityManager em) {
+        TypedQuery<License> query = em.createNamedQuery("list-active-licenses-by-req-data", License.class);
+        query.setParameter("hash", BlockedRequest.generateHash(requestData));
+        return null;
+    }
+
+    public String getReqDataHash() {
+        return reqDataHash;
+    }
+
+    public void setReqDataHash(String reqDataHash) {
+        this.reqDataHash = reqDataHash;
+    }
 }
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseHistory.java b/securis/src/main/java/net/curisit/securis/db/LicenseHistory.java
index 63590f5..2c25dc5 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseHistory.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseHistory.java
@@ -12,18 +12,19 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: license
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "license_history")
 @JsonIgnoreProperties(ignoreUnknown = true)
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseStatus.java b/securis/src/main/java/net/curisit/securis/db/LicenseStatus.java
index ff8b51f..1b07361 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseStatus.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseStatus.java
@@ -1,7 +1,7 @@
 package net.curisit.securis.db;
 
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
 
 /**
  * Contains the possible license statuses. For further details:
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseType.java b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
index 21d5225..3196743 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseType.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseType.java
@@ -18,24 +18,26 @@
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: license_type
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @JsonIgnoreProperties(ignoreUnknown = true)
 @Entity
 @Table(name = "license_type")
 @NamedQueries({
-    @NamedQuery(name = "list-license_types", query = "SELECT lt FROM LicenseType lt"),
-    @NamedQuery(name = "list-application-license_types", query = "SELECT lt FROM LicenseType lt where lt.application.id = :appId")
+        @NamedQuery(name = "list-license_types", query = "SELECT lt FROM LicenseType lt"),
+        @NamedQuery(name = "list-application-license_types", query = "SELECT lt FROM LicenseType lt where lt.application.id = :appId")
 })
 public class LicenseType implements Serializable {
 
@@ -62,7 +64,7 @@
 
     @OneToMany(fetch = FetchType.LAZY, mappedBy = "licenseType")
     private Set<LicenseTypeMetadata> metadata;
-    
+
     public Set<LicenseTypeMetadata> getMetadata() {
         return metadata;
     }
@@ -143,13 +145,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof LicenseType))
             return false;
-        LicenseType other = (LicenseType)obj; 
+        LicenseType other = (LicenseType) obj;
         return id.equals(other.id);
     }
-    
+
     @Override
     public int hashCode() {
-     
+
         return (id == null ? 0 : id.hashCode());
     }
 }
diff --git a/securis/src/main/java/net/curisit/securis/db/LicenseTypeMetadata.java b/securis/src/main/java/net/curisit/securis/db/LicenseTypeMetadata.java
index 471c355..c3b5525 100644
--- a/securis/src/main/java/net/curisit/securis/db/LicenseTypeMetadata.java
+++ b/securis/src/main/java/net/curisit/securis/db/LicenseTypeMetadata.java
@@ -3,7 +3,6 @@
 import java.io.Serializable;
 
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
@@ -11,18 +10,18 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: licensetype_metadata
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "licensetype_metadata")
 @NamedQueries({
@@ -88,13 +87,13 @@
     public boolean equals(Object obj) {
         if (!(obj instanceof LicenseTypeMetadata))
             return false;
-        LicenseTypeMetadata other = (LicenseTypeMetadata)obj; 
+        LicenseTypeMetadata other = (LicenseTypeMetadata) obj;
         return key.equals(other.key) && (licenseType == null || licenseType.equals(other.licenseType));
     }
-    
+
     @Override
     public int hashCode() {
-     
+
         return key.hashCode() + (licenseType == null ? 0 : licenseType.hashCode());
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/db/Organization.java b/securis/src/main/java/net/curisit/securis/db/Organization.java
index e2d798b..90e403d 100644
--- a/securis/src/main/java/net/curisit/securis/db/Organization.java
+++ b/securis/src/main/java/net/curisit/securis/db/Organization.java
@@ -23,17 +23,19 @@
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: organization
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "organization")
 @NamedQueries({
diff --git a/securis/src/main/java/net/curisit/securis/db/Pack.java b/securis/src/main/java/net/curisit/securis/db/Pack.java
index dcc977e..ff3a93e 100644
--- a/securis/src/main/java/net/curisit/securis/db/Pack.java
+++ b/securis/src/main/java/net/curisit/securis/db/Pack.java
@@ -17,18 +17,19 @@
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: pack
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "pack")
 @JsonIgnoreProperties(ignoreUnknown = true)
diff --git a/securis/src/main/java/net/curisit/securis/db/PackMetadata.java b/securis/src/main/java/net/curisit/securis/db/PackMetadata.java
index dd8e3ff..bb583b5 100644
--- a/securis/src/main/java/net/curisit/securis/db/PackMetadata.java
+++ b/securis/src/main/java/net/curisit/securis/db/PackMetadata.java
@@ -3,7 +3,6 @@
 import java.io.Serializable;
 
 import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
@@ -11,17 +10,18 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: pack_metadata
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "pack_metadata")
 @NamedQueries({
@@ -92,18 +92,18 @@
     public void setReadonly(boolean readonly) {
         this.readonly = readonly;
     }
-    
+
     @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof PackMetadata))
             return false;
-        PackMetadata other = (PackMetadata)obj; 
+        PackMetadata other = (PackMetadata) obj;
         return key.equals(other.key) && (pack == null || pack.equals(other.pack));
     }
-    
+
     @Override
     public int hashCode() {
-     
+
         return key.hashCode() + (pack == null ? 0 : pack.hashCode());
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/db/PackStatus.java b/securis/src/main/java/net/curisit/securis/db/PackStatus.java
index bd05a69..6dd99bb 100644
--- a/securis/src/main/java/net/curisit/securis/db/PackStatus.java
+++ b/securis/src/main/java/net/curisit/securis/db/PackStatus.java
@@ -1,7 +1,7 @@
 package net.curisit.securis.db;
 
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonValue;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
 
 /**
  * Contains the possible pack statuses. For further details:
diff --git a/securis/src/main/java/net/curisit/securis/db/User.java b/securis/src/main/java/net/curisit/securis/db/User.java
index 0899dad..e8b643b 100644
--- a/securis/src/main/java/net/curisit/securis/db/User.java
+++ b/securis/src/main/java/net/curisit/securis/db/User.java
@@ -17,17 +17,18 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
 
 /**
  * Entity implementation class for Entity: Users
  * 
  */
 @JsonAutoDetect
-@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonInclude(Include.NON_NULL)
 @Entity
 @Table(name = "user")
 @NamedQueries({
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
index 2930626..93192c7 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseResource.java
@@ -31,9 +31,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import net.curisit.integrity.commons.JsonUtils;
 import net.curisit.integrity.commons.Utils;
-import net.curisit.integrity.exception.CurisException;
 import net.curisit.securis.DefaultExceptionHandler;
 import net.curisit.securis.LicenseGenerator;
 import net.curisit.securis.SeCurisException;
@@ -41,6 +39,7 @@
 import net.curisit.securis.beans.RequestBean;
 import net.curisit.securis.beans.SignedLicenseBean;
 import net.curisit.securis.db.Application;
+import net.curisit.securis.db.BlockedRequest;
 import net.curisit.securis.db.License;
 import net.curisit.securis.db.LicenseHistory;
 import net.curisit.securis.db.LicenseStatus;
@@ -52,6 +51,7 @@
 import net.curisit.securis.services.exception.SeCurisServiceException;
 import net.curisit.securis.services.exception.SeCurisServiceException.ErrorCodes;
 import net.curisit.securis.utils.EmailManager;
+import net.curisit.securis.utils.JsonUtils;
 import net.curisit.securis.utils.Params;
 import net.curisit.securis.utils.TokenHelper;
 
@@ -331,8 +331,12 @@
             // directly to ACTIVE
             lic.setStatus(LicenseStatus.ACTIVE);
             try {
+                lic.setRequestData(JsonUtils.toJSON((RequestBean) signedLicense));
+                if (BlockedRequest.isRequestBlocked(lic.getRequestData(), em)) {
+                    throw new SeCurisServiceException(ErrorCodes.BLOCKED_REQUEST_DATA, "Given request data is blocked and cannot be activate");
+                }
                 lic.setLicenseData(JsonUtils.toJSON(signedLicense));
-            } catch (CurisException e) {
+            } catch (SeCurisException e) {
                 LOG.error("Error generaing license JSON", e);
                 throw new SeCurisServiceException(ErrorCodes.INVALID_FORMAT, "Error generaing license JSON");
             }
@@ -386,7 +390,7 @@
         RequestBean rb = null;
         try {
             rb = JsonUtils.json2object(requestData, RequestBean.class);
-        } catch (CurisException e) {
+        } catch (SeCurisException e) {
             throw new SeCurisServiceException(ErrorCodes.INVALID_REQUEST_DATA_FORMAT, "Request data has not a valid format");
         }
 
@@ -422,14 +426,18 @@
         currentLicense.setCode(lic.getCode());
         currentLicense.setFullName(lic.getFullName());
         currentLicense.setEmail(lic.getEmail());
-        if (lic.getRequestData() != null) {
+        if (lic.getRequestData() != null && currentLicense.getStatus() == LicenseStatus.CREATED) {
             SignedLicenseBean signedLicense = generateLicense(lic, em);
-            // If user provide a request data the license status is passed
-            // directly to ACTIVE
             lic.setStatus(LicenseStatus.ACTIVE);
             try {
+                // Next line is necessary to normalize the String that contains
+                // the request.
+                lic.setRequestData(JsonUtils.toJSON((RequestBean) signedLicense));
+                if (BlockedRequest.isRequestBlocked(lic.getRequestData(), em)) {
+                    throw new SeCurisServiceException(ErrorCodes.BLOCKED_REQUEST_DATA, "Given request data is blocked and cannot be activate");
+                }
                 lic.setLicenseData(JsonUtils.toJSON(signedLicense));
-            } catch (CurisException e) {
+            } catch (SeCurisException e) {
                 LOG.error("Error generaing license JSON", e);
                 throw new SeCurisServiceException(ErrorCodes.INVALID_FORMAT, "Error generaing license JSON");
             }
@@ -465,24 +473,32 @@
     }
 
     @DELETE
-    @Path("/{licId}")
+    @Path("/{licId}/block")
     @Transactional
     @Securable
     @Produces({
         MediaType.APPLICATION_JSON
     })
     public Response block(@PathParam("licId") Integer licId, @Context BasicSecurityContext bsc) throws SeCurisServiceException {
-        LOG.info("Deleting license with id: {}", licId);
+        LOG.info("Blocking license with id: {}", licId);
         EntityManager em = emProvider.get();
         License lic = getCurrentLicense(licId, bsc, em);
 
-        if (lic.getStatus() != LicenseStatus.CANCELLED || lic.getStatus() != LicenseStatus.CREATED) {
-            LOG.error("License {} can not be deleted with status {}", lic.getCode(), lic.getStatus());
-            return Response.status(Status.FORBIDDEN)
-                    .header(DefaultExceptionHandler.ERROR_MESSAGE_HEADER, "License can not be deleted in current status").build();
+        if (lic.getStatus() != LicenseStatus.CANCELLED) {
+            LOG.error("License can only be blocked in CANCELLED status, current: {}", lic.getStatus().name());
+            throw new SeCurisServiceException(ErrorCodes.WRONG_STATUS, "License can only be blocked in CANCELLED status");
         }
+        if (BlockedRequest.isRequestBlocked(lic.getRequestData(), em)) {
+            throw new SeCurisServiceException(ErrorCodes.BLOCKED_REQUEST_DATA, "Given request data is already blocked");
+        }
+        BlockedRequest blockedReq = new BlockedRequest();
+        blockedReq.setCreationTimestamp(new Date());
+        blockedReq.setBlockedBy(getUser(bsc, em));
+        blockedReq.setRequestData(lic.getRequestData());
 
-        em.remove(lic);
+        em.persist(blockedReq);
+
+        em.persist(createLicenseHistoryAction(lic, getUser(bsc, em), LicenseHistory.Actions.BLOCK));
         return Response.ok(Utils.createMap("success", true, "id", licId)).build();
     }
 
diff --git a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
index 74253cc..2a800e0 100644
--- a/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/LicenseTypeResource.java
@@ -28,7 +28,6 @@
 import net.curisit.securis.DefaultExceptionHandler;
 import net.curisit.securis.SeCurisException;
 import net.curisit.securis.db.Application;
-import net.curisit.securis.db.ApplicationMetadata;
 import net.curisit.securis.db.LicenseType;
 import net.curisit.securis.db.LicenseTypeMetadata;
 import net.curisit.securis.security.BasicSecurityContext;
diff --git a/securis/src/main/java/net/curisit/securis/services/PackResource.java b/securis/src/main/java/net/curisit/securis/services/PackResource.java
index 39ac56d..9205945 100644
--- a/securis/src/main/java/net/curisit/securis/services/PackResource.java
+++ b/securis/src/main/java/net/curisit/securis/services/PackResource.java
@@ -27,7 +27,6 @@
 import net.curisit.securis.DefaultExceptionHandler;
 import net.curisit.securis.SeCurisException;
 import net.curisit.securis.db.LicenseType;
-import net.curisit.securis.db.PackMetadata;
 import net.curisit.securis.db.Organization;
 import net.curisit.securis.db.Pack;
 import net.curisit.securis.db.PackMetadata;
diff --git a/securis/src/main/java/net/curisit/securis/services/exception/SeCurisServiceException.java b/securis/src/main/java/net/curisit/securis/services/exception/SeCurisServiceException.java
index 1610f0b..9b71247 100644
--- a/securis/src/main/java/net/curisit/securis/services/exception/SeCurisServiceException.java
+++ b/securis/src/main/java/net/curisit/securis/services/exception/SeCurisServiceException.java
@@ -31,11 +31,14 @@
         public static int UNAUTHORIZED_ACCESS = 1002;
         public static int NOT_FOUND = 1003;
         public static int INVALID_FORMAT = 1004;
+        public static int WRONG_STATUS = 1005;
 
         public static int INVALID_LICENSE_REQUEST_DATA = 1100;
         public static int LICENSE_NOT_READY_FOR_RENEW = 1101;
 
         public static int INVALID_REQUEST_DATA = 1201;
         public static int INVALID_REQUEST_DATA_FORMAT = 1202;
+        public static int BLOCKED_REQUEST_DATA = 1203;
+        public static int DUPLICATED_REQUEST_DATA = 1204;
     }
 }
diff --git a/securis/src/main/resources/db/schema.sql b/securis/src/main/resources/db/schema.sql
index d16fde7..1d4b2d9 100644
--- a/securis/src/main/resources/db/schema.sql
+++ b/securis/src/main/resources/db/schema.sql
@@ -103,6 +103,7 @@
   id INT NOT NULL auto_increment,
   code VARCHAR(100) NOT NULL ,
   request_data VARCHAR(1024) NULL ,
+  request_data_hash VARCHAR(64) NULL ,
   license_data VARCHAR(1024) NULL ,
   pack_id INT NOT NULL,  
   full_name VARCHAR(150) NULL,  
@@ -116,7 +117,9 @@
   created_by varchar(45) NULL ,  
   status VARCHAR(2) NOT NULL default 'CR',  
   PRIMARY KEY (id));
-  
+
+create index if not exists lic_hash_req_idx on license(hash_request_data);  
+create index if not exists lic_pack_idx on license(pack_id);  
   
 drop table IF EXISTS license_history;
 CREATE TABLE IF NOT EXISTS license_history (
@@ -131,9 +134,9 @@
    
 drop table IF EXISTS blocked_request;
 CREATE TABLE IF NOT EXISTS blocked_request (
-  hash VARCHAR(256) NOT NULL ,
+  hash VARCHAR(64) NOT NULL ,
   request_data VARCHAR(1024) NULL ,
   blocked_by varchar(45) NULL ,  
   creation_timestamp DATETIME NOT NULL default now(),  
-  PRIMARY KEY (id));
+  PRIMARY KEY (hash));
    
\ No newline at end of file
diff --git a/securis/src/main/resources/lic_email.template.en b/securis/src/main/resources/lic_email.template.en
new file mode 100644
index 0000000..ff0a5cc
--- /dev/null
+++ b/securis/src/main/resources/lic_email.template.en
@@ -0,0 +1,9 @@
+Hello {0}, the current email contains a license file to be used with the application '{1}'.
+
+Please, read the application documentation to learn how to install the license file.
+
+This mail has been sent form SeCuris server, please don't answer this mail.
+
+--
+SeCuris support team
+support@curisit.net
\ No newline at end of file

--
Gitblit v1.3.2