SilenceDetectionWorkflowOperationHandler extends AbstractWorkflowOperationHandler { @Override public WorkflowOperationResult start(WorkflowInstance workflowInstance, JobContext context) throws WorkflowOperationException { MediaPackage mp = workflowInstance.getMediaPackage(); logger.debug("Start silence detection workflow operation for mediapackage {}", mp.getIdentifier().toString()); String sourceFlavors = StringUtils.trimToNull(workflowInstance.getCurrentOperation().getConfiguration( SOURCE_FLAVORS_PROPERTY)); String sourceFlavor = StringUtils.trimToNull(workflowInstance.getCurrentOperation().getConfiguration( SOURCE_FLAVOR_PROPERTY)); String smilFlavorSubType = StringUtils.trimToNull(workflowInstance.getCurrentOperation().getConfiguration( SMIL_FLAVOR_SUBTYPE_PROPERTY)); String smilTargetFlavorString = StringUtils.trimToNull(workflowInstance.getCurrentOperation().getConfiguration( SMIL_TARGET_FLAVOR_PROPERTY)); MediaPackageElementFlavor smilTargetFlavor = null; if (smilTargetFlavorString != null) smilTargetFlavor = MediaPackageElementFlavor.parseFlavor(smilTargetFlavorString); if (sourceFlavor == null && sourceFlavors == null) { throw new WorkflowOperationException(String.format("No %s or %s have been specified", SOURCE_FLAVOR_PROPERTY, SOURCE_FLAVORS_PROPERTY)); } if (smilFlavorSubType == null && smilTargetFlavor == null) { throw new WorkflowOperationException(String.format("No %s or %s have been specified", SMIL_FLAVOR_SUBTYPE_PROPERTY, SMIL_TARGET_FLAVOR_PROPERTY)); } if (sourceFlavors != null && smilTargetFlavor != null) { throw new WorkflowOperationException(String.format("Can't use %s and %s together", SOURCE_FLAVORS_PROPERTY, SMIL_TARGET_FLAVOR_PROPERTY)); } final String finalSourceFlavors; if (smilTargetFlavor != null) { finalSourceFlavors = sourceFlavor; } else { finalSourceFlavors = sourceFlavors; } String referenceTracksFlavor = StringUtils.trimToNull(workflowInstance.getCurrentOperation().getConfiguration( REFERENCE_TRACKS_FLAVOR_PROPERTY)); if (referenceTracksFlavor == null) referenceTracksFlavor = finalSourceFlavors; TrackSelector trackSelector = new TrackSelector(); for (String flavor : asList(finalSourceFlavors)) { trackSelector.addFlavor(flavor); } Collection<Track> sourceTracks = trackSelector.select(mp, false); if (sourceTracks.isEmpty()) { logger.info("No source tracks found, skip silence detection"); return createResult(mp, Action.SKIP); } trackSelector = new TrackSelector(); for (String flavor : asList(referenceTracksFlavor)) { trackSelector.addFlavor(flavor); } Collection<Track> referenceTracks = trackSelector.select(mp, false); if (referenceTracks.isEmpty()) { throw new WorkflowOperationException(String.format("No tracks found filtered by flavor(s) '%s'", referenceTracksFlavor)); } MediaPackageElementBuilder mpeBuilder = MediaPackageElementBuilderFactory.newInstance().newElementBuilder(); for (Track sourceTrack : sourceTracks) { if (!sourceTrack.hasAudio()) { logger.info("Skipping silence detection of track {} since it has no audio", sourceTrack); continue; } logger.info("Executing silence detection on track {}", sourceTrack.getIdentifier()); try { Job detectionJob = detetionService.detect(sourceTrack, referenceTracks.toArray(new Track[referenceTracks.size()])); if (!waitForStatus(detectionJob).isSuccess()) { throw new WorkflowOperationException("Silence Detection failed"); } Smil smil = smilService.fromXml(detectionJob.getPayload()).getSmil(); InputStream is = null; try { is = IOUtils.toInputStream(smil.toXML(), "UTF-8"); URI smilURI = workspace.put(mp.getIdentifier().toString(), smil.getId(), TARGET_FILE_NAME, is); MediaPackageElementFlavor smilFlavor = smilTargetFlavor; if (smilFlavor == null) smilFlavor = new MediaPackageElementFlavor(sourceTrack.getFlavor().getType(), smilFlavorSubType); Catalog catalog = (Catalog) mpeBuilder.elementFromURI(smilURI, MediaPackageElement.Type.Catalog, smilFlavor); catalog.setIdentifier(smil.getId()); mp.add(catalog); } catch (Exception ex) { throw new WorkflowOperationException(String.format( "Failed to put smil into workspace. Silence detection for track %s failed", sourceTrack.getIdentifier()), ex); } finally { IOUtils.closeQuietly(is); } logger.info("Finished silence detection on track {}", sourceTrack.getIdentifier()); } catch (SilenceDetectionFailedException ex) { throw new WorkflowOperationException(String.format("Failed to create silence detection job for track %s", sourceTrack.getIdentifier())); } catch (SmilException ex) { throw new WorkflowOperationException(String.format( "Failed to get smil from silence detection job for track %s", sourceTrack.getIdentifier())); } } logger.debug("Finished silence detection workflow operation for mediapackage {}", mp.getIdentifier().toString()); return createResult(mp, Action.CONTINUE); }  @Override WorkflowOperationResult start(WorkflowInstance workflowInstance, JobContext context); @Override void activate(ComponentContext cc); void setDetectionService(SilenceDetectionService detectionService); void setSmilService(SmilService smilService); void setWorkspace(Workspace workspace);  }
@Test public void testStartOperation() throws WorkflowOperationException, SilenceDetectionFailedException, NotFoundException, ServiceRegistryException, MediaPackageException, SmilException, MalformedURLException, JAXBException, SAXException, IOException { Smil smil = smilService.fromXml(new File(smilURI)).getSmil(); Job job = EasyMock.createNiceMock(Job.class); EasyMock.expect(job.getPayload()).andReturn(smil.toXML()).anyTimes(); EasyMock.expect(job.getStatus()).andReturn(Job.Status.FINISHED); EasyMock.expect(silenceDetectionServiceMock.detect( (Track) EasyMock.anyObject(), (Track[]) EasyMock.anyObject())) .andReturn(job); EasyMock.expect(workspaceMock.put( (String) EasyMock.anyObject(), (String) EasyMock.anyObject(), (String) EasyMock.anyObject(), (InputStream) EasyMock.anyObject())) .andReturn(smilURI); ServiceRegistry serviceRegistry = EasyMock.createNiceMock(ServiceRegistry.class); silenceDetectionOperationHandler.setServiceRegistry(serviceRegistry); EasyMock.expect(serviceRegistry.getJob(EasyMock.anyLong())).andReturn(job); EasyMock.replay(job, serviceRegistry, silenceDetectionServiceMock, workspaceMock); WorkflowInstanceImpl workflowInstance = getWorkflowInstance(mp, getDefaultConfiguration()); WorkflowOperationResult result = silenceDetectionOperationHandler.start(workflowInstance, null); Assert.assertNotNull("SilenceDetectionWorkflowOperationHandler workflow operation returns null " + "but should be an instantiated WorkflowOperationResult", result); EasyMock.verify(silenceDetectionServiceMock, workspaceMock); WorkflowOperationInstance worflowOperationInstance = workflowInstance.getCurrentOperation(); String smilFlavorSubtypeProperty = worflowOperationInstance.getConfiguration("smil-flavor-subtype"); MediaPackageElementFlavor smilPartialFlavor = new MediaPackageElementFlavor("*", smilFlavorSubtypeProperty); Catalog[] smilCatalogs = mp.getCatalogs(smilPartialFlavor); Assert.assertTrue("Media package should contain a smil catalog", smilCatalogs != null && smilCatalogs.length > 0); }