Upgrading to 2025.2
Important changes have been introduced in this version at several levels. Please take the time to review the changelog carefully.
Pay special attention to the following sections:
PACKAGED_Portal: Default configuration updates
Security
- 1 Structures changes
- 1.1 asset (UPDATED) & assetgrouping (ADDED)
- 1.1.1 asset
- 1.1.2 Fields changes
- 1.2 assetgrouping (ADDED)
- 1.3 collaborativespace
- 1.3.1 Fields changes
- 1.3.2 Faces
- 1.3.2.1 Selector
- 1.3.2.2 Configuration
- 1.4 massimportitem
- 1.4.1 Fields changes
- 1.5 resolution
- 1.5.1 Fields changes
- 1.6 userregistration & user
- 1.7 userregistration
- 1.7.1 Faces
- 1.7.1.1 Selector
- 1.7.1.2 Configuration
- 1.7.1 Faces
- 1.8 user
- 1.8.1 Faces
- 1.8.1.1 Configuration
- 1.8.1 Faces
- 1.1 asset (UPDATED) & assetgrouping (ADDED)
- 2 PACKAGED_Portal : Default config update
- 3 Plugins changes
- 3.1 PACKAGED_PortalBranch (ADDED)
- 3.2 PACKAGED_DAM_Utils
- 3.3 plugin.xml
- 3.4 WXM_BO_Options
- 3.5 plugin.xml
- 3.6 WXM_DAMDY
- 3.7 plugin.xml
- 3.8 PACKAGED_Security
- 3.9 plugin.xml
- 3.10 security.xml
- 3.10.1 ADDED pkgIsPublishedDamobject
- 3.10.2 ADDED pkgSurferIsConnectedUser
- 3.10.3 ADDED pkgIsPublicPortal
- 4 Security changes
- 4.1 Domains changes
- 4.1.1 objectfile
- 4.1.1.1 sendFile
- 4.1.1 objectfile
- 4.1 Domains changes
- 5 Media Copy to Workspace: MassImport API Update
Structures changes
asset (UPDATED) & assetgrouping (ADDED)
Improvements introduced for unlinked asset copies, paving the way for future asset grouping features.
If you're looking to implement asset linking when copying between a DAM and a creative workflow, here are the steps to follow.:
asset
Fields changes
copietravail
Tags:
Added:
rest_api_mass_import_copy_ignore
uid
Tags:
Added:
rest_api_mass_import_copy_ignore
version
Tags:
Added:
rest_api_mass_import_copy_ignore
ai_captionde
Tags:
Added:
rest_api_include
tmpsource
Tags:
Added:
rest_api_mass_import_copy_ignore
spaces
Tags:
Added:
rest_api_mass_import_copy_ignore
portals
Tags:
Added:
rest_api_mass_import_copy_ignore
versionsdata
Tags:
Added:
rest_api_mass_import_copy_ignore
grouping (added)
Type: child
Nature: assetgrouping
Label:
Default value:
Order: 7500
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Indexed and stored
i18n: false
i18n for:
Tags:
rest_api_mass_import_copy_to_published
groupingmaster (added)
Type: child
Nature: activated
Label:
Default value: 2
Order: 7600
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Not indexed
i18n: false
i18n for:
Tags:
assetgrouping (ADDED)
collaborativespace
https://crossmedia.atlassian.net/browse/WXM-17380
https://crossmedia.atlassian.net/browse/WXM-17602
The UI on space creation/edition has been improved and users are now allowed to transfer space’s ownership and management to an other user.
For these updates, we changed the structure of collaborativespace
, primarily reorganizing fields and adding separators.
More info about the UI improvements : Creative workflow installation guide | Add specific properties to spaces structure (collaborativespace)
More info about the space owner transfer : How does Creative Workflow works | Owner transfer (since 2025.2)
Fields changes
owner
Order: 400 --> 2100
parent
Order: 500 --> 400
child
Order: 600 --> 500
status
Order: 700 --> 600
brieffiles
Order: 1700 --> 1900
itemsapprovals
Order: 1800 --> 1700
separator_space (added)
Type: data
Nature:
Label:
Default value:
Order: 700
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Not indexed
i18n: false
i18n for:
Tags:
separator_documents (added)
Type: data
Nature:
Label:
Default value:
Order: 1800
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Not indexed
i18n: false
i18n for:
Tags:
separator_ownership (added)
Type: data
Nature:
Label:
Default value:
Order: 2000
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Not indexed
i18n: false
i18n for:
Tags:
separator_otherprops (added)
Type: data
Nature:
Label:
Default value:
Order: 2200
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Not indexed
i18n: false
i18n for:
Tags:
Faces
Selector
Old selector
Collection<String> faces = new HashSet<String>();
faces.add("mandatory");
faces.add("not_editable");
return faces;
New selector
Collection<String> faces = new HashSet<String>();
faces.add("mandatory");
faces.add("not_editable");
// if user is on BO (params is filled only from the Front-end app)
if(params == null || params.isEmpty()) {
faces.add("not_editable_bo");
}
return faces;
Configuration
not_editable_bo
added
owner
Editable: false
Viewable: false
Mandatory: false
owner
Editable: false
Viewable: false
Mandatory: false
massimportitem
Updates made for the asset copy feature : https://crossmedia.atlassian.net/browse/WXM-17538
More info here : Upgrading to 2025.2 | Media Copy to Workspace: MassImport API Update
Fields changes
originassetid (added)
Type: data
Nature:
Label:
Default value:
Order: 7000
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Indexed and stored
i18n: false
i18n for:
Tags:
publishedassetid (added)
Type: data
Nature:
Label:
Default value:
Order: 7100
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Indexed and stored
i18n: false
i18n for:
Tags:
itemtype (added)
Type: data
Nature:
Label:
Default value: index
Order: 7200
Remote name:
Max size: 0
Attachment:
In list:
Editable: false
Viewable: false
Mandatory: false
Null if empty: false
Auto carriage return: false
Index: Indexed and stored
i18n: false
i18n for:
Tags:
resolution
https://crossmedia.atlassian.net/browse/WXM-17778
Fields changes
name
Mandatory: false --> true
shortname
Mandatory: false --> true
nature
Mandatory: false --> true
variation
Mandatory: false --> true
userregistration & user
https://crossmedia.atlassian.net/browse/WXM-17900
userregistration
Faces
Selector
Old selector
New selector
final Set<String> faces = new HashSet<String>();
faces.add("mandatory");
return faces;
Configuration
_hidden
removed
role
Editable: false
Viewable: false
Mandatory: false
group
removed
role
Editable: false
Viewable: false
Mandatory: false
user
removed
role
Editable: false
Viewable: true
Mandatory: true
user_role_4
removed
role
Editable: true
Viewable: true
Mandatory: true
mandatory
added
role
Editable: true
Viewable: true
Mandatory: true
user
Faces
Configuration
user
updated
role
Editable: true
Viewable: true
Mandatory: true
PACKAGED_Portal : Default config update
The list of available actions on assets selection has been updated through all the domain presenting assets (dam, boards, portals).
The list of available actions on asset’s detail view has also been updated
Please check the configuration changes below.
board
explore
footer
selection
actions UPDATED (Reordered):
Before:
[ "downloadSelection", "boardToggleItems", "damLandingPage", "updateAssetStatus", "boardItemsRemove" ]
After:
[ "addTo", "downloadSelection", "updateAssetStatus", "damCopyToWorkspace", "boardItemsRemove" ]
max-displayed-actions UPDATED : "3" → "2"
common
cursors (Cursors have been added)
collaborate-search-users ADDED
staticQuery
type
eq: 1
count-my-workspaces ADDED
path: "massimport/data/space"
staticQuery
activated
eq: true
withData: false
transfer-owner-search-users ADDED
path: "dam/data/user"
props: "id,avatar,name,role,status"
staticQuery
activated
eq: true
pkgroletemplate
neq: "999"
type
eq: 1
named-actions (Actions have been added)
dam-copy-to-workspace ADDED
action: "dam/copyToWorkspace"
checkEnabledGetter: "spaces/hasWorkspaces"
checkEnabledAction: "spaces/fetchHasWorkspaces"
i18n: "copyToWorkspace.general.tooltip"
icon: "fal fa-screen-users"
onlyIfAllFeaturesActive: ["spaces"]
i18nDisabledTooltip: "copyToWorkspace.general.disabledTooltip"
upload-preview ADDED
action: "upload/setPreview"
i18n: "action.upload.preview"
icon: "fal fa-eye"
dam-import
items
actions UPDATED
Added
uploadPreview
as the 3rd item[ "damImportChangeCollection", "damImportChangeStatus", "uploadPreview" ]
upload
transfer-to-user UPDATED
and UPDATED
Added type
eq: 1
Added role
in
id: [4, 27, 28]
New value of transfer-to-user:
{ "and":[ { "activated": { "eq": true } }, { "id": { "neq": "${surfer.id}" } }, { "type": { "eq": 1 } }, { "role": { "in":{ "id": [4, 27, 28] } } } ] }
dam
details
actions UPDATED
actions (Reordered & new action added)
Before:
[ "damDownload", "addTo", "damEdit", "damComposePicture", "damComposeVideo", "damEmbed", "damReverseSearch", "damShare" ]
After:
[ "damDownload", "addTo", "damEdit", "damCopyToWorkspace", "damComposePicture", "damComposeVideo", "damEmbed", "damReverseSearch", "damShare" ]
Added
damCopyToWorkspace
as the 4th item
explore
footer
selection
actions UPDATED (Reordered)
Before:
[ "downloadSelection", "damSendByMailSelection", "damBoard", "damLandingPage", "updateAssetStatus", "damBulkEdit" ]
After:
[ "addTo", "downloadSelection", "damSendByMailSelection", "updateAssetStatus", "damBulkEdit", "damCopyToWorkspace" ]
max-displayed-actions UPDATED : "3" → "2"
portals
edit-sections
explore
footer
selection
max-displayed-actions UPDATED : "2" → "1"
explore
footer
selection
actions UPDATED (Reordered)
Before:
[ "portalsDownloadZip", "damBoard", "damLandingPage", "updateAssetStatus", "damSendByMailSelection", "damBulkEdit" ]
After:
[ "addTo", "portalsDownloadZip", "updateAssetStatus", "damSendByMailSelection", "damBulkEdit", "damCopyToWorkspace" ]
max-displayed-actions UPDATED : "3" → "2"
named-filters
portals-roles UPDATED (label update for creator option in filter)
config
i18n : "general.owner" → "general.creator"
constraintKey : "or:portalrole.owner" → "or:portalrole.creator"
spaces
details ADDED
collapsed-form
space
collaborate
searchUsersCursor: "transferOwnerSearchUsers"
default-opened-groups: ["space"]
named-filters
spaces-roles UPDATED (label update for creator option in filter)
config
i18n : "general.owner" → "general.creator"
constraintKey : "or:spacerole.owner" → "or:spacerole.creator"
@startjson
<style>
.removed {
BackgroundColor pink
FontColor red
}
.added {
BackgroundColor lightgreen
FontColor darkgreen
}
</style>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" <<removed>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" / "in" <<removed>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" / "in" / "id" <<removed>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" / "in" / "id" / "0" <<removed>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" / "in" / "id" / "1" <<removed>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "role" / "in" / "id" / "2" <<removed>>
#highlight "common" / "cursors" / "collaborate-search-users" / "staticQuery" / "type" <<added>>
#highlight "common" / "cursors" / "collaborate-search-users" / "staticQuery" / "type" / "eq" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" / "path" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" / "staticQuery" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" / "staticQuery" / "activated" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" / "staticQuery" / "activated" / "eq" <<added>>
#highlight "common" / "cursors" / "count-my-workspaces" / "withData" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "path" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "props" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "activated" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "activated" / "eq" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "pkgroletemplate" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "pkgroletemplate" / "neq" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "type" <<added>>
#highlight "common" / "cursors" / "transfer-owner-search-users" / "staticQuery" / "type" / "eq" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "action" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "checkEnabledGetter" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "checkEnabledAction" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "i18n" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "icon" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "onlyIfAllFeaturesActive" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "onlyIfAllFeaturesActive" / "0" <<added>>
#highlight "common" / "named-actions" / "dam-copy-to-workspace" / "i18nDisabledTooltip" <<added>>
#highlight "common" / "named-actions" / "upload-preview" <<added>>
#highlight "common" / "named-actions" / "upload-preview" / "action" <<added>>
#highlight "common" / "named-actions" / "upload-preview" / "i18n" <<added>>
#highlight "common" / "named-actions" / "upload-preview" / "icon" <<added>>
#highlight "dam-import" / "items" / "actions" / "2" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "type" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "type" / "eq" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" / "in" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" / "in" / "id" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" / "in" / "id" / "0" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" / "in" / "id" / "1" <<added>>
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3" / "role" / "in" / "id" / "2" <<added>>
#highlight "dam" / "details" / "actions" / "actions" / "8" <<added>>
#highlight "spaces" / "details" <<added>>
#highlight "spaces" / "details" / "collapsed-form" <<added>>
#highlight "spaces" / "details" / "collapsed-form" / "space" <<added>>
#highlight "spaces" / "details" / "collapsed-form" / "space" / "collaborate" <<added>>
#highlight "spaces" / "details" / "collapsed-form" / "space" / "collaborate" / "searchUsersCursor" <<added>>
#highlight "spaces" / "details" / "collapsed-form" / "space" / "default-opened-groups" <<added>>
#highlight "spaces" / "details" / "collapsed-form" / "space" / "default-opened-groups" / "0" <<added>>
#highlight "board" / "explore" / "footer" / "selection" / "actions" / "0"
#highlight "board" / "explore" / "footer" / "selection" / "actions" / "1"
#highlight "board" / "explore" / "footer" / "selection" / "actions" / "2"
#highlight "board" / "explore" / "footer" / "selection" / "actions" / "3"
#highlight "board" / "explore" / "footer" / "selection" / "max-displayed-actions"
#highlight "common" / "cursors" / "collaborate-search-users" / "staticQuery" / "type"
#highlight "common" / "cursors" / "count-my-workspaces"
#highlight "common" / "cursors" / "transfer-owner-search-users"
#highlight "common" / "named-actions" / "dam-copy-to-workspace"
#highlight "common" / "named-actions" / "upload-preview"
#highlight "dam-import" / "items" / "actions" / "2"
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "2" / "type"
#highlight "dam-import" / "upload" / "transfer-to-user" / "and" / "3"
#highlight "dam" / "details" / "actions" / "actions" / "3"
#highlight "dam" / "details" / "actions" / "actions" / "4"
#highlight "dam" / "details" / "actions" / "actions" / "5"
#highlight "dam" / "details" / "actions" / "actions" / "6"
#highlight "dam" / "details" / "actions" / "actions" / "7"
#highlight "dam" / "details" / "actions" / "actions" / "8"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "0"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "1"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "2"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "3"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "4"
#highlight "dam" / "explore" / "footer" / "selection" / "actions" / "5"
#highlight "dam" / "explore" / "footer" / "selection" / "max-displayed-actions"
#highlight "portals" / "edit-sections" / "explore" / "footer" / "selection" / "max-displayed-actions"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "0"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "1"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "2"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "3"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "4"
#highlight "portals" / "explore" / "footer" / "selection" / "actions" / "5"
#highlight "portals" / "explore" / "footer" / "selection" / "max-displayed-actions"
#highlight "portals" / "named-filters" / "portals-roles" / "config" / "0" / "1" / "i18n"
#highlight "portals" / "named-filters" / "portals-roles" / "config" / "0" / "1" / "constraintKey"
#highlight "spaces" / "details"
#highlight "spaces" / "named-filters" / "spaces-roles" / "config" / "0" / "1" / "i18n"
#highlight "spaces" / "named-filters" / "spaces-roles" / "config" / "0" / "1" / "constraintKey"
{
"board": {
"explore": {
"footer": {
"selection": {
"actions": [
"addTo <s:red>downloadSelection",
"downloadSelection <s:red>boardToggleItems",
"updateAssetStatus <s:red>damLandingPage",
"damCopyToWorkspace <s:red>updateAssetStatus",
"boardItemsRemove"
],
"max-displayed-actions": "3 <s:red>2"
}
}
}
},
"common": {
"cursors": {
"collaborate-search-users": {
"path": "dam/data/user",
"props": "id,avatar,name,role,status",
"staticQuery": {
"activated": {
"eq": true
},
"id": {
"nin": "${surfer.id}"
},
"type": {
"eq": 1
}
}
},
"count-my-workspaces": {
"path": "massimport/data/space",
"staticQuery": {
"activated": {
"eq": true
}
},
"withData": false
},
"transfer-owner-search-users": {
"path": "dam/data/user",
"props": "id,avatar,name,role,status",
"staticQuery": {
"activated": {
"eq": true
},
"pkgroletemplate": {
"neq": "999"
},
"type": {
"eq": 1
}
}
}
},
"named-actions": {
"dam-copy-to-workspace": {
"action": "dam/copyToWorkspace",
"checkEnabledGetter": "spaces/hasWorkspaces",
"checkEnabledAction": "spaces/fetchHasWorkspaces",
"i18n": "copyToWorkspace.general.tooltip",
"icon": "fal fa-screen-users",
"onlyIfAllFeaturesActive": [
"spaces"
],
"i18nDisabledTooltip": "copyToWorkspace.general.disabledTooltip"
},
"upload-preview": {
"action": "upload/setPreview",
"i18n": "action.upload.preview",
"icon": "fal fa-eye"
}
}
},
"dam-import": {
"items": {
"actions": [
"damImportChangeCollection",
"damImportChangeStatus",
"uploadPreview"
]
},
"upload": {
"transfer-to-user": {
"and": [
{
"activated": {
"eq": true
}
},
{
"id": {
"neq": "${surfer.id}"
}
},
{
"role": {
"in": {
"id": [
4,
27,
28
]
}
},
"type": {
"eq": 1
}
},
{
"role": {
"in": {
"id": [
4,
27,
28
]
}
}
}
]
}
}
},
"dam": {
"details": {
"actions": {
"displayStatusUpdateAction": true,
"maxDisplayedActions": 5,
"actions": [
"damDownload",
"addTo",
"damEdit",
"damCopyToWorkspace <s:red>damComposePicture",
"damComposePicture <s:red>damComposeVideo",
"damComposeVideo <s:red>damEmbed",
"damEmbed <s:red>damReverseSearch",
"damReverseSearch <s:red>damShare",
"damShare"
]
}
},
"explore": {
"footer": {
"selection": {
"actions": [
"addTo <s:red>downloadSelection",
"downloadSelection <s:red>damSendByMailSelection",
"damSendByMailSelection <s:red>damBoard",
"updateAssetStatus <s:red>damLandingPage",
"damBulkEdit <s:red>updateAssetStatus",
"damCopyToWorkspace <s:red>damBulkEdit"
],
"max-displayed-actions": "3 <s:red>2"
}
}
}
},
"portals": {
"edit-sections": {
"explore": {
"footer": {
"selection": {
"max-displayed-actions": "2 <s:red>1"
}
}
}
},
"explore": {
"footer": {
"selection": {
"actions": [
"addTo <s:red>portalsDownloadZip",
"portalsDownloadZip <s:red>damBoard",
"updateAssetStatus <s:red>damLandingPage",
"damSendByMailSelection <s:red>updateAssetStatus",
"damBulkEdit <s:red>damSendByMailSelection",
"damCopyToWorkspace <s:red>damBulkEdit"
],
"max-displayed-actions": "3 <s:red>2"
}
}
},
"named-filters": {
"portals-roles": {
"i18n": "landingpages.landingpage-role",
"class": "cw-wrapping-component-ai",
"selectedValueOnDropdownLabel": true,
"globalConstraintKey": "portalrole",
"config": [
[
null,
{
"i18n": "general.owner <s:red>general.creator",
"constraintKey": "or:portalrole.owner <s:red>or:portalrole.creator",
"constraint": {
"owner": {
"eq": "${surfer.id}"
}
}
},
{
"i18n": "general.colaborator",
"constraintKey": "or:portalrole.colaborator",
"constraint": {
"team": {
"ct": "${surfer.id}"
}
}
},
{
"i18n": "general.viewer",
"constraintKey": "or:portalrole.viewer",
"constraint": {
"viewers": {
"ct": "${surfer.id}"
}
}
},
{
"i18n": "general.none",
"constraintKey": "or:portalrole.none",
"constraint": {
"and": [
{
"owner": {
"neq": "${surfer.id}"
}
},
{
"team": {
"nct": "${surfer.id}"
}
},
{
"viewers": {
"nct": "${surfer.id}"
}
}
]
}
}
]
]
}
}
},
"spaces": {
"named-filters": {
"spaces-roles": {
"i18n": "spaces.filters.space-role",
"class": "cw-wrapping-component-ai",
"selectedValueOnDropdownLabel": true,
"globalConstraintKey": "spacerole",
"config": [
[
null,
{
"i18n": "general.owner <s:red>general.creator",
"constraintKey": "or:spacerole.owner <s:red>or:spacerole.creator",
"constraint": {
"owner": {
"eq": "${surfer.id}"
}
}
},
{
"i18n": "general.colaborator",
"constraintKey": "or:spacerole.colaborator",
"constraint": {
"team": {
"ct": "${surfer.id}"
}
}
},
{
"i18n": "general.none",
"constraintKey": "or:spacerole.none",
"constraint": {
"and": [
{
"owner": {
"neq": "${surfer.id}"
}
},
{
"team": {
"nct": "${surfer.id}"
}
}
]
}
}
]
]
}
},
"details": {
"collapsed-form": {
"space": {
"collaborate": {
"searchUsersCursor": "transferOwnerSearchUsers"
},
"default-opened-groups": [
"space"
]
}
}
}
}
}
@endjson
Plugins changes
PACKAGED_PortalBranch (ADDED)
PACKAGED_DAM_Utils
plugin.xml
Parameters:
UPDATED dam_denormalization_config:
default value:
{
"aliases": {
"aiAttributeFromReport": "com.wedia.packaged.dam.triggers.datatransformers.impl.AiAttributeFromReport",
"append": "com.wedia.packaged.dam.triggers.datatransformers.impl.AppendIfNotEmpty",
"asChild": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToChild",
"blurHash": "com.wedia.packaged.dam.triggers.datatransformers.impl.BlurhashTransformer",
"booleanToActivated": "com.wedia.packaged.dam.triggers.datatransformers.impl.BooleanToActivatedTransformer",
"countCommon": "com.wedia.packaged.dam.triggers.datatransformers.impl.CountCommonValues",
"countZipEntries": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToZipFileEntriesCount",
"dimensionMultiTag": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToMultiTagValue",
"dimensionProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToPropertyTransformer",
"dimensionTag": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToTagValueTransformer",
"duplicatesFinder": "com.wedia.packaged.dam.triggers.datatransformers.impl.DuplicatesFinderTransformer",
"every": "com.wedia.packaged.dam.triggers.datatransformers.impl.EveryTransformer",
"firstNonNull": "com.wedia.packaged.dam.triggers.datatransformers.impl.FirstNonNullValueTransformer",
"geoCoords": "com.wedia.packaged.dam.triggers.datatransformers.impl.GeographicalsCoordinates",
"getObjectProp": "com.wedia.packaged.dam.triggers.datatransformers.impl.GetInstancePropertyTransformer",
"greaterThan": "com.wedia.packaged.dam.triggers.datatransformers.impl.GreaterThan",
"ifElse": "com.wedia.packaged.dam.triggers.datatransformers.impl.IfElseTransformer",
"ifEmpty": "com.wedia.packaged.dam.triggers.datatransformers.impl.DenormIfEmpty",
"isAllowed": "com.wedia.packaged.dam.triggers.datatransformers.impl.IsAllowedBySecurity",
"join": "com.wedia.packaged.dam.triggers.datatransformers.impl.JoinValuesTransformer",
"lowerThan": "com.wedia.packaged.dam.triggers.datatransformers.impl.LowerThan",
"negate": "com.wedia.packaged.dam.triggers.datatransformers.impl.NegationTransformer",
"parseBoolean": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToBooleanTransformer",
"parseDate": "com.wedia.packaged.dam.triggers.datatransformers.impl.DateTransformer",
"parseExifDate": "com.wedia.packaged.dam.triggers.datatransformers.impl.ExifToDateTransformer",
"pluginProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.PluginPropertyToStringTransformer",
"prediction": "com.wedia.packaged.dam.triggers.datatransformers.impl.AiMapperTransformer",
"propertyAsObject": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToPropertyAsObjectTransformer",
"ratioToOrientation": "com.wedia.packaged.dam.triggers.datatransformers.impl.RatioToOrientationTransformer",
"regexExtract": "com.wedia.packaged.dam.triggers.datatransformers.impl.RegExpPatternMatcher",
"relFinder": "com.wedia.packaged.dam.triggers.datatransformers.impl.KeyToChildTransformer",
"resource": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPresetTransformer",
"resourceFromFieldPattern": "com.wedia.packaged.dam.triggers.datatransformers.impl.PropertyToResourceTransformer",
"resourcePath": "com.wedia.packaged.dam.triggers.datatransformers.impl.SelectorToPath",
"resourceProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPropertyTransformer",
"resourceToDimension": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToDimensionTransformer",
"resourceToPreset": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPresetTransformer",
"rootTree": "com.wedia.packaged.dam.triggers.datatransformers.impl.TreeRootTransformer",
"staticVal": "com.wedia.packaged.dam.triggers.datatransformers.impl.StaticPropertyTransformer",
"stringEquals": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringEqualsTransformer",
"toAiReport": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToAiReport",
"videoAspectRatio": "com.wedia.packaged.dam.triggers.datatransformers.impl.RatioToVideoAspectRatioTransformer"
},
"presets": [
{
"key": "getBinary",
"classAlias": "resourceFromFieldPattern",
"init": "binary"
},
{
"key": "getDimensions",
"classAlias": "resourceToDimension",
"input": {
"preset": "getBinary"
}
},
{
"key": "getFilePath",
"classAlias": "resourcePath",
"init": "binary"
},
{
"key": "getFileName",
"classAlias": "regexExtract",
"init": "^.*/([^/]*)$",
"input": {
"preset": "getFilePath"
}
},
{
"key": "getAiReport",
"classAlias": "toAiReport",
"input": {
"classAlias": "resourceToPreset",
"init": "ia",
"input": {
"preset": "getBinary"
}
}
},
{
"key": "getRootNatureCode",
"classAlias": "getObjectProp",
"init": "code",
"input": {
"classAlias": "rootTree",
"init": "assetnature"
}
},
{
"key": "preventExecutionFromMassImport",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"massimport"
],
"input": {
"classAlias": "propertyAsObject",
"init": "tmpsource"
}
}
},
{
"key": "getJobType",
"classAlias": "getObjectProp",
"init": "type",
"input": {
"classAlias": "propertyAsObject",
"init": "job"
}
},
{
"key": "preventExecutionFromBulkEdit",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"bulkedit"
],
"input": {
"preset": "getJobType"
}
}
},
{
"key": "isDuplicate",
"classAlias": "lowerThan",
"init": 1,
"input": {
"classAlias": "countCommon",
"init": [
"null",
"[]",
"{}"
],
"input": {
"classAlias": "propertyAsObject",
"init": "duplicates"
}
}
},
{
"key": "isSpaceItem",
"classAlias": "lowerThan",
"init": 1,
"input": {
"classAlias": "countCommon",
"init": [
null
],
"input": {
"classAlias": "propertyAsObject",
"init": "space"
}
}
},
{
"key": "isSpaceAsset",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"space"
],
"input": {
"classAlias": "propertyAsObject",
"init": "tmpsource"
}
}
},
{
"key": "canPublish",
"classAlias": "every",
"input": [
{
"preset": "preventExecutionFromMassImport"
},
{
"classAlias": "isAllowed",
"init": {
"action": "changestatus",
"params": {
"newstatus": "6"
}
}
}
]
},
{
"key": "canSubmit",
"classAlias": "every",
"input": [
{
"preset": "preventExecutionFromMassImport"
},
{
"classAlias": "isAllowed",
"init": {
"action": "changestatus",
"params": {
"newstatus": "8"
}
}
}
]
}
],
"transformations": [
{
"objectSelector": "#damobject,damimport,transfer,massimportitem",
"preventGuard": {
"preset": "preventExecutionFromMassImport"
},
"propertiesTransforms": [
{
"fieldSelector": "name",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "regexExtract",
"init": "^(.*?)(?:\\.360\\.zip|\\.[^.]*)?$",
"input": {
"preset": "getFileName"
}
}
}
]
},
{
"fieldSelector": "originalfilename",
"transformers": [
{
"preset": "getFileName"
}
]
},
{
"fieldSelector": "assetnature",
"transformers": [
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "resourceProperty",
"init": "contenttype",
"input": {
"preset": "getBinary"
}
}
}
]
},
{
"fieldSelector": "rootnature",
"transformers": [
{
"classAlias": "rootTree",
"init": "assetnature"
}
]
},
{
"fieldSelector": "filesize",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "filesize",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "nbentries",
"transformers": [
{
"classAlias": "countZipEntries",
"input": {
"preset": "getBinary"
}
}
]
}
]
}
],
"asyncTransformations": [
{
"objectSelector": "#damobject",
"propertiesTransforms": [
{
"fieldSelector": "ai_caption",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "caption",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_concepts",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "tags",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_celebrities",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "celebrities",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_landmarks",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "landmarks",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_mainfg",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "dominantColorForeground",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_mainbg",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "dominantColorBackground",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_avgage",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "avgAge",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFaces",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_baby",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge0_3",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_children",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge3_17",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_adult",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge17_60",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_senior",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge60_999",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_faces",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "namedFaces",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "resorttheme",
"transformers": [
{
"classAlias": "prediction",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "mappers",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "resortthemesuggest",
"transformers": [
{
"classAlias": "prediction",
"init": {
"property": "resorttheme",
"minConfidence": 0,
"maxConfidence": 0.9
},
"input": {
"classAlias": "aiAttributeFromReport",
"init": "mappers",
"input": {
"preset": "getAiReport"
}
}
}
]
}
]
},
{
"objectSelector": "#damobject,damimport,massimportitem",
"preventGuard": {
"preset": "preventExecutionFromBulkEdit"
},
"propertiesTransforms": [
{
"fieldSelector": "blurhash",
"transformers": [
{
"classAlias": "blurHash",
"init": {
"components": 8
}
}
]
},
{
"fieldSelector": "phavg",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phavg",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "phdiff",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phdiff",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "sha",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "sha256",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "duplicates",
"transformers": [
{
"classAlias": "duplicatesFinder",
"init": {
"objects": "#damobject,massimportitem"
}
}
]
}
]
},
{
"objectSelector": "#damobject,damimport,massimportitem",
"preventGuard": {
"preset": "preventExecutionFromMassImport"
},
"propertiesTransforms": [
{
"fieldSelector": "keywords",
"transformers": [
{
"classAlias": "append",
"input": {
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "dimensionMultiTag",
"init": "iptc:keywords",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "description",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "dimensionTag",
"init": "iptc:2:120",
"input": {
"preset": "getDimensions"
}
}
}
]
},
{
"fieldSelector": "width",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "pxwidth",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "height",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "pxheight",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "dpi",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "xdpi",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "duration",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "duration",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "clipped",
"transformers": [
{
"classAlias": "booleanToActivated",
"input": {
"classAlias": "parseBoolean",
"input": {
"classAlias": "dimensionTag",
"init": "hasclipping",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "colorspace",
"transformers": [
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "dimensionProperty",
"init": "colorspace",
"input": {
"preset": "getDimensions"
}
}
}
]
},
{
"fieldSelector": "nbpages",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "pagecount",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "photograph",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "dimensionTag",
"init": "exif:artist",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "latitude",
"transformers": [
{
"classAlias": "geoCoords",
"init": "exif:gpslatitude",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "longitude",
"transformers": [
{
"classAlias": "geoCoords",
"init": "exif:gpslongitude",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "assetformat",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
},
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "ratioToOrientation",
"init": "2",
"input": {
"classAlias": "dimensionProperty",
"init": "ratio",
"input": {
"preset": "getDimensions"
}
}
}
}
]
}
]
},
{
"fieldSelector": "videoratio",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "stringEquals",
"init": "video",
"input": {
"preset": "getRootNatureCode"
}
},
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "videoAspectRatio",
"input": {
"classAlias": "dimensionProperty",
"init": "ratio",
"input": {
"preset": "getDimensions"
}
}
}
}
]
}
]
},
{
"fieldSelector": "resolution",
"transformers": [
{
"classAlias": "join",
"init": "x",
"input": [
{
"classAlias": "dimensionProperty",
"init": "xdpi",
"input": {
"preset": "getDimensions"
}
},
{
"classAlias": "dimensionProperty",
"init": "ydpi",
"input": {
"preset": "getDimensions"
}
}
]
}
]
}
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isSpaceAsset"
}
},
"workflowTrigger": [
"publish"
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "canPublish"
}
},
"workflowTrigger": [
"publish"
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "canSubmit"
}
},
"workflowTrigger": [
"submit"
]
},
{
"objectSelector": "#damobject",
"propertiesTransforms": [
{
"fieldSelector": "tmpsource",
"transformers": [
{
"classAlias": "staticVal",
"init": ""
}
]
}
]
},
{
"objectSelector": "massimportitem",
"propertiesTransforms": [
{
"fieldSelector": "tmpsource",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "ifElse",
"input": [
{
"preset": "isSpaceItem"
},
{
"classAlias": "staticVal",
"init": "space"
},
{
"classAlias": "staticVal",
"init": "massimport"
}
]
}
}
]
}
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isSpaceItem"
}
},
"workflowTrigger": [
"tocheck"
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isDuplicate"
}
},
"workflowTrigger": [
"markduplicate"
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"preset": "isSpaceItem"
},
"workflowTrigger": [
"approve"
]
}
],
"asyncCallback": [
{
"objectSelector": "#damobject",
"plugin": "PACKAGED_DAM_Utils",
"callbackClass": "com.wedia.packaged.dam.NotifyUserAsyncCallback",
"callbackMethod": "notifyUser",
"active": false,
"runOnEmptyChanges": true
}
]
}
{
"aliases": {
"aiAttributeFromReport": "com.wedia.packaged.dam.triggers.datatransformers.impl.AiAttributeFromReport",
"append": "com.wedia.packaged.dam.triggers.datatransformers.impl.AppendIfNotEmpty",
"asChild": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToChild",
"blurHash": "com.wedia.packaged.dam.triggers.datatransformers.impl.BlurhashTransformer",
"booleanToActivated": "com.wedia.packaged.dam.triggers.datatransformers.impl.BooleanToActivatedTransformer",
"countCommon": "com.wedia.packaged.dam.triggers.datatransformers.impl.CountCommonValues",
"countZipEntries": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToZipFileEntriesCount",
"dimensionMultiTag": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToMultiTagValue",
"dimensionProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToPropertyTransformer",
"dimensionTag": "com.wedia.packaged.dam.triggers.datatransformers.impl.DimensionToTagValueTransformer",
"duplicatesFinder": "com.wedia.packaged.dam.triggers.datatransformers.impl.DuplicatesFinderTransformer",
"every": "com.wedia.packaged.dam.triggers.datatransformers.impl.EveryTransformer",
"firstNonNull": "com.wedia.packaged.dam.triggers.datatransformers.impl.FirstNonNullValueTransformer",
"geoCoords": "com.wedia.packaged.dam.triggers.datatransformers.impl.GeographicalsCoordinates",
"getObjectProp": "com.wedia.packaged.dam.triggers.datatransformers.impl.GetInstancePropertyTransformer",
"greaterThan": "com.wedia.packaged.dam.triggers.datatransformers.impl.GreaterThan",
"ifElse": "com.wedia.packaged.dam.triggers.datatransformers.impl.IfElseTransformer",
"ifEmpty": "com.wedia.packaged.dam.triggers.datatransformers.impl.DenormIfEmpty",
"isAllowed": "com.wedia.packaged.dam.triggers.datatransformers.impl.IsAllowedBySecurity",
"join": "com.wedia.packaged.dam.triggers.datatransformers.impl.JoinValuesTransformer",
"lowerThan": "com.wedia.packaged.dam.triggers.datatransformers.impl.LowerThan",
"negate": "com.wedia.packaged.dam.triggers.datatransformers.impl.NegationTransformer",
"parseBoolean": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToBooleanTransformer",
"parseDate": "com.wedia.packaged.dam.triggers.datatransformers.impl.DateTransformer",
"parseExifDate": "com.wedia.packaged.dam.triggers.datatransformers.impl.ExifToDateTransformer",
"pluginProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.PluginPropertyToStringTransformer",
"prediction": "com.wedia.packaged.dam.triggers.datatransformers.impl.AiMapperTransformer",
"propertyAsObject": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringToPropertyAsObjectTransformer",
"ratioToOrientation": "com.wedia.packaged.dam.triggers.datatransformers.impl.RatioToOrientationTransformer",
"regexExtract": "com.wedia.packaged.dam.triggers.datatransformers.impl.RegExpPatternMatcher",
"relFinder": "com.wedia.packaged.dam.triggers.datatransformers.impl.KeyToChildTransformer",
"resource": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPresetTransformer",
"resourceFromFieldPattern": "com.wedia.packaged.dam.triggers.datatransformers.impl.PropertyToResourceTransformer",
"resourcePath": "com.wedia.packaged.dam.triggers.datatransformers.impl.SelectorToPath",
"resourceProperty": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPropertyTransformer",
"resourceToDimension": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToDimensionTransformer",
"resourceToPreset": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToPresetTransformer",
"rootTree": "com.wedia.packaged.dam.triggers.datatransformers.impl.TreeRootTransformer",
"staticVal": "com.wedia.packaged.dam.triggers.datatransformers.impl.StaticPropertyTransformer",
"stringEquals": "com.wedia.packaged.dam.triggers.datatransformers.impl.StringEqualsTransformer",
"toAiReport": "com.wedia.packaged.dam.triggers.datatransformers.impl.ResourceToAiReport",
"videoAspectRatio": "com.wedia.packaged.dam.triggers.datatransformers.impl.RatioToVideoAspectRatioTransformer"
},
"presets": [
{
"key": "getBinary",
"classAlias": "resourceFromFieldPattern",
"init": "binary"
},
{
"key": "getDimensions",
"classAlias": "resourceToDimension",
"input": {
"preset": "getBinary"
}
},
{
"key": "getFilePath",
"classAlias": "resourcePath",
"init": "binary"
},
{
"key": "getFileName",
"classAlias": "regexExtract",
"init": "^.*/([^/]*)$",
"input": {
"preset": "getFilePath"
}
},
{
"key": "getAiReport",
"classAlias": "toAiReport",
"input": {
"classAlias": "resourceToPreset",
"init": "ia",
"input": {
"preset": "getBinary"
}
}
},
{
"key": "getRootNatureCode",
"classAlias": "getObjectProp",
"init": "code",
"input": {
"classAlias": "rootTree",
"init": "assetnature"
}
},
{
"key": "preventExecutionFromMassImport",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"massimport"
],
"input": {
"classAlias": "propertyAsObject",
"init": "tmpsource"
}
}
},
{
"key": "getJobType",
"classAlias": "getObjectProp",
"init": "type",
"input": {
"classAlias": "propertyAsObject",
"init": "job"
}
},
{
"key": "isBulkEditItem",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"bulkedit"
],
"input": {
"preset": "getJobType"
}
}
},
{
"key": "isDuplicate",
"classAlias": "lowerThan",
"init": 1,
"input": {
"classAlias": "countCommon",
"init": [
"null",
"[]",
"{}"
],
"input": {
"classAlias": "propertyAsObject",
"init": "duplicates"
}
}
},
{
"key": "isSpaceItem",
"classAlias": "lowerThan",
"init": 1,
"input": {
"classAlias": "countCommon",
"init": [
null
],
"input": {
"classAlias": "propertyAsObject",
"init": "space"
}
}
},
{
"key": "isSpaceAsset",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"space"
],
"input": {
"classAlias": "propertyAsObject",
"init": "tmpsource"
}
}
},
{
"key": "canPublish",
"classAlias": "every",
"input": [
{
"preset": "preventExecutionFromMassImport"
},
{
"classAlias": "isAllowed",
"init": {
"action": "changestatus",
"params": {
"newstatus": "6"
}
}
}
]
},
{
"key": "canSubmit",
"classAlias": "every",
"input": [
{
"preset": "preventExecutionFromMassImport"
},
{
"classAlias": "isAllowed",
"init": {
"action": "changestatus",
"params": {
"newstatus": "8"
}
}
}
]
},
{
"key": "isItemTypeEmpty",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"null",
" ",
""
],
"input": {
"classAlias": "propertyAsObject",
"init": "itemtype"
}
}
},
{
"key": "isItemRealyNew",
"classAlias": "ifElse",
"input": [
{
"preset": "isItemTypeEmpty"
},
{
"classAlias": "parseBoolean",
"input": "true"
},
{
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"index"
],
"input": {
"classAlias": "propertyAsObject",
"init": "itemtype"
}
}
}
]
},
{
"key": "preventExecutionWhenItemIsFromCopy",
"classAlias": "negate",
"input": {
"preset": "isItemRealyNew"
}
},
{
"key": "hasMassimportOrSpaceTmpSource",
"classAlias": "greaterThan",
"init": 0,
"input": {
"classAlias": "countCommon",
"init": [
"space",
"massimport"
],
"input": {
"classAlias": "propertyAsObject",
"init": "tmpsource"
}
}
},
{
"key": "doNotComputeDuplicates",
"classAlias": "ifElse",
"input": [
{
"preset": "hasMassimportOrSpaceTmpSource"
},
{
"preset": "isBulkEditItem"
},
{
"preset": "preventExecutionWhenItemIsFromCopy"
}
]
},
],
"transformations": [
{
"objectSelector": "#damobject,damimport,transfer,massimportitem",
"preventGuard": {
"preset": "preventExecutionFromMassImport"
},
"propertiesTransforms": [
{
"fieldSelector": "name",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "regexExtract",
"init": "^(.*?)(?:\\.360\\.zip|\\.[^.]*)?$",
"input": {
"preset": "getFileName"
}
}
}
]
},
{
"fieldSelector": "originalfilename",
"transformers": [
{
"preset": "getFileName"
}
]
},
{
"fieldSelector": "assetnature",
"transformers": [
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "resourceProperty",
"init": "contenttype",
"input": {
"preset": "getBinary"
}
}
}
]
},
{
"fieldSelector": "rootnature",
"transformers": [
{
"classAlias": "rootTree",
"init": "assetnature"
}
]
},
{
"fieldSelector": "filesize",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "filesize",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "nbentries",
"transformers": [
{
"classAlias": "countZipEntries",
"input": {
"preset": "getBinary"
}
}
]
}
]
}
],
"asyncTransformations": [
{
"objectSelector": "#damobject",
"propertiesTransforms": [
{
"fieldSelector": "ai_caption",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "caption",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_concepts",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "tags",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_celebrities",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "celebrities",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_landmarks",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "landmarks",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_mainfg",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "dominantColorForeground",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_mainbg",
"transformers": [
{
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "dominantColorBackground",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "ai_avgage",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "avgAge",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFaces",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_baby",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge0_3",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_children",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge3_17",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_adult",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge17_60",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_nbfaces_senior",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "nbFacesOfAge60_999",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "ai_faces",
"transformers": [
{
"classAlias": "aiAttributeFromReport",
"init": "namedFaces",
"input": {
"preset": "getAiReport"
}
}
]
},
{
"fieldSelector": "resorttheme",
"transformers": [
{
"classAlias": "prediction",
"input": {
"classAlias": "aiAttributeFromReport",
"init": "mappers",
"input": {
"preset": "getAiReport"
}
}
}
]
},
{
"fieldSelector": "resortthemesuggest",
"transformers": [
{
"classAlias": "prediction",
"init": {
"property": "resorttheme",
"minConfidence": 0,
"maxConfidence": 0.9
},
"input": {
"classAlias": "aiAttributeFromReport",
"init": "mappers",
"input": {
"preset": "getAiReport"
}
}
}
]
}
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"preset": "doNotComputeDuplicates"
},
"propertiesTransforms": [
{
"fieldSelector": "blurhash",
"transformers": [
{
"classAlias": "blurHash",
"init": {
"components": 8
}
}
]
},
{
"fieldSelector": "phavg",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phavg",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "phdiff",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phdiff",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "sha",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "sha256",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "duplicates",
"transformers": [
{
"classAlias": "duplicatesFinder",
"init": {
"objects": "#damobject,massimportitem"
}
}
]
}
]
},
{
"objectSelector": "#damobject,damimport",
"preventGuard": {
"preset": "hasMassimportOrSpaceTmpSource"
},
"propertiesTransforms": [
{
"fieldSelector": "blurhash",
"transformers": [
{
"classAlias": "blurHash",
"init": {
"components": 8
}
}
]
},
{
"fieldSelector": "phavg",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phavg",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "phdiff",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "negate",
"input": {
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
}
},
{
"classAlias": "staticVal",
"init": "0"
},
{
"classAlias": "resourceProperty",
"init": "phdiff",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"fieldSelector": "sha",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "sha256",
"input": {
"preset": "getBinary"
}
}
]
}
]
},
{
"objectSelector": "#damobject,damimport,massimportitem",
"preventGuard": {
"preset": "preventExecutionFromMassImport"
},
"propertiesTransforms": [
{
"fieldSelector": "keywords",
"transformers": [
{
"classAlias": "append",
"input": {
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "dimensionMultiTag",
"init": "iptc:keywords",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "description",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "dimensionTag",
"init": "iptc:2:120",
"input": {
"preset": "getDimensions"
}
}
}
]
},
{
"fieldSelector": "width",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "pxwidth",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "height",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "pxheight",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "dpi",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "xdpi",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "duration",
"transformers": [
{
"classAlias": "dimensionProperty",
"init": "duration",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "clipped",
"transformers": [
{
"classAlias": "booleanToActivated",
"input": {
"classAlias": "parseBoolean",
"input": {
"classAlias": "dimensionTag",
"init": "hasclipping",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "colorspace",
"transformers": [
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "dimensionProperty",
"init": "colorspace",
"input": {
"preset": "getDimensions"
}
}
}
]
},
{
"fieldSelector": "nbpages",
"transformers": [
{
"classAlias": "resourceProperty",
"init": "pagecount",
"input": {
"preset": "getBinary"
}
}
]
},
{
"fieldSelector": "photograph",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "asChild",
"init": "name",
"input": {
"classAlias": "dimensionTag",
"init": "exif:artist",
"input": {
"preset": "getDimensions"
}
}
}
}
]
},
{
"fieldSelector": "latitude",
"transformers": [
{
"classAlias": "geoCoords",
"init": "exif:gpslatitude",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "longitude",
"transformers": [
{
"classAlias": "geoCoords",
"init": "exif:gpslongitude",
"input": {
"preset": "getDimensions"
}
}
]
},
{
"fieldSelector": "assetformat",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "stringEquals",
"init": "image",
"input": {
"preset": "getRootNatureCode"
}
},
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "ratioToOrientation",
"init": "2",
"input": {
"classAlias": "dimensionProperty",
"init": "ratio",
"input": {
"preset": "getDimensions"
}
}
}
}
]
}
]
},
{
"fieldSelector": "videoratio",
"transformers": [
{
"classAlias": "ifElse",
"input": [
{
"classAlias": "stringEquals",
"init": "video",
"input": {
"preset": "getRootNatureCode"
}
},
{
"classAlias": "asChild",
"init": "code",
"input": {
"classAlias": "videoAspectRatio",
"input": {
"classAlias": "dimensionProperty",
"init": "ratio",
"input": {
"preset": "getDimensions"
}
}
}
}
]
}
]
},
{
"fieldSelector": "resolution",
"transformers": [
{
"classAlias": "join",
"init": "x",
"input": [
{
"classAlias": "dimensionProperty",
"init": "xdpi",
"input": {
"preset": "getDimensions"
}
},
{
"classAlias": "dimensionProperty",
"init": "ydpi",
"input": {
"preset": "getDimensions"
}
}
]
}
]
}
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isSpaceAsset"
}
},
"workflowTrigger": [
"publish"
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "canPublish"
}
},
"workflowTrigger": [
"publish"
]
},
{
"objectSelector": "#damobject",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "canSubmit"
}
},
"workflowTrigger": [
"submit"
]
},
{
"objectSelector": "#damobject",
"propertiesTransforms": [
{
"fieldSelector": "tmpsource",
"transformers": [
{
"classAlias": "staticVal",
"init": ""
}
]
}
]
},
{
"objectSelector": "massimportitem",
"propertiesTransforms": [
{
"fieldSelector": "tmpsource",
"transformers": [
{
"classAlias": "ifEmpty",
"input": {
"classAlias": "ifElse",
"input": [
{
"preset": "isSpaceItem"
},
{
"classAlias": "staticVal",
"init": "space"
},
{
"classAlias": "staticVal",
"init": "massimport"
}
]
}
}
]
}
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isSpaceItem"
}
},
"workflowTrigger": [
"tocheck"
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"classAlias": "negate",
"input": {
"preset": "isDuplicate"
}
},
"workflowTrigger": [
"markduplicate"
]
},
{
"objectSelector": "massimportitem",
"preventGuard": {
"preset": "isSpaceItem"
},
"workflowTrigger": [
"approve"
]
}
],
"asyncCallback": [
{
"objectSelector": "#damobject",
"plugin": "PACKAGED_DAM_Utils",
"callbackClass": "com.wedia.packaged.dam.NotifyUserAsyncCallback",
"callbackMethod": "notifyUser",
"active": false,
"runOnEmptyChanges": true
}
]
}
More info about the current denorm config here :
WXM_BO_Options
plugin.xml
Parameters:
ADDED com.noheto.upload.SecuredUpload.svg_as_vulnerable:
type: boolean
mandatory: false
description: Defines if svg suffixes are vulnerable suffixes.
default value: true
WXM_DAMDY
plugin.xml
Parameters:
ADDED variationprovider.ignore.images:
type: boolean
mandatory: false
description: Set to true to ignore images in VariationsProviders and therefore reduce evp calls
default value: true
PACKAGED_Security
Macros have been added through the plugin with the new version.
Theses macros are used on new security rules added by default for objectfile domain and it’s sendfile action. (More info below on the Security part)
plugin.xml
Parameters:
UPDATED exclude_ids_in_base_edit_list_role:
default value:
Old:
,4,
New:
,4,1,
security.xml
ADDED pkgIsPublishedDamobject
CONFIGHASTAG(objectname, 'damobject') AND GETSTATUSONLINE(objectname) = object.status
ADDED pkgSurferIsConnectedUser
surfer.isconnected='1' and surfer.roleid != '1'
ADDED pkgIsPublicPortal
objectname = 'portal' AND GETSTATUSONLINE(objectname) = object.status
Security changes
Objectfile domain is now enabled by default. It’s sendfile action has now 3 rules delivered by default. Theses 3 rules are allowing :
A connected user to view and download all variations
To view or download an published #damobject
To view the banner and the logo of a public portal
Added with : https://crossmedia.atlassian.net/browse/WXM-17775
Domains changes
objectfile
Enabled: false --> true
sendFile
Rules:
WEDIA PACKAGED - Connected users (ADDED)
Rule details
Description: If the user is logged in, then he is authorized to view and download all variations.
Enabled: true
Blocking: false
Expression:
@pkgSurferIsConnectedUser()
WEDIA PACKAGED - DAM Published instances (ADDED)
Rule details
Description: If it's a DAM object and is published, then we have the rights to see it.
Enabled: true
Blocking: false
Expression:
@pkgIsPublishedDamobject()
WEDIA PACKAGED - Public portal instances (ADDED)
Rule details
Description: If it's public portal, then we have the right to see it.
Enabled: true
Blocking: false
Expression:
@pkgIsPublicPortal()
Media Copy to Workspace: MassImport API Update
Purpose of the "Unlinked Asset Copy" Feature
This feature allows importing an existing asset into a collaborative workspace without linking it to the original. Unlike linked copies (i.e., reindexing), publishing or modifying the item will not affect the original asset. The goal is to create a new, independent asset.
itemIds
Parameter Update
The itemIds
(or ids
) parameter in the request body now supports JSON objects with specific keys, allowing more control over how assets are handled.
Supported format:
{
"itemIds": [
"123", // existing item ID
"uid:type_id", // asset copied with link (default behavior)
{ "id": "uid:type_id", "link": false } // asset copied without link
],
"metadata": {},
"itemData": {}
}
Behavior of the link
parameter key
true
(default): linked copy (reindexing). The created item will point to the original asset, which will be updated on publication.false
: unlinked copy. A new item is created, and a new asset will be generated during publication.
Use of initialState
When performing an unlinked copy, properties from the source asset that are not directly mappable to the item structure are stored in an initialState
object. This structure is later used during simulation and publication to ensure consistent behavior without altering existing processing logic.
Customizing Copy Behavior with Tags
Two field-level tags allow fine-grained control over what is copied from the asset into the item and eventually into the new asset:
rest_api_mass_import_copy_ignore
➤ Marks a field to be ignored during the creation of the item (only for unlinked copies).
➤ The field will not appear in the item.rest_api_mass_import_copy_to_published
➤ Allows a field’s value to be transferred to the new asset during item publication.
➤ Useful for retaining edited content in the final published asset.
These tags make the unlinked copy process configurable, allowing teams to define exactly which data should be carried over and when — during the item creation or the final asset publication.
Additional technical information here :
Extending asset copy : Link when copy between DAM & Creative workflow
How to implement asset linking when copying between DAM and Creative Workflow