From 1c00a09ff5753e785b0dbf1467075be30bc37029 Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Tue, 18 Nov 2014 14:52:09 +0000
Subject: [PATCH] #396 fix - Changes on logging system, FileSaver.js and Enum management for Hibernate

---
 securis/pom.xml                                                                 |   10 
 securis/src/main/java/net/curisit/securis/db/common/PersistentEnumUserType.java |   76 ++++++++++
 securis/src/main/webapp/WEB-INF/web.xml                                         |    5 
 securis/src/main/webapp/js/vendor/FileSaver.js                                  |  245 +++++++++++++++++++++++++++++++++++
 securis/src/main/java/net/curisit/securis/db/common/CodedEnum.java              |    7 +
 securis/src/main/java/net/curisit/securis/db/common/LicenseStatusType.java      |   12 +
 securis/src/main/java/net/curisit/securis/db/common/PackStatusType.java         |   12 +
 securis/src/main/webapp/WEB-INF/classes/logging.properties                      |    2 
 securis/src/main/webapp/WEB-INF/log4j2.xml                                      |    4 
 9 files changed, 362 insertions(+), 11 deletions(-)

diff --git a/securis/pom.xml b/securis/pom.xml
index 63436dd..bad5b60 100644
--- a/securis/pom.xml
+++ b/securis/pom.xml
@@ -33,11 +33,6 @@
   		<version>3.0.9.Final</version>
   	</dependency>
   	<dependency>
-  		<groupId>org.slf4j</groupId>
-  		<artifactId>slf4j-log4j12</artifactId>
-  		<version>1.7.7</version>
-  	</dependency>
-  	<dependency>
   		<groupId>net.curisit</groupId>
   		<artifactId>commons-curis</artifactId>
   		<version>0.0.1-SNAPSHOT</version>
@@ -72,6 +67,11 @@
   		<artifactId>resteasy-jackson2-provider</artifactId>
   		<version>3.0.9.Final</version>
   	</dependency>
+  	<dependency>
+  		<groupId>org.apache.logging.log4j</groupId>
+  		<artifactId>log4j-web</artifactId>
+  		<version>2.1</version>
+  	</dependency>
   </dependencies>
 	  <build>
 		<plugins>
