Compare commits
32 Commits
Author | SHA1 | Date |
---|---|---|
Massimiliano Assante | fc37ffec6f | |
lucio | e0a50f2a72 | |
lucio | b4c9cfeee6 | |
lucio | 7920345286 | |
lucio | 80704b9df2 | |
lucio | a42919ffcf | |
lucio | 6b54bf4554 | |
lucio | 122cba00e4 | |
Lucio Lelii | 60d9bf570c | |
Lucio Lelii | f9870a0190 | |
lucio | d9a229929b | |
Lucio Lelii | 0b907277cd | |
Lucio Lelii | 500aaa3fc9 | |
Lucio Lelii | e167aa24d9 | |
Lucio Lelii | 39d73b97c4 | |
Lucio Lelii | 4dc547afd2 | |
Lucio Lelii | 122b326203 | |
Lucio Lelii | 1bbd1d200f | |
Lucio Lelii | 647dbb651a | |
lucio.lelii | 7f88e20a88 | |
lucio.lelii | 08f0160d8d | |
lucio.lelii | 2a46ac3aa2 | |
lucio.lelii | 882f849e2f | |
lucio.lelii | 8c934a138e | |
lucio.lelii | 20390e3147 | |
lucio.lelii | 47bf9b57d2 | |
lucio.lelii | 27c6f2d3e1 | |
lucio.lelii | 586d9df939 | |
lucio.lelii | 7ebd1ae629 | |
lucio.lelii | 51cbd0776a | |
lucio.lelii | f30029c052 | |
Lucio Lelii | 68eb65e168 |
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,7 +24,8 @@
|
||||||
|
|
||||||
|
|
||||||
<wb-module deploy-name="storagehub">
|
<wb-module deploy-name="storagehub">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,7 +49,8 @@
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
|
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,7 +74,8 @@
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,7 +99,8 @@
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
|
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,13 +124,8 @@
|
||||||
|
|
||||||
|
|
||||||
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
|
||||||
<dependent-module archiveName="storagehub-model-1.1.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/storagehub-model/storagehub-model">
|
|
||||||
<dependency-type>uses</dependency-type>
|
|
||||||
</dependent-module>
|
|
||||||
<dependent-module archiveName="storagehub-script-utils-1.0.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/storagehub-scripting-util/storagehub-scripting-util">
|
|
||||||
<dependency-type>uses</dependency-type>
|
|
||||||
</dependent-module>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,7 +149,8 @@
|
||||||
|
|
||||||
|
|
||||||
<property name="context-root" value="storagehub"/>
|
<property name="context-root" value="storagehub"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -173,7 +174,8 @@
|
||||||
|
|
||||||
|
|
||||||
<property name="java-output-path" value="/storagehub-webapp_BRANCH/target/classes"/>
|
<property name="java-output-path" value="/storagehub-webapp_BRANCH/target/classes"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,7 +199,8 @@
|
||||||
|
|
||||||
|
|
||||||
</wb-module>
|
</wb-module>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
13
CHANGELOG.md
13
CHANGELOG.md
|
@ -3,6 +3,19 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [v1.4.2] - [2023-05-22]
|
||||||
|
|
||||||
|
- added enunciate libraries for documentation
|
||||||
|
|
||||||
|
## [v1.4.1] - [2022-11-14]
|
||||||
|
|
||||||
|
- added libraries to manage different image format
|
||||||
|
|
||||||
|
## [v1.4.0] - [2021-10-07]
|
||||||
|
|
||||||
|
- slow query removed from VRE retrieving and recents
|
||||||
|
- incident #22184 solved
|
||||||
|
|
||||||
## [v1.3.2] - [2021-09-28]
|
## [v1.3.2] - [2021-09-28]
|
||||||
- fix 22087
|
- fix 22087
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<application mode='online'>
|
<application mode='online'>
|
||||||
<name>StorageHub</name>
|
<name>StorageHub</name>
|
||||||
<group>DataAccess</group>
|
<group>DataAccess</group>
|
||||||
<version>${version}</version>
|
<version>1.4.2</version>
|
||||||
<description>Storage Hub webapp</description>
|
<description>Storage Hub webapp</description>
|
||||||
<local-persistence location='target' />
|
<local-persistence location='target' />
|
||||||
|
<exclude>/workspace/api-docs/*</exclude>
|
||||||
</application>
|
</application>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<enunciate
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="http://enunciate.webcohesion.com/schemas/enunciate-2.14.0.xsd">
|
||||||
|
<api-classes>
|
||||||
|
<!-- Use patterns to exclude classes... e.g. for URI-Resolver <exclude
|
||||||
|
pattern="org.gcube.datatransfer.resolver.services.DocsGenerator" /> -->
|
||||||
|
</api-classes>
|
||||||
|
<modules>
|
||||||
|
<gwt-json-overlay disabled="true" />
|
||||||
|
<php-json-client disabled="true" />
|
||||||
|
<ruby-json-client disabled="true" />
|
||||||
|
<java-json-client disabled="true" />
|
||||||
|
<javascript-client disabled="true" />
|
||||||
|
<docs docsDir="${project.build.directory}" docsSubdir="api-docs" />
|
||||||
|
|
||||||
|
<docs
|
||||||
|
freemarkerTemplate="${project.basedir}/src/main/resources/META-INF/enunciate/d4science_docs.fmt">
|
||||||
|
<additional-css
|
||||||
|
file="css/d4science_enunciate_custom.css" />
|
||||||
|
</docs>
|
||||||
|
<swagger basePath="/workspace" />
|
||||||
|
</modules>
|
||||||
|
</enunciate>
|
162
pom.xml
162
pom.xml
|
@ -1,29 +1,23 @@
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
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">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>maven-parent</artifactId>
|
<artifactId>maven-parent</artifactId>
|
||||||
<groupId>org.gcube.tools</groupId>
|
<groupId>org.gcube.tools</groupId>
|
||||||
<version>1.1.0</version>
|
<version>1.1.0</version>
|
||||||
<relativePath />
|
<relativePath />
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.gcube.data.access</groupId>
|
<groupId>org.gcube.data.access</groupId>
|
||||||
<artifactId>storagehub</artifactId>
|
<artifactId>storagehub</artifactId>
|
||||||
<version>1.3.2</version>
|
<version>1.4.2</version>
|
||||||
<name>storagehub</name>
|
<name>storagehub</name>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/storagehub.git</connection>
|
<connection>scm:git:https://code-repo.d4science.org/gCubeSystem/storagehub.git</connection>
|
||||||
<developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/storagehub.git</developerConnection>
|
<developerConnection>scm:git:https://code-repo.d4science.org/gCubeSystem/storagehub.git</developerConnection>
|
||||||
<url>https://code-repo.d4science.org/gCubeSystem/storagehub</url>
|
<url>https://code-repo.d4science.org/gCubeSystem/storagehub</url>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
|
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<webappDirectory>${project.basedir}/src/main/webapp/WEB-INF</webappDirectory>
|
<webappDirectory>${project.basedir}/src/main/webapp/WEB-INF</webappDirectory>
|
||||||
<jackrabbit.version>2.20.2</jackrabbit.version>
|
<jackrabbit.version>2.20.2</jackrabbit.version>
|
||||||
|
@ -32,21 +26,19 @@
|
||||||
<tomcat.version>7.0.40</tomcat.version>
|
<tomcat.version>7.0.40</tomcat.version>
|
||||||
<jetty.version>6.1.26</jetty.version>
|
<jetty.version>6.1.26</jetty.version>
|
||||||
<tika.version>1.21</tika.version>
|
<tika.version>1.21</tika.version>
|
||||||
|
|
||||||
<distroDirectory>${project.basedir}/distro</distroDirectory>
|
<distroDirectory>${project.basedir}/distro</distroDirectory>
|
||||||
<description>REST web service for Jackrabbit</description>
|
<description>REST web service for Jackrabbit</description>
|
||||||
<warname>storagehub</warname>
|
<warname>storagehub</warname>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
<enunciate.version>2.14.0</enunciate.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.distribution</groupId>
|
<groupId>org.gcube.distribution</groupId>
|
||||||
<artifactId>gcube-smartgears-bom</artifactId>
|
<artifactId>gcube-smartgears-bom</artifactId>
|
||||||
<version>2.0.0</version>
|
<version>2.1.1</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -57,87 +49,85 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.aspectj</groupId>
|
<groupId>org.aspectj</groupId>
|
||||||
<artifactId>aspectjrt</artifactId>
|
<artifactId>aspectjrt</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.core</groupId>
|
<groupId>org.gcube.core</groupId>
|
||||||
<artifactId>common-smartgears</artifactId>
|
<artifactId>common-smartgears</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.core</groupId>
|
<groupId>org.gcube.core</groupId>
|
||||||
<artifactId>common-smartgears-app</artifactId>
|
<artifactId>common-smartgears-app</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>authorization-control-library</artifactId>
|
<artifactId>authorization-control-library</artifactId>
|
||||||
<version>[1.0.0,2.0.0-SNAPSHOT)</version>
|
<version>[1.0.0,2.0.0-SNAPSHOT)</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>common-authorization</artifactId>
|
<artifactId>common-authorization</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.core</groupId>
|
<groupId>org.gcube.core</groupId>
|
||||||
<artifactId>common-encryption</artifactId>
|
<artifactId>common-encryption</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.core</groupId>
|
<groupId>org.gcube.core</groupId>
|
||||||
<artifactId>common-scope-maps</artifactId>
|
<artifactId>common-scope-maps</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.core</groupId>
|
<groupId>org.gcube.core</groupId>
|
||||||
<artifactId>common-scope</artifactId>
|
<artifactId>common-scope</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>storagehub-model</artifactId>
|
<artifactId>storagehub-model</artifactId>
|
||||||
<version>[1.0.0,2.0.0-SNAPSHOT)</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.data.access</groupId>
|
<groupId>org.gcube.data.access</groupId>
|
||||||
<artifactId>storagehub-script-utils</artifactId>
|
<artifactId>storagehub-script-utils</artifactId>
|
||||||
<version>[1.0.0-SNAPSHOT,2.0.0)</version>
|
<version>[1.0.0, 2.0.0-SNAPSHOT)</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.itextpdf</groupId>
|
<groupId>com.itextpdf</groupId>
|
||||||
<artifactId>itextpdf</artifactId>
|
<artifactId>itextpdf</artifactId>
|
||||||
<version>5.5.13.2</version>
|
<version>5.5.13.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- needed to manage strange image types -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||||
|
<artifactId>imageio-jpeg</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||||
|
<artifactId>imageio-bmp</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.twelvemonkeys.imageio</groupId>
|
||||||
|
<artifactId>imageio-core</artifactId>
|
||||||
|
<version>3.3.2</version>
|
||||||
|
</dependency>
|
||||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
|
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bouncycastle</groupId>
|
<groupId>org.bouncycastle</groupId>
|
||||||
<artifactId>bcprov-jdk15on</artifactId>
|
<artifactId>bcprov-jdk15on</artifactId>
|
||||||
<version>1.62</version>
|
<version>1.62</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>gxJRS</artifactId>
|
<artifactId>gxJRS</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- JCR dependencies -->
|
<!-- JCR dependencies -->
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.jcr</groupId>
|
<groupId>javax.jcr</groupId>
|
||||||
<artifactId>jcr</artifactId>
|
<artifactId>jcr</artifactId>
|
||||||
|
@ -158,74 +148,67 @@
|
||||||
<artifactId>jackrabbit-jcr-server</artifactId>
|
<artifactId>jackrabbit-jcr-server</artifactId>
|
||||||
<version>${jackrabbit.version}</version>
|
<version>${jackrabbit.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-annotations</artifactId>
|
<artifactId>jackson-annotations</artifactId>
|
||||||
<version>${jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-core</artifactId>
|
<artifactId>jackson-core</artifactId>
|
||||||
<version>${jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>${jackson.version}</version>
|
<version>${jackson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
|
<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-parsers -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.tika</groupId>
|
<groupId>org.apache.tika</groupId>
|
||||||
<artifactId>tika-parsers</artifactId>
|
<artifactId>tika-parsers</artifactId>
|
||||||
<version>1.21</version>
|
<version>1.21</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-core -->
|
<!-- https://mvnrepository.com/artifact/org.apache.tika/tika-core -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.tika</groupId>
|
<groupId>org.apache.tika</groupId>
|
||||||
<artifactId>tika-core</artifactId>
|
<artifactId>tika-core</artifactId>
|
||||||
<version>1.21</version>
|
<version>1.21</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/net.bull.javamelody/javamelody-core -->
|
<!-- https://mvnrepository.com/artifact/net.bull.javamelody/javamelody-core -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.bull.javamelody</groupId>
|
<groupId>net.bull.javamelody</groupId>
|
||||||
<artifactId>javamelody-core</artifactId>
|
<artifactId>javamelody-core</artifactId>
|
||||||
<version>1.82.0</version>
|
<version>1.82.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.2</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<!-- jersey & weld -->
|
<!-- jersey & weld -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<version>3.0.1</version>
|
<version>3.0.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api -->
|
<!-- https://mvnrepository.com/artifact/javax.interceptor/javax.interceptor-api -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.interceptor</groupId>
|
<groupId>javax.interceptor</groupId>
|
||||||
<artifactId>javax.interceptor-api</artifactId>
|
<artifactId>javax.interceptor-api</artifactId>
|
||||||
<version>1.2.2</version>
|
<version>1.2.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/javax.enterprise/cdi-api -->
|
<!-- https://mvnrepository.com/artifact/javax.enterprise/cdi-api -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.enterprise</groupId>
|
<groupId>javax.enterprise</groupId>
|
||||||
<artifactId>cdi-api</artifactId>
|
<artifactId>cdi-api</artifactId>
|
||||||
<version>2.0</version>
|
<version>2.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.ws.rs</groupId>
|
<groupId>javax.ws.rs</groupId>
|
||||||
<artifactId>javax.ws.rs-api</artifactId>
|
<artifactId>javax.ws.rs-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.containers</groupId>
|
<groupId>org.glassfish.jersey.containers</groupId>
|
||||||
<artifactId>jersey-container-servlet</artifactId>
|
<artifactId>jersey-container-servlet</artifactId>
|
||||||
|
@ -234,14 +217,12 @@
|
||||||
<groupId>org.glassfish.jersey.containers</groupId>
|
<groupId>org.glassfish.jersey.containers</groupId>
|
||||||
<artifactId>jersey-container-servlet-core</artifactId>
|
<artifactId>jersey-container-servlet-core</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.inject/jersey-hk2 -->
|
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.inject/jersey-hk2 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.inject</groupId>
|
<groupId>org.glassfish.jersey.inject</groupId>
|
||||||
<artifactId>jersey-hk2</artifactId>
|
<artifactId>jersey-hk2</artifactId>
|
||||||
<version>2.30.1</version>
|
<version>2.30.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.core</groupId>
|
<groupId>org.glassfish.jersey.core</groupId>
|
||||||
<artifactId>jersey-server</artifactId>
|
<artifactId>jersey-server</artifactId>
|
||||||
|
@ -259,87 +240,67 @@
|
||||||
<artifactId>weld-servlet-core</artifactId>
|
<artifactId>weld-servlet-core</artifactId>
|
||||||
<version>3.1.0.Final</version>
|
<version>3.1.0.Final</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
|
<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss</groupId>
|
<groupId>org.jboss</groupId>
|
||||||
<artifactId>jandex</artifactId>
|
<artifactId>jandex</artifactId>
|
||||||
<version>2.2.2.Final</version>
|
<version>2.2.2.Final</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>javax.servlet</groupId>
|
|
||||||
<artifactId>javax.servlet-api</artifactId>
|
|
||||||
<version>3.0.1</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
|
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.core</groupId>
|
<groupId>org.glassfish.jersey.core</groupId>
|
||||||
<artifactId>jersey-common</artifactId>
|
<artifactId>jersey-common</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.media</groupId>
|
<groupId>org.glassfish.jersey.media</groupId>
|
||||||
<artifactId>jersey-media-json-jackson</artifactId>
|
<artifactId>jersey-media-json-jackson</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.media</groupId>
|
<groupId>org.glassfish.jersey.media</groupId>
|
||||||
<artifactId>jersey-media-multipart</artifactId>
|
<artifactId>jersey-media-multipart</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>postgresql</groupId>
|
<groupId>postgresql</groupId>
|
||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
<version>9.1-901.jdbc4</version>
|
<version>9.1-901.jdbc4</version>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Storage dependencies -->
|
<!-- Storage dependencies -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.contentmanagement</groupId>
|
<groupId>org.gcube.contentmanagement</groupId>
|
||||||
<artifactId>storage-manager-core</artifactId>
|
<artifactId>storage-manager-core</artifactId>
|
||||||
<version>[2.0.0,3.0.0-SNAPSHOT)</version>
|
<version>[3.0.0-SNAPSHOT,4.0.0-SNAPSHOT)</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.contentmanagement</groupId>
|
<groupId>org.gcube.contentmanagement</groupId>
|
||||||
<artifactId>storage-manager-wrapper</artifactId>
|
<artifactId>storage-manager-wrapper</artifactId>
|
||||||
<version>[2.0.0,3.0.0-SNAPSHOT)</version>
|
<version>[3.0.0-SNAPSHOT,4.0.0-SNAPSHOT)</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.reflections</groupId>
|
<groupId>org.reflections</groupId>
|
||||||
<artifactId>reflections</artifactId>
|
<artifactId>reflections</artifactId>
|
||||||
<version>0.9.10</version>
|
<version>0.9.10</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>16.0</version>
|
<version>16.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-compress</artifactId>
|
<artifactId>commons-compress</artifactId>
|
||||||
<version>1.17</version>
|
<version>1.17</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.tukaani</groupId>
|
<groupId>org.tukaani</groupId>
|
||||||
<artifactId>xz</artifactId>
|
<artifactId>xz</artifactId>
|
||||||
<version>1.5</version>
|
<version>1.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
|
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
|
||||||
<artifactId>jersey-test-framework-provider-simple</artifactId>
|
<artifactId>jersey-test-framework-provider-simple</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.derby</groupId>
|
<groupId>org.apache.derby</groupId>
|
||||||
<artifactId>derby</artifactId>
|
<artifactId>derby</artifactId>
|
||||||
|
@ -352,7 +313,6 @@
|
||||||
<version>10.8.2.2</version>
|
<version>10.8.2.2</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.googlecode.jeeunit</groupId>
|
<groupId>com.googlecode.jeeunit</groupId>
|
||||||
<artifactId>jeeunit</artifactId>
|
<artifactId>jeeunit</artifactId>
|
||||||
|
@ -365,20 +325,29 @@
|
||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>2.7</version>
|
<version>2.7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.vlkan.rfos</groupId>
|
<groupId>com.vlkan.rfos</groupId>
|
||||||
<artifactId>rotating-fos</artifactId>
|
<artifactId>rotating-fos</artifactId>
|
||||||
<version>0.9.2</version>
|
<version>0.9.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- enunciate deps -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.webcohesion.enunciate</groupId>
|
||||||
|
<artifactId>enunciate-core-annotations</artifactId>
|
||||||
|
<version>${enunciate.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.webcohesion.enunciate</groupId>
|
||||||
|
<artifactId>enunciate-rt-util</artifactId>
|
||||||
|
<version>${enunciate.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
|
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mockito</groupId>
|
<groupId>org.mockito</groupId>
|
||||||
|
@ -386,14 +355,11 @@
|
||||||
<version>1.9.5</version>
|
<version>1.9.5</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>jul-to-slf4j</artifactId>
|
<artifactId>jul-to-slf4j</artifactId>
|
||||||
<version>${slf4j.version}</version>
|
<version>${slf4j.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jboss.weld.se</groupId>
|
<groupId>org.jboss.weld.se</groupId>
|
||||||
<artifactId>weld-se</artifactId>
|
<artifactId>weld-se</artifactId>
|
||||||
|
@ -406,19 +372,16 @@
|
||||||
<version>4.11</version>
|
<version>4.11</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.test-framework</groupId>
|
<groupId>org.glassfish.jersey.test-framework</groupId>
|
||||||
<artifactId>jersey-test-framework-core</artifactId>
|
<artifactId>jersey-test-framework-core</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
|
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
|
||||||
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
|
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<finalName>${project.artifactId}</finalName>
|
<finalName>${project.artifactId}</finalName>
|
||||||
|
@ -452,7 +415,7 @@
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>aspectj-maven-plugin</artifactId>
|
<artifactId>aspectj-maven-plugin</artifactId>
|
||||||
<version>1.7</version>
|
<version>1.14.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<complianceLevel>1.8</complianceLevel>
|
<complianceLevel>1.8</complianceLevel>
|
||||||
<source>1.8</source>
|
<source>1.8</source>
|
||||||
|
@ -509,7 +472,46 @@
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<!-- Enunciate Maven plugin -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.webcohesion.enunciate</groupId>
|
||||||
|
<artifactId>enunciate-maven-plugin</artifactId>
|
||||||
|
<version>${enunciate.version}</version>
|
||||||
|
<configuration></configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>assemble</id>
|
||||||
|
<goals>
|
||||||
|
<goal>assemble</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- Copy Enunciate Documentation from your-application/docs to your-application.war -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-enunciate-docs</id>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-resources</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>target</outputDirectory>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<targetPath>${project.build.directory}/${project.artifactId}/api-docs</targetPath>
|
||||||
|
<directory>${project.build.directory}/api-docs</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -8,6 +8,7 @@ import javax.ws.rs.core.Application;
|
||||||
|
|
||||||
import org.gcube.common.gxrest.response.entity.SerializableErrorEntityTextWriter;
|
import org.gcube.common.gxrest.response.entity.SerializableErrorEntityTextWriter;
|
||||||
import org.gcube.data.access.storagehub.services.ACLManager;
|
import org.gcube.data.access.storagehub.services.ACLManager;
|
||||||
|
import org.gcube.data.access.storagehub.services.DocManager;
|
||||||
import org.gcube.data.access.storagehub.services.GroupManager;
|
import org.gcube.data.access.storagehub.services.GroupManager;
|
||||||
import org.gcube.data.access.storagehub.services.Impersonable;
|
import org.gcube.data.access.storagehub.services.Impersonable;
|
||||||
import org.gcube.data.access.storagehub.services.ItemSharing;
|
import org.gcube.data.access.storagehub.services.ItemSharing;
|
||||||
|
@ -39,6 +40,7 @@ public class StorageHub extends Application {
|
||||||
classes.add(MultiPartFeature.class);
|
classes.add(MultiPartFeature.class);
|
||||||
classes.add(SerializableErrorEntityTextWriter.class);
|
classes.add(SerializableErrorEntityTextWriter.class);
|
||||||
classes.add(MyApplicationListener.class);
|
classes.add(MyApplicationListener.class);
|
||||||
|
classes.add(DocManager.class);
|
||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,16 +101,16 @@ public class Utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static <T extends Item> List<T> serachByNameOnFolder(Session ses, String user, AuthorizationChecker authChecker, Node parent, List<String> excludes, Range range, boolean showHidden, boolean excludeTrashed, Class<? extends RootItem> nodeTypeToInclude, String nameParam) throws RepositoryException, BackendGenericError{
|
public static <T extends Item> List<T> searchByNameOnFolder(Session ses, String user, AuthorizationChecker authChecker, Node parent, List<String> excludes, Range range, boolean showHidden, boolean excludeTrashed, Class<? extends RootItem> nodeTypeToInclude, String nameParam) throws RepositoryException, BackendGenericError{
|
||||||
String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceItem)[jcr:like(fn:lower-case(@jcr:title), '%s')]",ISO9075.encodePath(parent.getPath()), nameParam.toLowerCase());
|
String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceItem)[jcr:like(fn:lower-case(@jcr:title), '%s')]",ISO9075.encodePath(parent.getPath()), nameParam.toLowerCase());
|
||||||
|
|
||||||
//String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
//String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
||||||
logger.debug("query for search is {}",xpath);
|
logger.trace("query for search is {}",xpath);
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
|
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
|
||||||
NodeChildrenFilterIterator iterator = new NodeChildrenFilterIterator(jcrQuery.execute().getNodes());
|
NodeChildrenFilterIterator iterator = new NodeChildrenFilterIterator(jcrQuery.execute().getNodes());
|
||||||
logger.debug("[SEARCH] real search took {} millis",(System.currentTimeMillis()-start));
|
logger.trace("[SEARCH] real search took {} millis",(System.currentTimeMillis()-start));
|
||||||
Predicate<Node> checker = new Predicate<Node>() {
|
Predicate<Node> checker = new Predicate<Node>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -152,7 +152,7 @@ public class Utils {
|
||||||
while (iterator.hasNext()){
|
while (iterator.hasNext()){
|
||||||
Node current = iterator.next();
|
Node current = iterator.next();
|
||||||
|
|
||||||
logger.debug("[SEARCH] evaluating node {} ",current.hasProperty(NodeProperty.TITLE.toString())? current.getProperty(NodeProperty.TITLE.toString()):current.getName());
|
logger.trace("[SEARCH] evaluating node {} ",current.hasProperty(NodeProperty.TITLE.toString())? current.getProperty(NodeProperty.TITLE.toString()):current.getName());
|
||||||
|
|
||||||
//REMOVE duplicate nodes, in case the indexes are not working
|
//REMOVE duplicate nodes, in case the indexes are not working
|
||||||
if (duplicateId.contains(current.getIdentifier())) {
|
if (duplicateId.contains(current.getIdentifier())) {
|
||||||
|
@ -168,7 +168,7 @@ public class Utils {
|
||||||
if (isToExclude(current, showHidden))
|
if (isToExclude(current, showHidden))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
logger.debug("[SEARCH] current node not excluded {} ",current.hasProperty(NodeProperty.TITLE.toString())? current.getProperty(NodeProperty.TITLE.toString()):current.getName());
|
logger.trace("[SEARCH] current node not excluded {} ",current.hasProperty(NodeProperty.TITLE.toString())? current.getProperty(NodeProperty.TITLE.toString()):current.getName());
|
||||||
|
|
||||||
if (range==null || (count>=range.getStart() && returnList.size()<range.getLimit())) {
|
if (range==null || (count>=range.getStart() && returnList.size()<range.getLimit())) {
|
||||||
T item = node2Item.getFilteredItem(current, excludes, nodeTypeToInclude);
|
T item = node2Item.getFilteredItem(current, excludes, nodeTypeToInclude);
|
||||||
|
|
|
@ -2,6 +2,7 @@ package org.gcube.data.access.storagehub.handlers;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
import javax.jcr.ItemNotFoundException;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.NodeIterator;
|
import javax.jcr.NodeIterator;
|
||||||
import javax.jcr.PathNotFoundException;
|
import javax.jcr.PathNotFoundException;
|
||||||
|
@ -11,7 +12,6 @@ import org.apache.jackrabbit.api.JackrabbitSession;
|
||||||
import org.apache.jackrabbit.api.security.user.Group;
|
import org.apache.jackrabbit.api.security.user.Group;
|
||||||
import org.apache.jackrabbit.api.security.user.User;
|
import org.apache.jackrabbit.api.security.user.User;
|
||||||
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
|
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
|
||||||
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
|
|
||||||
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
||||||
import org.gcube.common.storagehub.model.types.NodeProperty;
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.gcube.data.access.storagehub.Constants;
|
import org.gcube.data.access.storagehub.Constants;
|
||||||
|
@ -24,10 +24,10 @@ import org.slf4j.LoggerFactory;
|
||||||
public class GroupHandler {
|
public class GroupHandler {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(GroupManager.class);
|
private static final Logger log = LoggerFactory.getLogger(GroupManager.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
PathUtil pathUtil;
|
PathUtil pathUtil;
|
||||||
|
|
||||||
public boolean removeUserFromGroup(String groupId, String userId, JackrabbitSession session) throws StorageHubException, RepositoryException {
|
public boolean removeUserFromGroup(String groupId, String userId, JackrabbitSession session) throws StorageHubException, RepositoryException {
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public class GroupHandler {
|
||||||
|
|
||||||
//delete folder on user
|
//delete folder on user
|
||||||
String folderName = group.getPrincipal().getName();
|
String folderName = group.getPrincipal().getName();
|
||||||
Node folder = getVreFolderNode(session, folderName);
|
Node folder = getFolderNodeRelatedToGroup(session, folderName);
|
||||||
|
|
||||||
NodeIterator ni = folder.getSharedSet();
|
NodeIterator ni = folder.getSharedSet();
|
||||||
while (ni.hasNext()) {
|
while (ni.hasNext()) {
|
||||||
|
@ -53,8 +53,8 @@ public class GroupHandler {
|
||||||
return group.removeMember(user);
|
return group.removeMember(user);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Node getVreFolderNode(JackrabbitSession session, String name) throws InvalidItemException, RepositoryException {
|
public Node getFolderNodeRelatedToGroup(JackrabbitSession session, String name) throws ItemNotFoundException, RepositoryException {
|
||||||
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
||||||
|
|
||||||
Node vreFolder = null;
|
Node vreFolder = null;
|
||||||
|
@ -64,16 +64,18 @@ public class GroupHandler {
|
||||||
log.debug("is an old HL VRE");
|
log.debug("is an old HL VRE");
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeIterator nodes = sharedRootNode.getNodes();
|
if (vreFolder==null) {
|
||||||
while (nodes.hasNext()) {
|
NodeIterator nodes = sharedRootNode.getNodes();
|
||||||
Node node = nodes.nextNode();
|
while (nodes.hasNext()) {
|
||||||
if (node.hasProperty(NodeProperty.TITLE.toString()) && node.getProperty(NodeProperty.TITLE.toString()).getString().equals(name)) {
|
Node node = nodes.nextNode();
|
||||||
vreFolder= node;
|
if (node.hasProperty(NodeProperty.TITLE.toString()) && node.getProperty(NodeProperty.TITLE.toString()).getString().equals(name)) {
|
||||||
break;
|
vreFolder= node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vreFolder==null) throw new InvalidItemException("vre folder not found");
|
if (vreFolder==null) throw new ItemNotFoundException("vre folder not found for group "+name);
|
||||||
return vreFolder;
|
return vreFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,12 +11,14 @@ import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.RepositoryException;
|
import javax.jcr.RepositoryException;
|
||||||
import javax.jcr.Session;
|
import javax.jcr.Session;
|
||||||
import javax.jcr.lock.LockException;
|
import javax.jcr.lock.LockException;
|
||||||
|
|
||||||
import org.apache.commons.compress.archivers.ArchiveEntry;
|
import org.apache.commons.compress.archivers.ArchiveEntry;
|
||||||
import org.apache.commons.compress.archivers.ArchiveInputStream;
|
import org.apache.commons.compress.archivers.ArchiveInputStream;
|
||||||
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
|
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
|
||||||
|
@ -40,7 +42,6 @@ import org.gcube.common.storagehub.model.plugins.FolderManager;
|
||||||
import org.gcube.common.storagehub.model.storages.MetaInfo;
|
import org.gcube.common.storagehub.model.storages.MetaInfo;
|
||||||
import org.gcube.common.storagehub.model.storages.StorageBackend;
|
import org.gcube.common.storagehub.model.storages.StorageBackend;
|
||||||
import org.gcube.common.storagehub.model.types.ItemAction;
|
import org.gcube.common.storagehub.model.types.ItemAction;
|
||||||
import org.gcube.common.storagehub.model.types.NodeProperty;
|
|
||||||
import org.gcube.data.access.storagehub.AuthorizationChecker;
|
import org.gcube.data.access.storagehub.AuthorizationChecker;
|
||||||
import org.gcube.data.access.storagehub.MultipleOutputStream;
|
import org.gcube.data.access.storagehub.MultipleOutputStream;
|
||||||
import org.gcube.data.access.storagehub.Utils;
|
import org.gcube.data.access.storagehub.Utils;
|
||||||
|
@ -267,7 +268,7 @@ public class ItemHandler {
|
||||||
authChecker.checkWriteAuthorizationControl(ses, login, newNode.getIdentifier(), false);
|
authChecker.checkWriteAuthorizationControl(ses, login, newNode.getIdentifier(), false);
|
||||||
|
|
||||||
AbstractFileItem item = fillItemWithContent(stream, storageBackend, name, description, relativePath,login);
|
AbstractFileItem item = fillItemWithContent(stream, storageBackend, name, description, relativePath,login);
|
||||||
item.setHidden(destinationNode.getProperty(NodeProperty.HIDDEN.toString()).getBoolean());
|
|
||||||
if (withLock) {
|
if (withLock) {
|
||||||
try {
|
try {
|
||||||
ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login);
|
ses.getWorkspace().getLockManager().lock(newNode.getPath(), true, true, 0,login);
|
||||||
|
|
|
@ -85,6 +85,9 @@ public class Node2ItemConverter {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Message getMessageItem(Node node) throws RepositoryException{
|
public Message getMessageItem(Node node) throws RepositoryException{
|
||||||
|
if (!(node.getPrimaryNodeType().getName().equals("nthl:itemSentRequest")
|
||||||
|
|| node.getPrimaryNodeType().getName().equals("nthl:itemSentRequestSH")))
|
||||||
|
return null;
|
||||||
Message msg = new Message();
|
Message msg = new Message();
|
||||||
try {
|
try {
|
||||||
Node attachmentNode = node.getNode(Constants.ATTACHMENTNODE_NAME);
|
Node attachmentNode = node.getNode(Constants.ATTACHMENTNODE_NAME);
|
||||||
|
|
|
@ -9,6 +9,7 @@ import javax.jcr.SimpleCredentials;
|
||||||
|
|
||||||
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -21,11 +22,11 @@ public class VRE {
|
||||||
private VREQueryRetriever vreQueryRetriever;
|
private VREQueryRetriever vreQueryRetriever;
|
||||||
private ExecutorService executor;
|
private ExecutorService executor;
|
||||||
|
|
||||||
protected VRE(Item item, Repository repository, SimpleCredentials credentials, ExecutorService executor) {
|
protected VRE(Item item, Repository repository, SimpleCredentials credentials, Node2ItemConverter node2Item, ExecutorService executor) {
|
||||||
super();
|
super();
|
||||||
this.vreFolder = item;
|
this.vreFolder = item;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
vreQueryRetriever = new VREQueryRetriever(repository, credentials, vreFolder);
|
vreQueryRetriever = new VREQueryRetriever(repository, credentials, node2Item, vreFolder);
|
||||||
result = executor.submit(vreQueryRetriever);
|
result = executor.submit(vreQueryRetriever);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,8 @@ import java.util.concurrent.Executors;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.NodeIterator;
|
|
||||||
import javax.jcr.RepositoryException;
|
import javax.jcr.RepositoryException;
|
||||||
import javax.jcr.Session;
|
|
||||||
import javax.jcr.SimpleCredentials;
|
import javax.jcr.SimpleCredentials;
|
||||||
import javax.jcr.query.Query;
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
import org.apache.jackrabbit.api.JackrabbitSession;
|
import org.apache.jackrabbit.api.JackrabbitSession;
|
||||||
|
@ -29,6 +26,7 @@ import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.data.access.storagehub.Constants;
|
import org.gcube.data.access.storagehub.Constants;
|
||||||
import org.gcube.data.access.storagehub.PathUtil;
|
import org.gcube.data.access.storagehub.PathUtil;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.GroupHandler;
|
||||||
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
||||||
import org.gcube.data.access.storagehub.services.RepositoryInitializer;
|
import org.gcube.data.access.storagehub.services.RepositoryInitializer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -50,6 +48,9 @@ public class VREManager {
|
||||||
@Inject
|
@Inject
|
||||||
PathUtil pathUtil;
|
PathUtil pathUtil;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
GroupHandler groupHandler;
|
||||||
|
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(5);
|
ExecutorService executor = Executors.newFixedThreadPool(5);
|
||||||
|
|
||||||
SimpleCredentials credentials;
|
SimpleCredentials credentials;
|
||||||
|
@ -73,7 +74,7 @@ public class VREManager {
|
||||||
logger.trace("inserting VRE {}",vreFolder.getTitle());
|
logger.trace("inserting VRE {}",vreFolder.getTitle());
|
||||||
if (vreMap.containsKey(vreFolder.getTitle())) throw new RuntimeException("something went wrong (vre already present in the map)");
|
if (vreMap.containsKey(vreFolder.getTitle())) throw new RuntimeException("something went wrong (vre already present in the map)");
|
||||||
else {
|
else {
|
||||||
VRE toReturn = new VRE(vreFolder, repository.getRepository(), credentials, executor);
|
VRE toReturn = new VRE(vreFolder, repository.getRepository(), credentials, node2Item, executor);
|
||||||
vreMap.put(vreFolder.getTitle(), toReturn);
|
vreMap.put(vreFolder.getTitle(), toReturn);
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
@ -97,18 +98,13 @@ public class VREManager {
|
||||||
throw new InvalidCallParameters("error getting VRE with user "+userId+" for group "+groupName);
|
throw new InvalidCallParameters("error getting VRE with user "+userId+" for group "+groupName);
|
||||||
|
|
||||||
|
|
||||||
org.gcube.common.storagehub.model.Path vrePath = pathUtil.getVREsPath(userId, ses);
|
|
||||||
VRE vre = this.getVRE(groupName);
|
VRE vre = this.getVRE(groupName);
|
||||||
if (vre!=null) return vre;
|
if (vre!=null) return vre;
|
||||||
else {
|
else {
|
||||||
String query = String.format("SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s')",groupName, vrePath.toPath());
|
|
||||||
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE);
|
Node vreFolderNode = groupHandler.getFolderNodeRelatedToGroup(ses, groupName);
|
||||||
NodeIterator it = jcrQuery.execute().getNodes();
|
|
||||||
|
|
||||||
if (!it.hasNext()) throw new BackendGenericError("vre folder not found for context "+groupName);
|
Item vreFolder = node2Item.getItem(vreFolderNode, excludes);
|
||||||
|
|
||||||
Node folder = it.nextNode();
|
|
||||||
Item vreFolder = node2Item.getItem(folder, excludes);
|
|
||||||
return this.putVRE(vreFolder);
|
return this.putVRE(vreFolder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +1,30 @@
|
||||||
package org.gcube.data.access.storagehub.handlers.vres;
|
package org.gcube.data.access.storagehub.handlers.vres;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Iterator;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.jcr.Credentials;
|
import javax.jcr.Credentials;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
|
import javax.jcr.NodeIterator;
|
||||||
import javax.jcr.Property;
|
import javax.jcr.Property;
|
||||||
import javax.jcr.Repository;
|
import javax.jcr.Repository;
|
||||||
import javax.jcr.RepositoryException;
|
import javax.jcr.RepositoryException;
|
||||||
import javax.jcr.Session;
|
import javax.jcr.Session;
|
||||||
import javax.jcr.observation.Event;
|
import javax.jcr.observation.Event;
|
||||||
import javax.jcr.observation.EventJournal;
|
import javax.jcr.observation.EventJournal;
|
||||||
import javax.jcr.query.Query;
|
|
||||||
|
|
||||||
import org.apache.jackrabbit.util.ISO9075;
|
|
||||||
import org.gcube.common.storagehub.model.Excludes;
|
import org.gcube.common.storagehub.model.Excludes;
|
||||||
import org.gcube.common.storagehub.model.NodeConstants;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
|
import org.gcube.common.storagehub.model.items.AbstractFileItem;
|
||||||
|
import org.gcube.common.storagehub.model.items.FolderItem;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.data.access.storagehub.NodeChildrenFilterIterator;
|
|
||||||
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -37,92 +38,156 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
private Repository repository;
|
private Repository repository;
|
||||||
private Credentials credentials;
|
private Credentials credentials;
|
||||||
private Item vreFolder;
|
private Item vreFolder;
|
||||||
List<Item> cachedList = new ArrayList<>(CACHE_DIMENSION);
|
Map<String, Long> cachedMap = new HashMap<>(CACHE_DIMENSION);
|
||||||
|
|
||||||
long lastTimestamp =0;
|
long lastTimestamp =0;
|
||||||
|
|
||||||
private Node2ItemConverter node2Item = new Node2ItemConverter();
|
long doTime= 0;
|
||||||
|
boolean underRedo = false;
|
||||||
|
Node2ItemConverter node2Item;
|
||||||
|
|
||||||
|
private static int TIME_MEASURE = Calendar.MINUTE;
|
||||||
|
private static int VALUE_TIME_BEFORE = 30;
|
||||||
|
|
||||||
|
|
||||||
public VREQueryRetriever(Repository repository, Credentials credentials, Item vreFolder) {
|
public VREQueryRetriever(Repository repository, Credentials credentials, Node2ItemConverter node2Item, Item vreFolder) {
|
||||||
super();
|
super();
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
this.credentials = credentials;
|
this.credentials = credentials;
|
||||||
this.vreFolder = vreFolder;
|
this.vreFolder = vreFolder;
|
||||||
|
this.node2Item = node2Item;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Item> call() {
|
public List<Item> call() {
|
||||||
logger.trace("executing recents task");
|
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
if (lastTimestamp==0) {
|
try {
|
||||||
try {
|
ses = repository.login(credentials);
|
||||||
long start = System.currentTimeMillis();
|
Calendar now = Calendar.getInstance();
|
||||||
ses = repository.login(credentials);
|
now.add(TIME_MEASURE, -1*Math.abs(VALUE_TIME_BEFORE));
|
||||||
|
|
||||||
Calendar now = Calendar.getInstance();
|
if (doTime> now.getTimeInMillis() || underRedo) {
|
||||||
now.add(Calendar.YEAR, -1);
|
logger.debug("executing recents task for {} (cahced result)",vreFolder.getTitle());
|
||||||
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
|
return correctValues(ses, cachedMap);
|
||||||
String formattedDate = formatter.format(now.getTime());
|
}else {
|
||||||
|
logger.debug("executing recents task for {} (redoing it)",vreFolder.getTitle());
|
||||||
|
List<Item> toReturn = redo(ses);
|
||||||
String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceLeafItem)[@jcr:lastModified>xs:dateTime('%s')] order by @jcr:lastModified descending",ISO9075.encodePath(vreFolder.getPath()),formattedDate);
|
doTime = System.currentTimeMillis();
|
||||||
|
return toReturn;
|
||||||
//String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
|
||||||
logger.debug("query for recents is {}",xpath);
|
|
||||||
|
|
||||||
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
|
|
||||||
|
|
||||||
jcrQuery.setLimit(CACHE_DIMENSION);
|
|
||||||
lastTimestamp = System.currentTimeMillis();
|
|
||||||
NodeChildrenFilterIterator it = new NodeChildrenFilterIterator(jcrQuery.execute().getNodes());
|
|
||||||
logger.debug("query for recents took {}",System.currentTimeMillis()-start);
|
|
||||||
while (it.hasNext()) {
|
|
||||||
Node node = it.next();
|
|
||||||
|
|
||||||
Item item = node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING);
|
|
||||||
logger.debug("RECENTS - adding item {} with timestamp {}",item.getTitle(), item.getLastModificationTime().getTimeInMillis());
|
|
||||||
cachedList.add(item);
|
|
||||||
|
|
||||||
}
|
|
||||||
logger.debug("creating objects took {}",System.currentTimeMillis()-start);
|
|
||||||
if (cachedList.size()<=10) return cachedList;
|
|
||||||
else return cachedList.subList(0, 10);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("error querying vre {}",vreFolder.getTitle(),e);
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}finally{
|
|
||||||
if (ses!=null)
|
|
||||||
ses.logout();
|
|
||||||
logger.trace("recents task finished");
|
|
||||||
}
|
}
|
||||||
} else {
|
}catch (Exception e) {
|
||||||
|
logger.error("error preparing recents for folder {}", vreFolder.getTitle(),e);
|
||||||
|
return Collections.emptyList();
|
||||||
|
}finally{
|
||||||
|
if (ses!=null)
|
||||||
|
ses.logout();
|
||||||
|
logger.debug("recents task finished");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized List<Item> redo(Session ses) {
|
||||||
|
underRedo = true;
|
||||||
|
try {
|
||||||
|
Map<String, Long> tempCachedMap = new HashMap<>(cachedMap);
|
||||||
|
if (cachedMap.isEmpty())
|
||||||
|
init(ses, tempCachedMap);
|
||||||
|
else {
|
||||||
|
logger.debug("redoing recents for {}",vreFolder.getTitle());
|
||||||
|
update(ses, tempCachedMap);
|
||||||
|
}
|
||||||
|
cachedMap = tempCachedMap;
|
||||||
|
return correctValues(ses, tempCachedMap);
|
||||||
|
}finally{
|
||||||
|
underRedo = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private List<Item> correctValues(Session ses, Map<String, Long> tempCachedMap){
|
||||||
|
logger.debug("preparing returning values for {}",vreFolder.getTitle());
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
List<Map.Entry<String, Long>> list = new LinkedList<>(tempCachedMap.entrySet());
|
||||||
|
list.sort((c1, c2) -> c1.getValue().compareTo(c2.getValue())*-1);
|
||||||
|
if (list.size()>CACHE_DIMENSION)
|
||||||
|
for (int index = CACHE_DIMENSION-1; index< list.size() ; index++)
|
||||||
|
tempCachedMap.remove(list.get(index).getKey());
|
||||||
|
|
||||||
|
List<String> cachedIds = list.stream().map(m -> m.getKey()).collect(Collectors.toList());
|
||||||
|
if (cachedIds.size()>10)
|
||||||
|
cachedIds = cachedIds.subList(0, 10);
|
||||||
|
|
||||||
|
List<Item> result = new ArrayList<>(10);
|
||||||
|
|
||||||
|
for (String id: cachedIds) {
|
||||||
try {
|
try {
|
||||||
|
Item item = node2Item.getItem(id, ses, Excludes.EXCLUDE_ACCOUNTING);
|
||||||
|
if (item!=null)
|
||||||
|
result.add(item);
|
||||||
|
else logger.warn("item with id {} is null",id);
|
||||||
|
} catch (BackendGenericError | RepositoryException e) { }
|
||||||
|
}
|
||||||
|
|
||||||
long timestampToUse = lastTimestamp;
|
logger.debug("returning values prepared in {} for {}",System.currentTimeMillis()-start,vreFolder.getTitle());
|
||||||
lastTimestamp = System.currentTimeMillis();
|
|
||||||
|
|
||||||
long start = System.currentTimeMillis();
|
return result;
|
||||||
ses = repository.login(credentials);
|
}
|
||||||
final String[] types = { "nthl:workspaceLeafItem", "nthl:workspaceItem"};
|
|
||||||
|
|
||||||
EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
|
private void insertItemInTheRightPlace(Item item, Map<String, Long> tempCachedMap) {
|
||||||
journalChanged.skipTo(timestampToUse);
|
long lastModifiedTime = item.getLastModificationTime().getTimeInMillis();
|
||||||
|
|
||||||
logger.trace("getting the journal took {}",System.currentTimeMillis()-start);
|
if (tempCachedMap.size()<CACHE_DIMENSION || lastModifiedTime>Collections.min(tempCachedMap.values()))
|
||||||
|
tempCachedMap.put(item.getId(), lastModifiedTime);
|
||||||
|
|
||||||
|
|
||||||
int events = 0;
|
}
|
||||||
|
|
||||||
while (journalChanged.hasNext()) {
|
private void init(Session ses,Map<String, Long> tempCachedMap){
|
||||||
events++;
|
try {
|
||||||
Event event = journalChanged.nextEvent();
|
long start = System.currentTimeMillis();
|
||||||
|
lastTimestamp = System.currentTimeMillis();
|
||||||
|
Node vreFolderNode = ses.getNodeByIdentifier(vreFolder.getId());
|
||||||
|
logger.debug("starting visiting children for {}",vreFolder.getTitle());
|
||||||
|
visitChildren(vreFolderNode, tempCachedMap);
|
||||||
|
logger.debug("initializing recents for {} took {}",vreFolder.getTitle(),System.currentTimeMillis()-start);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("error querying vre {}",vreFolder.getTitle(),e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void update(Session ses, Map<String, Long> tempCachedMap) {
|
||||||
|
try {
|
||||||
|
long timestampToUse = lastTimestamp;
|
||||||
|
lastTimestamp = System.currentTimeMillis();
|
||||||
|
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
final String[] types = { "nthl:workspaceLeafItem", "nthl:workspaceItem"};
|
||||||
|
|
||||||
|
EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
|
||||||
|
journalChanged.skipTo(timestampToUse);
|
||||||
|
|
||||||
|
logger.debug("getting the journal took {}",System.currentTimeMillis()-start);
|
||||||
|
|
||||||
|
int events = 0;
|
||||||
|
|
||||||
|
//TODO: manage hidden nodes
|
||||||
|
while (journalChanged.hasNext()) {
|
||||||
|
events++;
|
||||||
|
Event event = journalChanged.nextEvent();
|
||||||
|
try {
|
||||||
switch(event.getType()) {
|
switch(event.getType()) {
|
||||||
|
|
||||||
case Event.NODE_ADDED:
|
case Event.NODE_ADDED:
|
||||||
if (ses.nodeExists(event.getPath())) {
|
if (ses.nodeExists(event.getPath())) {
|
||||||
Node nodeAdded = ses.getNode(event.getPath());
|
Node nodeAdded = ses.getNode(event.getPath());
|
||||||
if (nodeAdded.isNodeType("nthl:workspaceLeafItem")) {
|
if (nodeAdded.isNodeType("nthl:workspaceLeafItem")) {
|
||||||
logger.trace("node added event received with name {}", nodeAdded.getName());
|
logger.debug("node added event received with name {}", nodeAdded.getName());
|
||||||
Item item = node2Item.getItem(nodeAdded, Arrays.asList(NodeConstants.ACCOUNTING_NAME));
|
Item item = node2Item.getItem(nodeAdded, Excludes.ALL);
|
||||||
insertItemInTheRightPlace(item);
|
if (tempCachedMap.get(event.getIdentifier())!=null)
|
||||||
|
tempCachedMap.remove(event.getIdentifier());
|
||||||
|
if (item.isHidden())
|
||||||
|
break;
|
||||||
|
insertItemInTheRightPlace(item,tempCachedMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -131,66 +196,66 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
if (ses.propertyExists(event.getPath())) {
|
if (ses.propertyExists(event.getPath())) {
|
||||||
Property property = ses.getProperty(event.getPath());
|
Property property = ses.getProperty(event.getPath());
|
||||||
if (property.getName().equalsIgnoreCase("jcr:lastModified")) {
|
if (property.getName().equalsIgnoreCase("jcr:lastModified")) {
|
||||||
logger.trace("event property changed on {} with value {} and parent {}",property.getName(), property.getValue().getString(), property.getParent().getPath());
|
logger.debug("event property changed on {} with value {} and parent {}",property.getName(), property.getValue().getString(), property.getParent().getPath());
|
||||||
String identifier = property.getParent().getIdentifier();
|
String identifier = property.getParent().getIdentifier();
|
||||||
cachedList.removeIf(i -> i.getId().equals(identifier));
|
tempCachedMap.remove(identifier);
|
||||||
Item item = node2Item.getItem(property.getParent(), Excludes.EXCLUDE_ACCOUNTING);
|
Item item = node2Item.getItem(property.getParent(), Excludes.ALL);
|
||||||
insertItemInTheRightPlace(item);
|
if (item.isHidden())
|
||||||
|
break;
|
||||||
|
insertItemInTheRightPlace(item, tempCachedMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Event.NODE_REMOVED:
|
case Event.NODE_REMOVED:
|
||||||
logger.trace("node removed event received with type {}", event.getIdentifier());
|
logger.trace("node removed event received with type {}", event.getIdentifier());
|
||||||
cachedList.removeIf(i -> {
|
|
||||||
try {
|
|
||||||
return i.getId().equals(event.getIdentifier()) && i.getLastModificationTime().getTime().getTime()<event.getDate();
|
|
||||||
} catch (RepositoryException e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
if (tempCachedMap.get(event.getIdentifier())!=null &&
|
||||||
|
tempCachedMap.get(event.getIdentifier())<event.getDate())
|
||||||
|
tempCachedMap.remove(event.getIdentifier());
|
||||||
break;
|
break;
|
||||||
case Event.NODE_MOVED:
|
case Event.NODE_MOVED:
|
||||||
Node nodeMoved = ses.getNode(event.getPath());
|
Node nodeMoved = ses.getNode(event.getPath());
|
||||||
logger.trace("node moved event received with type {}", nodeMoved.getPrimaryNodeType());
|
logger.trace("node moved event received with type {}", nodeMoved.getPrimaryNodeType());
|
||||||
if (nodeMoved.isNodeType("nthl:workspaceLeafItem")) {
|
if (nodeMoved.isNodeType("nthl:workspaceLeafItem")) {
|
||||||
logger.trace("event node moved on {} with path {}",nodeMoved.getName(), nodeMoved.getPath());
|
logger.debug("event node moved on {} with path {}",nodeMoved.getName(), nodeMoved.getPath());
|
||||||
String identifier = nodeMoved.getIdentifier();
|
String identifier = nodeMoved.getIdentifier();
|
||||||
cachedList.removeIf(i -> i.getId().equals(identifier) && !i.getPath().startsWith(vreFolder.getPath()));
|
String nodePath = ses.getNode(identifier).getPath();
|
||||||
|
if (tempCachedMap.get(event.getIdentifier())!=null &&
|
||||||
|
!nodePath.startsWith(vreFolder.getPath()))
|
||||||
|
tempCachedMap.remove(event.getIdentifier());
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Exception("error in event handling");
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.warn("error handling event {}",event.getType(),e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cachedList.size()>CACHE_DIMENSION)
|
|
||||||
cachedList.subList(51, cachedList.size()).clear();
|
|
||||||
logger.trace("retrieving event took {} with {} events",System.currentTimeMillis()-start, events);
|
|
||||||
if (cachedList.size()<=10) return cachedList;
|
|
||||||
else return cachedList.subList(0, 10);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("error getting events for vre {}",vreFolder.getTitle(),e);
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}finally{
|
|
||||||
if (ses!=null)
|
|
||||||
ses.logout();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.trace("retrieving event took {} with {} events",System.currentTimeMillis()-start, events);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("error getting events for vre {}",vreFolder.getTitle(),e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertItemInTheRightPlace(Item item) {
|
private void visitChildren(Node node, Map<String, Long> tempCachedMap) throws Exception{
|
||||||
Iterator<Item> it = cachedList.iterator();
|
NodeIterator nodeIt = node.getNodes();
|
||||||
int index =0;
|
while(nodeIt.hasNext()) {
|
||||||
while (it.hasNext()) {
|
Node child = nodeIt.nextNode();
|
||||||
Item inListItem = it.next();
|
Item item = node2Item.getItem(child, Excludes.ALL);
|
||||||
if (item.getLastModificationTime().getTime().getTime()>=inListItem.getLastModificationTime().getTime().getTime()) break;
|
if (item==null || item.isHidden()) continue;
|
||||||
index++;
|
if (item instanceof FolderItem)
|
||||||
|
visitChildren(child,tempCachedMap);
|
||||||
|
else if(item instanceof AbstractFileItem)
|
||||||
|
insertItemInTheRightPlace(item,tempCachedMap);
|
||||||
}
|
}
|
||||||
if (index<CACHE_DIMENSION)
|
|
||||||
cachedList.add(index, item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @Override
|
/* @Override
|
||||||
|
|
|
@ -47,8 +47,14 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("items")
|
@Path("items")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class ACLManager extends Impersonable {
|
public class ACLManager extends Impersonable {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ACLManager.class);
|
private static final Logger log = LoggerFactory.getLogger(ACLManager.class);
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package org.gcube.data.access.storagehub.services;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.Context;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@Path("api-docs")
|
||||||
|
public class DocManager {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(DocManager.class);
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/{any: .*}")
|
||||||
|
public InputStream toDoc(@Context HttpServletRequest req) throws WebApplicationException {
|
||||||
|
logger.info(DocManager.class.getSimpleName() + " toDoc called");
|
||||||
|
|
||||||
|
String pathInfo = req.getPathInfo();
|
||||||
|
logger.debug("pathInfo {}", pathInfo);
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (pathInfo.endsWith("/api-docs")) {
|
||||||
|
pathInfo += "index.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pathInfo.endsWith("/api-docs/")) {
|
||||||
|
pathInfo += "index.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("going to {}", pathInfo);
|
||||||
|
|
||||||
|
String realPath = req.getServletContext().getRealPath(pathInfo);
|
||||||
|
return new FileInputStream(new File(realPath));
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new WebApplicationException("error getting docs",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,7 +9,6 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.PathNotFoundException;
|
import javax.jcr.PathNotFoundException;
|
||||||
|
@ -40,7 +39,6 @@ import org.apache.jackrabbit.api.security.user.QueryBuilder;
|
||||||
import org.apache.jackrabbit.api.security.user.User;
|
import org.apache.jackrabbit.api.security.user.User;
|
||||||
import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
|
import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
|
||||||
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
||||||
import org.gcube.common.authorization.library.AuthorizationEntry;
|
|
||||||
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
||||||
import org.gcube.common.scope.api.ScopeProvider;
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
@ -75,8 +73,14 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("groups")
|
@Path("groups")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class GroupManager {
|
public class GroupManager {
|
||||||
|
|
||||||
|
|
||||||
|
@ -200,11 +204,11 @@ public class GroupManager {
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
|
||||||
Authorizable authorizable = usrManager.getAuthorizable(group);
|
Authorizable authorizable = usrManager.getAuthorizable(group);
|
||||||
if (authorizable.isGroup())
|
if (authorizable!=null && authorizable.isGroup())
|
||||||
authorizable.remove();
|
authorizable.remove();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Node node = groupHandler.getVreFolderNode(session, group);
|
Node node = groupHandler.getFolderNodeRelatedToGroup(session, group);
|
||||||
List<Item> workspaceItems = Utils.getItemList(node, Excludes.GET_ONLY_CONTENT, null, true, null);
|
List<Item> workspaceItems = Utils.getItemList(node, Excludes.GET_ONLY_CONTENT, null, true, null);
|
||||||
trashHandler.removeOnlyNodesContent(session, workspaceItems);
|
trashHandler.removeOnlyNodesContent(session, workspaceItems);
|
||||||
node.removeSharedSet();
|
node.removeSharedSet();
|
||||||
|
@ -242,7 +246,7 @@ public class GroupManager {
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
Node vreFolder = groupHandler.getVreFolderNode(session, groupId);
|
Node vreFolder = groupHandler.getFolderNodeRelatedToGroup(session, groupId);
|
||||||
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
|
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
|
||||||
|
|
||||||
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
|
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
|
||||||
|
@ -296,7 +300,7 @@ public class GroupManager {
|
||||||
Objects.nonNull(userId);
|
Objects.nonNull(userId);
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
Node vreFolder = groupHandler.getVreFolderNode(session, groupId);
|
Node vreFolder = groupHandler.getFolderNodeRelatedToGroup(session, groupId);
|
||||||
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
|
String currentUser = AuthorizationProvider.instance.get().getClient().getId();
|
||||||
|
|
||||||
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
|
if (!isInfraManager() && !(isVREManager() && isValidGroupForContext(groupId) ))
|
||||||
|
@ -422,7 +426,7 @@ public class GroupManager {
|
||||||
boolean success = group.addMember(user);
|
boolean success = group.addMember(user);
|
||||||
session.save();
|
session.save();
|
||||||
String folderName = group.getPrincipal().getName();
|
String folderName = group.getPrincipal().getName();
|
||||||
Node folder = groupHandler.getVreFolderNode(session, folderName);
|
Node folder = groupHandler.getFolderNodeRelatedToGroup(session, folderName);
|
||||||
|
|
||||||
String userPath = Paths.append(pathUtil.getVREsPath(user.getPrincipal().getName(), session), folderName).toPath();
|
String userPath = Paths.append(pathUtil.getVREsPath(user.getPrincipal().getName(), session), folderName).toPath();
|
||||||
log.debug("creating folder in user path {} from {}", userPath, folder.getPath() );
|
log.debug("creating folder in user path {} from {}", userPath, folder.getPath() );
|
||||||
|
|
|
@ -35,7 +35,6 @@ import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
|
||||||
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
|
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
|
||||||
import org.gcube.common.storagehub.model.exceptions.ItemLockedException;
|
import org.gcube.common.storagehub.model.exceptions.ItemLockedException;
|
||||||
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
||||||
import org.gcube.common.storagehub.model.items.ExternalFolder;
|
|
||||||
import org.gcube.common.storagehub.model.items.FolderItem;
|
import org.gcube.common.storagehub.model.items.FolderItem;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.common.storagehub.model.items.SharedFolder;
|
import org.gcube.common.storagehub.model.items.SharedFolder;
|
||||||
|
@ -56,9 +55,15 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Path("items")
|
@Path("items")
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class ItemSharing extends Impersonable{
|
public class ItemSharing extends Impersonable{
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ItemSharing.class);
|
private static final Logger log = LoggerFactory.getLogger(ItemSharing.class);
|
||||||
|
|
|
@ -38,45 +38,50 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("items")
|
@Path("items")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
public class ItemsCreator extends Impersonable{
|
@RequestHeaders({
|
||||||
|
@RequestHeader(name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"), })
|
||||||
|
public class ItemsCreator extends Impersonable {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ItemsCreator.class);
|
private static final Logger log = LoggerFactory.getLogger(ItemsCreator.class);
|
||||||
|
|
||||||
@Context
|
@Context
|
||||||
ServletContext context;
|
ServletContext context;
|
||||||
|
|
||||||
RepositoryInitializer repository = StorageHubAppllicationManager.repository;
|
RepositoryInitializer repository = StorageHubAppllicationManager.repository;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ItemHandler itemHandler;
|
ItemHandler itemHandler;
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
@Path("/{id}/create/FOLDER")
|
@Path("/{id}/create/FOLDER")
|
||||||
public Response createFolder(@PathParam("id") String id, @FormParam("name") String name,
|
public Response createFolder(@PathParam("id") String id, @FormParam("name") String name,
|
||||||
@FormParam("description") String description, @FormParam("hidden") boolean hidden) {
|
@FormParam("description") String description, @FormParam("hidden") boolean hidden) {
|
||||||
InnerMethodName.instance.set("createItem(FOLDER)");
|
InnerMethodName.instance.set("createItem(FOLDER)");
|
||||||
log.info("create folder item called");
|
log.info("create folder item called");
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
try{
|
try {
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
ItemsParameterBuilder<FolderCreationParameters> builder = FolderCreationParameters.builder().name(name).description(description).hidden(hidden).on(id).with(ses).author(currentUser);
|
ItemsParameterBuilder<FolderCreationParameters> builder = FolderCreationParameters.builder().name(name)
|
||||||
toReturn = itemHandler.create(builder.build());
|
.description(description).hidden(hidden).on(id).with(ses).author(currentUser);
|
||||||
}catch(StorageHubException she ){
|
toReturn = itemHandler.create(builder.build());
|
||||||
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(RepositoryException re ){
|
} catch (RepositoryException re) {
|
||||||
log.error("jcr error creating item", re);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
}finally{
|
} finally {
|
||||||
if (ses!=null)
|
if (ses != null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -86,69 +91,70 @@ public class ItemsCreator extends Impersonable{
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
@Path("/{id}/create/EXTERNALFOLDER")
|
@Path("/{id}/create/EXTERNALFOLDER")
|
||||||
public Response createExternalFolder(@PathParam("id") String id, @FormParam("name") String name,
|
public Response createExternalFolder(@PathParam("id") String id, @FormParam("name") String name,
|
||||||
@FormParam("description") String description, @FormParam("hidden") boolean hidden,
|
@FormParam("description") String description, @FormParam("hidden") boolean hidden,
|
||||||
@FormParam("pluginName") String pluginName,
|
@FormParam("pluginName") String pluginName, @FormParam("parameters") String pluginParameters) {
|
||||||
@FormParam("parameters") String pluginParameters) {
|
|
||||||
InnerMethodName.instance.set("createItem(EXTERNALFOLDER)");
|
InnerMethodName.instance.set("createItem(EXTERNALFOLDER)");
|
||||||
log.info("create folder item called");
|
log.info("create folder item called");
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
try{
|
try {
|
||||||
//TODO
|
// TODO
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
ItemsParameterBuilder<FolderCreationParameters> builder = FolderCreationParameters.builder().name(name)
|
ItemsParameterBuilder<FolderCreationParameters> builder = FolderCreationParameters.builder().name(name)
|
||||||
.description(description).onRepository(pluginName).withParameters(null).hidden(hidden).on(id).with(ses).author(currentUser);
|
.description(description).onRepository(pluginName).withParameters(null).hidden(hidden).on(id)
|
||||||
toReturn = itemHandler.create(builder.build());
|
.with(ses).author(currentUser);
|
||||||
}catch(StorageHubException she ){
|
toReturn = itemHandler.create(builder.build());
|
||||||
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(RepositoryException re ){
|
} catch (RepositoryException re) {
|
||||||
log.error("jcr error creating item", re);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
}finally{
|
} finally {
|
||||||
if (ses!=null)
|
if (ses != null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
|
|
||||||
}
|
}
|
||||||
return Response.ok(toReturn).build();
|
return Response.ok(toReturn).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
@Path("/{id}/create/URL")
|
@Path("/{id}/create/URL")
|
||||||
public Response createURL(@PathParam("id") String id, @FormParam("name") String name, @FormParam("description") String description, @FormParam("value") URL value) {
|
public Response createURL(@PathParam("id") String id, @FormParam("name") String name,
|
||||||
|
@FormParam("description") String description, @FormParam("value") URL value) {
|
||||||
InnerMethodName.instance.set("createItem(URL)");
|
InnerMethodName.instance.set("createItem(URL)");
|
||||||
log.info("create url called");
|
log.info("create url called");
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
try{
|
try {
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
ItemsParameterBuilder<URLCreationParameters> builder = URLCreationParameters.builder().name(name).description(description).url(value).on(id).with(ses).author(currentUser);
|
|
||||||
|
|
||||||
toReturn = itemHandler.create(builder.build());
|
ItemsParameterBuilder<URLCreationParameters> builder = URLCreationParameters.builder().name(name)
|
||||||
}catch(StorageHubException she ){
|
.description(description).url(value).on(id).with(ses).author(currentUser);
|
||||||
|
|
||||||
|
toReturn = itemHandler.create(builder.build());
|
||||||
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(RepositoryException re ){
|
} catch (RepositoryException re) {
|
||||||
log.error("jcr error creating item", re);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
}finally{
|
} finally {
|
||||||
if (ses!=null)
|
if (ses != null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
|
|
||||||
}
|
}
|
||||||
return Response.ok(toReturn).build();
|
return Response.ok(toReturn).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
@Path("/{id}/create/GCUBEITEM")
|
@Path("/{id}/create/GCUBEITEM")
|
||||||
|
@ -158,58 +164,58 @@ public class ItemsCreator extends Impersonable{
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
|
|
||||||
try{
|
try {
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
ItemsParameterBuilder<GCubeItemCreationParameters> builder = GCubeItemCreationParameters.builder().item(item).on(id).with(ses).author(currentUser);
|
ItemsParameterBuilder<GCubeItemCreationParameters> builder = GCubeItemCreationParameters.builder()
|
||||||
|
.item(item).on(id).with(ses).author(currentUser);
|
||||||
toReturn = itemHandler.create(builder.build());
|
|
||||||
}catch(StorageHubException she ){
|
toReturn = itemHandler.create(builder.build());
|
||||||
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(RepositoryException re ){
|
} catch (RepositoryException re) {
|
||||||
log.error("jcr error creating item", re);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
}finally{
|
} finally {
|
||||||
if (ses!=null)
|
if (ses != null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
}
|
}
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
@Path("/{id}/create/FILE")
|
@Path("/{id}/create/FILE")
|
||||||
public String createFileItem(@PathParam("id") String id, @FormDataParam("name") String name,
|
public String createFileItem(@PathParam("id") String id, @FormDataParam("name") String name,
|
||||||
@FormDataParam("description") String description,
|
@FormDataParam("description") String description, @FormDataParam("file") InputStream stream,
|
||||||
@FormDataParam("file") InputStream stream,
|
@FormDataParam("file") FormDataContentDisposition fileDetail) {
|
||||||
@FormDataParam("file") FormDataContentDisposition fileDetail){
|
|
||||||
InnerMethodName.instance.set("createItem(FILE)");
|
InnerMethodName.instance.set("createItem(FILE)");
|
||||||
|
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
try{
|
try {
|
||||||
|
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
ItemsParameterBuilder<FileCreationParameters> builder = FileCreationParameters.builder().name(name).description(description).stream(stream).fileDetails(fileDetail)
|
ItemsParameterBuilder<FileCreationParameters> builder = FileCreationParameters.builder().name(name)
|
||||||
.on(id).with(ses).author(currentUser);
|
.description(description).stream(stream).fileDetails(fileDetail).on(id).with(ses)
|
||||||
|
.author(currentUser);
|
||||||
toReturn = itemHandler.create(builder.build());
|
|
||||||
|
toReturn = itemHandler.create(builder.build());
|
||||||
}catch(RepositoryException re ){
|
|
||||||
|
} catch (RepositoryException re) {
|
||||||
log.error("jcr error creating file item", re);
|
log.error("jcr error creating file item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating file item", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating file item", re));
|
||||||
}catch(StorageHubException she ){
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
}finally{
|
} finally {
|
||||||
if (ses!=null && ses.isLive()) {
|
if (ses != null && ses.isLive()) {
|
||||||
log.info("session closed");
|
log.info("session closed");
|
||||||
ses.logout();
|
ses.logout();
|
||||||
}
|
}
|
||||||
|
@ -218,47 +224,39 @@ public class ItemsCreator extends Impersonable{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
@Path("/{id}/create/ARCHIVE")
|
@Path("/{id}/create/ARCHIVE")
|
||||||
public String uploadArchive(@PathParam("id") String id, @FormDataParam("parentFolderName") String parentFolderName,
|
public String uploadArchive(@PathParam("id") String id, @FormDataParam("parentFolderName") String parentFolderName,
|
||||||
@FormDataParam("file") InputStream stream,
|
@FormDataParam("file") InputStream stream, @FormDataParam("file") FormDataContentDisposition fileDetail) {
|
||||||
@FormDataParam("file") FormDataContentDisposition fileDetail){
|
|
||||||
InnerMethodName.instance.set("createItem(ARCHIVE)");
|
InnerMethodName.instance.set("createItem(ARCHIVE)");
|
||||||
|
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
String toReturn = null;
|
String toReturn = null;
|
||||||
try{
|
try {
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
ItemsParameterBuilder<ArchiveStructureCreationParameter> builder = ArchiveStructureCreationParameter.builder().parentName(parentFolderName).stream(stream).fileDetails(fileDetail)
|
ItemsParameterBuilder<ArchiveStructureCreationParameter> builder = ArchiveStructureCreationParameter
|
||||||
.on(id).with(ses).author(currentUser);
|
.builder().parentName(parentFolderName).stream(stream).fileDetails(fileDetail).on(id).with(ses)
|
||||||
|
.author(currentUser);
|
||||||
toReturn = itemHandler.create(builder.build());
|
|
||||||
|
|
||||||
}catch(RepositoryException | ArchiveException | IOException re){
|
toReturn = itemHandler.create(builder.build());
|
||||||
|
|
||||||
|
} catch (RepositoryException | ArchiveException | IOException re) {
|
||||||
log.error("jcr error extracting archive", re);
|
log.error("jcr error extracting archive", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error extracting archive", re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error extracting archive", re));
|
||||||
}catch(StorageHubException she ){
|
} catch (StorageHubException she) {
|
||||||
log.error(she.getErrorMessage(), she);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
}catch(Throwable e ){
|
} catch (Throwable e) {
|
||||||
log.error("unexpected error", e);
|
log.error("unexpected error", e);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
||||||
} finally{
|
} finally {
|
||||||
if (ses!=null)
|
if (ses != null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
|
|
||||||
}
|
}
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,9 +94,15 @@ import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
|
|
||||||
@Path("items")
|
@Path("items")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class ItemsManager extends Impersonable{
|
public class ItemsManager extends Impersonable{
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ItemsManager.class);
|
private static final Logger log = LoggerFactory.getLogger(ItemsManager.class);
|
||||||
|
@ -350,7 +356,7 @@ public class ItemsManager extends Impersonable{
|
||||||
log.debug("search for node {}",name);
|
log.debug("search for node {}",name);
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
authChecker.checkReadAuthorizationControl(ses, currentUser, id);
|
authChecker.checkReadAuthorizationControl(ses, currentUser, id);
|
||||||
toReturn = Utils.serachByNameOnFolder(ses, currentUser, authChecker, ses.getNodeByIdentifier(id), excludes, null, showHidden==null?false:showHidden,excludeTrashed==true?false:excludeTrashed , nodeType!=null ? ClassHandler.instance().get(nodeType) : null, name);
|
toReturn = Utils.searchByNameOnFolder(ses, currentUser, authChecker, ses.getNodeByIdentifier(id), excludes, null, showHidden==null?false:showHidden,excludeTrashed==true?false:excludeTrashed , nodeType!=null ? ClassHandler.instance().get(nodeType) : null, name);
|
||||||
log.debug("search retrieved {} elements",toReturn.size());
|
log.debug("search retrieved {} elements",toReturn.size());
|
||||||
}catch (ItemNotFoundException e) {
|
}catch (ItemNotFoundException e) {
|
||||||
log.error("id {} not found",id,e);
|
log.error("id {} not found",id,e);
|
||||||
|
|
|
@ -63,8 +63,14 @@ import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("messages")
|
@Path("messages")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class MessageManager extends Impersonable{
|
public class MessageManager extends Impersonable{
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(MessageManager.class);
|
private static final Logger log = LoggerFactory.getLogger(MessageManager.class);
|
||||||
|
@ -87,7 +93,7 @@ public class MessageManager extends Impersonable{
|
||||||
@Inject Item2NodeConverter item2Node;
|
@Inject Item2NodeConverter item2Node;
|
||||||
|
|
||||||
@Inject TrashHandler trashHandler;
|
@Inject TrashHandler trashHandler;
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{id}")
|
@Path("{id}")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@ -127,7 +133,7 @@ public class MessageManager extends Impersonable{
|
||||||
Node messageNode = ses.getNodeByIdentifier(id);
|
Node messageNode = ses.getNodeByIdentifier(id);
|
||||||
Message message = node2Item.getMessageItem(messageNode);
|
Message message = node2Item.getMessageItem(messageNode);
|
||||||
Node personalNode = checkRights(currentUser, message);
|
Node personalNode = checkRights(currentUser, message);
|
||||||
|
|
||||||
if (countSharedSet(messageNode)>1)
|
if (countSharedSet(messageNode)>1)
|
||||||
personalNode.removeShare();
|
personalNode.removeShare();
|
||||||
else {
|
else {
|
||||||
|
@ -279,7 +285,7 @@ public class MessageManager extends Impersonable{
|
||||||
throw new InvalidCallParameters();
|
throw new InvalidCallParameters();
|
||||||
|
|
||||||
log.debug("attachments send are {}",attachments);
|
log.debug("attachments send are {}",attachments);
|
||||||
|
|
||||||
ses = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
Message message = new MessageSharable();
|
Message message = new MessageSharable();
|
||||||
|
@ -323,11 +329,11 @@ public class MessageManager extends Impersonable{
|
||||||
return messageId;
|
return messageId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Node saveAttachments(Session ses, Node messageNode , List<String> attachments) throws RepositoryException, BackendGenericError{
|
private Node saveAttachments(Session ses, Node messageNode , List<String> attachments) throws RepositoryException, BackendGenericError{
|
||||||
Node attachmentNode = messageNode.getNode(Constants.ATTACHMENTNODE_NAME);
|
Node attachmentNode = messageNode.getNode(Constants.ATTACHMENTNODE_NAME);
|
||||||
|
|
||||||
for (String itemId: attachments) {
|
for (String itemId: attachments) {
|
||||||
Node node = ses.getNodeByIdentifier(itemId);
|
Node node = ses.getNodeByIdentifier(itemId);
|
||||||
Item item = node2Item.getItem(node, Excludes.GET_ONLY_CONTENT);
|
Item item = node2Item.getItem(node, Excludes.GET_ONLY_CONTENT);
|
||||||
|
@ -345,7 +351,13 @@ public class MessageManager extends Impersonable{
|
||||||
NodeIterator nodeIt = node.getNodes();
|
NodeIterator nodeIt = node.getNodes();
|
||||||
while(nodeIt.hasNext()) {
|
while(nodeIt.hasNext()) {
|
||||||
Node child = nodeIt.nextNode();
|
Node child = nodeIt.nextNode();
|
||||||
|
log.info("message type "+child.getPrimaryNodeType().getName());
|
||||||
Message message = node2Item.getMessageItem(child);
|
Message message = node2Item.getMessageItem(child);
|
||||||
|
if (message == null) {
|
||||||
|
log.info("message discarded");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (reduceBody != null && reduceBody>0 && message.getBody().length()>reduceBody )
|
if (reduceBody != null && reduceBody>0 && message.getBody().length()>reduceBody )
|
||||||
message.setBody(message.getBody().substring(0, reduceBody));
|
message.setBody(message.getBody().substring(0, reduceBody));
|
||||||
insertOrdered(messages, message);
|
insertOrdered(messages, message);
|
||||||
|
@ -354,25 +366,28 @@ public class MessageManager extends Impersonable{
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertOrdered(List<Message> messages, Message toInsert) {
|
private void insertOrdered(List<Message> messages, Message toInsert) {
|
||||||
if (messages.isEmpty()) messages.add(toInsert);
|
if (messages.isEmpty())
|
||||||
int i;
|
messages.add(toInsert);
|
||||||
for ( i=0 ; i<messages.size(); i++)
|
else {
|
||||||
if (messages.get(i).getCreationTime().getTimeInMillis()<=toInsert.getCreationTime().getTimeInMillis())
|
int i;
|
||||||
break;
|
for ( i=0 ; i<messages.size(); i++)
|
||||||
messages.add(i, toInsert);
|
if (messages.get(i).getCreationTime().getTimeInMillis()<=toInsert.getCreationTime().getTimeInMillis())
|
||||||
|
break;
|
||||||
|
messages.add(i, toInsert);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Node checkRights(String user, Message messageItem) throws RepositoryException, StorageHubException{
|
private Node checkRights(String user, Message messageItem) throws RepositoryException, StorageHubException{
|
||||||
Node personalNode = null;
|
Node personalNode = null;
|
||||||
Node messageNode = (Node) messageItem.getRelatedNode();
|
Node messageNode = (Node) messageItem.getRelatedNode();
|
||||||
if (messageNode.getPath().startsWith(pathUtil.getWorkspacePath(currentUser).toPath()))
|
if (messageNode.getPath().startsWith(pathUtil.getInboxPath(user).toPath()))
|
||||||
return messageNode;
|
return messageNode;
|
||||||
|
|
||||||
NodeIterator nodeIt = messageNode.getSharedSet();
|
NodeIterator nodeIt = messageNode.getSharedSet();
|
||||||
while (nodeIt.hasNext()) {
|
while (nodeIt.hasNext()) {
|
||||||
Node node = nodeIt.nextNode();
|
Node node = nodeIt.nextNode();
|
||||||
if (node.getPath().startsWith(pathUtil.getWorkspacePath(currentUser).toPath()))
|
if (node.getPath().startsWith(pathUtil.getInboxPath(user).toPath()))
|
||||||
personalNode = node;
|
personalNode = node;
|
||||||
}
|
}
|
||||||
if (personalNode == null &&
|
if (personalNode == null &&
|
||||||
|
@ -391,7 +406,7 @@ public class MessageManager extends Impersonable{
|
||||||
String newPath= String.format("%s/%s", destination.getPath(), uniqueName);
|
String newPath= String.format("%s/%s", destination.getPath(), uniqueName);
|
||||||
session.getWorkspace().copy(nodeToCopy.getPath(), newPath);
|
session.getWorkspace().copy(nodeToCopy.getPath(), newPath);
|
||||||
Node newNode = session.getNode(newPath);
|
Node newNode = session.getNode(newPath);
|
||||||
|
|
||||||
if (itemToCopy instanceof AbstractFileItem) {
|
if (itemToCopy instanceof AbstractFileItem) {
|
||||||
AbstractFileItem newNodeItem = node2Item.getItem(newNode, Excludes.EXCLUDE_ACCOUNTING);
|
AbstractFileItem newNodeItem = node2Item.getItem(newNode, Excludes.EXCLUDE_ACCOUNTING);
|
||||||
newNodeItem.getContent().setRemotePath(newPath);
|
newNodeItem.getContent().setRemotePath(newPath);
|
||||||
|
@ -406,7 +421,7 @@ public class MessageManager extends Impersonable{
|
||||||
newNode.setProperty(NodeProperty.TITLE.toString(), uniqueName);
|
newNode.setProperty(NodeProperty.TITLE.toString(), uniqueName);
|
||||||
return newNode;
|
return newNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int countSharedSet(Node node) throws RepositoryException{
|
private int countSharedSet(Node node) throws RepositoryException{
|
||||||
int count =0;
|
int count =0;
|
||||||
NodeIterator it = node.getSharedSet();
|
NodeIterator it = node.getSharedSet();
|
||||||
|
|
|
@ -58,8 +58,14 @@ import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("users")
|
@Path("users")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class UserManager {
|
public class UserManager {
|
||||||
|
|
||||||
private static final String INFRASTRUCTURE_MANAGER_ROLE = "Infrastructure-Manager";
|
private static final String INFRASTRUCTURE_MANAGER_ROLE = "Infrastructure-Manager";
|
||||||
|
|
|
@ -55,10 +55,16 @@ import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@ManagedBy(StorageHubAppllicationManager.class)
|
@ManagedBy(StorageHubAppllicationManager.class)
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class WorkspaceManager extends Impersonable{
|
public class WorkspaceManager extends Impersonable{
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(WorkspaceManager.class);
|
private static final Logger log = LoggerFactory.getLogger(WorkspaceManager.class);
|
||||||
|
@ -352,59 +358,6 @@ public class WorkspaceManager extends Impersonable{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Path("query")
|
|
||||||
@GET
|
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
|
||||||
public ItemList searchItems(@QueryParam("n") String node, @QueryParam("e") String jsonExpr, @QueryParam("o") List<String> orderField, @QueryParam("l") Integer limit, @QueryParam("f") Integer offset){
|
|
||||||
InnerMethodName.instance.set("searchItems");
|
|
||||||
Session ses = null;
|
|
||||||
List<? extends Item> toReturn = new ArrayList<>();
|
|
||||||
|
|
||||||
try{
|
|
||||||
|
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
|
||||||
Expression<Boolean> expression = mapper.readValue(jsonExpr, Expression.class);
|
|
||||||
String stringExpression = evaluator.evaluate(new And(new ISDescendant(pathUtil.getWorkspacePath(currentUser)), expression));
|
|
||||||
|
|
||||||
String orderBy = "";
|
|
||||||
if (orderField!=null && orderField.size()>0)
|
|
||||||
orderBy= String.format("ORDER BY %s", orderField.stream().collect(Collectors.joining(",")).toString());
|
|
||||||
|
|
||||||
String sql2Query = String.format("SELECT * FROM [%s] AS node WHERE %s %s ",node, stringExpression,orderBy);
|
|
||||||
|
|
||||||
log.info("query sent is {}",sql2Query);
|
|
||||||
|
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
|
||||||
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(sql2Query, Constants.QUERY_LANGUAGE);
|
|
||||||
|
|
||||||
if (limit!=null && limit!=-1 )
|
|
||||||
jcrQuery.setLimit(limit);
|
|
||||||
|
|
||||||
if (offset!=null && offset!=-1 )
|
|
||||||
jcrQuery.setOffset(offset);
|
|
||||||
|
|
||||||
QueryResult result = jcrQuery.execute();
|
|
||||||
|
|
||||||
NodeIterator it = result.getNodes();
|
|
||||||
|
|
||||||
while (it.hasNext())
|
|
||||||
toReturn.add(node2Item.getItem(it.nextNode(), null));
|
|
||||||
}catch(RepositoryException | IOException re ){
|
|
||||||
log.error("error executing the query", re);
|
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(re));
|
|
||||||
}catch(StorageHubException she ){
|
|
||||||
log.error(she.getErrorMessage(), she);
|
|
||||||
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
|
||||||
}finally{
|
|
||||||
if (ses!=null)
|
|
||||||
ses.logout();
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ItemList(toReturn);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
@Path("count")
|
@Path("count")
|
||||||
@GET
|
@GET
|
||||||
|
|
|
@ -40,7 +40,13 @@ import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeader;
|
||||||
|
import com.webcohesion.enunciate.metadata.rs.RequestHeaders;
|
||||||
|
|
||||||
@Path("admin/script")
|
@Path("admin/script")
|
||||||
|
@RequestHeaders({
|
||||||
|
@RequestHeader( name = "Authorization", description = "Bearer token, see https://dev.d4science.org/how-to-access-resources"),
|
||||||
|
})
|
||||||
public class ScriptManager {
|
public class ScriptManager {
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,7 +80,7 @@ public class ScriptManager {
|
||||||
@FormDataParam("file") FormDataContentDisposition fileDetail) {
|
@FormDataParam("file") FormDataContentDisposition fileDetail) {
|
||||||
try {
|
try {
|
||||||
ScriptClassLoader scriptClassLoader = new ScriptClassLoader(Thread.currentThread().getContextClassLoader());
|
ScriptClassLoader scriptClassLoader = new ScriptClassLoader(Thread.currentThread().getContextClassLoader());
|
||||||
Class<?> scriptClass = uploadClass(stream, scriptClassLoader, name);
|
Class<?> scriptClass = uploadClass(stream, scriptClassLoader, fileDetail.getFileName().replace(".class", ""));
|
||||||
return run(scriptClass, name, destinationFolderId, asynch!=null? asynch : false);
|
return run(scriptClass, name, destinationFolderId, asynch!=null? asynch : false);
|
||||||
}catch(Throwable e) {
|
}catch(Throwable e) {
|
||||||
log.error("error executing script {}", name,e);
|
log.error("error executing script {}", name,e);
|
||||||
|
@ -168,7 +174,7 @@ public class ScriptManager {
|
||||||
.stream(stream).on(parentId).with(ses).author(login);
|
.stream(stream).on(parentId).with(ses).author(login);
|
||||||
itemHandler.create(builder.build());
|
itemHandler.create(builder.build());
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
log.error("error saving script result {} in the Workspace",name);
|
log.error("error saving script result {} in the Workspace",name, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
@ -10,7 +10,6 @@ import javax.jcr.RepositoryException;
|
||||||
|
|
||||||
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.data.access.storagehub.Range;
|
|
||||||
import org.gcube.data.access.storagehub.Utils;
|
import org.gcube.data.access.storagehub.Utils;
|
||||||
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
import org.gcube.data.access.storagehub.handlers.items.Node2ItemConverter;
|
||||||
import org.gcube.data.access.storagehub.scripting.ScriptUtil;
|
import org.gcube.data.access.storagehub.scripting.ScriptUtil;
|
||||||
|
@ -22,7 +21,7 @@ public class ScriptUtilImpl implements ScriptUtil {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Item> getChildren(Predicate<Node> checker, Node parent, List<String> excludes, boolean showHidden, Class<? extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError {
|
public List<Item> getChildren(Predicate<Node> checker, Node parent, List<String> excludes, boolean showHidden, Class<? extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError {
|
||||||
return Utils.getItemList(checker, parent, excludes, new Range(0, 100), showHidden, nodeTypeToInclude);
|
return Utils.getItemList(checker, parent, excludes, null, showHidden, nodeTypeToInclude);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,313 +1,297 @@
|
||||||
European Union Public Licence V. 1.1
|
European Union Public Licence V. 1.1
|
||||||
|
|
||||||
|
|
||||||
EUPL © the European Community 2007
|
EUPL © the European Community 2007
|
||||||
|
|
||||||
|
|
||||||
This European Union Public Licence (the “EUPL”) applies to the Work or Software
|
This European Union Public Licence (the “EUPL”) applies to the Work or Software
|
||||||
(as defined below) which is provided under the terms of this Licence. Any use of
|
(as defined below) which is provided under the terms of this Licence. Any use of
|
||||||
the Work, other than as authorised under this Licence is prohibited (to the
|
the Work, other than as authorised under this Licence is prohibited (to the
|
||||||
extent such use is covered by a right of the copyright holder of the Work).
|
extent such use is covered by a right of the copyright holder of the Work).
|
||||||
|
|
||||||
The Original Work is provided under the terms of this Licence when the Licensor
|
The Original Work is provided under the terms of this Licence when the Licensor
|
||||||
(as defined below) has placed the following notice immediately following the
|
(as defined below) has placed the following notice immediately following the
|
||||||
copyright notice for the Original Work:
|
copyright notice for the Original Work:
|
||||||
|
|
||||||
Licensed under the EUPL V.1.1
|
Licensed under the EUPL V.1.1
|
||||||
|
|
||||||
or has expressed by any other mean his willingness to license under the EUPL.
|
or has expressed by any other mean his willingness to license under the EUPL.
|
||||||
|
|
||||||
|
|
||||||
|
1. Definitions
|
||||||
|
|
||||||
1. Definitions
|
In this Licence, the following terms have the following meaning:
|
||||||
|
|
||||||
In this Licence, the following terms have the following meaning:
|
- The Licence: this Licence.
|
||||||
|
|
||||||
- The Licence: this Licence.
|
- The Original Work or the Software: the software distributed and/or
|
||||||
|
communicated by the Licensor under this Licence, available as Source Code and
|
||||||
|
also as Executable Code as the case may be.
|
||||||
|
|
||||||
- The Original Work or the Software: the software distributed and/or
|
- Derivative Works: the works or software that could be created by the Licensee,
|
||||||
communicated by the Licensor under this Licence, available as Source Code and
|
based upon the Original Work or modifications thereof. This Licence does not
|
||||||
also as Executable Code as the case may be.
|
define the extent of modification or dependence on the Original Work required
|
||||||
|
in order to classify a work as a Derivative Work; this extent is determined by
|
||||||
|
copyright law applicable in the country mentioned in Article 15.
|
||||||
|
|
||||||
- Derivative Works: the works or software that could be created by the Licensee,
|
- The Work: the Original Work and/or its Derivative Works.
|
||||||
based upon the Original Work or modifications thereof. This Licence does not
|
|
||||||
define the extent of modification or dependence on the Original Work required
|
|
||||||
in order to classify a work as a Derivative Work; this extent is determined by
|
|
||||||
copyright law applicable in the country mentioned in Article 15.
|
|
||||||
|
|
||||||
- The Work: the Original Work and/or its Derivative Works.
|
- The Source Code: the human-readable form of the Work which is the most
|
||||||
|
convenient for people to study and modify.
|
||||||
|
|
||||||
- The Source Code: the human-readable form of the Work which is the most
|
- The Executable Code: any code which has generally been compiled and which is
|
||||||
convenient for people to study and modify.
|
meant to be interpreted by a computer as a program.
|
||||||
|
|
||||||
- The Executable Code: any code which has generally been compiled and which is
|
- The Licensor: the natural or legal person that distributes and/or communicates
|
||||||
meant to be interpreted by a computer as a program.
|
the Work under the Licence.
|
||||||
|
|
||||||
- The Licensor: the natural or legal person that distributes and/or communicates
|
- Contributor(s): any natural or legal person who modifies the Work under the
|
||||||
the Work under the Licence.
|
Licence, or otherwise contributes to the creation of a Derivative Work.
|
||||||
|
|
||||||
- Contributor(s): any natural or legal person who modifies the Work under the
|
- The Licensee or “You”: any natural or legal person who makes any usage of the
|
||||||
Licence, or otherwise contributes to the creation of a Derivative Work.
|
Software under the terms of the Licence.
|
||||||
|
|
||||||
- The Licensee or “You”: any natural or legal person who makes any usage of the
|
- Distribution and/or Communication: any act of selling, giving, lending,
|
||||||
Software under the terms of the Licence.
|
renting, distributing, communicating, transmitting, or otherwise making
|
||||||
|
available, on-line or off-line, copies of the Work or providing access to its
|
||||||
|
essential functionalities at the disposal of any other natural or legal
|
||||||
|
person.
|
||||||
|
|
||||||
- Distribution and/or Communication: any act of selling, giving, lending,
|
|
||||||
renting, distributing, communicating, transmitting, or otherwise making
|
|
||||||
available, on-line or off-line, copies of the Work or providing access to its
|
|
||||||
essential functionalities at the disposal of any other natural or legal
|
|
||||||
person.
|
|
||||||
|
|
||||||
|
2. Scope of the rights granted by the Licence
|
||||||
|
|
||||||
|
The Licensor hereby grants You a world-wide, royalty-free, non-exclusive,
|
||||||
|
sub-licensable licence to do the following, for the duration of copyright vested
|
||||||
|
in the Original Work:
|
||||||
|
|
||||||
2. Scope of the rights granted by the Licence
|
- use the Work in any circumstance and for all usage, reproduce the Work, modify
|
||||||
|
- the Original Work, and make Derivative Works based upon the Work, communicate
|
||||||
|
- to the public, including the right to make available or display the Work or
|
||||||
|
- copies thereof to the public and perform publicly, as the case may be, the
|
||||||
|
- Work, distribute the Work or copies thereof, lend and rent the Work or copies
|
||||||
|
- thereof, sub-license rights in the Work or copies thereof.
|
||||||
|
|
||||||
The Licensor hereby grants You a world-wide, royalty-free, non-exclusive,
|
Those rights can be exercised on any media, supports and formats, whether now
|
||||||
sub-licensable licence to do the following, for the duration of copyright vested
|
known or later invented, as far as the applicable law permits so.
|
||||||
in the Original Work:
|
|
||||||
|
|
||||||
- use the Work in any circumstance and for all usage, reproduce the Work, modify
|
In the countries where moral rights apply, the Licensor waives his right to
|
||||||
- the Original Work, and make Derivative Works based upon the Work, communicate
|
exercise his moral right to the extent allowed by law in order to make effective
|
||||||
- to the public, including the right to make available or display the Work or
|
the licence of the economic rights here above listed.
|
||||||
- copies thereof to the public and perform publicly, as the case may be, the
|
|
||||||
- Work, distribute the Work or copies thereof, lend and rent the Work or copies
|
|
||||||
- thereof, sub-license rights in the Work or copies thereof.
|
|
||||||
|
|
||||||
Those rights can be exercised on any media, supports and formats, whether now
|
The Licensor grants to the Licensee royalty-free, non exclusive usage rights to
|
||||||
known or later invented, as far as the applicable law permits so.
|
any patents held by the Licensor, to the extent necessary to make use of the
|
||||||
|
rights granted on the Work under this Licence.
|
||||||
|
|
||||||
In the countries where moral rights apply, the Licensor waives his right to
|
|
||||||
exercise his moral right to the extent allowed by law in order to make effective
|
|
||||||
the licence of the economic rights here above listed.
|
|
||||||
|
|
||||||
The Licensor grants to the Licensee royalty-free, non exclusive usage rights to
|
3. Communication of the Source Code
|
||||||
any patents held by the Licensor, to the extent necessary to make use of the
|
|
||||||
rights granted on the Work under this Licence.
|
|
||||||
|
|
||||||
|
The Licensor may provide the Work either in its Source Code form, or as
|
||||||
|
Executable Code. If the Work is provided as Executable Code, the Licensor
|
||||||
|
provides in addition a machine-readable copy of the Source Code of the Work
|
||||||
|
along with each copy of the Work that the Licensor distributes or indicates, in
|
||||||
|
a notice following the copyright notice attached to the Work, a repository where
|
||||||
|
the Source Code is easily and freely accessible for as long as the Licensor
|
||||||
|
continues to distribute and/or communicate the Work.
|
||||||
|
|
||||||
|
|
||||||
3. Communication of the Source Code
|
4. Limitations on copyright
|
||||||
|
|
||||||
The Licensor may provide the Work either in its Source Code form, or as
|
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
||||||
Executable Code. If the Work is provided as Executable Code, the Licensor
|
any exception or limitation to the exclusive rights of the rights owners in the
|
||||||
provides in addition a machine-readable copy of the Source Code of the Work
|
Original Work or Software, of the exhaustion of those rights or of other
|
||||||
along with each copy of the Work that the Licensor distributes or indicates, in
|
applicable limitations thereto.
|
||||||
a notice following the copyright notice attached to the Work, a repository where
|
|
||||||
the Source Code is easily and freely accessible for as long as the Licensor
|
|
||||||
continues to distribute and/or communicate the Work.
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Obligations of the Licensee
|
||||||
|
|
||||||
4. Limitations on copyright
|
The grant of the rights mentioned above is subject to some restrictions and
|
||||||
|
obligations imposed on the Licensee. Those obligations are the following:
|
||||||
|
|
||||||
Nothing in this Licence is intended to deprive the Licensee of the benefits from
|
Attribution right: the Licensee shall keep intact all copyright, patent or
|
||||||
any exception or limitation to the exclusive rights of the rights owners in the
|
trademarks notices and all notices that refer to the Licence and to the
|
||||||
Original Work or Software, of the exhaustion of those rights or of other
|
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
||||||
applicable limitations thereto.
|
copy of the Licence with every copy of the Work he/she distributes and/or
|
||||||
|
communicates. The Licensee must cause any Derivative Work to carry prominent
|
||||||
|
notices stating that the Work has been modified and the date of modification.
|
||||||
|
|
||||||
|
Copyleft clause: If the Licensee distributes and/or communicates copies of the
|
||||||
|
Original Works or Derivative Works based upon the Original Work, this
|
||||||
|
Distribution and/or Communication will be done under the terms of this Licence
|
||||||
|
or of a later version of this Licence unless the Original Work is expressly
|
||||||
|
distributed only under this version of the Licence. The Licensee (becoming
|
||||||
|
Licensor) cannot offer or impose any additional terms or conditions on the Work
|
||||||
|
or Derivative Work that alter or restrict the terms of the Licence.
|
||||||
|
|
||||||
|
Compatibility clause: If the Licensee Distributes and/or Communicates Derivative
|
||||||
|
Works or copies thereof based upon both the Original Work and another work
|
||||||
|
licensed under a Compatible Licence, this Distribution and/or Communication can
|
||||||
|
be done under the terms of this Compatible Licence. For the sake of this clause,
|
||||||
|
“Compatible Licence” refers to the licences listed in the appendix attached to
|
||||||
|
this Licence. Should the Licensee’s obligations under the Compatible Licence
|
||||||
|
conflict with his/her obligations under this Licence, the obligations of the
|
||||||
|
Compatible Licence shall prevail.
|
||||||
|
|
||||||
5. Obligations of the Licensee
|
Provision of Source Code: When distributing and/or communicating copies of the
|
||||||
|
Work, the Licensee will provide a machine-readable copy of the Source Code or
|
||||||
|
indicate a repository where this Source will be easily and freely available for
|
||||||
|
as long as the Licensee continues to distribute and/or communicate the Work.
|
||||||
|
|
||||||
The grant of the rights mentioned above is subject to some restrictions and
|
Legal Protection: This Licence does not grant permission to use the trade names,
|
||||||
obligations imposed on the Licensee. Those obligations are the following:
|
trademarks, service marks, or names of the Licensor, except as required for
|
||||||
|
reasonable and customary use in describing the origin of the Work and
|
||||||
|
reproducing the content of the copyright notice.
|
||||||
|
|
||||||
Attribution right: the Licensee shall keep intact all copyright, patent or
|
|
||||||
trademarks notices and all notices that refer to the Licence and to the
|
|
||||||
disclaimer of warranties. The Licensee must include a copy of such notices and a
|
|
||||||
copy of the Licence with every copy of the Work he/she distributes and/or
|
|
||||||
communicates. The Licensee must cause any Derivative Work to carry prominent
|
|
||||||
notices stating that the Work has been modified and the date of modification.
|
|
||||||
|
|
||||||
Copyleft clause: If the Licensee distributes and/or communicates copies of the
|
6. Chain of Authorship
|
||||||
Original Works or Derivative Works based upon the Original Work, this
|
|
||||||
Distribution and/or Communication will be done under the terms of this Licence
|
|
||||||
or of a later version of this Licence unless the Original Work is expressly
|
|
||||||
distributed only under this version of the Licence. The Licensee (becoming
|
|
||||||
Licensor) cannot offer or impose any additional terms or conditions on the Work
|
|
||||||
or Derivative Work that alter or restrict the terms of the Licence.
|
|
||||||
|
|
||||||
Compatibility clause: If the Licensee Distributes and/or Communicates Derivative
|
The original Licensor warrants that the copyright in the Original Work granted
|
||||||
Works or copies thereof based upon both the Original Work and another work
|
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
||||||
licensed under a Compatible Licence, this Distribution and/or Communication can
|
power and authority to grant the Licence.
|
||||||
be done under the terms of this Compatible Licence. For the sake of this clause,
|
|
||||||
“Compatible Licence” refers to the licences listed in the appendix attached to
|
|
||||||
this Licence. Should the Licensee’s obligations under the Compatible Licence
|
|
||||||
conflict with his/her obligations under this Licence, the obligations of the
|
|
||||||
Compatible Licence shall prevail.
|
|
||||||
|
|
||||||
Provision of Source Code: When distributing and/or communicating copies of the
|
Each Contributor warrants that the copyright in the modifications he/she brings
|
||||||
Work, the Licensee will provide a machine-readable copy of the Source Code or
|
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
||||||
indicate a repository where this Source will be easily and freely available for
|
power and authority to grant the Licence.
|
||||||
as long as the Licensee continues to distribute and/or communicate the Work.
|
|
||||||
|
|
||||||
Legal Protection: This Licence does not grant permission to use the trade names,
|
Each time You accept the Licence, the original Licensor and subsequent
|
||||||
trademarks, service marks, or names of the Licensor, except as required for
|
Contributors grant You a licence to their contributions to the Work, under the
|
||||||
reasonable and customary use in describing the origin of the Work and
|
terms of this Licence.
|
||||||
reproducing the content of the copyright notice.
|
|
||||||
|
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty
|
||||||
|
|
||||||
6. Chain of Authorship
|
The Work is a work in progress, which is continuously improved by numerous
|
||||||
|
contributors. It is not a finished work and may therefore contain defects or
|
||||||
|
“bugs” inherent to this type of software development.
|
||||||
|
|
||||||
The original Licensor warrants that the copyright in the Original Work granted
|
For the above reason, the Work is provided under the Licence on an “as is” basis
|
||||||
hereunder is owned by him/her or licensed to him/her and that he/she has the
|
and without warranties of any kind concerning the Work, including without
|
||||||
power and authority to grant the Licence.
|
limitation merchantability, fitness for a particular purpose, absence of defects
|
||||||
|
or errors, accuracy, non-infringement of intellectual property rights other than
|
||||||
|
copyright as stated in Article 6 of this Licence.
|
||||||
|
|
||||||
Each Contributor warrants that the copyright in the modifications he/she brings
|
This disclaimer of warranty is an essential part of the Licence and a condition
|
||||||
to the Work are owned by him/her or licensed to him/her and that he/she has the
|
for the grant of any rights to the Work.
|
||||||
power and authority to grant the Licence.
|
|
||||||
|
|
||||||
Each time You accept the Licence, the original Licensor and subsequent
|
|
||||||
Contributors grant You a licence to their contributions to the Work, under the
|
|
||||||
terms of this Licence.
|
|
||||||
|
|
||||||
|
8. Disclaimer of Liability
|
||||||
|
|
||||||
|
Except in the cases of wilful misconduct or damages directly caused to natural
|
||||||
|
persons, the Licensor will in no event be liable for any direct or indirect,
|
||||||
|
material or moral, damages of any kind, arising out of the Licence or of the use
|
||||||
|
of the Work, including without limitation, damages for loss of goodwill, work
|
||||||
|
stoppage, computer failure or malfunction, loss of data or any commercial
|
||||||
|
damage, even if the Licensor has been advised of the possibility of such
|
||||||
|
damage. However, the Licensor will be liable under statutory product liability
|
||||||
|
laws as far such laws apply to the Work.
|
||||||
|
|
||||||
7. Disclaimer of Warranty
|
|
||||||
|
|
||||||
The Work is a work in progress, which is continuously improved by numerous
|
9. Additional agreements
|
||||||
contributors. It is not a finished work and may therefore contain defects or
|
|
||||||
“bugs” inherent to this type of software development.
|
|
||||||
|
|
||||||
For the above reason, the Work is provided under the Licence on an “as is” basis
|
While distributing the Original Work or Derivative Works, You may choose to
|
||||||
and without warranties of any kind concerning the Work, including without
|
conclude an additional agreement to offer, and charge a fee for, acceptance of
|
||||||
limitation merchantability, fitness for a particular purpose, absence of defects
|
support, warranty, indemnity, or other liability obligations and/or services
|
||||||
or errors, accuracy, non-infringement of intellectual property rights other than
|
consistent with this Licence. However, in accepting such obligations, You may
|
||||||
copyright as stated in Article 6 of this Licence.
|
act only on your own behalf and on your sole responsibility, not on behalf of
|
||||||
|
the original Licensor or any other Contributor, and only if You agree to
|
||||||
|
indemnify, defend, and hold each Contributor harmless for any liability incurred
|
||||||
|
by, or claims asserted against such Contributor by the fact You have accepted
|
||||||
|
any such warranty or additional liability.
|
||||||
|
|
||||||
This disclaimer of warranty is an essential part of the Licence and a condition
|
|
||||||
for the grant of any rights to the Work.
|
|
||||||
|
|
||||||
|
10. Acceptance of the Licence
|
||||||
|
|
||||||
|
The provisions of this Licence can be accepted by clicking on an icon “I agree”
|
||||||
|
placed under the bottom of a window displaying the text of this Licence or by
|
||||||
|
affirming consent in any other similar way, in accordance with the rules of
|
||||||
|
applicable law. Clicking on that icon indicates your clear and irrevocable
|
||||||
|
acceptance of this Licence and all of its terms and conditions.
|
||||||
|
|
||||||
8. Disclaimer of Liability
|
Similarly, you irrevocably accept this Licence and all of its terms and
|
||||||
|
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
||||||
|
such as the use of the Work, the creation by You of a Derivative Work or the
|
||||||
|
Distribution and/or Communication by You of the Work or copies thereof.
|
||||||
|
|
||||||
Except in the cases of wilful misconduct or damages directly caused to natural
|
|
||||||
persons, the Licensor will in no event be liable for any direct or indirect,
|
|
||||||
material or moral, damages of any kind, arising out of the Licence or of the use
|
|
||||||
of the Work, including without limitation, damages for loss of goodwill, work
|
|
||||||
stoppage, computer failure or malfunction, loss of data or any commercial
|
|
||||||
damage, even if the Licensor has been advised of the possibility of such
|
|
||||||
damage. However, the Licensor will be liable under statutory product liability
|
|
||||||
laws as far such laws apply to the Work.
|
|
||||||
|
|
||||||
|
11. Information to the public
|
||||||
|
|
||||||
|
In case of any Distribution and/or Communication of the Work by means of
|
||||||
|
electronic communication by You (for example, by offering to download the Work
|
||||||
|
from a remote location) the distribution channel or media (for example, a
|
||||||
|
website) must at least provide to the public the information requested by the
|
||||||
|
applicable law regarding the Licensor, the Licence and the way it may be
|
||||||
|
accessible, concluded, stored and reproduced by the Licensee.
|
||||||
|
|
||||||
9. Additional agreements
|
|
||||||
|
|
||||||
While distributing the Original Work or Derivative Works, You may choose to
|
12. Termination of the Licence
|
||||||
conclude an additional agreement to offer, and charge a fee for, acceptance of
|
|
||||||
support, warranty, indemnity, or other liability obligations and/or services
|
|
||||||
consistent with this Licence. However, in accepting such obligations, You may
|
|
||||||
act only on your own behalf and on your sole responsibility, not on behalf of
|
|
||||||
the original Licensor or any other Contributor, and only if You agree to
|
|
||||||
indemnify, defend, and hold each Contributor harmless for any liability incurred
|
|
||||||
by, or claims asserted against such Contributor by the fact You have accepted
|
|
||||||
any such warranty or additional liability.
|
|
||||||
|
|
||||||
|
The Licence and the rights granted hereunder will terminate automatically upon
|
||||||
|
any breach by the Licensee of the terms of the Licence.
|
||||||
|
|
||||||
|
Such a termination will not terminate the licences of any person who has
|
||||||
|
received the Work from the Licensee under the Licence, provided such persons
|
||||||
|
remain in full compliance with the Licence.
|
||||||
|
|
||||||
10. Acceptance of the Licence
|
|
||||||
|
|
||||||
The provisions of this Licence can be accepted by clicking on an icon “I agree”
|
13. Miscellaneous
|
||||||
placed under the bottom of a window displaying the text of this Licence or by
|
|
||||||
affirming consent in any other similar way, in accordance with the rules of
|
|
||||||
applicable law. Clicking on that icon indicates your clear and irrevocable
|
|
||||||
acceptance of this Licence and all of its terms and conditions.
|
|
||||||
|
|
||||||
Similarly, you irrevocably accept this Licence and all of its terms and
|
Without prejudice of Article 9 above, the Licence represents the complete
|
||||||
conditions by exercising any rights granted to You by Article 2 of this Licence,
|
agreement between the Parties as to the Work licensed hereunder.
|
||||||
such as the use of the Work, the creation by You of a Derivative Work or the
|
|
||||||
Distribution and/or Communication by You of the Work or copies thereof.
|
|
||||||
|
|
||||||
|
If any provision of the Licence is invalid or unenforceable under applicable
|
||||||
|
law, this will not affect the validity or enforceability of the Licence as a
|
||||||
|
whole. Such provision will be construed and/or reformed so as necessary to make
|
||||||
|
it valid and enforceable.
|
||||||
|
|
||||||
|
The European Commission may publish other linguistic versions and/or new
|
||||||
|
versions of this Licence, so far this is required and reasonable, without
|
||||||
|
reducing the scope of the rights granted by the Licence. New versions of the
|
||||||
|
Licence will be published with a unique version number.
|
||||||
|
|
||||||
11. Information to the public
|
All linguistic versions of this Licence, approved by the European Commission,
|
||||||
|
have identical value. Parties can take advantage of the linguistic version of
|
||||||
|
their choice.
|
||||||
|
|
||||||
In case of any Distribution and/or Communication of the Work by means of
|
|
||||||
electronic communication by You (for example, by offering to download the Work
|
|
||||||
from a remote location) the distribution channel or media (for example, a
|
|
||||||
website) must at least provide to the public the information requested by the
|
|
||||||
applicable law regarding the Licensor, the Licence and the way it may be
|
|
||||||
accessible, concluded, stored and reproduced by the Licensee.
|
|
||||||
|
|
||||||
|
14. Jurisdiction
|
||||||
|
|
||||||
|
Any litigation resulting from the interpretation of this License, arising
|
||||||
|
between the European Commission, as a Licensor, and any Licensee, will be
|
||||||
|
subject to the jurisdiction of the Court of Justice of the European Communities,
|
||||||
|
as laid down in article 238 of the Treaty establishing the European Community.
|
||||||
|
|
||||||
12. Termination of the Licence
|
Any litigation arising between Parties, other than the European Commission, and
|
||||||
|
resulting from the interpretation of this License, will be subject to the
|
||||||
|
exclusive jurisdiction of the competent court where the Licensor resides or
|
||||||
|
conducts its primary business.
|
||||||
|
|
||||||
The Licence and the rights granted hereunder will terminate automatically upon
|
|
||||||
any breach by the Licensee of the terms of the Licence.
|
|
||||||
|
|
||||||
Such a termination will not terminate the licences of any person who has
|
15. Applicable Law
|
||||||
received the Work from the Licensee under the Licence, provided such persons
|
|
||||||
remain in full compliance with the Licence.
|
|
||||||
|
|
||||||
|
This Licence shall be governed by the law of the European Union country where
|
||||||
|
the Licensor resides or has his registered office.
|
||||||
|
|
||||||
|
This licence shall be governed by the Belgian law if:
|
||||||
|
|
||||||
13. Miscellaneous
|
- a litigation arises between the European Commission, as a Licensor, and any
|
||||||
|
- Licensee; the Licensor, other than the European Commission, has no residence
|
||||||
|
- or registered office inside a European Union country.
|
||||||
|
|
||||||
Without prejudice of Article 9 above, the Licence represents the complete
|
|
||||||
agreement between the Parties as to the Work licensed hereunder.
|
|
||||||
|
|
||||||
If any provision of the Licence is invalid or unenforceable under applicable
|
===
|
||||||
law, this will not affect the validity or enforceability of the Licence as a
|
|
||||||
whole. Such provision will be construed and/or reformed so as necessary to make
|
|
||||||
it valid and enforceable.
|
|
||||||
|
|
||||||
The European Commission may publish other linguistic versions and/or new
|
|
||||||
versions of this Licence, so far this is required and reasonable, without
|
|
||||||
reducing the scope of the rights granted by the Licence. New versions of the
|
|
||||||
Licence will be published with a unique version number.
|
|
||||||
|
|
||||||
All linguistic versions of this Licence, approved by the European Commission,
|
Appendix
|
||||||
have identical value. Parties can take advantage of the linguistic version of
|
|
||||||
their choice.
|
|
||||||
|
|
||||||
|
|
||||||
|
“Compatible Licences” according to article 5 EUPL are:
|
||||||
|
|
||||||
14. Jurisdiction
|
|
||||||
|
|
||||||
Any litigation resulting from the interpretation of this License, arising
|
- GNU General Public License (GNU GPL) v. 2
|
||||||
between the European Commission, as a Licensor, and any Licensee, will be
|
|
||||||
subject to the jurisdiction of the Court of Justice of the European Communities,
|
|
||||||
as laid down in article 238 of the Treaty establishing the European Community.
|
|
||||||
|
|
||||||
Any litigation arising between Parties, other than the European Commission, and
|
- Open Software License (OSL) v. 2.1, v. 3.0
|
||||||
resulting from the interpretation of this License, will be subject to the
|
|
||||||
exclusive jurisdiction of the competent court where the Licensor resides or
|
|
||||||
conducts its primary business.
|
|
||||||
|
|
||||||
|
- Common Public License v. 1.0
|
||||||
|
|
||||||
|
- Eclipse Public License v. 1.0
|
||||||
|
|
||||||
15. Applicable Law
|
- Cecill v. 2.0
|
||||||
|
|
||||||
This Licence shall be governed by the law of the European Union country where
|
|
||||||
the Licensor resides or has his registered office.
|
|
||||||
|
|
||||||
This licence shall be governed by the Belgian law if:
|
|
||||||
|
|
||||||
- a litigation arises between the European Commission, as a Licensor, and any
|
|
||||||
- Licensee; the Licensor, other than the European Commission, has no residence
|
|
||||||
- or registered office inside a European Union country.
|
|
||||||
|
|
||||||
|
|
||||||
===
|
|
||||||
|
|
||||||
|
|
||||||
Appendix
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
“Compatible Licences” according to article 5 EUPL are:
|
|
||||||
|
|
||||||
|
|
||||||
- GNU General Public License (GNU GPL) v. 2
|
|
||||||
|
|
||||||
- Open Software License (OSL) v. 2.1, v. 3.0
|
|
||||||
|
|
||||||
- Common Public License v. 1.0
|
|
||||||
|
|
||||||
- Eclipse Public License v. 1.0
|
|
||||||
|
|
||||||
- Cecill v. 2.0
|
|
||||||
|
|
|
@ -5,27 +5,27 @@ REST web service for Jackrabbit
|
||||||
|
|
||||||
|
|
||||||
This software is part of the gCube Framework (https://www.gcube-system.org/): an
|
This software is part of the gCube Framework (https://www.gcube-system.org/): an
|
||||||
open-source software toolkit used for building and operating Hybrid Data
|
open-source software toolkit used for building and operating Hybrid Data
|
||||||
Infrastructures enabling the dynamic deployment of Virtual Research Environments
|
Infrastructures enabling the dynamic deployment of Virtual Research Environments
|
||||||
by favouring the realisation of reuse oriented policies.
|
by favouring the realisation of reuse oriented policies.
|
||||||
|
|
||||||
The projects leading to this software have received funding from a series of
|
The projects leading to this software have received funding from a series of
|
||||||
European Union programmes including:
|
European Union programmes including:
|
||||||
* the Sixth Framework Programme for Research and Technological Development -
|
* the Sixth Framework Programme for Research and Technological Development -
|
||||||
DILIGENT (grant no. 004260);
|
DILIGENT (grant no. 004260);
|
||||||
* the Seventh Framework Programme for research, technological development and
|
* the Seventh Framework Programme for research, technological development and
|
||||||
demonstration - D4Science (grant no. 212488), D4Science-II (grant no.
|
demonstration - D4Science (grant no. 212488), D4Science-II (grant no.
|
||||||
239019),ENVRI (grant no. 283465), EUBrazilOpenBio (grant no. 288754), iMarine
|
239019),ENVRI (grant no. 283465), EUBrazilOpenBio (grant no. 288754), iMarine
|
||||||
(grant no. 283644);
|
(grant no. 283644);
|
||||||
* the H2020 research and innovation programme - BlueBRIDGE (grant no. 675680),
|
* the H2020 research and innovation programme - BlueBRIDGE (grant no. 675680),
|
||||||
EGIEngage (grant no. 654142), ENVRIplus (grant no. 654182), Parthenos (grant
|
EGIEngage (grant no. 654142), ENVRIplus (grant no. 654182), Parthenos (grant
|
||||||
no. 654119), SoBigData (grant no. 654024), AGINFRA PLUS (grant no. 731001).
|
no. 654119), SoBigData (grant no. 654024), AGINFRA PLUS (grant no. 731001).
|
||||||
|
|
||||||
|
|
||||||
Version
|
Version
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
1.3.1 (20210910-085653)
|
1.4.2 (20230524-150450)
|
||||||
|
|
||||||
Please see the file named "changelog.xml" in this directory for the release notes.
|
Please see the file named "changelog.xml" in this directory for the release notes.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<application mode='online'>
|
<application mode='online'>
|
||||||
<name>StorageHub</name>
|
<name>StorageHub</name>
|
||||||
<group>DataAccess</group>
|
<group>DataAccess</group>
|
||||||
<version>1.3.1</version>
|
<version>1.4.2</version>
|
||||||
<description>Storage Hub webapp</description>
|
<description>Storage Hub webapp</description>
|
||||||
<local-persistence location='target' />
|
<local-persistence location='target' />
|
||||||
|
<exclude>/workspace/api-docs/*</exclude>
|
||||||
</application>
|
</application>
|
|
@ -0,0 +1,26 @@
|
||||||
|
.d4science_intro {
|
||||||
|
top: 0;
|
||||||
|
z-index: 2000;
|
||||||
|
position: fixed;
|
||||||
|
display: block ruby;
|
||||||
|
padding: 10px;
|
||||||
|
background: white;
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-fixed-top {
|
||||||
|
top: 100px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
top: 160px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
margin-bottom: 40px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
top: 90px;
|
||||||
|
}
|
Loading…
Reference in New Issue