@Override public void updateContainer(String id, KieContainerInstance kieContainerInstance, Map<String, Object> parameters) { // recreate configuration for updated container disposeContainer(id, kieContainerInstance, parameters); createContainer(id, kieContainerInstance, parameters); }
@Override public String getType() { return FormServiceBase.FormType.FORM_MODELLER_TYPE.getName(); } }
public FormServiceBase(DefinitionService definitionService, RuntimeDataService dataService, UserTaskService userTaskService, FormManagerService formManagerService, KieServerRegistry registry) { this.definitionService = definitionService; this.dataService = dataService; this.userTaskService = userTaskService; this.registry = registry; providers.addAll(collectFormProviders(formManagerService)); }
formServiceBase = new FormServiceBase(definitionService, runtimeDataService, userTaskService, formManagerService, registry); imageServiceBase = new ImageServiceBase(runtimeDataService, imageReferences, registry); formRendererBase = new FormRendererBase(definitionService, userTaskService, formManagerService, caseRuntimeDataService, registry); services.add(formRendererBase); this.kieContainerCommandService = new JBPMUIKieContainerCommandServiceImpl(null, formServiceBase, imageServiceBase, formRendererBase);
FormInstance form = formReader.readFromString(formStructure); form = generateDefaultProcessForm(processDesc); form.setNestedFormsLookup(formId -> { Map<String, String> forms = indexedForms.get(resolvedContainerId); String formStructureNested = forms.get(formId); return formReader.readFromString(formStructureNested); }); FormRenderer formRenderer = renderers.get(renderer); throw new IllegalArgumentException("Form renderer with name " + renderer + " not found"); String output = formRenderer.renderProcess(resolvedContainerId, processDesc, form);
public String getFormDisplayProcess(String containerId, String processId, String lang, boolean filterContent, String formType) { containerId = registry.getContainerId(containerId, ContainerLocatorProvider.get().getLocator()); ProcessDefinition processDesc = definitionService.getProcessDefinition(containerId, processId); if (processDesc == null) { throw new IllegalStateException("Process definition " + containerId + " : " + processId + " not found"); } Map<String, String> processData = definitionService.getProcessVariables(containerId, processId); if (processData == null) { processData = new HashMap<>(); } Map<String, Object> renderContext = new HashMap<>(); renderContext.put("process", processDesc); renderContext.put("outputs", processData); renderContext.put("lang", lang); renderContext.put("filterForm", filterContent); for (UIFormProvider provider : providers) { // if there's no formType or formType is ANY the first provider able to generate the formContent wins if (!FormType.ANY.getName().equals(formType) && !provider.getType().equals(formType)) { logger.debug("Provider {} does not support {} form type", provider, formType); continue; } String template = provider.render(processDesc.getName(), processDesc, renderContext); if (!StringUtils.isEmpty(template)) { return template; } } logger.warn("Unable to find form to render for process '{}'", processDesc.getName()); throw new IllegalStateException("No form for process with id " + processDesc.getName() + " found"); }
@SuppressWarnings("unchecked") @Override public void createContainer(String id, KieContainerInstance kieContainerInstance, Map<String, Object> parameters) { if (!initialized) { return; } List<Message> messages = (List<Message>) parameters.get(KieServerConstants.KIE_SERVER_PARAM_MESSAGES); try { DeployedUnit deployedUnit = deploymentService.getDeployedUnit(id); if(deployedUnit != null) { String kieBaseName = ((KModuleDeploymentUnit)deployedUnit.getDeploymentUnit()).getKbaseName(); KieContainer kieContainer = kieContainerInstance.getKieContainer(); imageReferences.putIfAbsent(id, new ImageReference(kieContainer, kieBaseName)); formRendererBase.indexDeploymentForms(id); } } catch (Exception e) { messages.add(new Message(Severity.WARN, "Unable to create image reference for container " + id +" by extension " + this + " due to " + e.getMessage())); logger.warn("Unable to create image reference for container {} due to {}", id, e.getMessage(), e); } }
protected String marshallFormContent( String formContent, String formType, Variant variant ) throws Exception { if ( StringUtils.isEmpty( formContent ) ) { return formContent; } FormServiceBase.FormType actualFormType = FormServiceBase.FormType.fromName(formType); String actualContentType = actualFormType.getContentType(); if ( actualContentType == null ) { actualContentType = getMediaTypeForFormContent( formContent ); } if (variant.getMediaType().equals(MediaType.APPLICATION_JSON_TYPE) && !MediaType.APPLICATION_JSON_TYPE.getSubtype().equals( actualContentType )) { JSONObject json = XML.toJSONObject(formContent); formatJSONResponse(json); formContent = json.toString(PRETTY_PRINT_INDENT_FACTOR); } else if (variant.getMediaType().equals(MediaType.APPLICATION_XML_TYPE) && !MediaType.APPLICATION_XML_TYPE.getSubtype().equals( actualContentType )) { Object json = parseToJSON(formContent); formContent = XML.toString(json); } return formContent; }
public String getActiveProcessImage(String containerId, long procInstId) { ProcessInstanceDesc instance = dataService.getProcessInstanceById(procInstId); if (instance == null) { throw new ProcessInstanceNotFoundException("No instance found for process instance id " + procInstId); } String imageSVGString = null; // get SVG String byte[] imageSVG = getProcessImageAsBytes(instance.getDeploymentId(), instance.getProcessId()); if (imageSVG != null) { // find active nodes and modify image Map<String, String> subProcessLinks = new HashMap<>(); Collection<NodeInstanceDesc> activeLogs = dataService.getProcessInstanceHistoryActive(procInstId, new QueryContext(0, 1000)); Collection<NodeInstanceDesc> completedLogs = dataService.getProcessInstanceHistoryCompleted(procInstId, new QueryContext(0, 1000)); Map<Long, String> active = new HashMap<Long, String>(); List<String> completed = new ArrayList<String>(); for (NodeInstanceDesc activeNode : activeLogs) { active.put(activeNode.getId(), activeNode.getNodeId()); populateSubProcessLink(containerId, activeNode, subProcessLinks); } for (NodeInstanceDesc completeNode : completedLogs) { completed.add(completeNode.getNodeId()); active.remove(completeNode.getId()); populateSubProcessLink(containerId, completeNode, subProcessLinks); } ByteArrayInputStream svgStream = new ByteArrayInputStream(imageSVG); imageSVGString = SVGImageProcessor.transform(svgStream, completed, new ArrayList<String>(active.values()), subProcessLinks); return imageSVGString; } throw new IllegalArgumentException("No process found for " + instance.getProcessId() + " within container " + containerId); }
@ApiOperation(value="Retrieves given resource/file based on the type and file name", response=String.class, code=200) @ApiResponses(value = { @ApiResponse(code = 500, message = "Unexpected error"), @ApiResponse(code = 404, message = "resource/file not found") }) @GET @Path(STATIC_BY_TYPE_GET_URI) public Response getSharedContent( @ApiParam(value = "Type of the resource e.g. js, css, etc", required = true) @PathParam("type") String type, @ApiParam(value = "Name of the resource to look up", required = true) @PathParam("file") String file) { InputStream resourceStream = formRendererBase.readResources("/" + type + "/" + file); if (resourceStream == null) { return Response.status(Status.NOT_FOUND).build(); } StreamingOutput entity = new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { IOUtils.copy(resourceStream, output); } }; ResponseBuilder builder = Response.ok().entity(entity); setHeaders(builder); return builder .header("Content-Type", getContentType(file)) .build(); }
@Override public void disposeContainer(String id, KieContainerInstance kieContainerInstance, Map<String, Object> parameters) { if (!initialized) { return; } imageReferences.remove(id); formRendererBase.dropDeploymentForms(id); }
@Bean @ConditionalOnMissingBean(name = "jBPMUIServerExtension") @ConditionalOnProperty(name = "kieserver.jbpmui.enabled") public KieServerExtension jbpmUIServerExtension() { return new JBPMUIKieServerExtension(); } }
@Override public List<Message> healthCheck(boolean report) { List<Message> messages = KieServerExtension.super.healthCheck(report); if (report) { messages.add(new Message(Severity.INFO, getExtensionName() + " is alive")); } return messages; } }
public String getProcessImage(String containerId, String processId) { containerId = registry.getContainerId(containerId, ContainerLocatorProvider.get().getLocator()); String imageSVGString = null; byte[] imageSVG = getProcessImageAsBytes(containerId, processId); if (imageSVG != null) { try { imageSVGString = new String(imageSVG, "UTF-8"); } catch (UnsupportedEncodingException e) { logger.debug("UnsupportedEncodingException while building process image due to {}", e.getMessage()); } } return imageSVGString; }
@ApiOperation(value="Retrieves process definition image", response=String.class, code=200) @ApiResponses(value = { @ApiResponse(code = 500, message = "Unexpected error"), @ApiResponse(code = 404, message = "Process definition, image or Container Id not found") }) @GET @Path(PROCESS_IMG_GET_URI) @Produces({MediaType.APPLICATION_SVG_XML}) public Response getProcessImage(@javax.ws.rs.core.Context HttpHeaders headers, @ApiParam(value = "container id that process definition belongs to", required = true) @PathParam(CONTAINER_ID) String containerId, @ApiParam(value = "identifier of the process definition that image should be loaded for", required = true) @PathParam(PROCESS_ID) String processId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String svgString = imageServiceBase.getProcessImage(containerId, processId); logger.debug("Returning OK response with content '{}'", svgString); return createResponse(svgString, v, Response.Status.OK, conversationIdHeader); } catch (IllegalArgumentException e) { return notFound("Image for process id " + processId + " not found", v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format("Unexpected error encountered", e.getMessage()), v, conversationIdHeader); } }
@ApiOperation(value="Retrieves process instance image", response=String.class, code=200) @ApiResponses(value = { @ApiResponse(code = 500, message = "Unexpected error"), @ApiResponse(code = 404, message = "Process instance, image or Container Id not found") }) @GET @Path(PROCESS_INST_IMG_GET_URI) @Produces({MediaType.APPLICATION_SVG_XML}) public Response getProcessInstanceImage(@javax.ws.rs.core.Context HttpHeaders headers, @ApiParam(value = "container id that process instance belongs to", required = true) @PathParam(CONTAINER_ID) String containerId, @ApiParam(value = "identifier of the process instance that image should be loaded for", required = true) @PathParam(PROCESS_INST_ID) Long procInstId) { Variant v = getVariant(headers); Header conversationIdHeader = buildConversationIdHeader(containerId, context, headers); try { String svgString = imageServiceBase.getActiveProcessImage(containerId, procInstId); logger.debug("Returning OK response with content '{}'", svgString); return createResponse(svgString, v, Response.Status.OK, conversationIdHeader); } catch (ProcessInstanceNotFoundException e) { return notFound(MessageFormat.format("Not found", e.getMessage()), v, conversationIdHeader); } catch (IllegalArgumentException e) { return notFound("Image for process instance id " + procInstId + " not found", v, conversationIdHeader); } catch (Exception e) { logger.error("Unexpected error during processing {}", e.getMessage(), e); return internalServerError(MessageFormat.format("Unexpected error encountered", e.getMessage()), v, conversationIdHeader); } } }
@Override public String getType() { return FormServiceBase.FormType.FREE_MARKER_TYPE.getName(); } }
@ApiParam(value = "Name of the resource to look up", required = true) @PathParam("file") String file) { InputStream resourceStream = formRendererBase.readResources("/" + provider + "/" + type + "/" + file); if (resourceStream == null) { return Response.status(Status.NOT_FOUND).build();
@Override public String getType() { return FormServiceBase.FormType.FORM_TYPE.getName(); }
public static FormType fromName(String name) { if (FORM_MODELLER_TYPE.getName().equals(name)) { return FORM_MODELLER_TYPE; } else if (FORM_TYPE.getName().equals(name)) { return FORM_TYPE; } else if (FREE_MARKER_TYPE.getName().equals(name)) { return FREE_MARKER_TYPE; } else if (ANY.getName().equals(name)) { return ANY; } else { throw new IllegalArgumentException("No FormType enum value for " + name); } } }