use of org.opencastproject.mediapackage.EName in project opencast by opencast.
the class AnimateWorkflowOperationHandler method getMetadata.
private Map<String, String> getMetadata(MediaPackage mediaPackage) {
Map<String, String> metadata = new HashMap<>();
// get episode metadata
MediaPackageElementFlavor[] flavors = { MediaPackageElements.EPISODE, MediaPackageElements.SERIES };
for (MediaPackageElementFlavor flavor : flavors) {
// Get metadata catalogs
for (Catalog catalog : mediaPackage.getCatalogs(flavor)) {
DublinCoreCatalog dc = DublinCoreUtil.loadDublinCore(workspace, catalog);
for (Map.Entry<EName, List<DublinCoreValue>> entry : dc.getValues().entrySet()) {
String key = String.format("%s.%s", flavor.getSubtype(), entry.getKey().getLocalName());
String value = entry.getValue().get(0).getValue();
metadata.put(key, value);
logger.debug("metadata: {} -> {}", key, value);
}
}
}
return metadata;
}
use of org.opencastproject.mediapackage.EName in project opencast by opencast.
the class EmailTemplateServiceImpl method initCatalogs.
/**
* Initializes the map with all fields from the dublin core catalogs.
*/
private HashMap<String, HashMap<String, String>> initCatalogs(MediaPackage mediaPackage) {
HashMap<String, HashMap<String, String>> catalogs = new HashMap<String, HashMap<String, String>>();
Catalog[] dcs = mediaPackage.getCatalogs(DublinCoreCatalog.ANY_DUBLINCORE);
for (int i = 0; dcs != null && i < dcs.length; i++) {
DublinCoreCatalog dc = null;
InputStream in = null;
try {
File f = workspace.get(dcs[i].getURI());
in = new FileInputStream(f);
dc = DublinCores.read(in);
} catch (Exception e) {
logger.warn("Error when populating catalog data", e);
// Don't include the info
continue;
} finally {
IOUtils.closeQuietly(in);
}
if (dc != null) {
String catalogFlavor = dcs[i].getFlavor().getSubtype();
HashMap<String, String> catalogHash = new HashMap<String, String>();
for (EName ename : dc.getProperties()) {
String name = ename.getLocalName();
catalogHash.put(name, dc.getAsText(ename, DublinCore.LANGUAGE_ANY, DEFAULT_DELIMITER_FOR_MULTIPLE));
}
catalogs.put(catalogFlavor, catalogHash);
}
}
return catalogs;
}
use of org.opencastproject.mediapackage.EName in project opencast by opencast.
the class SchedulerUtil method toHumanReadableString.
/**
* Converts a scheduler event to a human readable string
*
* @param workspace
* the workspace
* @param catalogFlavors
* the event catalog flavors
* @param event
* the scheduler event
* @return a human readable string
*/
public static String toHumanReadableString(Workspace workspace, List<MediaPackageElementFlavor> catalogFlavors, SchedulerEvent event) {
TechnicalMetadata technicalMetadata = event.getTechnicalMetadata();
StringBuilder sb = new StringBuilder("Event: ").append(CharUtils.LF);
sb.append("- ").append(event.getEventId()).append(CharUtils.LF);
sb.append(CharUtils.LF);
sb.append("Version").append(CharUtils.LF);
sb.append("- ").append(event.getVersion()).append(CharUtils.LF);
sb.append(CharUtils.LF);
sb.append("Start").append(CharUtils.LF);
sb.append("- ").append(DateTimeSupport.toUTC(technicalMetadata.getStartDate().getTime())).append(CharUtils.LF);
sb.append(CharUtils.LF);
sb.append("End").append(CharUtils.LF);
sb.append("- ").append(DateTimeSupport.toUTC(technicalMetadata.getEndDate().getTime())).append(CharUtils.LF);
sb.append(CharUtils.LF);
sb.append("Room").append(CharUtils.LF);
sb.append("- ").append(technicalMetadata.getAgentId()).append(CharUtils.LF);
sb.append(CharUtils.LF);
sb.append("Scheduling configuration").append(CharUtils.LF);
sb.append("- optout: ").append(technicalMetadata.isOptOut()).append(CharUtils.LF);
for (Entry<String, String> entry : technicalMetadata.getCaptureAgentConfiguration().entrySet()) {
sb.append("- ").append(entry.getKey()).append(": ").append(entry.getValue()).append(CharUtils.LF);
}
sb.append(CharUtils.LF);
sb.append("Presenters").append(CharUtils.LF);
for (String presenter : technicalMetadata.getPresenters()) {
sb.append("- ").append(presenter).append(CharUtils.LF);
}
sb.append(CharUtils.LF);
sb.append("Workflow configuration").append(CharUtils.LF);
for (Entry<String, String> entry : technicalMetadata.getWorkflowProperties().entrySet()) {
sb.append("- ").append(entry.getKey()).append(": ").append(entry.getValue()).append(CharUtils.LF);
}
sb.append(CharUtils.LF);
for (Catalog c : $(event.getMediaPackage().getCatalogs())) {
if (!catalogFlavors.contains(c.getFlavor()))
continue;
DublinCoreCatalog dublinCore;
try {
dublinCore = DublinCoreUtil.loadDublinCore(workspace, c);
} catch (Exception e) {
logger.error("Unable to read event dublincore: {}", ExceptionUtils.getStackTrace(e));
continue;
}
sb.append("Event metadata ").append("(").append(c.getFlavor().toString()).append(")").append(CharUtils.LF);
for (Entry<EName, List<DublinCoreValue>> entry : dublinCore.getValues().entrySet()) {
EName eName = entry.getKey();
for (DublinCoreValue value : entry.getValue()) {
sb.append("- ").append(eName.getNamespaceURI()).append(":").append(eName.getLocalName()).append(": ").append(value.getValue());
boolean hasLanguageDefined = !DublinCore.LANGUAGE_UNDEFINED.equals(value.getLanguage());
if (hasLanguageDefined || value.getEncodingScheme().isSome()) {
sb.append(" (");
if (hasLanguageDefined) {
sb.append("lang:").append(value.getLanguage());
if (value.getEncodingScheme().isSome())
sb.append("/");
}
for (EName schema : value.getEncodingScheme()) {
sb.append(schema.getLocalName());
}
sb.append(")");
}
sb.append(CharUtils.LF);
}
}
sb.append(CharUtils.LF);
}
return sb.toString();
}
use of org.opencastproject.mediapackage.EName in project opencast by opencast.
the class SchedulerServiceImplTest method generateExtendedEvent.
protected static DublinCoreCatalog generateExtendedEvent(Opt<String> eventId, String flavorType) {
DublinCoreCatalog dc = DublinCores.mkStandard();
final Map<String, String> prefixToUri = new HashMap<>();
prefixToUri.put("", "http://test.com/video/opencast");
prefixToUri.put("extended", "http://test.com/video/metadata");
dc.addBindings(new XmlNamespaceContext(prefixToUri));
dc.setRootTag(new EName("http://test.com/video/opencast", "extended"));
dc.setFlavor(new MediaPackageElementFlavor(flavorType, "episode"));
dc.set(PROPERTY_IDENTIFIER, eventId.getOr("1"));
dc.set(PROPERTY_EXTENT, "demo");
return dc;
}
use of org.opencastproject.mediapackage.EName in project opencast by opencast.
the class SeriesWorkflowOperationHandler method start.
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.WorkflowOperationHandler#start(org.opencastproject.workflow.api.WorkflowInstance,
* JobContext)
*/
@Override
public WorkflowOperationResult start(final WorkflowInstance workflowInstance, JobContext context) throws WorkflowOperationException {
logger.debug("Running series workflow operation");
MediaPackage mediaPackage = workflowInstance.getMediaPackage();
Opt<String> optSeries = getOptConfig(workflowInstance.getCurrentOperation(), SERIES_PROPERTY);
Opt<String> optAttachFlavors = getOptConfig(workflowInstance.getCurrentOperation(), ATTACH_PROPERTY);
Boolean applyAcl = getOptConfig(workflowInstance.getCurrentOperation(), APPLY_ACL_PROPERTY).map(toBoolean).getOr(false);
Opt<String> optCopyMetadata = getOptConfig(workflowInstance.getCurrentOperation(), COPY_METADATA_PROPERTY);
String defaultNamespace = getOptConfig(workflowInstance.getCurrentOperation(), DEFAULT_NS_PROPERTY).getOr(DublinCore.TERMS_NS_URI);
logger.debug("Using default namespace: '{}'", defaultNamespace);
if (optSeries.isSome() && !optSeries.get().equals(mediaPackage.getSeries())) {
logger.info("Changing series id from '{}' to '{}'", StringUtils.trimToEmpty(mediaPackage.getSeries()), optSeries.get());
mediaPackage.setSeries(optSeries.get());
}
String seriesId = mediaPackage.getSeries();
if (seriesId == null) {
logger.info("No series set, skip operation");
return createResult(mediaPackage, Action.SKIP);
}
DublinCoreCatalog series;
try {
series = seriesService.getSeries(seriesId);
} catch (NotFoundException e) {
logger.info("No series with the identifier '{}' found, skip operation", seriesId);
return createResult(mediaPackage, Action.SKIP);
} catch (UnauthorizedException e) {
logger.warn("Not authorized to get series with identifier '{}' found, skip operation", seriesId);
return createResult(mediaPackage, Action.SKIP);
} catch (SeriesException e) {
logger.error("Unable to get series with identifier '{}', skip operation: {}", seriesId, ExceptionUtils.getStackTrace(e));
throw new WorkflowOperationException(e);
}
mediaPackage.setSeriesTitle(series.getFirst(DublinCore.PROPERTY_TITLE));
// Process extra metadata
HashSet<EName> extraMetadata = new HashSet<>();
if (optCopyMetadata.isSome()) {
for (String strEName : optCopyMetadata.get().split(",+\\s*")) try {
if (!strEName.isEmpty()) {
extraMetadata.add(EName.fromString(strEName, defaultNamespace));
}
} catch (IllegalArgumentException iae) {
logger.warn("Ignoring incorrect dublincore metadata property: '{}'", strEName);
}
}
// Update the episode catalog
for (Catalog episodeCatalog : mediaPackage.getCatalogs(MediaPackageElements.EPISODE)) {
DublinCoreCatalog episodeDublinCore = DublinCoreUtil.loadDublinCore(workspace, episodeCatalog);
// Make sure the MP catalog has bindings defined
episodeDublinCore.addBindings(XmlNamespaceContext.mk(XmlNamespaceBinding.mk(DublinCore.TERMS_NS_PREFIX, DublinCore.TERMS_NS_URI)));
episodeDublinCore.addBindings(XmlNamespaceContext.mk(XmlNamespaceBinding.mk(DublinCore.ELEMENTS_1_1_NS_PREFIX, DublinCore.ELEMENTS_1_1_NS_URI)));
episodeDublinCore.addBindings(XmlNamespaceContext.mk(XmlNamespaceBinding.mk(DublinCores.OC_PROPERTY_NS_PREFIX, DublinCores.OC_PROPERTY_NS_URI)));
episodeDublinCore.set(DublinCore.PROPERTY_IS_PART_OF, seriesId);
for (EName property : extraMetadata) {
if (!episodeDublinCore.hasValue(property) && series.hasValue(property)) {
episodeDublinCore.set(property, series.get(property));
}
}
try (InputStream in = IOUtils.toInputStream(episodeDublinCore.toXmlString(), "UTF-8")) {
String filename = FilenameUtils.getName(episodeCatalog.getURI().toString());
URI uri = workspace.put(mediaPackage.getIdentifier().toString(), episodeCatalog.getIdentifier(), filename, in);
episodeCatalog.setURI(uri);
// setting the URI to a new source so the checksum will most like be invalid
episodeCatalog.setChecksum(null);
} catch (Exception e) {
logger.error("Unable to update episode catalog isPartOf field: {}", ExceptionUtils.getStackTrace(e));
throw new WorkflowOperationException(e);
}
}
// Attach series catalogs
if (optAttachFlavors.isSome()) {
// Remove existing series catalogs
AbstractMediaPackageElementSelector<Catalog> catalogSelector = new CatalogSelector();
String[] seriesFlavors = StringUtils.split(optAttachFlavors.get(), ",");
for (String flavor : seriesFlavors) {
if ("*".equals(flavor)) {
catalogSelector.addFlavor("*/*");
} else {
catalogSelector.addFlavor(flavor);
}
}
for (Catalog c : catalogSelector.select(mediaPackage, false)) {
if (MediaPackageElements.SERIES.equals(c.getFlavor()) || "series".equals(c.getFlavor().getSubtype())) {
mediaPackage.remove(c);
}
}
List<SeriesCatalogUIAdapter> adapters = getSeriesCatalogUIAdapters();
for (String flavorString : seriesFlavors) {
MediaPackageElementFlavor flavor;
if ("*".equals(flavorString)) {
flavor = MediaPackageElementFlavor.parseFlavor("*/*");
} else {
flavor = MediaPackageElementFlavor.parseFlavor(flavorString);
}
for (SeriesCatalogUIAdapter a : adapters) {
MediaPackageElementFlavor adapterFlavor = MediaPackageElementFlavor.parseFlavor(a.getFlavor());
if (flavor.matches(adapterFlavor)) {
if (MediaPackageElements.SERIES.eq(a.getFlavor())) {
addDublinCoreCatalog(series, MediaPackageElements.SERIES, mediaPackage);
} else {
try {
Opt<byte[]> seriesElementData = seriesService.getSeriesElementData(seriesId, adapterFlavor.getType());
if (seriesElementData.isSome()) {
DublinCoreCatalog catalog = DublinCores.read(new ByteArrayInputStream(seriesElementData.get()));
addDublinCoreCatalog(catalog, adapterFlavor, mediaPackage);
} else {
logger.warn("No extended series catalog found for flavor '{}' and series '{}', skip adding catalog", adapterFlavor.getType(), seriesId);
}
} catch (SeriesException e) {
logger.error("Unable to load extended series metadata for flavor {}", adapterFlavor.getType());
throw new WorkflowOperationException(e);
}
}
}
}
}
}
if (applyAcl) {
try {
AccessControlList acl = seriesService.getSeriesAccessControl(seriesId);
if (acl != null)
authorizationService.setAcl(mediaPackage, AclScope.Series, acl);
} catch (Exception e) {
logger.error("Unable to update series ACL: {}", ExceptionUtils.getStackTrace(e));
throw new WorkflowOperationException(e);
}
}
return createResult(mediaPackage, Action.CONTINUE);
}
Aggregations