@Test
public void testExtraMetadata() throws WorkflowOperationException {

  final EName otherProperty = new EName(DublinCore.TERMS_NS_URI, "my-custom-property");
  final String otherValue = "foobar";
  // Add extra metadata to the series catalog.
  seriesCatalog.set(DublinCore.PROPERTY_LANGUAGE, "Opencastian");
  seriesCatalog.set(otherProperty, otherValue);
  seriesCatalog.set(DublinCore.PROPERTY_CONTRIBUTOR, Arrays.asList(
          new DublinCoreValue[] { DublinCoreValue.mk("Mr. Contry Bute"), DublinCoreValue.mk("Mrs. Jane Doe") }));
  // Prepare "copy metadata" property
  String[] extraMetadata = {
          // Append a full metadata field, with NS
          DublinCore.PROPERTY_LANGUAGE.toString(),
          // Field without namespace
          DublinCore.PROPERTY_CONTRIBUTOR.getLocalName(),
          // Field with a namespace different than the default
          otherProperty.toString(),
          // Field that does not exist in the series catalog
          "does-not-exist" };
  WorkflowInstanceImpl instance = new WorkflowInstanceImpl();
  List<WorkflowOperationInstance> ops = new ArrayList<WorkflowOperationInstance>();
  WorkflowOperationInstanceImpl operation = new WorkflowOperationInstanceImpl("test", OperationState.INSTANTIATED);
  ops.add(operation);
  instance.setOperations(ops);
  instance.setMediaPackage(mp);
  MediaPackage clone = (MediaPackage) mp.clone();
  operation.setConfiguration(SeriesWorkflowOperationHandler.SERIES_PROPERTY, "series1");
  operation.setConfiguration(SeriesWorkflowOperationHandler.ATTACH_PROPERTY, "*");
  operation.setConfiguration(SeriesWorkflowOperationHandler.APPLY_ACL_PROPERTY, "false");
  operation.setConfiguration(SeriesWorkflowOperationHandler.COPY_METADATA_PROPERTY,
          StringUtils.join(extraMetadata, ", "));
  WorkflowOperationResult result = operationHandler.start(instance, null);
  Assert.assertEquals(Action.CONTINUE, result.getAction());
  MediaPackage resultingMediapackage = result.getMediaPackage();
  // Get episode DublinCore
  DublinCoreCatalog episodeCatalog = DublinCores.read(capturedStream.getValue());
  Assert.assertEquals("series1", resultingMediapackage.getSeries());
  Assert.assertEquals("Series 1", resultingMediapackage.getSeriesTitle());
  Assert.assertEquals(clone.getElements().length + 1, resultingMediapackage.getElements().length);
  // Check the extra metadata were copied into the dublincore (only those present in the series catalog)
  Assert.assertTrue(episodeCatalog.hasValue(DublinCore.PROPERTY_CONTRIBUTOR));
  Assert.assertEquals(seriesCatalog.get(DublinCore.PROPERTY_CONTRIBUTOR),
          episodeCatalog.get(DublinCore.PROPERTY_CONTRIBUTOR));
  Assert.assertTrue(episodeCatalog.hasValue(DublinCore.PROPERTY_LANGUAGE));
  Assert.assertEquals(seriesCatalog.get(DublinCore.PROPERTY_LANGUAGE),
          episodeCatalog.get(DublinCore.PROPERTY_LANGUAGE));
  Assert.assertTrue(episodeCatalog.hasValue(otherProperty));
  Assert.assertEquals(seriesCatalog.get(otherProperty), episodeCatalog.get(otherProperty));
  Assert.assertFalse(episodeCatalog.hasValue(new EName(DublinCore.TERMS_NS_URI, "does-not-exist")));
}