|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+use crate::ODRL::Vocabulary::Vocabulary;
|
|
|
2
|
+
|
|
|
3
|
+use std::collections::HashMap;
|
|
|
4
|
+use lazy_static::lazy_static;
|
|
|
5
|
+use std::sync::Mutex;
|
|
|
6
|
+
|
|
|
7
|
+
|
|
|
8
|
+#[derive(Clone)]
|
|
|
9
|
+struct ActionTerm {
|
|
|
10
|
+
|
|
|
11
|
+ value: String,
|
|
|
12
|
+ parent_term: Option<Box<ActionTerm>>,
|
|
|
13
|
+ child_terms: Vec<ActionTerm>,
|
|
|
14
|
+
|
|
|
15
|
+}
|
|
|
16
|
+
|
|
|
17
|
+impl ActionTerm {
|
|
|
18
|
+
|
|
|
19
|
+ pub fn new(value: String, parent_term: Option<Box<ActionTerm>>) -> Self {
|
|
|
20
|
+
|
|
|
21
|
+ let mut action_term = ActionTerm {
|
|
|
22
|
+ value,
|
|
|
23
|
+ parent_term: None,
|
|
|
24
|
+ child_terms: Vec::new(),
|
|
|
25
|
+ };
|
|
|
26
|
+
|
|
|
27
|
+ if let Some(mut parent) = parent_term {
|
|
|
28
|
+ parent.child_terms.push(action_term.clone());
|
|
|
29
|
+ action_term.parent_term = Some(parent);
|
|
|
30
|
+ }
|
|
|
31
|
+
|
|
|
32
|
+ action_term
|
|
|
33
|
+
|
|
|
34
|
+ }
|
|
|
35
|
+
|
|
|
36
|
+ pub fn get_ancestor_terms(&self) -> Vec<ActionTerm> {
|
|
|
37
|
+ let mut ancestors = Vec::new();
|
|
|
38
|
+ self.add_ancestor_term(&mut ancestors);
|
|
|
39
|
+ ancestors
|
|
|
40
|
+ }
|
|
|
41
|
+
|
|
|
42
|
+ fn add_ancestor_term(&self, ancestors: &mut Vec<ActionTerm>) {
|
|
|
43
|
+ if let Some(parent) = &self.parent_term {
|
|
|
44
|
+ ancestors.insert(0, (**parent).clone());
|
|
|
45
|
+ parent.add_ancestor_term(ancestors);
|
|
|
46
|
+ }
|
|
|
47
|
+ }
|
|
|
48
|
+
|
|
|
49
|
+ pub fn get_root_term(&self) -> ActionTerm {
|
|
|
50
|
+ let ancestors = self.get_ancestor_terms();
|
|
|
51
|
+ if !ancestors.is_empty() {
|
|
|
52
|
+ ancestors[0].clone()
|
|
|
53
|
+ } else {
|
|
|
54
|
+ self.clone()
|
|
|
55
|
+ }
|
|
|
56
|
+ }
|
|
|
57
|
+
|
|
|
58
|
+ pub fn get_descendant_terms(&self) -> Vec<ActionTerm> {
|
|
|
59
|
+ let mut descendants = Vec::new();
|
|
|
60
|
+ self.add_descendant_term(&mut descendants);
|
|
|
61
|
+ descendants
|
|
|
62
|
+ }
|
|
|
63
|
+
|
|
|
64
|
+ fn add_descendant_term(&self, descendants: &mut Vec<ActionTerm>) {
|
|
|
65
|
+ for child in &self.child_terms {
|
|
|
66
|
+ descendants.push(child.clone());
|
|
|
67
|
+ child.add_descendant_term(descendants);
|
|
|
68
|
+ }
|
|
|
69
|
+ }
|
|
|
70
|
+
|
|
|
71
|
+}
|
|
|
72
|
+
|
|
|
73
|
+lazy_static! {
|
|
|
74
|
+ static ref ACTIONTERMS: Mutex<HashMap<String, ActionTerm>> = {
|
|
|
75
|
+ let mut map = HashMap::new();
|
|
|
76
|
+ init_action_terms();
|
|
|
77
|
+ Mutex::new(map)
|
|
|
78
|
+ };
|
|
|
79
|
+}
|
|
|
80
|
+
|
|
|
81
|
+pub fn register_action_term(value: String, action_term: ActionTerm) {
|
|
|
82
|
+ ACTIONTERMS.lock().unwrap().insert(value, action_term);
|
|
|
83
|
+}
|
|
|
84
|
+
|
|
|
85
|
+fn init_action_terms() {
|
|
|
86
|
+
|
|
|
87
|
+ /// Actions for Permission or Prohibition
|
|
|
88
|
+
|
|
|
89
|
+ /// "use" and subitems
|
|
|
90
|
+ /* The Assigner permits/prohibits the Assignee to use the Asset as agreed.
|
|
|
91
|
+ More details may be defined in the applicable agreements or under applicable commercial laws.
|
|
|
92
|
+ Refined types of actions can be expressed by the narrower actions. */
|
|
|
93
|
+ let use_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("use"), None);
|
|
|
94
|
+ register_action_term("USE".to_string(), use_term.clone());
|
|
|
95
|
+
|
|
|
96
|
+ /* The Assigner permits/prohibits the Assignee(s) to use the Asset or parts of it as part of a composite collection. */
|
|
|
97
|
+ let aggregate_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("aggregate"), Some(Box::new(use_term.clone())));
|
|
|
98
|
+ register_action_term("AGGREGATE".to_string(), aggregate_term.clone());
|
|
|
99
|
+
|
|
|
100
|
+ /* The Assigner permits/prohibits the Assignee(s) to add explanatory notations/commentaries to the Asset without
|
|
|
101
|
+ modifying the Asset in any other way. */
|
|
|
102
|
+ let annotate_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("annotate"), Some(Box::new(use_term.clone())));
|
|
|
103
|
+ register_action_term("ANNOTATE".to_string(), annotate_term.clone());
|
|
|
104
|
+
|
|
|
105
|
+ /* The Assigner permits/prohibits the Assignee(s) to anonymize all or parts of the Asset.
|
|
|
106
|
+ For example, to remove identifying particulars for statistical or for other comparable purposes,
|
|
|
107
|
+ or to use the asset without stating the author / source */
|
|
|
108
|
+ let anonymize_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("anonymize"), Some(Box::new(use_term.clone())));
|
|
|
109
|
+ register_action_term("ANONYMIZE".to_string(), anonymize_term.clone());
|
|
|
110
|
+
|
|
|
111
|
+ /* The Assigner permits/prohibits the Assignee(s) to store the Asset (in a non-transient form).
|
|
|
112
|
+ Constraints may be used for temporal conditions. */
|
|
|
113
|
+ let archive_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("archive"), Some(Box::new(use_term.clone())));
|
|
|
114
|
+ register_action_term("ARCHIVE".to_string(), archive_term.clone());
|
|
|
115
|
+
|
|
|
116
|
+ /* The Assigner permits/prohibits the Assignee(s) to create multiple copies of the Asset that are being concurrently used. */
|
|
|
117
|
+ let concurrent_use_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("concurrent"), Some(Box::new(use_term.clone())));
|
|
|
118
|
+ register_action_term("CONCURRENT_USE".to_string(), concurrent_use_term.clone());
|
|
|
119
|
+
|
|
|
120
|
+ /* The Assigner permits/prohibits the Assignee(s) to create a new derivative Asset from this Asset and to edit or modify the derivative.
|
|
|
121
|
+ A new asset is created and may have significant overlaps with the original Asset. (Note that the notion of whether or not the change is
|
|
|
122
|
+ significant enough to qualify as a new asset is subjective.) To the derived Asset a next policy may be applied. */
|
|
|
123
|
+ let derive_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("derive"), Some(Box::new(use_term.clone())));
|
|
|
124
|
+ register_action_term("DERIVE".to_string(), derive_term.clone());
|
|
|
125
|
+
|
|
|
126
|
+ /* The Assigner permits/prohibits the Assignee(s) to produce a digital copy of (or otherwise digitize) the Asset from its analogue form. */
|
|
|
127
|
+ let digitize_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("digitize"), Some(Box::new(use_term.clone())));
|
|
|
128
|
+ register_action_term("DIGITIZE".to_string(), digitize_term.clone());
|
|
|
129
|
+
|
|
|
130
|
+ /* The Assigner permits/prohibits the Assignee(s) to distribute the Asset. */
|
|
|
131
|
+ let distribute_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("distribute"), Some(Box::new(use_term.clone())));
|
|
|
132
|
+ register_action_term("DISTRIBUTE".to_string(), distribute_term.clone());
|
|
|
133
|
+
|
|
|
134
|
+ /* The Assigner permits/prohibits the Assignee(s) to run the computer program Asset.
|
|
|
135
|
+ For example, machine executable code or Java such as a game or application. */
|
|
|
136
|
+ let execute_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("execute"), Some(Box::new(use_term.clone())));
|
|
|
137
|
+ register_action_term("EXECUTE".to_string(), execute_term.clone());
|
|
|
138
|
+
|
|
|
139
|
+ /* The Assigner permits/prohibits the Assignee to grant the use the Asset to third parties.
|
|
|
140
|
+ This action enables the Assignee to create policies for the use of the Asset for third parties.
|
|
|
141
|
+ nextPolicy is recommended to be agreed with the third party. Use of temporal constraints is recommended. */
|
|
|
142
|
+ let grant_use_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("grantUse"), Some(Box::new(use_term.clone()))); // towards third-party only
|
|
|
143
|
+ register_action_term("GRANT_USE".to_string(), grant_use_term.clone());
|
|
|
144
|
+
|
|
|
145
|
+ /* The Assigner permits/prohibits the Assignee(s) to record the Asset in an index.
|
|
|
146
|
+ For example, to include a link to the Asset in a search engine database. */
|
|
|
147
|
+ let index_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("index"), Some(Box::new(use_term.clone())));
|
|
|
148
|
+ register_action_term("INDEX".to_string(), index_term.clone());
|
|
|
149
|
+
|
|
|
150
|
+ /* The Assigner permits/prohibits the Assignee(s) to load the computer program Asset onto a storage device
|
|
|
151
|
+ which allows operating or running the Asset. */
|
|
|
152
|
+ let install_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("install"), Some(Box::new(use_term.clone())));
|
|
|
153
|
+ register_action_term("INSTALL".to_string(), install_term.clone());
|
|
|
154
|
+
|
|
|
155
|
+ /* The Assigner permits/prohibits the Assignee(s) to update existing content of the Asset. A new asset is not created by this action.
|
|
|
156
|
+ This action will modify an asset which is typically updated from time to time without creating a new asset like a database.
|
|
|
157
|
+ If the result from modifying the asset should be a new asset the actions derive or extract should be used.
|
|
|
158
|
+ (Note that the notion of whether or not the change is significant enough to qualify as a new asset is subjective.) */
|
|
|
159
|
+ let modify_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("modify"), Some(Box::new(use_term.clone())));
|
|
|
160
|
+ register_action_term("MODIFY".to_string(), modify_term.clone());
|
|
|
161
|
+
|
|
|
162
|
+ /* The Assigner permits/prohibits the Assignee(s) to move the Asset from one digital location to another including deleting the original copy.
|
|
|
163
|
+ After the Asset has been moved, the original copy must be deleted. */
|
|
|
164
|
+ let move_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("move"), Some(Box::new(use_term.clone())));
|
|
|
165
|
+ register_action_term("MOVE".to_string(), move_term.clone());
|
|
|
166
|
+
|
|
|
167
|
+ /* The Assigner permits/prohibits the Assignee(s) to obtain data from the Asset.
|
|
|
168
|
+ For example, the ability to read a record from a database (the Asset). */
|
|
|
169
|
+ let read_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("read"), Some(Box::new(use_term.clone())));
|
|
|
170
|
+ register_action_term("READ".to_string(), read_term.clone());
|
|
|
171
|
+
|
|
|
172
|
+ /* The Assigner permits/prohibits the Assignee(s) to have a text Asset read out loud to an audience. */
|
|
|
173
|
+ let text_to_speech_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("textToSpeech"), Some(Box::new(use_term.clone())));
|
|
|
174
|
+ register_action_term("TEXT_TO_SPEECH".to_string(), text_to_speech_term.clone());
|
|
|
175
|
+
|
|
|
176
|
+ /* The Assigner permits/prohibits the Assignee(s) to make a digital copy of the digital Asset in another digital format.
|
|
|
177
|
+ Typically used to convert the Asset into a different format for consumption on/transfer to a third party system. */
|
|
|
178
|
+ let transform_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("transform"), Some(Box::new(use_term.clone())));
|
|
|
179
|
+ register_action_term("TRANSFORM".to_string(), transform_term.clone());
|
|
|
180
|
+
|
|
|
181
|
+ /* The Assigner permits/prohibits the Assignee(s) to translate the original natural language of an Asset into another natural language.
|
|
|
182
|
+ A new derivative Asset is created by that action. */
|
|
|
183
|
+ let translate_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("translate"), Some(Box::new(use_term.clone())));
|
|
|
184
|
+ register_action_term("TRANSLATE".to_string(), translate_term.clone());
|
|
|
185
|
+
|
|
|
186
|
+ /// "present" and subitems
|
|
|
187
|
+ /* The Assigner permits/prohibits the Assignee(s) to perform or exhibit an Asset to an audience. */
|
|
|
188
|
+ let present_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("present"), Some(Box::new(use_term.clone())));
|
|
|
189
|
+ register_action_term("PRESENT".to_string(), present_term.clone());
|
|
|
190
|
+
|
|
|
191
|
+ /* The Assigner permits/prohibits the Assignee(s) to display the visual media Asset to an audience or the public.
|
|
|
192
|
+ For example, displaying an image on a screen. */
|
|
|
193
|
+ let display_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("display"), Some(Box::new(present_term.clone())));
|
|
|
194
|
+ register_action_term("DISPLAY".to_string(), display_term.clone());
|
|
|
195
|
+
|
|
|
196
|
+ /* The Assigner permits/prohibits the Assignee(s) to perform an audio Asset to an audience. */
|
|
|
197
|
+ let play_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("play"), Some(Box::new(present_term.clone())));
|
|
|
198
|
+ register_action_term("PLAY".to_string(), play_term.clone());
|
|
|
199
|
+
|
|
|
200
|
+ /* The Assigner permits/prohibits the Assignee(s) to print an Asset onto paper or to create a hard copy.
|
|
|
201
|
+ For example, creating a permanent, fixed (static), and directly perceivable representation of the Asset. */
|
|
|
202
|
+ let print_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("print"), Some(Box::new(present_term.clone())));
|
|
|
203
|
+ register_action_term("PRINT".to_string(), print_term.clone());
|
|
|
204
|
+
|
|
|
205
|
+ /// "reproduce" and subitems
|
|
|
206
|
+ /* The Assigner permits/prohibits the Assignee(s) to make (an) exact reproduction(s) of the Asset. */
|
|
|
207
|
+ let reproduce_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("reproduce"), Some(Box::new(use_term.clone())));
|
|
|
208
|
+ register_action_term("REPRODUCE".to_string(), reproduce_term.clone());
|
|
|
209
|
+
|
|
|
210
|
+ /* The Assigner permits/prohibits the Assignee(s) to extract parts of the Asset and to use it as a new Asset.
|
|
|
211
|
+ A new asset is created and may have very little in common with the original Asset. (Note that the notion of
|
|
|
212
|
+ whether or not the change is significant enough to qualify as a new asset is subjective.) To the extracted
|
|
|
213
|
+ Asset a next policy may be applied. */
|
|
|
214
|
+ let extract_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("extract"), Some(Box::new(reproduce_term.clone())));
|
|
|
215
|
+ register_action_term("EXTRACT".to_string(), extract_term.clone());
|
|
|
216
|
+
|
|
|
217
|
+ /// "transfer" and subitems
|
|
|
218
|
+ /* The Assigner transfers/does not transfer the ownership in perpetuity to the Assignee(s). */
|
|
|
219
|
+ let transfer_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("transfer"), None);
|
|
|
220
|
+ register_action_term("TRANSFER".to_string(), transfer_term.clone());
|
|
|
221
|
+
|
|
|
222
|
+ /* The Assigner permits/prohibits the Assignee(s) to transfer the ownership of the Asset to a third party without
|
|
|
223
|
+ compensation and while deleting the original asset. */
|
|
|
224
|
+ let give_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("give"), Some(Box::new(transfer_term.clone()))); // towards third-party only
|
|
|
225
|
+ register_action_term("GIVE".to_string(), give_term.clone());
|
|
|
226
|
+
|
|
|
227
|
+ /* The Assigner permits/prohibits the Assignee(s) to transfer the ownership of the Asset to a third party with compensation and while deleting the original asset. */
|
|
|
228
|
+ let sell_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("sell"), Some(Box::new(transfer_term.clone()))); // towards third-party only
|
|
|
229
|
+ register_action_term("SELL".to_string(), sell_term.clone());
|
|
|
230
|
+
|
|
|
231
|
+
|
|
|
232
|
+ /// Actions for Duty
|
|
|
233
|
+ /* The Assigner requires that the Assignee(s) accepts that the use of the Asset may be tracked
|
|
|
234
|
+ The collected information may be tracked by the Assigner, or may link to a Party with the role function “trackingParty”. */
|
|
|
235
|
+ let accept_tracking_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("acceptTracking"), None);
|
|
|
236
|
+ register_action_term("ACCEPT_TRACKING".to_string(), accept_tracking_term.clone());
|
|
|
237
|
+
|
|
|
238
|
+ /* The Assigner requires that the Assignee(s) attributes the Asset to the Assigner or an attributed Party.
|
|
|
239
|
+ May link to an Asset with the attribution information. May link to a Party with the role function “attributedParty”. */
|
|
|
240
|
+ let attribute_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("attribute"), None);
|
|
|
241
|
+ register_action_term("ATTRIBUTE".to_string(), attribute_term.clone());
|
|
|
242
|
+
|
|
|
243
|
+ /* The Assigner requires that the Assignee(s) compensates the Assigner (or other specified compensation Party) by some amount of value,
|
|
|
244
|
+ if defined, for use of the Asset.
|
|
|
245
|
+ The compensation may use different types of things with a value:
|
|
|
246
|
+ – the thing is expressed by the value (term) of the Constraint name
|
|
|
247
|
+ – the value is expressed by operator, rightOperand, dataType and unit */
|
|
|
248
|
+ let compensate_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("compensate"), None);
|
|
|
249
|
+ register_action_term("COMPENSATE".to_string(), compensate_term.clone());
|
|
|
250
|
+
|
|
|
251
|
+ /* The Assigner requires that the Assignee(s) permanently removes all copies of the Asset.
|
|
|
252
|
+ Use a constraint to define under which conditions the Asset should be deleted. */
|
|
|
253
|
+ let delete_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("delete"), None);
|
|
|
254
|
+ register_action_term("DELETE".to_string(), delete_term.clone());
|
|
|
255
|
+
|
|
|
256
|
+ /* The Assignee requires that the Assigner(s) ensure(s) that the permission on the Asset is exclusive to the Assignee. */
|
|
|
257
|
+ let ensure_exclusivity_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("ensureExclusivity"), None);
|
|
|
258
|
+ register_action_term("ENSURE_EXCLUSIVITY".to_string(), ensure_exclusivity_term.clone());
|
|
|
259
|
+
|
|
|
260
|
+ /* The Assigner requires that the Assignee(s) include(s) other related assets in the Asset.
|
|
|
261
|
+ For example; Bio picture must be included in the attribution. Use of the Asset relation attribute is required */
|
|
|
262
|
+ let include_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("include"), None);
|
|
|
263
|
+ register_action_term("INCLUDE".to_string(), include_term.clone());
|
|
|
264
|
+
|
|
|
265
|
+ /* The Assigner requires that the Assignee(s) inform(s) the Assigner or an informed Party that an action has been performed
|
|
|
266
|
+ in relation to the Asset.
|
|
|
267
|
+ May link to a Party with the role function “informedParty”. */
|
|
|
268
|
+ let inform_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("inform"), None);
|
|
|
269
|
+ register_action_term("INFORM".to_string(), inform_term.clone());
|
|
|
270
|
+
|
|
|
271
|
+ /* The Assigner requires that the Assignee(s) grants the specified Policy to a third party for their use of the Asset. */
|
|
|
272
|
+ let next_policy_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("nextPolicy"), None);
|
|
|
273
|
+ register_action_term("NEXT_POLICY".to_string(), next_policy_term.clone());
|
|
|
274
|
+
|
|
|
275
|
+ /* The Assigner requires that the Assignee(s) obtains explicit consent from the Assigner or a consenting Party to perform the requested
|
|
|
276
|
+ action in relation to the Asset.
|
|
|
277
|
+ Used as a Duty to ensure that the Assigner or a Party is authorized to approve such actions on a case-by-case basis.
|
|
|
278
|
+ May link to a Party with the role function “consentingParty”. */
|
|
|
279
|
+ let obtain_consent_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("obtainConsent"), None);
|
|
|
280
|
+ register_action_term("OBTAIN_CONSENT".to_string(), obtain_consent_term.clone());
|
|
|
281
|
+
|
|
|
282
|
+ /* The Assigner requires that the Assignee(s) has(ve) a person review the Policy applicable to the Asset.
|
|
|
283
|
+ Used when human intervention is required to review the Policy. May link to an Asset which represents the full Policy information. */
|
|
|
284
|
+ let review_policy_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("reviewPolicy"), None);
|
|
|
285
|
+ register_action_term("REVIEW_POLICY".to_string(), review_policy_term.clone());
|
|
|
286
|
+
|
|
|
287
|
+ /* The Assigner requires that the Assignee(s) unload(s) and delete(s) the computer program Asset from a storage device and
|
|
|
288
|
+ disable(s) its readiness for operation.
|
|
|
289
|
+ The Asset is no longer accessible to the Assignee(s). */
|
|
|
290
|
+ let uninstall_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("uninstall"), None);
|
|
|
291
|
+ register_action_term("UNINSTALL".to_string(), uninstall_term.clone());
|
|
|
292
|
+
|
|
|
293
|
+ /* The Assigner requires that the Assignee(s) apply(ies) a watermark as provided by the Assigner to the Asset.
|
|
|
294
|
+ It is recommended to embed a link to the watermark. */
|
|
|
295
|
+ let watermark_term = ActionTerm::new(Vocabulary::create_odrl_vocab_item("watermark"), None);
|
|
|
296
|
+ register_action_term("WATERMARK".to_string(), watermark_term.clone());
|
|
|
297
|
+
|
|
|
298
|
+}
|