parent
698d117cdc
commit
f1f87a39f2
|
@ -0,0 +1,5 @@
|
||||||
|
.settings
|
||||||
|
.vscode
|
||||||
|
target
|
||||||
|
.classpath
|
||||||
|
.project
|
340
README.md
340
README.md
|
@ -1,2 +1,340 @@
|
||||||
# confluence-rest-extender
|
[](https://www.tiburon.su)
|
||||||
|
|
||||||
|
REST API Extender for Confluence
|
||||||
|
================
|
||||||
|
|
||||||
|
REST API for automated Confluence configuration with URMS
|
||||||
|
|
||||||
|
|
||||||
|
Resources
|
||||||
|
---------
|
||||||
|
|
||||||
|
All resources produce JSON (media type: `application/json`) results.
|
||||||
|
|
||||||
|
### Page versions
|
||||||
|
|
||||||
|
Get and delete outdated page versions
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/api/versions/all`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Get all page versions in all instance.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `DELETE /rest/extender/1/api/versions/all`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove all page versions in all instance.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/api/versions/space/{spaceKey}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- spaceKey: Key of the target space. (required)
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Get all page versions in space with key=`spaceKey`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `DELETE /rest/extender/1/api/versions/space/{spaceKey}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- spaceKey: Key of the target space. (required)
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove all page versions in space with key=`spaceKey`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/api/versions/page/{pageId}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- pageId: Id of the target page. (required)
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Get versions of the page with id=`pageId`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `DELETE /rest/extender/1/api/versions/page/{pageId}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- pageId: Id of the target page. (required)
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove versions of the page with id=`pageId`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
### Trashes
|
||||||
|
|
||||||
|
Get and delete trash
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/api/trash/all`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Get all trash in all instance.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `DELETE /rest/extender/1/api/trash/all`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove all trash in all instance.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/api/trash/space/{spaceKey}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- spaceKey: Key of the target space. (required)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Get trash from space with key=`spaceKey`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `DELETE /rest/extender/1/api/trash/space/{spaceKey}`
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- spaceKey: Key of the target space. (required)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove trash from space with key=`spaceKey`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- type: all or page or attachment. (default:all)
|
||||||
|
- endDays: 1~ (0=today, 1=yesterday) (default:0)
|
||||||
|
- limit: 1~1000 (default:1000)
|
||||||
|
|
||||||
|
Remove versions of the page with id=`pageId`.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Syncronise Crowd User Directory
|
||||||
|
|
||||||
|
* #### `GET /rest/extender/1/directory`
|
||||||
|
|
||||||
|
Get info about User Directories.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 262145,
|
||||||
|
"type": "INTERNAL",
|
||||||
|
"issynchronising": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1277953,
|
||||||
|
"type": "CROWD",
|
||||||
|
"issynchronising": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
* #### `PUT /rest/extender/1/directory`
|
||||||
|
|
||||||
|
|
||||||
|
**QueryString**
|
||||||
|
- id: User Directory ID. (required)
|
||||||
|
|
||||||
|
Start sycronyse User Directory.
|
||||||
|
|
||||||
|
__Responses__
|
||||||
|
|
||||||
|
![Status 200][status-200]
|
||||||
|
|
||||||
|
If OK, `issynchronising` of target directory returned as `true`
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 262145,
|
||||||
|
"type": "INTERNAL",
|
||||||
|
"issynchronising": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1277953,
|
||||||
|
"type": "CROWD",
|
||||||
|
"issynchronising": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
![Status 401][status-401]
|
||||||
|
|
||||||
|
Returned if the current user is not authenticated.
|
||||||
|
|
||||||
|
![Status 403][status-403]
|
||||||
|
|
||||||
|
Returned if the current user is not an administrator.
|
||||||
|
|
||||||
|
|
||||||
|
[status-200]: https://img.shields.io/badge/status-200-brightgreen.svg
|
||||||
|
[status-400]: https://img.shields.io/badge/status-400-red.svg
|
||||||
|
[status-401]: https://img.shields.io/badge/status-401-red.svg
|
||||||
|
[status-403]: https://img.shields.io/badge/status-403-red.svg
|
||||||
|
[status-404]: https://img.shields.io/badge/status-404-red.svg
|
||||||
|
|
|
@ -0,0 +1,229 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>su.tiburon.confluence</groupId>
|
||||||
|
<artifactId>rest-extender</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
<packaging>atlassian-plugin</packaging>
|
||||||
|
|
||||||
|
<name>REST API extender for Confluence</name>
|
||||||
|
<description>REST API extender for Confluence.</description>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>BSD 3-Clause License</name>
|
||||||
|
<url>https://opensource.org/licenses/BSD-3-Clause</url>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<issueManagement>
|
||||||
|
<system>Github</system>
|
||||||
|
<url>https://github.com/tiburon-777/confluence-rest-extender/issues</url>
|
||||||
|
</issueManagement>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git://github.com/tiburon-777/confluence-rest-extender.git</connection>
|
||||||
|
<developerConnection>scm:git:git@github.com:tiburon-777/confluence-rest-extender.git</developerConnection>
|
||||||
|
<url>https://github.com/tiburon-777/confluence-rest-extender</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<organization>
|
||||||
|
<name>OCTOPUS CodeWare</name>
|
||||||
|
<url>http://www.tiburon.su/</url>
|
||||||
|
</organization>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Andrey Ivanov</name>
|
||||||
|
<email>ya@tiburon.su</email>
|
||||||
|
<organization>OCTOPUS CodeWare</organization>
|
||||||
|
<organizationUrl>https://www.tiburon.su</organizationUrl>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>atlassian-public</id>
|
||||||
|
<url>https://packages.atlassian.com/maven/repository/public</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<updatePolicy>never</updatePolicy>
|
||||||
|
<checksumPolicy>warn</checksumPolicy>
|
||||||
|
</snapshots>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<checksumPolicy>warn</checksumPolicy>
|
||||||
|
</releases>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<pluginRepositories>
|
||||||
|
<pluginRepository>
|
||||||
|
<id>atlassian-public</id>
|
||||||
|
<url>https://m2proxy.atlassian.com/repository/public/</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</pluginRepository>
|
||||||
|
</pluginRepositories>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.json</groupId>
|
||||||
|
<artifactId>json</artifactId>
|
||||||
|
<version>20090211</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.10</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.confluence</groupId>
|
||||||
|
<artifactId>confluence</artifactId>
|
||||||
|
<version>${confluence.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.plugin</groupId>
|
||||||
|
<artifactId>atlassian-spring-scanner-annotation</artifactId>
|
||||||
|
<version>${atlassian.spring.scanner.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.inject</groupId>
|
||||||
|
<artifactId>javax.inject</artifactId>
|
||||||
|
<version>1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- WIRED TEST RUNNER DEPENDENCIES -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.plugins</groupId>
|
||||||
|
<artifactId>atlassian-plugins-osgi-testrunner</artifactId>
|
||||||
|
<version>${plugin.testrunner.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.ws.rs</groupId>
|
||||||
|
<artifactId>jsr311-api</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.2.2-atlassian-1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>servlet-api</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-api</artifactId>
|
||||||
|
<version>2.3.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.plugins.rest</groupId>
|
||||||
|
<artifactId>atlassian-rest-common</artifactId>
|
||||||
|
<version>1.0.2</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.sal</groupId>
|
||||||
|
<artifactId>sal-api</artifactId>
|
||||||
|
<version>2.10.10</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.wink</groupId>
|
||||||
|
<artifactId>wink-client</artifactId>
|
||||||
|
<version>1.4</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-all</artifactId>
|
||||||
|
<version>1.8.5</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.atlassian.maven.plugins</groupId>
|
||||||
|
<artifactId>confluence-maven-plugin</artifactId>
|
||||||
|
<version>${amps.version}</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<productVersion>${confluence.version}</productVersion>
|
||||||
|
<productDataVersion>${confluence.data.version}</productDataVersion>
|
||||||
|
<enableQuickReload>true</enableQuickReload>
|
||||||
|
<!-- See here for an explanation of default instructions: -->
|
||||||
|
<!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
|
||||||
|
<instructions>
|
||||||
|
<Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
|
||||||
|
<!-- Add package to export here -->
|
||||||
|
<Export-Package>sample.api</Export-Package>
|
||||||
|
<!-- Add package import here -->
|
||||||
|
<Import-Package>
|
||||||
|
<!-- For use of @ModuleType -->
|
||||||
|
<!-- com.atlassian.plugin.osgi.bridge.external, -->
|
||||||
|
<!-- For ConfluenceImports -->
|
||||||
|
com.atlassian.confluence.*;resolution:="optional",
|
||||||
|
<!-- All the rest should be common to all products -->
|
||||||
|
*
|
||||||
|
</Import-Package>
|
||||||
|
<!-- Ensure plugin is spring powered -->
|
||||||
|
<Spring-Context>*</Spring-Context>
|
||||||
|
</instructions>
|
||||||
|
<skipManifestValidation>true</skipManifestValidation>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.atlassian.plugin</groupId>
|
||||||
|
<artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
|
||||||
|
<version>${atlassian.spring.scanner.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>atlassian-spring-scanner</goal>
|
||||||
|
</goals>
|
||||||
|
<phase>process-classes</phase>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<scannedDependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.atlassian.plugin</groupId>
|
||||||
|
<artifactId>atlassian-spring-scanner-external-jar</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</scannedDependencies>
|
||||||
|
<verbose>false</verbose>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<properties>
|
||||||
|
<confluence.version>6.14.0</confluence.version>
|
||||||
|
<confluence.data.version>6.14.0</confluence.data.version>
|
||||||
|
<amps.version>8.0.0</amps.version>
|
||||||
|
<plugin.testrunner.version>2.0.1</plugin.testrunner.version>
|
||||||
|
<atlassian.spring.scanner.version>2.1.8</atlassian.spring.scanner.version>
|
||||||
|
<!-- This property ensures consistency between the key in atlassian-plugin.xml and the OSGi bundle's key. -->
|
||||||
|
<atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
</project>
|
|
@ -0,0 +1,49 @@
|
||||||
|
package su.tiburon.atlassian.confluence.api;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.atlassian.confluence.pages.AbstractPage;
|
||||||
|
import com.atlassian.confluence.pages.Attachment;
|
||||||
|
import com.atlassian.confluence.pages.Page;
|
||||||
|
import com.atlassian.confluence.spaces.Space;
|
||||||
|
|
||||||
|
import su.tiburon.atlassian.confluence.rest.PageVersionsModel;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.SpaceTrashModel;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.SpaceVersionsModel;
|
||||||
|
|
||||||
|
public interface DataCleanUtil {
|
||||||
|
public abstract Date getCreatedOrUpdatedDate(int paramInt);
|
||||||
|
|
||||||
|
public abstract List<Attachment> getAttachmentVersions(Attachment attachment, int endDays);
|
||||||
|
|
||||||
|
public abstract List<AbstractPage> getPageVersions(Page page, int endDays, String type);
|
||||||
|
|
||||||
|
public abstract long removePageVersions(Page paramPage, int paramInt, String paramString);
|
||||||
|
|
||||||
|
public abstract long removeSpaceVersions(Space paramSpace, int paramInt, String paramString);
|
||||||
|
|
||||||
|
public abstract long removeAllVersions(int paramInt, String paramString);
|
||||||
|
|
||||||
|
public abstract int removeSpaceTrash(Space paramSpace);
|
||||||
|
|
||||||
|
public abstract long removeAllTrash();
|
||||||
|
|
||||||
|
public abstract PageVersionsModel getPageVersionSummary(Page page, int endDays, String type);
|
||||||
|
|
||||||
|
public abstract SpaceVersionsModel getSpaceVersionSummary(Space paramSpace, int paramInt, String paramString);
|
||||||
|
|
||||||
|
public abstract List<SpaceVersionsModel> getAllVersionSummary(int paramInt, String paramString);
|
||||||
|
|
||||||
|
public abstract SpaceTrashModel getSpaceTrashSummary(Space paramSpace);
|
||||||
|
|
||||||
|
public abstract List<SpaceTrashModel> getAllTrashSummary();
|
||||||
|
|
||||||
|
public abstract void setLimit(int paramInt);
|
||||||
|
|
||||||
|
public abstract int getLimit();
|
||||||
|
|
||||||
|
public abstract void setCount(int paramInt);
|
||||||
|
|
||||||
|
public abstract int getCount();
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package su.tiburon.atlassian.confluence.api;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public interface DateTimeUtil {
|
||||||
|
public abstract Date getDate();
|
||||||
|
}
|
|
@ -0,0 +1,364 @@
|
||||||
|
package su.tiburon.atlassian.confluence.impl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.atlassian.confluence.core.VersionHistorySummary;
|
||||||
|
import com.atlassian.confluence.pages.AbstractPage;
|
||||||
|
import com.atlassian.confluence.pages.Attachment;
|
||||||
|
import com.atlassian.confluence.pages.AttachmentManager;
|
||||||
|
import com.atlassian.confluence.pages.Page;
|
||||||
|
import com.atlassian.confluence.pages.PageManager;
|
||||||
|
import com.atlassian.confluence.pages.TrashManager;
|
||||||
|
import com.atlassian.confluence.spaces.Space;
|
||||||
|
import com.atlassian.confluence.spaces.SpaceManager;
|
||||||
|
import com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;
|
||||||
|
import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
|
||||||
|
|
||||||
|
import su.tiburon.atlassian.confluence.api.DataCleanUtil;
|
||||||
|
import su.tiburon.atlassian.confluence.api.DateTimeUtil;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.AttachmentModel;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.PageVersionsModel;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.SpaceTrashModel;
|
||||||
|
import su.tiburon.atlassian.confluence.rest.SpaceVersionsModel;
|
||||||
|
|
||||||
|
@ExportAsService
|
||||||
|
@Named
|
||||||
|
public class DataCleanUtilImpl implements DataCleanUtil {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DataCleanUtil.class);
|
||||||
|
|
||||||
|
@ComponentImport
|
||||||
|
private final PageManager pageManager;
|
||||||
|
@ComponentImport
|
||||||
|
private final AttachmentManager attachmentManager;
|
||||||
|
@ComponentImport
|
||||||
|
private final TrashManager trashManager;
|
||||||
|
@ComponentImport
|
||||||
|
private final SpaceManager spaceManager;
|
||||||
|
private DateTimeUtil dateTimeUtil;
|
||||||
|
private int limit;
|
||||||
|
private int count;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DataCleanUtilImpl(PageManager pageManager, AttachmentManager attachmentManager, TrashManager trashManager, SpaceManager spaceManager, DateTimeUtil dateTimeUtil) {
|
||||||
|
this.pageManager = pageManager;
|
||||||
|
this.attachmentManager = attachmentManager;
|
||||||
|
this.trashManager = trashManager;
|
||||||
|
this.spaceManager = spaceManager;
|
||||||
|
this.limit = 1000;
|
||||||
|
this.count = 0;
|
||||||
|
this.dateTimeUtil = dateTimeUtil;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Date getCreatedOrUpdatedDate(int endDays) {
|
||||||
|
Date defaultDate = dateTimeUtil.getDate();
|
||||||
|
try {
|
||||||
|
int lastCreatedOrUpdated = Integer.parseInt("-" + endDays);
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.setTime(defaultDate);
|
||||||
|
cal.add(Calendar.DAY_OF_MONTH, lastCreatedOrUpdated);
|
||||||
|
return cal.getTime();
|
||||||
|
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
logger.error(e.getMessage(), e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Attachment> getAttachmentVersions(Attachment attachment, int endDays) {
|
||||||
|
List<Attachment> resultAttachments = new ArrayList<Attachment>();
|
||||||
|
Date lastUpdatedOrCreatedDate = getCreatedOrUpdatedDate(endDays);
|
||||||
|
List<Attachment> vAttachments = this.attachmentManager.getPreviousVersions(attachment);
|
||||||
|
|
||||||
|
for (Attachment vAttachment : vAttachments) {
|
||||||
|
if (vAttachment.getLastModificationDate().before(lastUpdatedOrCreatedDate)) {
|
||||||
|
resultAttachments.add(vAttachment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultAttachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AbstractPage> getPageVersions(Page page, int endDays, String type) {
|
||||||
|
List<AbstractPage> resultVersions = new ArrayList<AbstractPage>();
|
||||||
|
Date lastUpdatedOrCreatedDate = getCreatedOrUpdatedDate(endDays);
|
||||||
|
List<VersionHistorySummary> versions = this.pageManager.getVersionHistorySummaries(page);
|
||||||
|
|
||||||
|
for (VersionHistorySummary vSummary : versions) {
|
||||||
|
if (page.getId() != vSummary.getId() && vSummary.getLastModificationDate().before(lastUpdatedOrCreatedDate)) {
|
||||||
|
AbstractPage vPage = this.pageManager.getPage(vSummary.getId());
|
||||||
|
if (vPage == null) {
|
||||||
|
vPage = this.pageManager.getBlogPost(vSummary.getId());
|
||||||
|
|
||||||
|
}
|
||||||
|
if (vPage != null) {
|
||||||
|
resultVersions.add(vPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultVersions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long removePageVersions(Page page, int endDays, String type) {
|
||||||
|
long delete_index = 0;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("all".equals(type) || "page".equals(type)) {
|
||||||
|
List<AbstractPage> aPages = getPageVersions(page, endDays, type);
|
||||||
|
|
||||||
|
for (AbstractPage aPage : aPages) {
|
||||||
|
this.pageManager.removeHistoricalVersion(aPage);
|
||||||
|
delete_index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delete_index > 0) {
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("all".equals(type) || "attachment".equals(type)) {
|
||||||
|
List<Attachment> attachments = attachmentManager.getLatestVersionsOfAttachments(page);
|
||||||
|
|
||||||
|
for (Attachment attachment : attachments) {
|
||||||
|
List<Attachment> targetAttachments = getAttachmentVersions(attachment, endDays);
|
||||||
|
|
||||||
|
for (Attachment targetAttachment : targetAttachments) {
|
||||||
|
this.attachmentManager.removeAttachmentVersionFromServer(targetAttachment);
|
||||||
|
delete_index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetAttachments.size() > 0) {
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long removeSpaceVersions(Space space, int endDays, String type) {
|
||||||
|
Date lastUpdatedOrCreatedDate = getCreatedOrUpdatedDate(endDays);
|
||||||
|
Collection<Page> pages = this.pageManager.getPages(space, true);
|
||||||
|
long delete_index = 0L;
|
||||||
|
|
||||||
|
for (Page page : pages) {
|
||||||
|
if (page.getCreationDate().before(lastUpdatedOrCreatedDate)) {
|
||||||
|
delete_index += removePageVersions(page, endDays, type);
|
||||||
|
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long removeAllVersions(int endDays, String type) {
|
||||||
|
long delete_index = 0L;
|
||||||
|
for (Space space : this.spaceManager.getAllSpaces()) {
|
||||||
|
delete_index += this.removeSpaceVersions(space, endDays, type);
|
||||||
|
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return delete_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int removeSpaceTrash(Space space) {
|
||||||
|
int numberOfItems = this.trashManager.getNumberOfItemsInTrash(space);
|
||||||
|
this.trashManager.emptyTrash(space);
|
||||||
|
|
||||||
|
return numberOfItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long removeAllTrash() {
|
||||||
|
long deleted = 0L;
|
||||||
|
for (Space space : this.spaceManager.getAllSpaces()) {
|
||||||
|
deleted += this.removeSpaceTrash(space);
|
||||||
|
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageVersionsModel getPageVersionSummary(Page page, int endDays, String type) {
|
||||||
|
List<AbstractPage> resultVersions = new ArrayList<AbstractPage>();
|
||||||
|
if ("all".equals(type) || "page".equals(type)) {
|
||||||
|
resultVersions = getPageVersions(page, endDays, type);
|
||||||
|
}
|
||||||
|
PageVersionsModel pageModel = new PageVersionsModel();
|
||||||
|
String modifier = page.getLastModifier() != null ? page.getLastModifier().getName() : "";
|
||||||
|
pageModel.setId(page.getId());
|
||||||
|
pageModel.setTitle(page.getTitle());
|
||||||
|
pageModel.setVersionCount(resultVersions.size());
|
||||||
|
pageModel.setLastModifier(modifier);
|
||||||
|
pageModel.setLastModified(page.getLastModificationDate());
|
||||||
|
|
||||||
|
long totalPageVersionCount = pageModel.getVersionCount();
|
||||||
|
if (pageModel.getVersionCount() > 0) {
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
pageModel.setTotalVersionCount(totalPageVersionCount);
|
||||||
|
return pageModel;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("all".equals(type) || "attachment".equals(type)) {
|
||||||
|
List<Attachment> attachments = attachmentManager.getLatestVersionsOfAttachments(page);
|
||||||
|
List<Attachment> attachmentVersions = new ArrayList<Attachment>();
|
||||||
|
List<AttachmentModel> attachmentModels = new ArrayList<AttachmentModel>();
|
||||||
|
|
||||||
|
for (Attachment attachment : attachments) {
|
||||||
|
List<Attachment> tmpAttachmentVersions = getAttachmentVersions(attachment, endDays);
|
||||||
|
int tmpAttachmentVersionsCount = tmpAttachmentVersions.size();
|
||||||
|
|
||||||
|
if (tmpAttachmentVersionsCount > 0) {
|
||||||
|
attachmentVersions.addAll(tmpAttachmentVersions);
|
||||||
|
totalPageVersionCount += tmpAttachmentVersions.size();
|
||||||
|
String last_modifier = attachment.getLastModifier() != null ? attachment.getLastModifier().getName() : "";
|
||||||
|
AttachmentModel model = new AttachmentModel(
|
||||||
|
attachment.getId(),
|
||||||
|
attachment.getTitle(),
|
||||||
|
tmpAttachmentVersionsCount,
|
||||||
|
last_modifier,
|
||||||
|
attachment.getLastModificationDate()
|
||||||
|
);
|
||||||
|
attachmentModels.add(model);
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pageModel.setAttachments(attachmentModels);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pageModel.setTotalVersionCount(totalPageVersionCount);
|
||||||
|
return pageModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SpaceVersionsModel getSpaceVersionSummary(Space space, int endDays, String type) {
|
||||||
|
Collection<Page> pages = this.pageManager.getPages(space, true);
|
||||||
|
List<PageVersionsModel> pageModels = new ArrayList<PageVersionsModel>();
|
||||||
|
|
||||||
|
long totalSpaceVersionCount = 0;
|
||||||
|
for (Page page : pages) {
|
||||||
|
PageVersionsModel pageModel = getPageVersionSummary(page, endDays, type);
|
||||||
|
|
||||||
|
if (pageModel.getTotalVersionCount() > 0) {
|
||||||
|
totalSpaceVersionCount += pageModel.getTotalVersionCount();
|
||||||
|
pageModels.add(pageModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SpaceVersionsModel spaceModel = new SpaceVersionsModel(space.getKey(), space.getDisplayTitle(), totalSpaceVersionCount, pageModels);
|
||||||
|
|
||||||
|
return spaceModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SpaceVersionsModel> getAllVersionSummary(int endDays, String type) {
|
||||||
|
List<SpaceVersionsModel> spaceModels = new ArrayList<SpaceVersionsModel>();
|
||||||
|
for (Space space : this.spaceManager.getAllSpaces()) {
|
||||||
|
SpaceVersionsModel spaceModel = this.getSpaceVersionSummary(space, endDays, type);
|
||||||
|
|
||||||
|
if(spaceModel.getTotalVersionCount() > 0) {
|
||||||
|
spaceModels.add(spaceModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return spaceModels;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return spaceModels;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SpaceTrashModel getSpaceTrashSummary(Space space) {
|
||||||
|
int numberOfItems = this.trashManager.getNumberOfItemsInTrash(space);
|
||||||
|
SpaceTrashModel trashModel = new SpaceTrashModel(space.getKey(), space.getDisplayTitle(), numberOfItems);
|
||||||
|
|
||||||
|
return trashModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SpaceTrashModel> getAllTrashSummary() {
|
||||||
|
List<SpaceTrashModel> trashModels = new ArrayList<SpaceTrashModel>();
|
||||||
|
for (Space space : this.spaceManager.getAllSpaces()) {
|
||||||
|
SpaceTrashModel trashModel = this.getSpaceTrashSummary(space);
|
||||||
|
|
||||||
|
if (trashModel.getNumberOfItemsInTrash() > 0) {
|
||||||
|
|
||||||
|
trashModels.add(trashModel);
|
||||||
|
|
||||||
|
this.count++;
|
||||||
|
if (this.count >= this.limit) {
|
||||||
|
return trashModels;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return trashModels;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLimit(int limit) {
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLimit() {
|
||||||
|
return this.limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCount(int count) {
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return this.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package su.tiburon.atlassian.confluence.impl;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
import com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;
|
||||||
|
|
||||||
|
import su.tiburon.atlassian.confluence.api.DateTimeUtil;
|
||||||
|
|
||||||
|
@ExportAsService
|
||||||
|
@Named
|
||||||
|
public class DateTimeUtilImpl implements DateTimeUtil {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Date getDate() {
|
||||||
|
return new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class AllTrashModel {
|
||||||
|
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name="trash")
|
||||||
|
public List<SpaceTrashModel> trashList;
|
||||||
|
|
||||||
|
public AllTrashModel() {
|
||||||
|
this.trashList = new ArrayList<SpaceTrashModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AllTrashModel(List<SpaceTrashModel> trashList) {
|
||||||
|
this.trashList = trashList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SpaceTrashModel> getTrashList() {
|
||||||
|
return trashList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrashList(List<SpaceTrashModel> trashList) {
|
||||||
|
this.trashList = trashList;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class AllVersionsModel {
|
||||||
|
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name="space")
|
||||||
|
public List<SpaceVersionsModel> spaces;
|
||||||
|
|
||||||
|
public AllVersionsModel() {
|
||||||
|
this.spaces = new ArrayList<SpaceVersionsModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AllVersionsModel(List<SpaceVersionsModel> spaces) {
|
||||||
|
this.spaces = spaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SpaceVersionsModel> getSpaces() {
|
||||||
|
return spaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpaces(List<SpaceVersionsModel> spaces) {
|
||||||
|
this.spaces = spaces;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class AttachmentModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String id;
|
||||||
|
@XmlElement
|
||||||
|
public String title;
|
||||||
|
@XmlElement
|
||||||
|
public int versionCount;
|
||||||
|
@XmlElement
|
||||||
|
public String lastModifier;
|
||||||
|
@XmlElement
|
||||||
|
public String lastModified;
|
||||||
|
|
||||||
|
public AttachmentModel() {
|
||||||
|
this.id = "";
|
||||||
|
this.title = "";
|
||||||
|
this.versionCount = -1;
|
||||||
|
this.lastModifier = "";
|
||||||
|
this.lastModified = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public AttachmentModel(Long id, String title, int versionCount, String lastModifier, Date lastModified) {
|
||||||
|
this.id = String.valueOf(id);
|
||||||
|
this.title = title;
|
||||||
|
this.versionCount = versionCount;
|
||||||
|
this.lastModifier = lastModifier;
|
||||||
|
this.lastModified = String.valueOf(lastModified);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = String.valueOf(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVersionCount() {
|
||||||
|
return versionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersionCount(int versionCount) {
|
||||||
|
this.versionCount = versionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastModifier() {
|
||||||
|
return lastModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModifier(String lastModifier) {
|
||||||
|
this.lastModifier = lastModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastModified() {
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModified(Date lastModified) {
|
||||||
|
this.lastModified = String.valueOf(lastModified);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,456 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.ws.rs.DELETE;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.PathParam;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.QueryParam;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.atlassian.confluence.pages.Page;
|
||||||
|
import com.atlassian.confluence.pages.PageManager;
|
||||||
|
import com.atlassian.confluence.security.Permission;
|
||||||
|
import com.atlassian.confluence.security.PermissionManager;
|
||||||
|
import com.atlassian.confluence.spaces.Space;
|
||||||
|
import com.atlassian.confluence.spaces.SpaceManager;
|
||||||
|
import com.atlassian.confluence.user.AuthenticatedUserThreadLocal;
|
||||||
|
import com.atlassian.confluence.user.ConfluenceUser;
|
||||||
|
import com.atlassian.plugin.spring.scanner.annotation.imports.ConfluenceImport;
|
||||||
|
import com.atlassian.plugins.rest.common.security.AnonymousAllowed;
|
||||||
|
|
||||||
|
import su.tiburon.atlassian.confluence.api.DataCleanUtil;
|
||||||
|
|
||||||
|
@Path("/api")
|
||||||
|
public class Cleaner {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Cleaner.class);
|
||||||
|
|
||||||
|
private final DataCleanUtil dataCleanUtil;
|
||||||
|
@ConfluenceImport
|
||||||
|
private final PermissionManager permissionManager;
|
||||||
|
@ConfluenceImport
|
||||||
|
private final PageManager pageManager;
|
||||||
|
@ConfluenceImport
|
||||||
|
private final SpaceManager spaceManager;
|
||||||
|
private final static int MAX_LIMIT_FOR_VERSIONS = 1000;
|
||||||
|
private final static int MAX_LIMIT_FOR_TRASH = 100;
|
||||||
|
private final static long NOT_DELETED = 0;
|
||||||
|
private final static String ITEM_TYPE_FOR_SPACE_TRASH = "SpaceTrash";
|
||||||
|
private final static String END_DAYS_FOR_SPACE_TRASH = "Endless";
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public Cleaner(DataCleanUtil dataCleanUtil, PermissionManager permissionManager, PageManager pageManager, SpaceManager spaceManager) {
|
||||||
|
this.dataCleanUtil = dataCleanUtil;
|
||||||
|
this.permissionManager = permissionManager;
|
||||||
|
this.pageManager = pageManager;
|
||||||
|
this.spaceManager = spaceManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/all")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response getAllVersions(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr) {
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
List<SpaceVersionsModel> spaceModels = this.dataCleanUtil.getAllVersionSummary(baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
NOT_DELETED,
|
||||||
|
NOT_DELETED,
|
||||||
|
spaceModels);
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/all")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response deleteAllVersions(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr) {
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
logger.info(MessageFormat.format("User({0}) deleting versions for all spaces..", new Object[] {loggedInAppUser.getName() }));
|
||||||
|
long deleted = this.dataCleanUtil.removeAllVersions(baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
deleted,
|
||||||
|
new MessageModel("Deleted Versions Count - " + deleted));
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/space/{spaceKey}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response getSpaceVersionsBySpaceKey(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr, @PathParam("spaceKey") String spaceKey) {
|
||||||
|
// Authentication
|
||||||
|
if (StringUtils.isEmpty(spaceKey)) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Space space = this.spaceManager.getSpace(spaceKey);
|
||||||
|
if (space == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.VIEW, space)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "View Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
SpaceVersionsModel spaceVersionModel = this.dataCleanUtil.getSpaceVersionSummary(space, baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
NOT_DELETED,
|
||||||
|
NOT_DELETED,
|
||||||
|
spaceVersionModel);
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/space/{spaceKey}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response deleteSpaceVersionsBySpaceKey(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr, @PathParam("spaceKey") String spaceKey) {
|
||||||
|
// Authentication
|
||||||
|
if (StringUtils.isEmpty(spaceKey)) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Space space = this.spaceManager.getSpace(spaceKey);
|
||||||
|
if (space == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.ADMINISTER, space)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Admin Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
logger.info(MessageFormat.format("User({0}) deleting versions for spaceKey {1}", new Object[] {loggedInAppUser.getName(), spaceKey }));
|
||||||
|
long deleted = this.dataCleanUtil.removeSpaceVersions(space, baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
deleted,
|
||||||
|
new MessageModel("Deleted Versions Count - " + deleted));
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/page/{pageId}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response getPageVersionsByPageId(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr, @PathParam("pageId") long pageId) {
|
||||||
|
// Authentication
|
||||||
|
if (pageId <= 0L) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Page page = this.pageManager.getPage(pageId);
|
||||||
|
if (page == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.VIEW, page)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "View Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
PageVersionsModel pageVersionsModel = this.dataCleanUtil.getPageVersionSummary(page, baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
NOT_DELETED,
|
||||||
|
NOT_DELETED,
|
||||||
|
pageVersionsModel);
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/versions/page/{pageId}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response deletePageVersionsByPageId(@QueryParam("type") String type, @QueryParam("endDays") String endDaysStr, @QueryParam("limit") String limitStr, @PathParam("pageId") long pageId) {
|
||||||
|
// Authentication
|
||||||
|
if (pageId <= 0L) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Page page = this.pageManager.getPage(pageId);
|
||||||
|
if (page == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.ADMINISTER, page)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Admin Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
VersionBaseParam baseParam = new VersionBaseParam(type, endDaysStr, limitStr, MAX_LIMIT_FOR_VERSIONS);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
logger.info(MessageFormat.format("User({0}) deleting page versions for pageId {1}", new Object[] {loggedInAppUser.getName(), Long.valueOf(pageId) }));
|
||||||
|
long deleted = this.dataCleanUtil.removePageVersions(page, baseParam.getEndDays(), baseParam.getType());
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
deleted,
|
||||||
|
new MessageModel("Deleted Versions Count - " + deleted));
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/trash/all")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response getAllGarbages(@QueryParam("limit") String limitStr) {
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
TrashBaseParam baseParam = new TrashBaseParam(ITEM_TYPE_FOR_SPACE_TRASH, END_DAYS_FOR_SPACE_TRASH, limitStr, MAX_LIMIT_FOR_TRASH);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
List<SpaceTrashModel> trashModels = this.dataCleanUtil.getAllTrashSummary();
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
NOT_DELETED,
|
||||||
|
NOT_DELETED,
|
||||||
|
trashModels);
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/trash/all")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response deleteAllGarbages(@QueryParam("limit") String limitStr) {
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
TrashBaseParam baseParam = new TrashBaseParam(ITEM_TYPE_FOR_SPACE_TRASH, END_DAYS_FOR_SPACE_TRASH, limitStr, MAX_LIMIT_FOR_TRASH);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
logger.info(MessageFormat.format("User({0}) deleting space trash for all", new Object[] {loggedInAppUser.getName() }));
|
||||||
|
long deleted = this.dataCleanUtil.removeAllTrash();
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
deleted,
|
||||||
|
new MessageModel("Deleted Trash Items Count - " + deleted));
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/trash/space/{spaceKey}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response getSpaceGarbagesBySpaceKey(@QueryParam("limit") String limitStr, @PathParam("spaceKey") String spaceKey) {
|
||||||
|
// Authentication
|
||||||
|
if (StringUtils.isEmpty(spaceKey)) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Space space = this.spaceManager.getSpace(spaceKey);
|
||||||
|
if (space == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.VIEW, space)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "View Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
TrashBaseParam baseParam = new TrashBaseParam(ITEM_TYPE_FOR_SPACE_TRASH, END_DAYS_FOR_SPACE_TRASH, limitStr, MAX_LIMIT_FOR_TRASH);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
SpaceTrashModel spaceTrashModel = this.dataCleanUtil.getSpaceTrashSummary(space);
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
NOT_DELETED,
|
||||||
|
NOT_DELETED,
|
||||||
|
spaceTrashModel);
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Produces({MediaType.APPLICATION_JSON})
|
||||||
|
@Path("/trash/space/{spaceKey}")
|
||||||
|
@AnonymousAllowed
|
||||||
|
public Response deleteSpaceGarbagesBySpaceKey(@QueryParam("limit") String limitStr, @PathParam("spaceKey") String spaceKey) {
|
||||||
|
// Authentication
|
||||||
|
if (StringUtils.isEmpty(spaceKey)) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorModel("400 Bad Request", "Required fields are missing. : spaceKey")).build();
|
||||||
|
}
|
||||||
|
Space space = this.spaceManager.getSpace(spaceKey);
|
||||||
|
if (space == null) {
|
||||||
|
return Response.status(Response.Status.NOT_FOUND).entity(new ErrorModel("404 Not Found", "Space is not exists!")).build();
|
||||||
|
}
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.hasPermission(loggedInAppUser, Permission.ADMINISTER, space)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Admin Permission denied!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate Params
|
||||||
|
TrashBaseParam baseParam = new TrashBaseParam(ITEM_TYPE_FOR_SPACE_TRASH, END_DAYS_FOR_SPACE_TRASH, limitStr, MAX_LIMIT_FOR_TRASH);
|
||||||
|
if (baseParam.getErrorModel().getMessages().size() > 0) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(baseParam.getErrorModel()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up
|
||||||
|
this.dataCleanUtil.setLimit(baseParam.getLimit());
|
||||||
|
this.dataCleanUtil.setCount(0);
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
logger.info(MessageFormat.format("User({0}) deleting space trash for spaceKey {1}", new Object[] {loggedInAppUser.getName(), Long.valueOf(spaceKey) }));
|
||||||
|
int deleted = 0;
|
||||||
|
deleted = this.dataCleanUtil.removeSpaceTrash(space);
|
||||||
|
|
||||||
|
ResponseModel responseModel = new ResponseModel(
|
||||||
|
baseParam.getType(),
|
||||||
|
baseParam.getEndDays(),
|
||||||
|
baseParam.getLimit(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
this.dataCleanUtil.getCount(),
|
||||||
|
deleted,
|
||||||
|
new MessageModel("Deleted Trash Items Count - " + deleted));
|
||||||
|
return Response.ok(responseModel).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import com.atlassian.crowd.embedded.api.DirectoryType;
|
||||||
|
|
||||||
|
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class DirectoryModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
private DirectoryType type;
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
private Boolean issynchronising;
|
||||||
|
|
||||||
|
public DirectoryModel() {
|
||||||
|
this.id = null;
|
||||||
|
this.type = null;
|
||||||
|
this.issynchronising = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DirectoryModel(Long id, DirectoryType type, Boolean issynchronising) {
|
||||||
|
this.id = id;
|
||||||
|
this.type = type;
|
||||||
|
this.issynchronising = issynchronising;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.PUT;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.QueryParam;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.atlassian.confluence.security.PermissionManager;
|
||||||
|
import com.atlassian.confluence.user.AuthenticatedUserThreadLocal;
|
||||||
|
import com.atlassian.confluence.user.ConfluenceUser;
|
||||||
|
import com.atlassian.plugin.spring.scanner.annotation.imports.ConfluenceImport;
|
||||||
|
import com.atlassian.plugins.rest.common.security.AnonymousAllowed;
|
||||||
|
import com.atlassian.crowd.embedded.api.CrowdDirectoryService;
|
||||||
|
import com.atlassian.crowd.embedded.api.Directory;
|
||||||
|
|
||||||
|
@Path("/directory")
|
||||||
|
@AnonymousAllowed
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public class DirectoryService {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DirectoryService.class);
|
||||||
|
|
||||||
|
@ConfluenceImport
|
||||||
|
private final PermissionManager permissionManager;
|
||||||
|
|
||||||
|
@ConfluenceImport
|
||||||
|
private final CrowdDirectoryService crowdDirectoryService;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DirectoryService(PermissionManager permissionManager, CrowdDirectoryService crowdDirectoryService) {
|
||||||
|
this.permissionManager = permissionManager;
|
||||||
|
this.crowdDirectoryService = crowdDirectoryService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
public Response getDir() {
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
logger.info(MessageFormat.format("User({0}) requesting infodmation about CUDs", new Object[] {loggedInAppUser.getName() }));
|
||||||
|
|
||||||
|
Collection<DirectoryModel> coll = new ArrayList<DirectoryModel>();
|
||||||
|
|
||||||
|
for (Directory dsa : crowdDirectoryService.findAllDirectories()) {
|
||||||
|
coll.add(new DirectoryModel(dsa.getId(),dsa.getType(),crowdDirectoryService.isDirectorySynchronising(dsa.getId())));
|
||||||
|
}
|
||||||
|
return Response.ok(coll).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
public Response syncDir(@QueryParam("id") Long dirId) {
|
||||||
|
|
||||||
|
// Authentication
|
||||||
|
ConfluenceUser loggedInAppUser = AuthenticatedUserThreadLocal.get();
|
||||||
|
if (!this.permissionManager.isConfluenceAdministrator(loggedInAppUser)) {
|
||||||
|
return Response.status(Response.Status.UNAUTHORIZED).entity(new ErrorModel("401 Unauthorized", "Confluence Administrator Permission required!")).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
crowdDirectoryService.synchroniseDirectory(dirId, true);
|
||||||
|
|
||||||
|
Collection<DirectoryModel> coll = new ArrayList<DirectoryModel>();
|
||||||
|
|
||||||
|
for (Directory dsa : crowdDirectoryService.findAllDirectories()) {
|
||||||
|
coll.add(new DirectoryModel(dsa.getId(),dsa.getType(),crowdDirectoryService.isDirectorySynchronising(dsa.getId())));
|
||||||
|
}
|
||||||
|
return Response.ok(coll).build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class ErrorModel {
|
||||||
|
|
||||||
|
@XmlElement(name = "statusCode")
|
||||||
|
private String statusCode;
|
||||||
|
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name="message")
|
||||||
|
public List<MessageModel> messages;
|
||||||
|
|
||||||
|
public ErrorModel() {
|
||||||
|
this.statusCode = "";
|
||||||
|
this.messages = new ArrayList<MessageModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ErrorModel(String statusCode, String messages) {
|
||||||
|
this.statusCode = statusCode;
|
||||||
|
this.messages = new ArrayList<MessageModel>();
|
||||||
|
this.addMessage(messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatusCode() {
|
||||||
|
return statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusCode(String statusCode) {
|
||||||
|
this.statusCode = statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MessageModel> getMessages() {
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessages(List<MessageModel> messages) {
|
||||||
|
this.messages = messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMessage(String message) {
|
||||||
|
this.messages.add(new MessageModel(message));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class MessageModel {
|
||||||
|
|
||||||
|
@XmlElement(name = "message")
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public MessageModel() {
|
||||||
|
this.message = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageModel(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class PageVersionsModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String id;
|
||||||
|
@XmlElement
|
||||||
|
public String title;
|
||||||
|
@XmlElement
|
||||||
|
public long totalVersionCount;
|
||||||
|
@XmlElement
|
||||||
|
public int versionCount;
|
||||||
|
@XmlElement
|
||||||
|
public String lastModifier;
|
||||||
|
@XmlElement
|
||||||
|
public String lastModified;
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name="attachment")
|
||||||
|
public List<AttachmentModel> attachments;
|
||||||
|
|
||||||
|
public PageVersionsModel() {
|
||||||
|
this.id = "";
|
||||||
|
this.title = "";
|
||||||
|
this.versionCount = -1;
|
||||||
|
this.totalVersionCount = -1;
|
||||||
|
this.lastModifier = "";
|
||||||
|
this.lastModified = "";
|
||||||
|
this.attachments = new ArrayList<AttachmentModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PageVersionsModel(Long id, String title, long totalVersionCount, int versionCount, String lastModifier, Date lastModified, List<AttachmentModel> attachments) {
|
||||||
|
this.id = String.valueOf(id);
|
||||||
|
this.title = title;
|
||||||
|
this.totalVersionCount = totalVersionCount;
|
||||||
|
this.versionCount = versionCount;
|
||||||
|
this.lastModifier = lastModifier;
|
||||||
|
this.lastModified = String.valueOf(lastModified);
|
||||||
|
this.attachments = attachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = String.valueOf(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVersionCount() {
|
||||||
|
return versionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersionCount(int versionCount) {
|
||||||
|
this.versionCount = versionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastModifier() {
|
||||||
|
return lastModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModifier(String lastModifier) {
|
||||||
|
this.lastModifier = lastModifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastModified() {
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModified(Date lastModified) {
|
||||||
|
this.lastModified = String.valueOf(lastModified);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<AttachmentModel> getAttachments() {
|
||||||
|
return attachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAttachments(List<AttachmentModel> attachments) {
|
||||||
|
this.attachments = attachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalVersionCount() {
|
||||||
|
return this.totalVersionCount;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalVersionCount(long totalVersionCount) {
|
||||||
|
this.totalVersionCount = totalVersionCount;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class ResponseModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String itemType;
|
||||||
|
@XmlElement
|
||||||
|
public String endDays;
|
||||||
|
@XmlElement
|
||||||
|
public int itemCountLimit;
|
||||||
|
@XmlElement
|
||||||
|
public int targetItemCount;
|
||||||
|
@XmlElement
|
||||||
|
public long deletedItemCount;
|
||||||
|
@XmlElement
|
||||||
|
public long deletedVersionCount;
|
||||||
|
@XmlElement
|
||||||
|
public Object result;
|
||||||
|
|
||||||
|
public ResponseModel(String itemType, int endDays, int itemCountLimit, int targetItemCount, long deletedItemCount, long deletedVersionCount, Object result) {
|
||||||
|
this.itemType = itemType;
|
||||||
|
this.endDays = String.valueOf(endDays);
|
||||||
|
this.itemCountLimit = itemCountLimit;
|
||||||
|
this.targetItemCount = targetItemCount;
|
||||||
|
this.deletedItemCount = deletedItemCount;
|
||||||
|
this.deletedVersionCount = deletedVersionCount;
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResponseModel(String itemType, String endDaysStr, int itemCountLimit, int targetItemCount, long deletedItemCount, long deletedVersionCount, Object result) {
|
||||||
|
this.itemType = itemType;
|
||||||
|
this.endDays = endDaysStr;
|
||||||
|
this.itemCountLimit = itemCountLimit;
|
||||||
|
this.targetItemCount = targetItemCount;
|
||||||
|
this.deletedItemCount = deletedItemCount;
|
||||||
|
this.deletedVersionCount = deletedVersionCount;
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getItemType() {
|
||||||
|
return itemType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItemType(String itemType) {
|
||||||
|
this.itemType = itemType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndDays() {
|
||||||
|
return endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDays(String endDays) {
|
||||||
|
this.endDays = endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getItemCountLimit() {
|
||||||
|
return itemCountLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setItemCountLimit(int itemCountLimit) {
|
||||||
|
this.itemCountLimit = itemCountLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTargetItemCount() {
|
||||||
|
return targetItemCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTargetItemCount(int targetItemCount) {
|
||||||
|
this.targetItemCount = targetItemCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDeletedItemCount() {
|
||||||
|
return deletedItemCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedItemCount(long deletedItemCount) {
|
||||||
|
this.deletedItemCount = deletedItemCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDeletedVersionCount() {
|
||||||
|
return deletedVersionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeletedVersionCount(long deletedVersionCount) {
|
||||||
|
this.deletedVersionCount = deletedVersionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResult(Object result) {
|
||||||
|
this.result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class SpaceTrashModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String spaceKey;
|
||||||
|
@XmlElement
|
||||||
|
public String title;
|
||||||
|
@XmlElement
|
||||||
|
public int numberOfItemsInTrash;
|
||||||
|
|
||||||
|
public SpaceTrashModel() {
|
||||||
|
this.spaceKey = "";
|
||||||
|
this.title = "";
|
||||||
|
this.numberOfItemsInTrash = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpaceTrashModel(String spaceKey, String title, int numberOfItemsInTrash) {
|
||||||
|
this.spaceKey = spaceKey;
|
||||||
|
this.title = title;
|
||||||
|
this.numberOfItemsInTrash = numberOfItemsInTrash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSpaceKey() {
|
||||||
|
return spaceKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpaceKey(String spaceKey) {
|
||||||
|
this.spaceKey = spaceKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNumberOfItemsInTrash() {
|
||||||
|
return numberOfItemsInTrash;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNumberOfItemsInTrash(int numberOfItemsInTrash) {
|
||||||
|
this.numberOfItemsInTrash = numberOfItemsInTrash;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
@XmlRootElement
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
public class SpaceVersionsModel {
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String spaceKey;
|
||||||
|
@XmlElement
|
||||||
|
public String title;
|
||||||
|
@XmlElement
|
||||||
|
public long totalVersionCount;
|
||||||
|
@XmlElementWrapper
|
||||||
|
@XmlElement(name="page")
|
||||||
|
public List<PageVersionsModel> pages;
|
||||||
|
|
||||||
|
public SpaceVersionsModel() {
|
||||||
|
this.spaceKey = "";
|
||||||
|
this.title = "";
|
||||||
|
this.totalVersionCount = -1;
|
||||||
|
this.pages = new ArrayList<PageVersionsModel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpaceVersionsModel(String spaceKey, String title, long totalVersionCount, List<PageVersionsModel> pages) {
|
||||||
|
this.spaceKey = spaceKey;
|
||||||
|
this.title = title;
|
||||||
|
this.totalVersionCount = totalVersionCount;
|
||||||
|
this.pages = pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSpaceKey() {
|
||||||
|
return spaceKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpaceKey(String spaceKey) {
|
||||||
|
this.spaceKey = spaceKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalVersionCount() {
|
||||||
|
return totalVersionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalVersionCount(long totalVersionCount) {
|
||||||
|
this.totalVersionCount = totalVersionCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PageVersionsModel> getPages() {
|
||||||
|
return pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPages(List<PageVersionsModel> pages) {
|
||||||
|
this.pages = pages;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
public class TrashBaseParam {
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
private String endDays;
|
||||||
|
private int limit;
|
||||||
|
private ErrorModel errorModel;
|
||||||
|
|
||||||
|
|
||||||
|
public TrashBaseParam(String type, String endDaysStr, String limitStr, int maxLimit) {
|
||||||
|
this.errorModel = new ErrorModel();
|
||||||
|
this.type = type;
|
||||||
|
this.endDays = endDaysStr;
|
||||||
|
validateLimit(limitStr, maxLimit);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getEndDays() {
|
||||||
|
return endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setEndDays(String endDays) {
|
||||||
|
this.endDays = endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getLimit() {
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setLimit(int limit) {
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ErrorModel getErrorModel() {
|
||||||
|
return errorModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateLimit(String limitStr, int maxLimit) {
|
||||||
|
if(StringUtils.isEmpty(limitStr)) {
|
||||||
|
limitStr = String.valueOf(maxLimit);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.limit = Integer.parseInt(limitStr);
|
||||||
|
if (limit < 1 || limit > maxLimit) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("limit is invalid. : limit=1~" + String.valueOf(maxLimit));
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("limit is invalid. : limit=1~" + String.valueOf(maxLimit));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
package su.tiburon.atlassian.confluence.rest;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
public class VersionBaseParam {
|
||||||
|
|
||||||
|
private String type;
|
||||||
|
private int endDays;
|
||||||
|
private int limit;
|
||||||
|
private ErrorModel errorModel;
|
||||||
|
|
||||||
|
|
||||||
|
public VersionBaseParam(String type, String endDaysStr, String limitStr, int maxLimit) {
|
||||||
|
this.errorModel = new ErrorModel();
|
||||||
|
validateType(type);
|
||||||
|
validateEndDays(endDaysStr);
|
||||||
|
validateLimit(limitStr, maxLimit);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getEndDays() {
|
||||||
|
return endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setEndDays(int endDays) {
|
||||||
|
this.endDays = endDays;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getLimit() {
|
||||||
|
return limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setLimit(int limit) {
|
||||||
|
this.limit = limit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public ErrorModel getErrorModel() {
|
||||||
|
return errorModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateType(String type) {
|
||||||
|
if(StringUtils.isEmpty(type)) {
|
||||||
|
type = "all";
|
||||||
|
}
|
||||||
|
if ("all".equals(type) || "page".equals(type) || "attachment".equals(type)) {
|
||||||
|
this.type = type;
|
||||||
|
} else {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("type is invalid. : type=all or type=page or type=attachment");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateEndDays(String endDaysStr) {
|
||||||
|
if(StringUtils.isEmpty(endDaysStr)) {
|
||||||
|
endDaysStr = "0";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.endDays = Integer.parseInt(endDaysStr);
|
||||||
|
if (endDays < 0 ) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("endDays is invalid. : endDays=0~ ");
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("endDays is invalid. : endDays=0~ ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateLimit(String limitStr, int maxLimit) {
|
||||||
|
if(StringUtils.isEmpty(limitStr)) {
|
||||||
|
limitStr = String.valueOf(maxLimit);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
this.limit = Integer.parseInt(limitStr);
|
||||||
|
if (limit < 1 || limit > maxLimit) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("limit is invalid. : limit=1~" + String.valueOf(maxLimit));
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
this.errorModel.setStatusCode("400 Bad Request");
|
||||||
|
this.errorModel.addMessage("limit is invalid. : limit=1~" + String.valueOf(maxLimit));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:atlassian-scanner="http://www.atlassian.com/schema/atlassian-scanner/2"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||||
|
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
|
||||||
|
http://www.atlassian.com/schema/atlassian-scanner/2
|
||||||
|
http://www.atlassian.com/schema/atlassian-scanner/2/atlassian-scanner.xsd">
|
||||||
|
<atlassian-scanner:scan-indexes/>
|
||||||
|
</beans>
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<atlassian-plugin key="${atlassian.plugin.key}" name="${project.name}" plugins-version="2">
|
||||||
|
<plugin-info>
|
||||||
|
<description>${project.description}</description>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<vendor name="${project.organization.name}" url="${project.organization.url}"/>
|
||||||
|
<param name="plugin-icon">images/logo_octo_375_293.png</param>
|
||||||
|
<param name="plugin-logo">images/logo_octo_375_293.png</param>
|
||||||
|
</plugin-info>
|
||||||
|
<!-- add our i18n resource -->
|
||||||
|
<resource type="i18n" name="i18n" location="rest-extender"/>
|
||||||
|
<!-- add our web resources -->
|
||||||
|
<web-resource key="rest-extender-web-resources" name="Rest Extender Web Resources">
|
||||||
|
<dependency>com.atlassian.auiplugin:ajs</dependency>
|
||||||
|
<resource type="download" name="rest-extender.css" location="/css/rest-extender.css"/>
|
||||||
|
<resource type="download" name="rest-extender.js" location="/js/rest-extender.js"/>
|
||||||
|
<resource type="download" name="images/" location="/images"/>
|
||||||
|
<context>rest-extender</context>
|
||||||
|
</web-resource>
|
||||||
|
<rest name="Rest Extender" i18n-name-key="rest-extender.name" key="rest-extender" path="/extender" version="1">
|
||||||
|
<description key="rest-extender.description">Rest Extender Plugin</description>
|
||||||
|
</rest>
|
||||||
|
</atlassian-plugin>
|
Binary file not shown.
After Width: | Height: | Size: 47 KiB |
|
@ -0,0 +1,3 @@
|
||||||
|
#put any key/value pairs here
|
||||||
|
rest-extender.name=REST Extender
|
||||||
|
rest-extender.description=Confluence REST API extender
|
Loading…
Reference in New Issue