The Carbon Copy Plus allows to automatically populate asset information fields with values coming from node information fields. For this the fields have to have compatible types. The node values can come from an asset's parent nodes (direct trigger) or from the nodes in its node referencing fields. In case there are multiple nodes, possibly from multiple sources, there are aggregation functions to get the desired value. By specifying a scope it can be exactly defined for which assets a configured target is applicable.
An asset is updated if it is in scope and there was an asset event for it (create, update metadata, released, add to/remove from node, version add/activate/delete) or a node metadata update event where the change of the updated node leads to a change of an asset's value. However, node changes that would lead to an asset coming in scope without the node changes leading to potential asset changes cannot be detected (edge case, moving a node with some linked assets is a likely scenario that could lead to this problem, then we can either use the task or trigger a change on the assets, if the assets were moved themselves it would be detected). The value is only updated if the newly calculated value is not the same.
To be configured in {home}/appserver/conf/custom.properties
If a deprecated property (crossed out) has no description the next propery is a new version of the property and its description still applies.
By using the target name "default" default values for targets can be specified. Replaced by templates in v2+. It's as simple as specifying a template and then all its data is copied before writing the other settings. Like this we have much more flexibility, e.g. we could have more than one default or even create template trees. See *.template and *.templateOnly properties.
type: string, required: yes, default: -
The license key for the plugin (product: carbonCopyPlus), provided by brix.
type: integer, required: no, default: 4
The number of threads in the thread pool.
type: integer, required: no, default: 30, version: 2+
The number of seconds events for assets and nodes are collected before the changes are processed by Carbon Copy Plus.
type: comma-separated list of nodeTypeId, required: no, default: -, version: <2
carbonCopyPlus.assetTypeId.{assetTypeId}.assignIfLinkedToNodeTypeIds
type: comma-separated list of nodeTypeId, required: no, default: -, version: 2+
The asset type with the {assetTypeId} is automatically assigned to an asset with no asset type if it is linked to a node with any of the listed node types.
A target (essentially an information field on an asset) has to have at least one data source (an information field on a node or a tag).
The other important information on the source is the trigger. It specifies which nodes or tags are considered as data sources for an asset (either the nodes to which the asset is directly assigned or the nodes/tags in a specific node/tag referencing information field). It is called trigger because linking an asset to a node or adding a node to the specific asset information field will trigger the copy process.
Because the trigger can be a node or tag referencing information field it is possible to get data from more than one node, therefore it is important to either specify or be aware of the default aggregation function when using those. It's also possible to delay the aggregation and let the target do it. The handling of empty values can be relevant for the aggregation also.
type: source name, required: no, default: -, version: 2+
A source to copy all properties from before setting the other properties. Source has no targetOnly property because a source that is not used in a target is automatically only a template.
type: information field id, required: yes, default: -, version <2
type: information field id, required: yes, default: -, version: 2+
Source node or tag (v2+) information field id. Has to have the same kind as the target field.
type: information field id, required: no, default: - (direct assigned), version: <2
carbonCopyPlus.source.{name}.trigger
type: direct (literally) or node/tag reference information field id, default: direct, version: 2+
Node or tag (v2+) reference field id or direct assignment if no trigger was specified (<v2) direct (literally, v2+).
type: boolean, required: no, default: false, version: <2
If there is no trigger (direct assignment) then recursive looks at all the nodes in its parent paths.
type: string, required: no, default: none, version: 2+
This specifies how to collect values from parent nodes.
type: string, required: yes, default: default, version: 2+
The aggregation function to use. For many of the aggregation functions the emptyValue property is very important.
Special values (always applicable):
or
for boolean fields, concatenate
for text fields, any
for dropdowns, max
for dates, union
for tag or node referencing fields and sum
for numbers.Boolean fields (checkboxes):
Node and tag referencing information fields:
Text information fields (including text area and their localized version, localized just handles each language independently):
Number information fields (long and double):
Dates:
type: string, required: no, default: ignore, version: 2+
What to do with empty (blank) values:
type: string, required: no, default:
,<SPACE>
, version: 2+
The delimiter to use for string concatenation. Only relevant for text fields and aggregation function not delay.
White-spaces at the start or the end are ignored in properties files, that's why there are the following substitutes available:
<SPACE>
<TAB>
<LINEBREAK>
type: asc or desc, required: no, default: asc, version: 2+
How to sort the individual parts before concatenating strings.
type: comma-separated list of options, required: no, default:
before, ellipsis, trim
, version: 2+
This defines how to shorten strings for (localized) text fields (max 255 characters).
type: integer, required: no, default: 10, version: 2+
The minimal length a text can be shortened to, if the string is still too long it will add as many texts as possible and force a delimiter and ellipsis at the end.
type: comma-separated list of modes, required: no, default: none, version: 2+
Additional modes that can be specified:
Targets have an asset information fields to which the data from the specified sources is written. Scopes are also defined on the target. Other than that most properties are similar to the ones of the sources to handle the aggregation of sources.
type: target name, required: no, default: -, version: 2+
The target from which all properties are copied before setting the other ones. This property is not inherited from the template.
type: boolean, required: no, default: false, version: 2+
If this is set to true then the target is not executed and just used as template for others. This property is not inherited from the template.
type: information field id, required: yes, default: -, version: <2
carbonCopyPlus.target.{name}.informationFieldId
type: information field id, required: yes, default: -, version: 2+
The target asset information field id.
type: user id, required: no, default: API User, version: 2+
The user ID of the user used to write the target information field.
type: comma-separated list of source names, required: yes, default: -, version: 2+
The sources for the target.
type: search util 2 expression, required: no, default: assetId >= 1, version: 2+
Carbon Copy Plus is only triggered on assets within the specified scope.
This does not apply to the reapply task, be sure to set it there as well
type: user id, required: no, default: API User, version: 2+
The user ID of the user used to check whether an asset is in scope or not. This allows for additional filter possibilities through permissions.
type: string, required: yes, default: default, version: 2+
The aggregation function to use. Same as for source except that delay is not allowed.
type: string, required: no, default: ignore, version: 2+
What to do with empty (blank) values when aggregating the values from the sources. Same possible values as for sources.
type: string, required: no, default:
,<SPACE>
, version: <2carbonCopyPlus.target.{name}.delimiter
type: string, required: no, default:
;<SPACE>
, version: 2+
Delimiter for text concatenation of the values from the sources, special values: <SPACE>
, <TAB>
, <LINEBREAK>
type: asc or desc, required: no, default: asc, version: 2+
How to sort the data from the sources before concatenating strings.
type: comma-separated list of options, required: no, default:
before, ellipsis, trim
, version: 2+
This defines how to shorten strings for (localized) text fields, same as for sources.
type: integer, required: no, default: 10, version: 2+
The minimal length a text can be shortened to, if the string is still too long it will add as many texts as possible and force a delimiter and ellipsis at the end.
type: comma-separated list of modes, required: no, default: none, version: 2+
Additional modes for the target.
type: boolean, required:no, default: false, version: <2
Only change value if the target field is empty.
type: string, required: yes, default: -, version: <2
How to collect values if the target has several sources or trigger fields with multiple nodes in it.
A task to re-apply the carbon copy initially or after node values have changed.
type: boolean, required: no, default: true, version: 2+
Set this property to false to disable the completely, this prevents someone from accidentally starting the task.
type: comma-separated list of target names, required: no, default: - (all targets except templates), version: 2+
The targets which should be executed. It is possible to define special targets just used in tasks by defining them as templateOnly and then listing them explicitly.
type: search util 2 expression, required: no, default: assetId >= 1, version: 2+
Define a scope for the task. This property and targets can be useful if there are a lot of assets to only update what is really needed and not everything.
type: user id, required: no, default: API User, version: 2+
The user ID of the user used to check whether an asset is in scope or not. This allows for additional filter possibilities through permissions.
type: comma-separated list of modes, required: no, default: noClear, version: 2+
type: boolean, required: no, default: true, version: <2
Clear information fields when a trigger becomes empty.
type: boolean, required: no, default:
true
, version: <2
If this property is set to true then the system task only triggers assets and targets if the target has direct assigned (recursive) sources or the target has sources with non-empty asset trigger fields.
There are a lot of properties, but most of them usually don't need to be changed. Some hints for a basic configuration:
carbonCopyPlus.license=
carbonCopyPlus.threadPoolSize=4
carbonCopyPlus.debounceTimeInSeconds=30
carbonCopyPlus.assetTypeId.{assetTypeId}.assignIfLinkedToNodeTypeIds=
carbonCopyPlus.source.{name}.template=
carbonCopyPlus.source.{name}.sourceFieldId=
carbonCopyPlus.source.{name}.trigger=direct
carbonCopyPlus.source.{name}.triggerRecursive=no
carbonCopyPlus.source.{name}.aggregation=default
carbonCopyPlus.source.{name}.emptyValue=ignore
carbonCopyPlus.source.{name}.delimiter=,<SPACE>
carbonCopyPlus.source.{name}.order=asc
carbonCopyPlus.source.{name}.shortenSingleLineText=before,ellipsis,trim
carbonCopyPlus.source.{name}.shortenMinLength=10
carbonCopyPlus.source.{name}.modes=none
carbonCopyPlus.target.{name}.template=
carbonCopyPlus.target.{name}.templateOnly=false
carbonCopyPlus.target.{name}.informationFieldId=
carbonCopyPlus.target.{name}.infoFieldUserId=
carbonCopyPlus.target.{name}.sources=
carbonCopyPlus.target.{name}.scope=assetId >= 1
carbonCopyPlus.target.{name}.sopeUserId=
carbonCopyPlus.target.{name}.aggregation=default
carbonCopyPlus.target.{name}.emptyValue=ignore
carbonCopyPlus.target.{name}.delimiter=;<SPACE>
carbonCopyPlus.target.{name}.order=asc
carbonCopyPlus.target.{name}.shortenSingleLineText=before,ellipsis,trim
carbonCopyPlus.target.{name}.shortenMinLength=10
carbonCopyPlus.target.{name}.modes=none
carbonCopyPlus.task.enabled=true
carbonCopyPlus.task.targets=
carbonCopyPlus.task.scope=assetId >= 1
carbonCopyPlus.task.scopeUserId=
carbonCopyPlus.task.modes=noClear
carbonCopyPlus.license=...
carbonCopyPlus.actionMenuEnabled=false
carbonCopyPlus.default.delimiter=;<SPACE>
carbonCopyPlus.default.mode=UNION
carbonCopyPlus.default.clearInformationFields=true
# Copy field 104 when assigned through noderef 106
carbonCopyPlus.1.target=104
carbonCopyPlus.1.1.source=104
carbonCopyPlus.1.1.trigger=106
# Copy field 136 when assigned through noderef 106
carbonCopyPlus.2.target=136
carbonCopyPlus.2.1.source=136
carbonCopyPlus.2.1.trigger=106
# Copy from 135 to 149 when assigned through noderef 150
carbonCopyPlus.3.target=149
carbonCopyPlus.3.1.source=135
carbonCopyPlus.3.1.trigger=150
Carbon Copy Plus | CELUM (min. version) |
---|---|
1.0.0 | 6.4 |
2.0.0 | 6.4 |
Released 2022-08-25
Initial version
Released 2022-12-08
Released 2023-02-16