From 5554f5ebced8adb7b7982481120d0ca00767c7f9 Mon Sep 17 00:00:00 2001
From: Leonardo Vannucci <leonardo.vannucci@grupposistematica.it>
Date: Wed, 01 Aug 2018 09:48:18 +0200
Subject: [PATCH] primi sviluppi
---
.gitignore | 73 ++
dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$2.class | 0
dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.class | 0
dg1cloud-core/src/main/java/it/digione/dg1cloud/config/dg1cloud.properties | 16
dg1cloud-core/src/main/java/it/digione/dg1cloud/config/AppConfig.java | 104 +++
dg1cloud-core/target/classes/it/digione/dg1cloud/controller/DownloadFileController.class | 0
dg1cloud-core/src/main/resources/application.properties | 19
dg1cloud-core/target/classes/it/digione/dg1cloud/config/AppConfig.class | 0
dg1cloud-core/target/classes/it/digione/dg1cloud/service/CleanerService.class | 0
dg1cloud-core/target/classes/it/digione/dg1cloud/repository/RegDocumentRepository.class | 0
dg1cloud-core/pom.xml | 94 +++
dg1cloud-core/src/main/java/it/digione/dg1cloud/repository/RegDocumentRepository.java | 23
dg1cloud-core/src/test/java/it/digione/cloud/Dg1cloudCoreApplicationTests.java | 22
dg1cloud-core/mvnw | 225 +++++++
dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CleanerService.java | 60 ++
dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptor.java | 29 +
dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadFileController.java | 63 ++
dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.properties | 7
dg1cloud-core/src/main/java/it/digione/dg1cloud/app/Dg1cloudCoreApplication.java | 21
dg1cloud-core/target/classes/it/digione/dg1cloud/service/Utils.class | 0
dg1cloud-core/.mvn/wrapper/maven-wrapper.properties | 1
dg1cloud-core/target/classes/it/digione/dg1cloud/scheduler/RepositoryJob.class | 0
dg1cloud-core/target/classes/application.properties | 19
dg1cloud-core/target/classes/it/digione/dg1cloud/config/dg1cloud.properties | 16
dg1cloud-core/src/main/java/it/digione/dg1cloud/service/Utils.java | 52 +
dg1cloud-core/WebContent/WEB-INF/web.xml | 12
dg1cloud-core/src/main/java/it/digione/dg1cloud/model/RegDocument.java | 152 +++++
dg1cloud-core/target/classes/it/digione/dg1cloud/model/RegDocument.class | 0
dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$1.class | 0
dg1cloud-core/target/test-classes/it/digione/cloud/Dg1cloudCoreApplicationTests.class | 0
dg1cloud-core/mvnw.cmd | 143 ++++
dg1cloud-core/target/classes/db/migration/V0.1__DG1CLOUD.sql | 27
dg1cloud-core/src/main/java/db/migration/V0.1__DG1CLOUD.sql | 27
dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptor.class | 0
dg1cloud-core/WebContent/META-INF/MANIFEST.MF | 3
dg1cloud-core/src/main/java/it/digione/dg1cloud/scheduler/RepositoryJob.java | 56 +
dg1cloud-core/target/classes/META-INF/persistence.xml | 9
dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.xml | 94 +++
dg1cloud-core/.mvn/wrapper/maven-wrapper.jar | 0
dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.java | 20
dg1cloud-core/target/classes/META-INF/MANIFEST.MF | 10
dg1cloud-core/target/classes/it/digione/dg1cloud/app/Dg1cloudCoreApplication.class | 0
dg1cloud-core/src/main/java/META-INF/persistence.xml | 9
dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CloudService.java | 332 +++++++++++
dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService.class | 0
45 files changed, 1,738 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f1e22eb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,73 @@
+
+# Created by https://www.gitignore.io/api/eclipse
+
+### Eclipse ###
+
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# CDT- autotools
+.autotools
+
+# Java annotation processor (APT)
+.factorypath
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
+.springBeans
+
+# Code Recommenders
+.recommenders/
+
+# Annotation Processing
+.apt_generated/
+
+# Scala IDE specific (Scala & Java development for Eclipse)
+.cache-main
+.scala_dependencies
+.worksheet
+
+### Eclipse Patch ###
+# Eclipse Core
+.project
+
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+# Annotation Processing
+.apt_generated
+
+
+# End of https://www.gitignore.io/api/eclipse
\ No newline at end of file
diff --git a/dg1cloud-core/.mvn/wrapper/maven-wrapper.jar b/dg1cloud-core/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..9cc84ea
--- /dev/null
+++ b/dg1cloud-core/.mvn/wrapper/maven-wrapper.jar
Binary files differ
diff --git a/dg1cloud-core/.mvn/wrapper/maven-wrapper.properties b/dg1cloud-core/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..b573bb5
--- /dev/null
+++ b/dg1cloud-core/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip
diff --git a/dg1cloud-core/WebContent/META-INF/MANIFEST.MF b/dg1cloud-core/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..254272e
--- /dev/null
+++ b/dg1cloud-core/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/dg1cloud-core/WebContent/WEB-INF/web.xml b/dg1cloud-core/WebContent/WEB-INF/web.xml
new file mode 100644
index 0000000..96bdff6
--- /dev/null
+++ b/dg1cloud-core/WebContent/WEB-INF/web.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
+ <display-name>dg1cloud-core</display-name>
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ <welcome-file>default.html</welcome-file>
+ <welcome-file>default.htm</welcome-file>
+ <welcome-file>default.jsp</welcome-file>
+ </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/dg1cloud-core/mvnw b/dg1cloud-core/mvnw
new file mode 100644
index 0000000..5bf251c
--- /dev/null
+++ b/dg1cloud-core/mvnw
@@ -0,0 +1,225 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+echo $MAVEN_PROJECTBASEDIR
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/dg1cloud-core/mvnw.cmd b/dg1cloud-core/mvnw.cmd
new file mode 100644
index 0000000..019bd74
--- /dev/null
+++ b/dg1cloud-core/mvnw.cmd
@@ -0,0 +1,143 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/dg1cloud-core/pom.xml b/dg1cloud-core/pom.xml
new file mode 100644
index 0000000..1fcf8c8
--- /dev/null
+++ b/dg1cloud-core/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>it.digione.cloud</groupId>
+ <artifactId>dg1cloud-core</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>dg1cloud-core</name>
+ <description>Servizio cloud per ricezione file</description>
+
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>2.0.3.RELEASE</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <java.version>1.8</java.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.flywaydb</groupId>
+ <artifactId>flyway-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>eclipselink</artifactId>
+ <version>2.5.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+
+</project>
diff --git a/dg1cloud-core/src/main/java/META-INF/persistence.xml b/dg1cloud-core/src/main/java/META-INF/persistence.xml
new file mode 100644
index 0000000..3ea7c16
--- /dev/null
+++ b/dg1cloud-core/src/main/java/META-INF/persistence.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+ <persistence-unit name="dg1cloud-core">
+ <class>it.digione.dg1cloud.model.RegDocument</class>
+ <properties>
+ <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/dg1cloud-core/src/main/java/db/migration/V0.1__DG1CLOUD.sql b/dg1cloud-core/src/main/java/db/migration/V0.1__DG1CLOUD.sql
new file mode 100644
index 0000000..aab3b34
--- /dev/null
+++ b/dg1cloud-core/src/main/java/db/migration/V0.1__DG1CLOUD.sql
@@ -0,0 +1,27 @@
+-- Table: public.reg_document
+CREATE TABLE public.reg_document
+(
+ document_id bigint NOT NULL,
+ created timestamp without time zone NOT NULL DEFAULT now(),
+ createdby character varying(255) NOT NULL,
+ modified timestamp without time zone NOT NULL DEFAULT now(),
+ modifiedby character varying(255) NOT NULL,
+ file_hash character varying(255),
+ file_name text NOT NULL,
+ file_path text NOT NULL,
+ file_size bigint,
+ due_date date,
+ CONSTRAINT reg_document_pkey PRIMARY KEY (document_id)
+)
+WITH (
+ OIDS = FALSE
+);
+
+CREATE SEQUENCE public.reg_document_seq
+ INCREMENT 1
+ START 1
+ MINVALUE 1
+ MAXVALUE 9223372036854775807
+ CACHE 1;
+
+
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/app/Dg1cloudCoreApplication.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/app/Dg1cloudCoreApplication.java
new file mode 100644
index 0000000..afe51f8
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/app/Dg1cloudCoreApplication.java
@@ -0,0 +1,21 @@
+package it.digione.dg1cloud.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan(basePackages="it.digione.dg1cloud")
+@SpringBootApplication
+public class Dg1cloudCoreApplication extends SpringBootServletInitializer {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Dg1cloudCoreApplication.class, args);
+ }
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(Dg1cloudCoreApplication.class);
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/AppConfig.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/AppConfig.java
new file mode 100644
index 0000000..bc5e0e7
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/AppConfig.java
@@ -0,0 +1,104 @@
+package it.digione.dg1cloud.config;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+import org.eclipse.persistence.config.BatchWriting;
+import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.eclipse.persistence.config.TargetServer;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
+import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter;
+import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.transaction.jta.JtaTransactionManager;
+
+@ComponentScan
+@Configuration
+@PropertySources({
+ @PropertySource(value = "classpath:/it/digione/dg1cloud/config/dg1cloud.properties", ignoreResourceNotFound=false),
+ @PropertySource(value = "file:/etc/digione/dg1cloud/application.properties", ignoreResourceNotFound=true)
+ })
+@EnableAutoConfiguration
+@EnableConfigurationProperties
+@EnableJpaRepositories("it.digione.dg1cloud.repository")
+@EntityScan("it.digione.dg1cloud.model")
+@EnableTransactionManagement
+public class AppConfig extends JpaBaseConfiguration implements Serializable{
+
+ protected AppConfig(DataSource dataSource, JpaProperties properties,
+ ObjectProvider<JtaTransactionManager> jtaTransactionManager,
+ ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
+ super(dataSource, properties, jtaTransactionManager, transactionManagerCustomizers);
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -662074265587285778L;
+
+ @Value("${application.version}")
+ private String applicationVersion;
+ public String getApplicationVersion() {
+ return applicationVersion;
+ }
+
+ @Value("${repository.base.upload.path}")
+ private String repositoryBaseUploadPath;
+ public String getRepositoryBaseUploadPath() {
+ return repositoryBaseUploadPath;
+ }
+
+ @Value("${repository.base.storage.path}")
+ private String repositoryBaseStoragePath;
+ public String getRepositoryBaseStoragePath() {
+ return repositoryBaseStoragePath;
+ }
+
+ @Value("${external.server.address.base.url}")
+ private String externalBaseUrl;
+ public String getExternalBaseUrl() {
+ return externalBaseUrl;
+ }
+
+ @Bean
+ public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
+ final JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(emf);
+ return transactionManager;
+ }
+
+ @Override
+ protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
+ return new EclipseLinkJpaVendorAdapter();
+ }
+
+ @Override
+ protected Map<String, Object> getVendorProperties() {
+ final Map<String, Object> map = new HashMap<>();
+ map.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.JDBC);
+ map.put(PersistenceUnitProperties.WEAVING, "static");
+ map.put(PersistenceUnitProperties.DEPLOY_ON_STARTUP, "true");
+ map.put(PersistenceUnitProperties.TARGET_SERVER, TargetServer.DEFAULT);
+ return map;
+ }
+
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/dg1cloud.properties b/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/dg1cloud.properties
new file mode 100644
index 0000000..f74bf52
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/config/dg1cloud.properties
@@ -0,0 +1,16 @@
+application.version=v0.0.1beta
+
+repository.base.upload.path=/etc/dg1cloud/repository/upload
+repository.base.storage.path=/etc/dg1cloud/repository/storage
+
+repository.scanner.job.fixed.delay=60000
+repository.scanner.job.initial.delay=1000
+
+repository.cleaner.job.fixed.delay=60000
+repository.cleaner.job.initial.delay=1000
+
+repository.dircleaner.job.cron=0 0 5 * * *
+
+server.servlet.context-path=/dg1cloud
+
+external.server.address.base.url=http://vannux.grupposistematica.it:8080/dg1cloud
\ No newline at end of file
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadFileController.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadFileController.java
new file mode 100644
index 0000000..076a8db
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/controller/DownloadFileController.java
@@ -0,0 +1,63 @@
+package it.digione.dg1cloud.controller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import javax.servlet.ServletContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import it.digione.dg1cloud.model.RegDocument;
+import it.digione.dg1cloud.repository.RegDocumentRepository;
+import it.digione.dg1cloud.service.CloudService;
+
+@Controller
+public class DownloadFileController {
+
+ private static final Logger logger = LoggerFactory.getLogger(CloudService.class);
+
+ @Autowired private ServletContext servletContext;
+ @Autowired private RegDocumentRepository regDocumentRepository;
+
+ @RequestMapping("/downloadFile")
+ public ResponseEntity<InputStreamResource> downloadFile(@RequestParam String fileName, @RequestParam long id) throws IOException {
+
+ logger.debug("Avvio download file {} con id {}, fileName, id");
+
+ MediaType mediaType = MediaType.APPLICATION_OCTET_STREAM;
+ try {
+ mediaType = MediaType.parseMediaType(servletContext.getMimeType(fileName));
+ } catch (Exception e) {
+ logger.warn("Errore nello stabilire il mime type del file. VerrĂ usato " + mediaType.toString(), e);
+ }
+
+ RegDocument regDocument = regDocumentRepository.getOne(id);
+
+ if (regDocument.getFileName().equalsIgnoreCase(fileName) == false ) {
+ logger.error("Il nome del file richiesto non corrisponde con quello referenziato dall'id");
+ throw new RuntimeException("Il nome del file richiesto non corrisponde con quello referenziato dall'id");
+ }
+
+ File file = new File(regDocument.getFilePath());
+ FileInputStream fis = new FileInputStream(file);
+ InputStreamResource isr = new InputStreamResource(fis);
+ return ResponseEntity.ok()
+ // Content-Disposition
+ .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + file.getName())
+ // Content-Type
+ .contentType(mediaType)
+ // Contet-Length
+ .contentLength(file.length()) //
+ .body(isr);
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/model/RegDocument.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/model/RegDocument.java
new file mode 100644
index 0000000..83f2690
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/model/RegDocument.java
@@ -0,0 +1,152 @@
+package it.digione.dg1cloud.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.*;
+
+/**
+ * The persistent class for the reg_classification database table.
+ *
+ */
+@Entity
+@Table(name="reg_document")
+@Cacheable(false)
+@SequenceGenerator(name="reg_document_seq", sequenceName="reg_document_seq", allocationSize=1 )
+public class RegDocument implements Serializable {
+
+ private static final long serialVersionUID = -3682129109212204091L;
+
+ @Id
+ @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="reg_document_seq")
+ @Column(name="document_id")
+ private Long documentId;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date created;
+
+ @Column(name="createdby")
+ private String createdBy;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date modified;
+
+ @Column(name="modifiedby")
+ private String modifiedBy;
+
+ @Column(name="file_hash")
+ private String fileHash;
+
+ @Column(name="file_name")
+ private String fileName;
+
+ @Column(name="file_path")
+ private String filePath;
+
+ @Column(name="file_size")
+ private Long fileSize;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name="due_date")
+ private Date dueDate;
+
+ public RegDocument() {
+ }
+
+ @PrePersist
+ public void prePersist() {
+ Date now = new Date();
+ if(created == null) //We set default value in case if the value is not set yet.
+ created = now;
+ if(modified == null) //We set default value in case if the value is not set yet.
+ modified = now;
+ }
+
+ public Long getDocumentId() {
+ return documentId;
+ }
+
+ public void setDocumentId(Long documentId) {
+ this.documentId = documentId;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public void setCreatedBy(String createdBy) {
+ this.createdBy = createdBy;
+ }
+
+ public Date getModified() {
+ return modified;
+ }
+
+ public void setModified(Date modified) {
+ this.modified = modified;
+ }
+
+ public String getModifiedBy() {
+ return modifiedBy;
+ }
+
+ public void setModifiedBy(String modifiedBy) {
+ this.modifiedBy = modifiedBy;
+ }
+
+ public String getFileHash() {
+ return fileHash;
+ }
+
+ public void setFileHash(String fileHash) {
+ this.fileHash = fileHash;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public void setFilePath(String filePath) {
+ this.filePath = filePath;
+ }
+
+ public Long getFileSize() {
+ return fileSize;
+ }
+
+ public void setFileSize(Long fileSize) {
+ this.fileSize = fileSize;
+ }
+
+ public Date getDueDate() {
+ return dueDate;
+ }
+
+ public void setDueDate(Date dueDate) {
+ this.dueDate = dueDate;
+ }
+
+ @Override
+ public String toString() {
+ return "RegDocument [documentId=" + documentId + ", created=" + created + ", createdBy=" + createdBy
+ + ", modified=" + modified + ", modifiedBy=" + modifiedBy + ", fileHash=" + fileHash + ", filePath="
+ + filePath + ", fileSize=" + fileSize + ", dueDate=" + dueDate + "]";
+ }
+
+}
\ No newline at end of file
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptor.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptor.java
new file mode 100644
index 0000000..f7bf4f9
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptor.java
@@ -0,0 +1,29 @@
+package it.digione.dg1cloud.pojo;
+
+import java.util.Date;
+
+public class UploadedFileDescriptor {
+
+ private String fileName;
+ private String sha256;
+ private Date dueDate; //Data nel formato ISO-8601 - es: 2018-07-27T18:25:43.511Z
+
+ public String getFileName() {
+ return fileName;
+ }
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+ public String getSha256() {
+ return sha256;
+ }
+ public void setSha256(String sha256) {
+ this.sha256 = sha256;
+ }
+ public Date getDueDate() {
+ return dueDate;
+ }
+ public void setDueDate(Date dueDate) {
+ this.dueDate = dueDate;
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.java
new file mode 100644
index 0000000..18609fa
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.java
@@ -0,0 +1,20 @@
+package it.digione.dg1cloud.pojo;
+
+public class UploadedFileDescriptorOk {
+
+ private String fileName;
+ private String url;
+
+ public String getFileName() {
+ return fileName;
+ }
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/repository/RegDocumentRepository.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/repository/RegDocumentRepository.java
new file mode 100644
index 0000000..35b4df3
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/repository/RegDocumentRepository.java
@@ -0,0 +1,23 @@
+package it.digione.dg1cloud.repository;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import it.digione.dg1cloud.model.RegDocument;
+
+@Repository
+@Transactional( propagation = Propagation.REQUIRED )
+public interface RegDocumentRepository extends JpaRepository<RegDocument, Long> {
+
+ @Query("SELECT d FROM RegDocument d WHERE d.fileHash = :fileHash and d.fileName = :fileName")
+ RegDocument findOneByHashAndName(@Param("fileHash") String fileHash, @Param("fileName") String fileName);
+
+ @Query("SELECT d FROM RegDocument d WHERE CURRENT_DATE > d.dueDate")
+ List<RegDocument> findAllRegDocumentExpired();
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/scheduler/RepositoryJob.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/scheduler/RepositoryJob.java
new file mode 100644
index 0000000..fba0002
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/scheduler/RepositoryJob.java
@@ -0,0 +1,56 @@
+package it.digione.dg1cloud.scheduler;
+
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+
+import it.digione.dg1cloud.service.CleanerService;
+import it.digione.dg1cloud.service.CloudService;
+
+@Configuration
+@EnableScheduling
+public class RepositoryJob {
+
+ private static final Logger logger = LoggerFactory.getLogger(RepositoryJob.class);
+
+ @Autowired private CloudService cloudService;
+ @Autowired private CleanerService cleanerService;
+
+ @Scheduled(
+ fixedDelayString = "${repository.scanner.job.fixed.delay}",
+ initialDelayString = "${repository.scanner.job.initial.delay}"
+ )
+ public void scannerJob() throws JsonParseException, JsonMappingException, NoSuchAlgorithmException, IOException {
+ logger.debug("Avvio servizio controllo home directory");
+ cloudService.scannAccountHomeDirs();
+ logger.debug("Fine");
+ }
+
+ @Scheduled(
+ fixedDelayString = "${repository.cleaner.job.fixed.delay}",
+ initialDelayString = "${repository.cleaner.job.initial.delay}"
+ )
+ public void cleanerJob() {
+ logger.debug("Avvio servizio rimozione file scaduti");
+ cleanerService.cleanExpiredStoredFiles();
+ logger.debug("Fine");
+ }
+
+ @Scheduled(
+ cron = "${repository.dircleaner.job.cron}"
+ )
+ public void dirCleanerJob() {
+ logger.debug("Avvio servizio rimozione directory vuote");
+ cleanerService.cleanEmptyStorageFolder();
+ logger.debug("Fine");
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CleanerService.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CleanerService.java
new file mode 100644
index 0000000..5442841
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CleanerService.java
@@ -0,0 +1,60 @@
+package it.digione.dg1cloud.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import it.digione.dg1cloud.config.AppConfig;
+import it.digione.dg1cloud.model.RegDocument;
+import it.digione.dg1cloud.repository.RegDocumentRepository;
+
+@Service("cleanerService")
+public class CleanerService {
+
+ private static final Logger logger = LoggerFactory.getLogger(CleanerService.class);
+
+ @Autowired private Utils utils;
+ @Autowired private AppConfig appConfig;
+ @Autowired private RegDocumentRepository regDocumentRepository;
+
+ public void cleanExpiredStoredFiles() {
+
+ List<RegDocument> regDocuments = regDocumentRepository.findAllRegDocumentExpired();
+ logger.debug("Trovati {} documenti da cancellare", regDocuments.size());
+
+ for ( RegDocument regDocument : regDocuments ) {
+ logger.debug("Rimozione file {}", regDocument.getFilePath());
+ File cloudFile = new File( regDocument.getFilePath() );
+ if (cloudFile.exists() == true ) {
+ FileUtils.deleteQuietly(cloudFile);
+ } else {
+ logger.debug("File gia' rimosso. Procedo alla rimozione del record");
+ }
+ logger.debug("Rimozione record");
+ regDocumentRepository.delete(regDocument);
+ logger.debug("Record rimosso");
+
+ try {
+ utils.deleteDir(cloudFile.getParentFile());
+ } catch (Exception e) {
+ logger.warn("ERRORE: Problemi nella rimozione della directory", e);
+ }
+ }
+ }
+
+ public void cleanEmptyStorageFolder() {
+ String baseStoragePath = appConfig.getRepositoryBaseStoragePath();
+ logger.debug("Avvio esplorazione ricorsiva directory vuote da eliminare partendo da {}", baseStoragePath);
+ try {
+ utils.deleteEmptyDirectoriesRecursive(new File(baseStoragePath));
+ } catch (IOException e) {
+ logger.error("Errore nell'esplorazione delle sotto directory", e);
+ }
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CloudService.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CloudService.java
new file mode 100644
index 0000000..2175d3b
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/CloudService.java
@@ -0,0 +1,332 @@
+package it.digione.dg1cloud.service;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.security.NoSuchAlgorithmException;
+import java.time.LocalDate;
+import java.time.ZoneId;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import it.digione.dg1cloud.config.AppConfig;
+import it.digione.dg1cloud.model.RegDocument;
+import it.digione.dg1cloud.pojo.UploadedFileDescriptor;
+import it.digione.dg1cloud.pojo.UploadedFileDescriptorOk;
+import it.digione.dg1cloud.repository.RegDocumentRepository;
+
+@Service("cloudService")
+public class CloudService {
+
+ private static final Logger logger = LoggerFactory.getLogger(CloudService.class);
+
+ @Autowired private AppConfig appConfig;
+ @Autowired private Utils utils;
+ @Autowired private RegDocumentRepository regDocumentRepository;
+
+ public void scannAccountHomeDirs() throws JsonParseException, JsonMappingException, NoSuchAlgorithmException, IOException {
+
+ String repositoryPath = appConfig.getRepositoryBaseUploadPath();
+ File basePath = new File(repositoryPath);
+
+ if ( basePath.exists() == false || basePath.isDirectory() == false )
+ throw new RuntimeException("La directory '" + basePath.getAbsolutePath() + "' non esiste oppure non e' una directory");
+
+ for ( File folder : basePath.listFiles(File::isDirectory)) {
+ for ( File descriptor : folder.listFiles(
+ (dir, name) -> {
+ return name.toLowerCase().endsWith(".dg1cloud");
+ }))
+ {
+ boolean checkFile = false;
+ try {
+ checkFile = checkFile(descriptor.getAbsolutePath());
+ } catch (Exception e ) {
+ logger.error("Errore durante la fase di verifica del file", e);
+ writeKoFile(descriptor.getAbsolutePath(), "Errore durante la fase di verifica del file\n" + e.getMessage());
+ continue;
+ }
+
+ if ( checkFile == true ) {
+ logger.debug("Controllo file descrittore completato con successo");
+ try {
+ storeFile(descriptor.getAbsolutePath());
+ } catch (Exception e) {
+ writeKoFile(descriptor.getAbsolutePath(), "Errore duranto la memorizzazione del file nello store\n" + e.getMessage());
+ }
+ } else {
+ logger.debug("Il file non ha passato le verifiche");
+ }
+ }
+ }
+ }
+
+ public boolean checkFile(String cloudFileDescriptorPath) throws IOException, NoSuchAlgorithmException {
+ logger.debug("Controllo il file {}", cloudFileDescriptorPath);
+
+ TypeReference<UploadedFileDescriptor> typeReference = new TypeReference<UploadedFileDescriptor>() {};
+ File cloudFileDescriptor = new File(cloudFileDescriptorPath);
+
+ String koMessage = null;
+
+ if ( cloudFileDescriptor.exists() == false ) {
+ koMessage = "Il file descrittore inviato '" + cloudFileDescriptor + "' non esiste";
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ if ( cloudFileDescriptor.isFile() == false ) {
+ koMessage = "Il file descrittore inviato '" + cloudFileDescriptor + "' non e' di tipo file";
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ InputStream is = new FileInputStream(cloudFileDescriptor);
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ UploadedFileDescriptor uploadedFileDescriptor;
+ try {
+ uploadedFileDescriptor = mapper.readValue(is, typeReference);
+ } catch (IOException e) {
+ koMessage = "Il file descrittore non conforme:\n" + e.getMessage();
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ is.close();
+
+ File uploadedFile = new File(cloudFileDescriptor.getParentFile(), uploadedFileDescriptor.getFileName());
+ if ( uploadedFile.exists() == false ) {
+ koMessage = "Il file inviato '" + uploadedFile + "' non esiste";
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ if ( uploadedFile.isFile() == false ) {
+ koMessage = "Il file inviato '" + uploadedFile + "' non e' di tipo file";
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ FileInputStream fis = new FileInputStream(uploadedFile);
+ String hash = DigestUtils.sha256Hex(fis);
+ fis.close();
+
+ if ( hash.equalsIgnoreCase(uploadedFileDescriptor.getSha256()) == false ) {
+ koMessage = "L'hash del file inviato non corrisponde con l'hash dichiarato nel descrittore del file:\n\t" +
+ "hash file inviato: " + hash + "\n\t" +
+ "hash dichiarato nel descrittore: " + uploadedFileDescriptor.getSha256();
+ writeKoFile(cloudFileDescriptorPath, koMessage);
+ return false;
+ }
+
+ return true;
+ }
+
+ public void storeFile(String cloudFileDescriptorPath) {
+ logger.debug("Avvio processo di memorizzazione file nello store");
+ TypeReference<UploadedFileDescriptor> typeReference = new TypeReference<UploadedFileDescriptor>() {};
+ File cloudFileDescriptor = new File(cloudFileDescriptorPath);
+
+ InputStream is;
+ try {
+ is = new FileInputStream(cloudFileDescriptor);
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException("Errore apertura stream file descrittore", e);
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ UploadedFileDescriptor uploadedFileDescriptor;
+ try {
+ uploadedFileDescriptor = mapper.readValue(is, typeReference);
+ } catch (IOException e) {
+ throw new RuntimeException("Errore caricamento classe dal json del descrittore", e);
+ }
+
+ logger.debug("Controllo esistenza file sul db");
+ RegDocument regDocument = regDocumentRepository.findOneByHashAndName(uploadedFileDescriptor.getSha256(), uploadedFileDescriptor.getFileName());
+
+ String userName = cloudFileDescriptor.getParentFile().getName();
+
+ File uploadedFile = new File(getUploadedFilePath(cloudFileDescriptorPath));
+
+ if ( regDocument == null ) {
+
+ logger.debug("Creazione nuovo record per il documento da conservare");
+ regDocument = new RegDocument();
+ regDocument.setCreatedBy(userName);
+ regDocument.setModifiedBy(userName);
+ regDocument.setFileHash(uploadedFileDescriptor.getSha256());
+ regDocument.setFileName(uploadedFileDescriptor.getFileName());
+ regDocument.setFileSize(uploadedFile.length());
+ regDocument.setDueDate(uploadedFileDescriptor.getDueDate());
+ regDocument.setFilePath("");
+
+ regDocumentRepository.save(regDocument);
+
+ } else {
+ logger.debug("Trovato 1 record per il documento da memorizzare");
+ }
+
+ try {
+ moveUploadedFileToStorage(uploadedFile.getAbsolutePath(), regDocument);
+ } catch (Exception e) {
+ try {
+ writeKoFile(cloudFileDescriptorPath, e.getMessage());
+ } finally {
+ logger.debug("Rimozione regDocument");
+ regDocumentRepository.delete(regDocument);
+ }
+ }
+ try {
+ createOkFile(cloudFileDescriptorPath, regDocument);
+ } catch (Exception e) {
+ try {
+ writeKoFile(cloudFileDescriptorPath, e.getMessage());
+ } finally {
+ logger.debug("Rimozione regDocument");
+ regDocumentRepository.delete(regDocument);
+ }
+ }
+ }
+
+ private void moveUploadedFileToStorage( String source, RegDocument regDocument ) throws IOException {
+ logger.debug("Spostamento file nello storage");
+
+ String sha256Descriptor = regDocument.getFileHash();
+
+ File sourceFile = new File(source);
+ File destinationFile = new File(generateStoragePath(regDocument));
+
+ if ( destinationFile.exists() == false ) {
+ logger.debug("Creazione alberatura directory: " + destinationFile.getParent());
+ FileUtils.forceMkdirParent(destinationFile);
+ FileUtils.copyFile(sourceFile, destinationFile);
+ } else {
+ logger.debug("Il file risulta gia' presente nello storage. Verifico l'integrita'");
+ FileInputStream fis = new FileInputStream(destinationFile);
+ String hash = DigestUtils.sha256Hex(fis);
+ fis.close();
+ if ( sha256Descriptor.equalsIgnoreCase(hash) == false ) {
+ throw new IllegalStateException("L'hash del file nello storage non corrisponde con l'hash dichiarato nel descrittore del file:\n\t" +
+ "hash file inviato: " + hash + "\n\t" +
+ "hash dichiarato nel descrittore: " + sha256Descriptor);
+ }
+ }
+
+ regDocument.setFilePath(destinationFile.getAbsolutePath());
+ logger.debug("Salvo il path nel regDocument: {}", regDocument.getFilePath());
+ regDocumentRepository.save(regDocument);
+ }
+
+ private void createOkFile( String cloudFileDescriptorPath, RegDocument regDocument ) throws IOException {
+ logger.debug("Creazione file di OK");
+
+ File fileDescriptor = new File(cloudFileDescriptorPath);
+ File okFile = new File(fileDescriptor.getParentFile(), fileDescriptor.getName() + ".ok");
+
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.enable(SerializationFeature.INDENT_OUTPUT);
+ mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+
+ UploadedFileDescriptorOk uploadedFileDescriptorOk = new UploadedFileDescriptorOk();
+
+ uploadedFileDescriptorOk.setFileName(regDocument.getFileName());
+
+ URL url = utils.generateUrl(regDocument);
+
+ uploadedFileDescriptorOk.setUrl(url.toExternalForm());
+
+ try {
+ String json = mapper.writeValueAsString(uploadedFileDescriptorOk);
+ logger.debug("Scrittura json di ok:\n{}", json);
+ FileUtils.writeStringToFile(okFile, json, StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ throw new RuntimeException("Errore nella scrittura del file di OK", e);
+ }
+
+ File cloudFile = new File( getUploadedFilePath(cloudFileDescriptorPath) );
+ if (cloudFile.exists() == true )
+ FileUtils.deleteQuietly(cloudFile);
+
+ try {
+ FileUtils.forceDelete(fileDescriptor);
+ } catch (IOException e) {
+ throw new RuntimeException("Errore rimozione del file descrittore", e);
+ }
+ }
+
+ public void writeKoFile( String cloudFileDescriptorPath, String errorMessage ) {
+ logger.debug("Si e' verificato il seguente errore nella verifica tramite {}: {}", cloudFileDescriptorPath, errorMessage);
+
+ File fileDescriptor = new File(cloudFileDescriptorPath);
+ File koFile = new File(fileDescriptor.getParentFile(), fileDescriptor.getName() + ".ko");
+
+ try {
+ FileUtils.writeStringToFile(koFile, errorMessage, StandardCharsets.UTF_8);
+ } catch (IOException e) {
+ throw new RuntimeException("Errore nella scrittura del file di KO", e);
+ }
+
+ File cloudFile = new File( getUploadedFilePath(cloudFileDescriptorPath) );
+ if (cloudFile.exists() == true )
+ FileUtils.deleteQuietly(cloudFile);
+
+ try {
+ FileUtils.forceDelete(fileDescriptor);
+ } catch (IOException e) {
+ throw new RuntimeException("Errore rimozione del file descrittore", e);
+ }
+ }
+
+ public String getUploadedFilePath( String cloudFileDescriptorPath ) {
+ File fileDescriptor = new File(cloudFileDescriptorPath);
+ return fileDescriptor.getParentFile().getAbsolutePath() + File.separator + FilenameUtils.getBaseName(fileDescriptor.getName());
+ }
+
+ private String generateStoragePath( RegDocument regDocument ) {
+
+ if ( regDocument.getCreated() == null )
+ throw new IllegalStateException("La data di creazione del RegDocument non e' valorizzata");
+
+ LocalDate localDate = regDocument.getCreated().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+ int year = localDate.getYear();
+ int month = localDate.getMonthValue();
+ int day = localDate.getDayOfMonth();
+
+ StringBuffer sb = new StringBuffer();
+ sb.append(appConfig.getRepositoryBaseStoragePath());
+ sb.append(File.separator);
+ sb.append(regDocument.getCreatedBy());
+ sb.append(File.separator);
+ sb.append(year);
+ sb.append(File.separator);
+ sb.append(month);
+ sb.append(File.separator);
+ sb.append(day);
+ sb.append(File.separator);
+ sb.append(regDocument.getDocumentId());
+ sb.append(File.separator);
+ sb.append(regDocument.getFileName());
+
+ return sb.toString();
+ }
+}
diff --git a/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/Utils.java b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/Utils.java
new file mode 100644
index 0000000..ee38726
--- /dev/null
+++ b/dg1cloud-core/src/main/java/it/digione/dg1cloud/service/Utils.java
@@ -0,0 +1,52 @@
+package it.digione.dg1cloud.service;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.util.UriBuilder;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import it.digione.dg1cloud.config.AppConfig;
+import it.digione.dg1cloud.model.RegDocument;
+
+@Service("utils")
+public class Utils {
+
+ @Autowired private AppConfig appConfig;
+
+ private static final Logger logger = LoggerFactory.getLogger(CloudService.class);
+
+ public URL generateUrl(RegDocument regDocument) throws MalformedURLException {
+ logger.debug("Genero l'url per il record file {} con id {}", regDocument.getFileName(), regDocument.getDocumentId());
+ UriBuilder uriBuilder = UriComponentsBuilder.fromUriString(appConfig.getExternalBaseUrl());
+ uriBuilder.path("/downloadFile");
+ uriBuilder.queryParam("fileName", regDocument.getFileName());
+ uriBuilder.queryParam("id", regDocument.getDocumentId());
+ return uriBuilder.build().toURL();
+ }
+
+ public void deleteDir( File directory ) throws IOException {
+ logger.debug("Rimozione directory {}", directory.getAbsolutePath());
+ FileUtils.deleteDirectory(directory);
+ }
+
+ public void deleteEmptyDirectoriesRecursive( File directory) throws IOException {
+ for (File subDirectory : directory.listFiles(File::isDirectory) ) {
+ logger.debug("Analizzo sottodirectory {}", subDirectory.getAbsolutePath());
+ deleteEmptyDirectoriesRecursive(subDirectory);
+ }
+ if ( directory.listFiles().length == 0 ) {
+ logger.debug("La directory {} e' vuota", directory.getAbsolutePath());
+ deleteDir(directory);
+ } else {
+ logger.debug("La directory {} non e' vuota", directory.getAbsolutePath());
+ }
+ }
+}
diff --git a/dg1cloud-core/src/main/resources/application.properties b/dg1cloud-core/src/main/resources/application.properties
new file mode 100644
index 0000000..af62d1d
--- /dev/null
+++ b/dg1cloud-core/src/main/resources/application.properties
@@ -0,0 +1,19 @@
+spring.datasource.url=jdbc:postgresql://localhost:5432/dg1cloud
+spring.datasource.username=postgres
+spring.datasource.password=passero
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.datasource.tomcat.initial-size=10
+spring.datasource.tomcat.max-wait=30000
+spring.datasource.tomcat.max-active=25
+spring.datasource.tomcat.max-idle=20
+spring.datasource.tomcat.min-idle=10
+spring.datasource.tomcat.test-on-borrow=true
+spring.datasource.tomcat.test-while-idle=true
+spring.datasource.tomcat.validation-query=SELECT 1
+spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+
+spring.jpa.open-in-view=true
+
+server.address=vannux.grupposistematica.it
+
+logging.level.it.digione.dg1cloud=DEBUG
\ No newline at end of file
diff --git a/dg1cloud-core/src/test/java/it/digione/cloud/Dg1cloudCoreApplicationTests.java b/dg1cloud-core/src/test/java/it/digione/cloud/Dg1cloudCoreApplicationTests.java
new file mode 100644
index 0000000..c7adb36
--- /dev/null
+++ b/dg1cloud-core/src/test/java/it/digione/cloud/Dg1cloudCoreApplicationTests.java
@@ -0,0 +1,22 @@
+package it.digione.cloud;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import it.digione.dg1cloud.app.Dg1cloudCoreApplication;
+import it.digione.dg1cloud.service.CleanerService;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Dg1cloudCoreApplication.class)
+public class Dg1cloudCoreApplicationTests {
+
+ @Autowired CleanerService cleanerService;
+ @Test
+ public void contextLoads() {
+ cleanerService.cleanEmptyStorageFolder();
+ }
+
+}
diff --git a/dg1cloud-core/target/classes/META-INF/MANIFEST.MF b/dg1cloud-core/target/classes/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7d3d475
--- /dev/null
+++ b/dg1cloud-core/target/classes/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Implementation-Title: dg1cloud-core
+Implementation-Version: 0.0.1-SNAPSHOT
+Built-By: lvannucci
+Implementation-Vendor-Id: it.digione.cloud
+Build-Jdk: 1.8.0_131
+Implementation-URL: https://projects.spring.io/spring-boot/#/spring-bo
+ ot-starter-parent/dg1cloud-core
+Created-By: Maven Integration for Eclipse
+
diff --git a/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.properties b/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.properties
new file mode 100644
index 0000000..3ea6df0
--- /dev/null
+++ b/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.properties
@@ -0,0 +1,7 @@
+#Generated by Maven Integration for Eclipse
+#Wed Aug 01 09:46:22 CEST 2018
+version=0.0.1-SNAPSHOT
+groupId=it.digione.cloud
+m2e.projectName=dg1cloud-core
+m2e.projectLocation=E\:\\users\\lvannucci\\GIT_Projects\\dg1cloud\\dg1cloud-core
+artifactId=dg1cloud-core
diff --git a/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.xml b/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.xml
new file mode 100644
index 0000000..1fcf8c8
--- /dev/null
+++ b/dg1cloud-core/target/classes/META-INF/maven/it.digione.cloud/dg1cloud-core/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>it.digione.cloud</groupId>
+ <artifactId>dg1cloud-core</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>jar</packaging>
+
+ <name>dg1cloud-core</name>
+ <description>Servizio cloud per ricezione file</description>
+
+ <parent>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-parent</artifactId>
+ <version>2.0.3.RELEASE</version>
+ <relativePath/> <!-- lookup parent from repository -->
+ </parent>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <java.version>1.8</java.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.flywaydb</groupId>
+ <artifactId>flyway-core</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>eclipselink</artifactId>
+ <version>2.5.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+
+</project>
diff --git a/dg1cloud-core/target/classes/META-INF/persistence.xml b/dg1cloud-core/target/classes/META-INF/persistence.xml
new file mode 100644
index 0000000..3ea7c16
--- /dev/null
+++ b/dg1cloud-core/target/classes/META-INF/persistence.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+ <persistence-unit name="dg1cloud-core">
+ <class>it.digione.dg1cloud.model.RegDocument</class>
+ <properties>
+ <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
+ </properties>
+ </persistence-unit>
+</persistence>
diff --git a/dg1cloud-core/target/classes/application.properties b/dg1cloud-core/target/classes/application.properties
new file mode 100644
index 0000000..af62d1d
--- /dev/null
+++ b/dg1cloud-core/target/classes/application.properties
@@ -0,0 +1,19 @@
+spring.datasource.url=jdbc:postgresql://localhost:5432/dg1cloud
+spring.datasource.username=postgres
+spring.datasource.password=passero
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.datasource.tomcat.initial-size=10
+spring.datasource.tomcat.max-wait=30000
+spring.datasource.tomcat.max-active=25
+spring.datasource.tomcat.max-idle=20
+spring.datasource.tomcat.min-idle=10
+spring.datasource.tomcat.test-on-borrow=true
+spring.datasource.tomcat.test-while-idle=true
+spring.datasource.tomcat.validation-query=SELECT 1
+spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+
+spring.jpa.open-in-view=true
+
+server.address=vannux.grupposistematica.it
+
+logging.level.it.digione.dg1cloud=DEBUG
\ No newline at end of file
diff --git a/dg1cloud-core/target/classes/db/migration/V0.1__DG1CLOUD.sql b/dg1cloud-core/target/classes/db/migration/V0.1__DG1CLOUD.sql
new file mode 100644
index 0000000..aab3b34
--- /dev/null
+++ b/dg1cloud-core/target/classes/db/migration/V0.1__DG1CLOUD.sql
@@ -0,0 +1,27 @@
+-- Table: public.reg_document
+CREATE TABLE public.reg_document
+(
+ document_id bigint NOT NULL,
+ created timestamp without time zone NOT NULL DEFAULT now(),
+ createdby character varying(255) NOT NULL,
+ modified timestamp without time zone NOT NULL DEFAULT now(),
+ modifiedby character varying(255) NOT NULL,
+ file_hash character varying(255),
+ file_name text NOT NULL,
+ file_path text NOT NULL,
+ file_size bigint,
+ due_date date,
+ CONSTRAINT reg_document_pkey PRIMARY KEY (document_id)
+)
+WITH (
+ OIDS = FALSE
+);
+
+CREATE SEQUENCE public.reg_document_seq
+ INCREMENT 1
+ START 1
+ MINVALUE 1
+ MAXVALUE 9223372036854775807
+ CACHE 1;
+
+
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/app/Dg1cloudCoreApplication.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/app/Dg1cloudCoreApplication.class
new file mode 100644
index 0000000..87df6d0
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/app/Dg1cloudCoreApplication.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/config/AppConfig.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/config/AppConfig.class
new file mode 100644
index 0000000..4d94807
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/config/AppConfig.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/config/dg1cloud.properties b/dg1cloud-core/target/classes/it/digione/dg1cloud/config/dg1cloud.properties
new file mode 100644
index 0000000..f74bf52
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/config/dg1cloud.properties
@@ -0,0 +1,16 @@
+application.version=v0.0.1beta
+
+repository.base.upload.path=/etc/dg1cloud/repository/upload
+repository.base.storage.path=/etc/dg1cloud/repository/storage
+
+repository.scanner.job.fixed.delay=60000
+repository.scanner.job.initial.delay=1000
+
+repository.cleaner.job.fixed.delay=60000
+repository.cleaner.job.initial.delay=1000
+
+repository.dircleaner.job.cron=0 0 5 * * *
+
+server.servlet.context-path=/dg1cloud
+
+external.server.address.base.url=http://vannux.grupposistematica.it:8080/dg1cloud
\ No newline at end of file
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/controller/DownloadFileController.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/controller/DownloadFileController.class
new file mode 100644
index 0000000..dc77b22
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/controller/DownloadFileController.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/model/RegDocument.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/model/RegDocument.class
new file mode 100644
index 0000000..b6de2da
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/model/RegDocument.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptor.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptor.class
new file mode 100644
index 0000000..c7d7c3b
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptor.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.class
new file mode 100644
index 0000000..205cd5a
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/pojo/UploadedFileDescriptorOk.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/repository/RegDocumentRepository.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/repository/RegDocumentRepository.class
new file mode 100644
index 0000000..12b8823
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/repository/RegDocumentRepository.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/scheduler/RepositoryJob.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/scheduler/RepositoryJob.class
new file mode 100644
index 0000000..6c81a57
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/scheduler/RepositoryJob.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CleanerService.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CleanerService.class
new file mode 100644
index 0000000..d0d74f4
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CleanerService.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$1.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$1.class
new file mode 100644
index 0000000..146cf3f
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$1.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$2.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$2.class
new file mode 100644
index 0000000..c20478f
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService$2.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService.class
new file mode 100644
index 0000000..37f1588
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/CloudService.class
Binary files differ
diff --git a/dg1cloud-core/target/classes/it/digione/dg1cloud/service/Utils.class b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/Utils.class
new file mode 100644
index 0000000..46e81a1
--- /dev/null
+++ b/dg1cloud-core/target/classes/it/digione/dg1cloud/service/Utils.class
Binary files differ
diff --git a/dg1cloud-core/target/test-classes/it/digione/cloud/Dg1cloudCoreApplicationTests.class b/dg1cloud-core/target/test-classes/it/digione/cloud/Dg1cloudCoreApplicationTests.class
new file mode 100644
index 0000000..ed288e4
--- /dev/null
+++ b/dg1cloud-core/target/test-classes/it/digione/cloud/Dg1cloudCoreApplicationTests.class
Binary files differ
--
Gitblit v1.6.2