Files
d.velop/_Vorlagen/Groovy-Skripte/uploadDocuments.groovy
2025-04-04 11:35:25 +02:00

279 lines
12 KiB
Groovy

//Dieses Skriptist ein Beispiel um Dokumente per DMS-Api hochzuladen
//Eine Beispieldatei wird bei Ausführung des Skripts erstellt
//In den Konfigurationsparametern muss für die Verbindung die Base-Url, RepoId und ein Api-Key angeben werden. Der Benutzer hinter dem Api-Key braucht mindestens die Berechtigungen "Dokument importieren" und "Eigenschaften aktualisieren"
//Per docType kann eine Dokumentart angeben werden. Die Eigenschaften können weiter unten im Skript (suche nach {to be configured}) angegeben werden. Dazu wird in diesem Beispiel das DMS-Default Mapping verwendet -> https://BASE-URL/dms/r/REPO-ID/source Beispiel: https://dms-test.local/dms/r/074ef140-250d-5a76-9c0c-311835e900e2/source
import groovy.json.JsonBuilder
import groovyx.net.http.FromServer
import groovyx.net.http.HttpBuilder
import groovyx.net.http.ContentTypes
import java.text.SimpleDateFormat
import java.time.YearMonth
class Configuration
{
// login data, used to perform operations which need authentication
// public static String API_KEY = "{yourApiKey}"
public static String API_KEY = "DOz4JkcUEl2nu+NWmh9ylqFtIz2bDtcA+UpWikbwFpqzHGlnQuaAj5XzM+6XKTI/IPDRQomgoTN6h8y2MDkojGHUeWvqN6qJaMEZ/wNxvXMIQyiCRsDgx4yqSmKmlfEM&_z_A0V5ayCSpMjWpAFIyddgzAJPQsAloshCGVuKs-6Sxam3gyUxmKVy45yP5jqdXY0HQyCzH9im5FHDT4fboog8erv_t0Anu"
// Base Url of d.3 system, to target API endpoints
// public static String baseUrl = "https://{yourUrl}.de"
public static String baseUrl = "https://w2019-sql2019en.vcloud.d-velop.de/"
// repository of destination, is used to target right repository for searching documents
public static String repositoryId = "1ddde1e8-2431-56c0-8cd1-b05dc1ae7dc3"
//public static String repositoryId = "{yourRepostoryId}"
//d.3 destination data
public static String docType = "DTEST"
//Do not edit these variables
public static String dmsUrl = "/dms/r/" + repositoryId
public static HttpBuilder httpBuilder = null
public static String authSessionId = ""
public static String sessionExpire = ""
public static File csvLog = null
public static String logDirPath = "./log/"
public static File logFile = new File(logDirPath + System.currentTimeMillis() + "_log.csv")
}
// must be allowed to set origin header
System.setProperty( "sun.net.http.allowRestrictedHeaders", "true")
// create httpBuilde with baseUrl
log("Create httpBuilder")
Configuration.httpBuilder = HttpBuilder.configure {
request.uri = Configuration.baseUrl
request.headers['Accept'] = 'application/json'
request.headers['Origin'] = Configuration.baseUrl
}
log("httpBuilder created")
login()
uploadDocument()
/**
* Function to upload document / create placeholder
*/
void uploadDocument(){
// check if login is valid
if(isLoginExpired()) {
login()
}
String requestUUID = UUID.randomUUID().toString()
// create new file
// check if directory "Tmp" exists
File tmpDir = new File("./Tmp/")
if(!tmpDir.exists() || !tmpDir.isDirectory()) {
// create directory for tmp files
tmpDir.mkdirs()
}
File tmpFile = new File("./Tmp/mydoc.hc")
tmpFile.createNewFile()
tmpFile.text = "New mydoc: " + System.currentTimeMillis()
Configuration.httpBuilder.post {
request.uri.path = Configuration.dmsUrl + "/blob/chunk/"
request.headers['Authorization'] = 'Bearer ' + Configuration.authSessionId
request.headers['Accept'] = 'application/hal+json'
request.headers['x-dv-request-id'] = requestUUID
request.contentType = ContentTypes.BINARY[0]
request.body = tmpFile.bytes
response.exception { e ->
log("RequestUUID: ${requestUUID} - Upload exception: ${e.message}")
}
response.failure { f ->
log("RequestUUID: ${requestUUID} - Upload failed: ${f.message}")
// if request failed because of "Unathorized" ir "Forbidden" try new login and then send request again
if(f.message.toString().equals("Unauthorized") || f.message.toString().equals("Forbidden") ) {
login()
}
}
response.success { s, bytes ->
// get header for Location
String locationUrl = FromServer.Header.find(s.getHeaders(), "Location").parsed
if(locationUrl != null && !locationUrl.equals("")) {
log("RequestUUID: ${requestUUID} - Upload of binary successful -> locationUrl: ${locationUrl} ")
//Now assign metadata to uploaded document
saveNewUploadedDocument(locationUrl)
}
}
}
}
/**
* Function to assign metadata to uploaded document
*/
void saveNewUploadedDocument(String locationUrl){
// check if login is valid
if(isLoginExpired()) {
login()
}
String requestUUID = UUID.randomUUID().toString()
Map bodyMap = new HashMap<>()
//Your file
bodyMap.put("filename", "mydoc.hc")
bodyMap.put("sourceCategory", Configuration.docType)
bodyMap.put("sourceId", Configuration.dmsUrl + "/source")
bodyMap.put("contentLocationUri", locationUrl)
List propertiesList = new ArrayList()
Map propertiesMap = new HashMap()
Map propertyMap1 = new HashMap<>()
Map propertyMap2 = new HashMap<>()
//ToDo: Adjust Key and value. Have a look at this URL to find out the keys for your metadata: https://BASE-URL/dms/r/REPO-ID/source Example: https://dms-test.local/dms/r/074ef140-250d-5a76-9c0c-311835e900e2/source
//Your metadata (single value) {to be configured}
propertyMap1.put("key", "1")
propertyMap1.put("values", ["myValue"])
propertiesList.add(propertyMap1)
propertiesMap.put("properties", propertiesList)
bodyMap.put("sourceProperties", propertiesMap)
//Your metadata (multi value) {to be configured}
propertyMap2.put("key", "12")
propertyMap2.put("values", ["myDocMultiValue1", "myDocMultiValue2"])
propertiesList.add(propertyMap2)
propertiesMap.put("properties", propertiesList)
bodyMap.put("sourceProperties", propertiesMap)
JsonBuilder jsonBuilder = new JsonBuilder()
jsonBuilder.content = bodyMap
Configuration.httpBuilder.post {
request.uri.path = Configuration.dmsUrl + "/o2m"
request.headers['Authorization'] = 'Bearer ' + Configuration.authSessionId
request.headers['Accept'] = 'application/hal+json'
request.headers['x-dv-request-id'] = requestUUID
request.contentType = ContentTypes.JSON[0]//'application/hal+json'
request.body = jsonBuilder.toPrettyString()
response.parser(ContentTypes.JSON[0]) {config, resp ->
String responseText = resp.inputStream.getText()
log("RequestUUID: ${requestUUID} - ResponseText: ${responseText}")
}
response.exception { e ->
log("RequestUUID: ${requestUUID} - Save uploaded file exception: ${e.message}")
}
response.failure { f ->
log("RequestUUID: ${requestUUID} - Save uploaded file failed: ${f.message}")
// if request failed because of "Unathorized" ir "Forbidden" try new login and then send request again
if(f.message.toString().equals("Unauthorized") || f.message.toString().equals("Forbidden") ) {
login()
}
}
response.success { s ->
log("RequestUUID: ${requestUUID} - Save uploaded file successful")
// get docId from Location Header
String locationHeader = FromServer.Header.find(s.getHeaders(), "Location").parsed
if(locationHeader != null && !locationHeader.equals("")) {
String[] locationParts = locationHeader.split("/o2m/")
if(locationParts.size() == 2) {
String[] secondParts = locationParts[1].split("\\?")
String docId = secondParts[0]
log("RequestUUID: ${requestUUID} - Save uploaded file successful: DocId - " + docId)
}
}
}
}
}
/**
* Function to perform login request
*/
void login() {
String requestUUID = UUID.randomUUID().toString()
Configuration.httpBuilder.get {
request.uri.path = '/identityprovider/login'
request.headers['Authorization'] = 'Bearer ' + Configuration.API_KEY
request.headers['x-dv-request-id'] = requestUUID
request.contentType = ContentTypes.URLENC
response.exception { e ->
log("RequestUUID: ${requestUUID} - Login exception")
}
response.failure { f ->
log("RequestUUID: ${requestUUID} - Login failed: ${f.message}")
}
response.success { s, json ->
log("RequestUUID: ${requestUUID} - Login success")
Configuration.authSessionId = json.getAt("authSessionId")
Configuration.sessionExpire = json.getAt("expire")
if(Configuration.authSessionId == null || Configuration.authSessionId.equals("") || Configuration.authSessionId.equals("null")) {
log("AuthSessionId not given with first letter small, try upper case")
Configuration.authSessionId = json.getAt("AuthSessionId")
}
if(Configuration.sessionExpire == null || Configuration.sessionExpire.equals("") || Configuration.sessionExpire.equals("null")) {
log("Expire not given with first letter small, try upper case")
Configuration.sessionExpire = json.getAt("Expire")
}
}
}
}
/**
* Function to check if authSessionId is given and still not expired
*
* @return boolean true if login is not valid
*/
boolean isLoginExpired() {
boolean result = false
if(Configuration.authSessionId == null || Configuration.authSessionId.equals("")) {
result = true
}
if(Configuration.sessionExpire == null || Configuration.sessionExpire.equals("")) {
result = true
} else {
// check if sessionExpire is grater then current timestamp
long nowTimestamp = System.currentTimeMillis()
// convert sessionExpire to timestamp
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'H:m:s.S'Z'")
Date expireDate = inputFormat.parse(Configuration.sessionExpire)
long expireTimestamp = expireDate.time
if(nowTimestamp>=expireTimestamp) {
result = true
}
}
return result
}
/**
* Function to log given message to log file and to console
* @param message
*/
void log(String message) {
String messageWithTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date(System.currentTimeMillis())) + " : ${message}"
println(messageWithTimestamp)
if(!Configuration.logFile.exists()) {
// check if directory exists
// check if directory "Log" exists
File logDir = new File(Configuration.logDirPath)
if(!logDir.exists() || !logDir.isDirectory()) {
// create directory for log files
logDir.mkdirs()
}
Configuration.logFile.createNewFile()
}
Configuration.logFile.append(messageWithTimestamp + "\n")
}