@Override
 public void deleteProcessInstance(final SProcessInstance sProcessInstance)
     throws SProcessInstanceModificationException {
   final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
   try {
     final long processDefinitionId = sProcessInstance.getProcessDefinitionId();
     final ClassLoader localClassLoader =
         classLoaderService.getLocalClassLoader("process", processDefinitionId);
     Thread.currentThread().setContextClassLoader(localClassLoader);
     deleteProcessInstanceElements(sProcessInstance);
     final DeleteRecord deleteRecord = new DeleteRecord(sProcessInstance);
     SDeleteEvent deleteEvent = null;
     if (eventService.hasHandlers(PROCESSINSTANCE, EventActionType.DELETED)) {
       deleteEvent =
           (SDeleteEvent)
               BuilderFactory.get(SEventBuilderFactory.class)
                   .createDeleteEvent(PROCESSINSTANCE)
                   .setObject(sProcessInstance)
                   .done();
     }
     recorder.recordDelete(deleteRecord, deleteEvent);
   } catch (final SBonitaException e) {
     throw new SProcessInstanceModificationException(e);
   } finally {
     Thread.currentThread().setContextClassLoader(contextClassLoader);
   }
 }
 private void deleteProcessInstanceElements(final SProcessInstance processInstance)
     throws SBonitaException {
   SProcessDefinition processDefinition = null;
   try {
     processDefinition =
         processDefinitionService.getProcessDefinition(processInstance.getProcessDefinitionId());
   } catch (final SProcessDefinitionNotFoundException e) {
     // delete anyway
   }
   try {
     tokenService.deleteTokens(processInstance.getId());
   } catch (final SObjectReadException e) {
     throw new SProcessInstanceModificationException(e);
   } catch (final SObjectModificationException e) {
     throw new SProcessInstanceModificationException(e);
   }
   deleteFlowNodeInstances(processInstance.getId(), processDefinition);
   deleteDataInstancesIfNecessary(processInstance, processDefinition);
   processDocumentService.deleteDocumentsFromProcessInstance(processInstance.getId());
   deleteConnectorInstancesIfNecessary(processInstance, processDefinition);
   commentService.deleteComments(processInstance.getId());
 }