Yes you can do this.
The process is roughly, create a package, set up your properties, get the workflow, start a new instance of the workflow.
Here's a snippet of some java code I am working on at the moment that kicks off a new workflow and runs the start task.
NodeRef wfPackage = this.workflowService.createPackage(null);
Map<QName, Serializable> workflowProps = new HashMap<QName, Serializable>(
16);
workflowProps.put(WorkflowModel.ASSOC_PACKAGE, wfPackage);
workflowProps.put(WorkflowModel.ASSOC_ASSIGNEE, inviteeNodeRef);
workflowProps.put(
WorkflowModelModeratedInvitation.ASSOC_GROUP_ASSIGNEE,
roleGroup);
workflowProps.put(
WorkflowModelModeratedInvitation.WF_PROP_INVITEE_COMMENTS,
inviteeComments);
workflowProps.put(
WorkflowModelModeratedInvitation.WF_PROP_INVITEE_ROLE,
inviteeRole);
workflowProps.put(
WorkflowModelModeratedInvitation.WF_PROP_INVITEE_USER_NAME,
inviteeUserName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_NAME,
resourceName);
workflowProps.put(
WorkflowModelNominatedInvitation.WF_PROP_RESOURCE_TYPE,
resourceType.toString());
// get the moderated workflow
WorkflowDefinition wfDefinition = this.workflowService
.getDefinitionByName(WorkflowModelModeratedInvitation.WORKFLOW_DEFINITION_NAME);
if (wfDefinition == null) {
// handle workflow definition does not exist
Object objs[] = { WorkflowModelModeratedInvitation.WORKFLOW_DEFINITION_NAME };
throw new InvitationException("invitation.error.noworkflow", objs);
}
// start the workflow
WorkflowPath wfPath = this.workflowService.startWorkflow(wfDefinition
.getId(), workflowProps);
String workflowId = wfPath.instance.id;
String wfPathId = wfPath.id;
List<WorkflowTask> wfTasks = this.workflowService
.getTasksForWorkflowPath(wfPathId);
// throw an exception if no tasks where found on the workflow path
if (wfTasks.size() == 0)
{
Object objs[] = { WorkflowModelModeratedInvitation.WORKFLOW_DEFINITION_NAME };
throw new InvitationException("invitation.error.notasks", objs);
}
try {
WorkflowTask wfStartTask = wfTasks.get(0);
this.workflowService.endTask(wfStartTask.id, null);
} catch (RuntimeException err) {
if (logger.isDebugEnabled())
logger.debug("Failed - caught error during Invite workflow transition: "
+ err.getMessage());
throw err;
}