/**
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
*
* The Apereo Foundation licenses this file to you under the Educational
* Community License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License
* at:
*
* http://opensource.org/licenses/ecl2.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package org.opencastproject.workflow.handler.workflow;
import org.opencastproject.job.api.JobContext;
import org.opencastproject.rest.RestConstants;
import org.opencastproject.rest.StaticResource;
import org.opencastproject.workflow.api.AbstractWorkflowOperationHandler;
import org.opencastproject.workflow.api.ResumableWorkflowOperationHandler;
import org.opencastproject.workflow.api.WorkflowInstance;
import org.opencastproject.workflow.api.WorkflowOperationException;
import org.opencastproject.workflow.api.WorkflowOperationResult;
import org.opencastproject.workflow.api.WorkflowOperationResult.Action;
import org.apache.commons.io.FilenameUtils;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Map;
import javax.servlet.Servlet;
/**
* Abstract base implementation for a resumable operation handler, which implements a simple operations for starting an
* operation, returning a {@link WorkflowOperationResult} with the current mediapackage and {@link Action#PAUSE} and
* resuming an operation, returning a {@link WorkflowOperationResult} with the current mediapackage and
* {@link Action#CONTINUE}.
*/
public class ResumableWorkflowOperationHandlerBase extends AbstractWorkflowOperationHandler implements
ResumableWorkflowOperationHandler {
/** OSGi component context, obtained during component activation */
protected ComponentContext componentContext = null;
/** Reference to the static resource service */
protected ServiceRegistration staticResourceRegistration = null;
/** The static resource representing the hold state ui */
protected StaticResource staticResource = null;
/** Title of this hold state */
protected String holdActionTitle = null;
private static final String DEFAULT_TITLE = "Action";
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.AbstractWorkflowOperationHandler#activate(org.osgi.service.component.ComponentContext)
*/
public void activate(ComponentContext componentContext) {
this.componentContext = componentContext;
super.activate(componentContext);
}
/**
* Callback from the OSGi environment on component shutdown. Make sure to call this super implementation when
* overwriting this class.
*/
public void deactivate() {
if (staticResourceRegistration != null)
staticResourceRegistration.unregister();
}
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.ResumableWorkflowOperationHandler#getHoldStateUserInterfaceURL(org.opencastproject.workflow.api.WorkflowInstance)
*/
public String getHoldStateUserInterfaceURL(WorkflowInstance workflowInstance) throws WorkflowOperationException {
if (staticResource == null)
return null;
return staticResource.getDefaultUrl();
}
/**
* Sets the title that is displayed on the hold state ui.
*
* @param title
* the title
*/
protected void setHoldActionTitle(String title) {
this.holdActionTitle = title;
}
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.ResumableWorkflowOperationHandler#getHoldActionTitle()
*/
public String getHoldActionTitle() {
if (holdActionTitle == null) {
return DEFAULT_TITLE;
} else {
return holdActionTitle;
}
}
/**
* Registers the resource identified by <code>resourcePath</code> as the ui to be displayed during hold.
*
* @param resourcePath
* the path to the resource
* @return the URL that was created when registering the resource
*/
protected String registerHoldStateUserInterface(final String resourcePath) {
String alias = "/workflow/hold/" + getClass().getName().toLowerCase();
if (resourcePath == null)
throw new IllegalArgumentException("Classpath must not be null");
String path = FilenameUtils.getPathNoEndSeparator(resourcePath);
String welcomeFile = FilenameUtils.getName(resourcePath);
staticResource = new StaticResource(getClass().getClassLoader(), path, alias, welcomeFile);
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("httpContext.id", RestConstants.HTTP_CONTEXT_ID);
props.put("alias", alias);
staticResourceRegistration = componentContext.getBundleContext().registerService(Servlet.class.getName(),
staticResource, props);
return staticResource.getDefaultUrl();
}
/**
* {@inheritDoc}
*
* This default implementation will put the workflow into the hold state.
*
* @see org.opencastproject.workflow.api.AbstractWorkflowOperationHandler#start(org.opencastproject.workflow.api.WorkflowInstance,
* JobContext)
*/
@Override
public WorkflowOperationResult start(WorkflowInstance workflowInstance, JobContext context)
throws WorkflowOperationException {
return createResult(Action.PAUSE);
}
/**
* {@inheritDoc}
*
* @see org.opencastproject.workflow.api.ResumableWorkflowOperationHandler#resume(org.opencastproject.workflow.api.WorkflowInstance,
* JobContext, java.util.Map)
*/
@Override
public WorkflowOperationResult resume(WorkflowInstance workflowInstance, JobContext context,
Map<String, String> properties) throws WorkflowOperationException {
return createResult(Action.CONTINUE);
}
@Override
public boolean isAlwaysPause() {
return false;
}
}