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