1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.opencastproject.assetmanager.util;
22
23 import static org.opencastproject.assetmanager.api.AssetManager.DEFAULT_OWNER;
24 import static org.opencastproject.mediapackage.MediaPackageElements.XACML_POLICY_EPISODE;
25 import static org.opencastproject.mediapackage.MediaPackageElements.XACML_POLICY_SERIES;
26 import static org.opencastproject.systems.OpencastConstants.WORKFLOW_PROPERTIES_NAMESPACE;
27
28 import org.opencastproject.assetmanager.api.AssetManager;
29 import org.opencastproject.assetmanager.api.Property;
30 import org.opencastproject.assetmanager.api.PropertyId;
31 import org.opencastproject.assetmanager.api.Value;
32 import org.opencastproject.assetmanager.api.query.AQueryBuilder;
33 import org.opencastproject.assetmanager.api.query.ARecord;
34 import org.opencastproject.assetmanager.api.query.AResult;
35 import org.opencastproject.mediapackage.Attachment;
36 import org.opencastproject.mediapackage.Catalog;
37 import org.opencastproject.mediapackage.MediaPackage;
38 import org.opencastproject.mediapackage.MediaPackageElement;
39 import org.opencastproject.mediapackage.MediaPackageElementFlavor;
40
41 import java.util.Arrays;
42 import java.util.Collection;
43 import java.util.Collections;
44 import java.util.HashMap;
45 import java.util.HashSet;
46 import java.util.List;
47 import java.util.Map;
48 import java.util.Set;
49 import java.util.stream.Collectors;
50
51
52
53
54
55 public final class WorkflowPropertiesUtil {
56 private static final Set<MediaPackageElementFlavor> SECURITY_FLAVORS = new HashSet<>(
57 Arrays.asList(XACML_POLICY_EPISODE, XACML_POLICY_SERIES));
58
59 private WorkflowPropertiesUtil() {
60 }
61
62
63
64
65
66
67
68 public static Map<String, Map<String, String>> getLatestWorkflowPropertiesForEvents(final AssetManager assetManager,
69 final Collection<String> eventIds) {
70 final AQueryBuilder query = assetManager.createQuery();
71 final AResult result = query.select(query.snapshot(), query.propertiesOf(WORKFLOW_PROPERTIES_NAMESPACE))
72 .where(query.mediaPackageIds(eventIds.toArray(new String[0])).and(query.version().isLatest())).run();
73 final Map<String, Map<String, String>> workflowProperties = new HashMap<>(eventIds.size());
74 for (final ARecord record : result.getRecords()) {
75 final List<Property> recordProps = record.getProperties();
76 final Map<String, String> eventMap = new HashMap<>(recordProps.size());
77 for (final Property property : recordProps) {
78 eventMap.put(property.getId().getName(), property.getValue().get(Value.STRING));
79 }
80 final String eventId = record.getMediaPackageId();
81 workflowProperties.put(eventId, eventMap);
82 }
83 return workflowProperties;
84 }
85
86
87
88
89
90
91
92 public static Map<String, String> getLatestWorkflowProperties(final AssetManager assetManager,
93 final String mediaPackageId) {
94 return assetManager.selectProperties(mediaPackageId, WORKFLOW_PROPERTIES_NAMESPACE)
95 .parallelStream()
96 .collect(Collectors.toMap(
97 p -> p.getId().getName(),
98 p -> p.getValue().get(Value.STRING)));
99 }
100
101
102
103
104
105
106
107 public static void storeProperties(final AssetManager assetManager, final MediaPackage mediaPackage,
108 final Map<String, String> properties) {
109
110
111
112
113 if (!assetManager.snapshotExists(mediaPackage.getIdentifier().toString())) {
114 MediaPackage simplifiedMediaPackage = (MediaPackage) mediaPackage.clone();
115 for (MediaPackageElement element : mediaPackage.getElements()) {
116 if (element instanceof Catalog) {
117 continue;
118 }
119 if (element instanceof Attachment && SECURITY_FLAVORS.contains(element.getFlavor())) {
120 continue;
121 }
122 simplifiedMediaPackage.remove(element);
123 }
124
125 assetManager.takeSnapshot(DEFAULT_OWNER, simplifiedMediaPackage);
126 }
127
128
129 for (final Map.Entry<String, String> entry : properties.entrySet()) {
130 final PropertyId propertyId = PropertyId
131 .mk(mediaPackage.getIdentifier().toString(), WORKFLOW_PROPERTIES_NAMESPACE, entry.getKey());
132 final Property property = Property.mk(propertyId, Value.mk(entry.getValue()));
133 assetManager.setProperty(property);
134 }
135 }
136
137 public static void storeProperty(final AssetManager assetManager, final MediaPackage mediaPackage,
138 final String name, final String value) {
139 storeProperties(assetManager, mediaPackage, Collections.singletonMap(name, value));
140 }
141 }