В примере в этой статье показан метод реализации просмотра блок-схемы Activiti. Конкретные шаги заключаются в следующем:
1. Код изображения просмотра тестового примера выглядит следующим образом:
public void viewImage() throws Exception { // Создаем объект службы хранилища RepositoryService RepositoryService =processEngine.getRepositoryService() // Находим файлы, которые необходимо отобразить, из хранилища String DeploymentId = "701"; репозиторийService.getDeploymentResourceNames (deploymentId) = null for (Имя строки: имена) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); File f = new File("e: /"+ imageName); // Получаем входной поток файла по идентификатору развертывания и имени файла. InputStream in = репозиторийService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile (в, е});
проиллюстрировать:
1) DeploymentId — идентификатор развертывания процесса.
2) имя_ресурса — это значение столбца NAME_ в таблице act_ge_bytearray.
3) Используйте метод getDeploymentResourceNames службы репозитория, чтобы получить имена всех файлов в указанном развертывании.
4) Используйте метод getResourceAsStream службы репозитория, чтобы передать идентификатор развертывания и имя файла, чтобы получить входной поток файла с указанным именем в развертывании.
5) Для последней операции с потоком ввода-вывода используйте метод copyInputStreamToFile инструмента FileUtils, чтобы завершить копирование потока процесса в файл.
2. Просмотрите изображение на странице определения процесса в веб-проекте:
public String viewImage(){InputStream in = репозиторийService.getResourceAsStream.getImageStream(deploymentId,imageName);//Фактический проект метода здесь должен быть размещен в сервисе HttpServletResponse resp = ServletActionContext.getResponse();try { OutputStream out = resp .getOutputStream( ); // Записываем процесс ввода изображения в поток вывода соответственно byte[] b = new byte[1024]; for (int len = -1; (len= in.read(b))!=-1; ) { out.write(b, 0, len } // Закрываем поток out); .close(); in.close();} catch (IOException e) { e.printStackTrace();} return null;}
проиллюстрировать:
1) DeploymentId — идентификатор развертывания процесса, imageName — имя образа.
2) Поскольку изображение просматривается на странице списка определений процессов, идентификатор и imageName можно получить из определения процесса (ProcessDefinition) (String getDeploymentId(); и String getDiagramResourceName();)
3) Тег веб-страницы <a target="_blank" href="viewImage?deploymentId=1&imageName=imageName.png" rel="external nofollow" >Блок-схема просмотра</a>
3. Просмотрите текущую блок-схему веб-проекта.
public String viewCurrentImage(){ProcessDefinition pd = service.getProcessDefinitionByTaskId(taskId);// 1. Получаем идентификатор развертывания процесса putContext("deploymentId", pd.getDeploymentId());// 2. Получаем имя образа процесса putContext ("imageName" , pd.getDiagramResourceName());// 3. Получить координаты текущей активности Map<String,Object> currentActivityCoordinates =service.getCurrentActivityCoordinates(taskId);putContext("acs", currentActivityCoordinates);return "image";}
Реализация кода service.getProcessDefinitionByTaskId(taskId):
public ProcessDefinition getProcessDefinitionByTaskId(String TaskId) {// 1. Получить TaskTask Task = TaskService.createTaskQuery().taskId(taskId).singleResult();// 2. Получить объект определения процесса ProcessDefinition через pdid объекта задачи pd = репозиторийService.getProcessDefinition(task.getProcessDefinitionId());return пд;}
Реализация кода service.getCurrentActivityCoordinates(taskId);
public Map<String, Object> getCurrentActivityCoordinates(String TaskId) {Map<String, Object> координаты = new HashMap<String, Object>(); // 1. Получить текущую активную задачу IDTask = TaskService.createTaskQuery().taskId ( TaskId).singleResult();ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();String currentActivitiId = pi.getActivityId();// 2. Получите определение процесса ProcessDefinitionEntity pd = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(task.getProcessDefinitionId( ));// 3. Используйте определение процесса, чтобы получить объект действия ActivityImpl через currentActivitiId Activity = pd.findActivity(currentActivitiId);// 4. Получите координаты действия. put("y" , Activity.getY());coordinates.put("width", Activity.getWidth());coordinates.put("height", Activity.getHeight()); возвращаемые координаты;}
часть страницы изображения:
На странице списка личных задач нажмите <a target="_blank" href="/viewCurrentImage?taskId=1" rel="external nofollow" >Просмотреть текущую блок-схему</a>, чтобы перейти на следующую страницу:
<body><!-- 1. Получите блок-схему правил. Здесь мы используем тег strust2, чтобы получить значение, помещенное в стек значений выше --><img style="position: Absolute;top: 0px;left: 0px. ; " src="viewImage?deploymentId=<s:property value='#deploymentId'/>&imageName=<s:property value='#imageName'/>"><!-- 2. Динамически рисовать DIV в соответствии с координатами текущего действия --><div style="position: Absolute;border:1px Solid Red;top:<s: значение свойства ='#acs.y'/>px;слева: <s:property value='#acs.x'/>px;ширина: <s:property value='#acs.width'/>px;height:<s:property value='#acs.height'/>px; "></div></body>