diff --git a/securis/src/main/java/net/curisit/securis/db/common/CodedEnum.java b/securis/src/main/java/net/curisit/securis/db/common/CodedEnum.java
new file mode 100644
index 0000000..9d9f996
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/db/common/CodedEnum.java
@@ -0,0 +1,7 @@
+package net.curisit.securis.db.common;
+
+public interface CodedEnum {
+
+    public String getCode();
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/db/common/LicenseStatusType.java b/securis/src/main/java/net/curisit/securis/db/common/LicenseStatusType.java
new file mode 100644
index 0000000..8310069
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/db/common/LicenseStatusType.java
@@ -0,0 +1,12 @@
+package net.curisit.securis.db.common;
+
+import net.curisit.securis.db.LicenseStatus;
+
+public class LicenseStatusType extends PersistentEnumUserType<LicenseStatus> {
+
+    @Override
+    public Class<LicenseStatus> returnedClass() {
+        return LicenseStatus.class;
+    }
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/db/common/PackStatusType.java b/securis/src/main/java/net/curisit/securis/db/common/PackStatusType.java
new file mode 100644
index 0000000..e562933
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/db/common/PackStatusType.java
@@ -0,0 +1,12 @@
+package net.curisit.securis.db.common;
+
+import net.curisit.securis.db.PackStatus;
+
+public class PackStatusType extends PersistentEnumUserType<PackStatus> {
+
+    @Override
+    public Class<PackStatus> returnedClass() {
+        return PackStatus.class;
+    }
+
+}
diff --git a/securis/src/main/java/net/curisit/securis/db/common/PersistentEnumUserType.java b/securis/src/main/java/net/curisit/securis/db/common/PersistentEnumUserType.java
new file mode 100644
index 0000000..100b5c4
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/db/common/PersistentEnumUserType.java
@@ -0,0 +1,76 @@
+package net.curisit.securis.db.common;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SessionImplementor;
+import org.hibernate.usertype.UserType;
+
+public abstract class PersistentEnumUserType<T extends CodedEnum> implements UserType {
+
+    @Override
+    public Object assemble(Serializable cached, Object owner) throws HibernateException {
+        return cached;
+    }
+
+    @Override
+    public Object deepCopy(Object value) throws HibernateException {
+        return value;
+    }
+
+    @Override
+    public Serializable disassemble(Object value) throws HibernateException {
+        return (Serializable) value;
+    }
+
+    @Override
+    public boolean equals(Object x, Object y) throws HibernateException {
+        return x == y;
+    }
+
+    @Override
+    public int hashCode(Object x) throws HibernateException {
+        return x == null ? 0 : x.hashCode();
+    }
+
+    @Override
+    public boolean isMutable() {
+        return false;
+    }
+
+    @Override
+    public Object replace(Object original, Object target, Object owner) throws HibernateException {
+        return original;
+    }
+
+    @Override
+    public abstract Class<T> returnedClass();
+
+    @Override
+    public int[] sqlTypes() {
+        return new int[] {
+            Types.VARCHAR
+        };
+    }
+
+    @Override
+    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
+        String code = rs.getString(names[0]);
+        for (CodedEnum en : returnedClass().getEnumConstants()) {
+            if (en.getCode().equals(code)) {
+                return en;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
+        st.setString(index, value == null ? null : ((CodedEnum) value).getCode());
+    }
+
+}
diff --git a/securis/src/main/webapp/WEB-INF/classes/logging.properties b/securis/src/main/webapp/WEB-INF/classes/logging.properties
index 25769ed..069430f 100644
--- a/securis/src/main/webapp/WEB-INF/classes/logging.properties
+++ b/securis/src/main/webapp/WEB-INF/classes/logging.properties
@@ -1 +1,3 @@
+org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler
 org.apache.catalina.level=INFO
diff --git a/securis/src/main/resources/log4j2.xml b/securis/src/main/webapp/WEB-INF/log4j2.xml
similarity index 87%
rename from securis/src/main/resources/log4j2.xml
rename to securis/src/main/webapp/WEB-INF/log4j2.xml
index b8b903c..a3ae586 100644
--- a/securis/src/main/resources/log4j2.xml
+++ b/securis/src/main/webapp/WEB-INF/log4j2.xml
@@ -3,8 +3,8 @@
 	<Appenders>
 
 		<RollingFile name="defaultFile"
-			fileName="${sys:user.home}/.SeCuris/logs/securis-server.log" append="true"
-			filePattern="${sys:user.home}/.SeCuris/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">
+			fileName="${sys:catalina.home}/logs/securis-server.log" append="true"
+			filePattern="${sys:catalina.home}/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">
 			<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
 			<Policies>
 				<TimeBasedTriggeringPolicy interval="1"
diff --git a/securis/src/main/webapp/WEB-INF/web.xml b/securis/src/main/webapp/WEB-INF/web.xml
index 106da5d..e7acaaa 100644
--- a/securis/src/main/webapp/WEB-INF/web.xml
+++ b/securis/src/main/webapp/WEB-INF/web.xml
@@ -47,10 +47,7 @@
         <filter-class>
             org.jboss.resteasy.plugins.server.servlet.FilterDispatcher
         </filter-class>
-        <init-param>
-            <param-name>javax.ws.rs.Application</param-name>
-            <param-value>net.curisit.securis.RestServicesApplication</param-value>
-        </init-param>
+
     </filter>
     
     <filter-mapping>
diff --git a/securis/src/main/webapp/js/vendor/FileSaver.js b/securis/src/main/webapp/js/vendor/FileSaver.js
new file mode 100644
index 0000000..15787e9
--- /dev/null
+++ b/securis/src/main/webapp/js/vendor/FileSaver.js
@@ -0,0 +1,245 @@
+/* FileSaver.js
+ * A saveAs() FileSaver implementation.
+ * 2014-08-29
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: X11/MIT
+ *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
+ */
+
+/*global self */
+/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
+
+/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
+
+var saveAs = saveAs
+  // IE 10+ (native saveAs)
+  || (typeof navigator !== "undefined" &&
+      navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
+  // Everyone else
+  || (function(view) {
+	"use strict";
+	// IE <10 is explicitly unsupported
+	if (typeof navigator !== "undefined" &&
+	    /MSIE [1-9]\./.test(navigator.userAgent)) {
+		return;
+	}
+	var
+		  doc = view.document
+		  // only get URL when necessary in case Blob.js hasn't overridden it yet
+		, get_URL = function() {
+			return view.URL || view.webkitURL || view;
+		}
+		, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
+		, can_use_save_link = "download" in save_link
+		, click = function(node) {
+			var event = doc.createEvent("MouseEvents");
+			event.initMouseEvent(
+				"click", true, false, view, 0, 0, 0, 0, 0
+				, false, false, false, false, 0, null
+			);
+			node.dispatchEvent(event);
+		}
+		, webkit_req_fs = view.webkitRequestFileSystem
+		, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
+		, throw_outside = function(ex) {
+			(view.setImmediate || view.setTimeout)(function() {
+				throw ex;
+			}, 0);
+		}
+		, force_saveable_type = "application/octet-stream"
+		, fs_min_size = 0
+		// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 for
+		// the reasoning behind the timeout and revocation flow
+		, arbitrary_revoke_timeout = 10
+		, revoke = function(file) {
+			var revoker = function() {
+				if (typeof file === "string") { // file is an object URL
+					get_URL().revokeObjectURL(file);
+				} else { // file is a File
+					file.remove();
+				}
+			};
+			if (view.chrome) {
+				revoker();
+			} else {
+				setTimeout(revoker, arbitrary_revoke_timeout);
+			}
+		}
+		, dispatch = function(filesaver, event_types, event) {
+			event_types = [].concat(event_types);
+			var i = event_types.length;
+			while (i--) {
+				var listener = filesaver["on" + event_types[i]];
+				if (typeof listener === "function") {
+					try {
+						listener.call(filesaver, event || filesaver);
+					} catch (ex) {
+						throw_outside(ex);
+					}
+				}
+			}
+		}
+		, FileSaver = function(blob, name) {
+			// First try a.download, then web filesystem, then object URLs
+			var
+				  filesaver = this
+				, type = blob.type
+				, blob_changed = false
+				, object_url
+				, target_view
+				, dispatch_all = function() {
+					dispatch(filesaver, "writestart progress write writeend".split(" "));
+				}
+				// on any filesys errors revert to saving with object URLs
+				, fs_error = function() {
+					// don't create more object URLs than needed
+					if (blob_changed || !object_url) {
+						object_url = get_URL().createObjectURL(blob);
+					}
+					if (target_view) {
+						target_view.location.href = object_url;
+					} else {
+						var new_tab = view.open(object_url, "_blank");
+						if (new_tab == undefined && typeof safari !== "undefined") {
+							//Apple do not allow window.open, see http://bit.ly/1kZffRI
+							view.location.href = object_url
+						}
+					}
+					filesaver.readyState = filesaver.DONE;
+					dispatch_all();
+					revoke(object_url);
+				}
+				, abortable = function(func) {
+					return function() {
+						if (filesaver.readyState !== filesaver.DONE) {
+							return func.apply(this, arguments);
+						}
+					};
+				}
+				, create_if_not_found = {create: true, exclusive: false}
+				, slice
+			;
+			filesaver.readyState = filesaver.INIT;
+			if (!name) {
+				name = "download";
+			}
+			if (can_use_save_link) {
+				//blob = new Blob([ blob ], { type : 'application/json' });
+				//object_url = (window.URL || window.webkitURL).createObjectURL( blob );
+				object_url = get_URL().createObjectURL(blob);
+				save_link.href = object_url;
+				save_link.download = name;
+				click(save_link);
+				filesaver.readyState = filesaver.DONE;
+				dispatch_all();
+				revoke(object_url);
+				return;
+			}
+			// Object and web filesystem URLs have a problem saving in Google Chrome when
+			// viewed in a tab, so I force save with application/octet-stream
+			// http://code.google.com/p/chromium/issues/detail?id=91158
+			// Update: Google errantly closed 91158, I submitted it again:
+			// https://code.google.com/p/chromium/issues/detail?id=389642
+			if (view.chrome && type && type !== force_saveable_type) {
+				slice = blob.slice || blob.webkitSlice;
+				blob = slice.call(blob, 0, blob.size, force_saveable_type);
+				blob_changed = true;
+			}
+			// Since I can't be sure that the guessed media type will trigger a download
+			// in WebKit, I append .download to the filename.
+			// https://bugs.webkit.org/show_bug.cgi?id=65440
+			if (webkit_req_fs && name !== "download") {
+				name += ".download";
+			}
+			if (type === force_saveable_type || webkit_req_fs) {
+				target_view = view;
+			}
+			if (!req_fs) {
+				fs_error();
+				return;
+			}
+			fs_min_size += blob.size;
+			req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
+				fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
+					var save = function() {
+						dir.getFile(name, create_if_not_found, abortable(function(file) {
+							file.createWriter(abortable(function(writer) {
+								writer.onwriteend = function(event) {
+									target_view.location.href = file.toURL();
+									filesaver.readyState = filesaver.DONE;
+									dispatch(filesaver, "writeend", event);
+									revoke(file);
+								};
+								writer.onerror = function() {
+									var error = writer.error;
+									if (error.code !== error.ABORT_ERR) {
+										fs_error();
+									}
+								};
+								"writestart progress write abort".split(" ").forEach(function(event) {
+									writer["on" + event] = filesaver["on" + event];
+								});
+								writer.write(blob);
+								filesaver.abort = function() {
+									writer.abort();
+									filesaver.readyState = filesaver.DONE;
+								};
+								filesaver.readyState = filesaver.WRITING;
+							}), fs_error);
+						}), fs_error);
+					};
+					dir.getFile(name, {create: false}, abortable(function(file) {
+						// delete file if it already exists
+						file.remove();
+						save();
+					}), abortable(function(ex) {
+						if (ex.code === ex.NOT_FOUND_ERR) {
+							save();
+						} else {
+							fs_error();
+						}
+					}));
+				}), fs_error);
+			}), fs_error);
+		}
+		, FS_proto = FileSaver.prototype
+		, saveAs = function(blob, name) {
+			return new FileSaver(blob, name);
+		}
+	;
+	FS_proto.abort = function() {
+		var filesaver = this;
+		filesaver.readyState = filesaver.DONE;
+		dispatch(filesaver, "abort");
+	};
+	FS_proto.readyState = FS_proto.INIT = 0;
+	FS_proto.WRITING = 1;
+	FS_proto.DONE = 2;
+
+	FS_proto.error =
+	FS_proto.onwritestart =
+	FS_proto.onprogress =
+	FS_proto.onwrite =
+	FS_proto.onabort =
+	FS_proto.onerror =
+	FS_proto.onwriteend =
+		null;
+
+	return saveAs;
+}(
+	   typeof self !== "undefined" && self
+	|| typeof window !== "undefined" && window
+	|| this.content
+));
+// `self` is undefined in Firefox for Android content script context
+// while `this` is nsIContentFrameMessageManager
+// with an attribute `content` that corresponds to the window
+
+if (typeof module !== "undefined" && module !== null) {
+  module.exports = saveAs;
+} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
+  define([], function() {
+    return saveAs;
+  });
+}

--
Gitblit v1.3.2