public void buildProcess()

in jbpm/jbpm-flow-builder/src/main/java/org/jbpm/compiler/ProcessBuilderImpl.java [105:201]


    public void buildProcess(final Process process, Resource resource) {
        if (resource != null) {
            process.setResource(resource);
        }
        boolean hasErrors = false;
        ProcessValidator validator = ProcessValidatorRegistry.getInstance().getValidator(process, resource);
        if (validator == null) {
            logger.warn("Could not find validator for process {}.", process.getType());
            logger.warn("Continuing without validation of the process {} [{}]", process.getName(), process.getId());
        } else {
            ProcessValidationError[] errors = validator.validateProcess(process);
            if (errors.length != 0) {
                hasErrors = true;
                for (int i = 0; i < errors.length; i++) {
                    this.errors.add(new ParserError(resource,
                            errors[i].toString(),
                            -1,
                            -1));
                }
            }
        }
        if (!hasErrors) {

            // generate and add rule for process
            String rules = "package " + process.getPackageName() + "\n";
            // NPE for validator
            if (validator != null && validator.compilationSupported()) {
                rules = generateRules(process);
            }
            try {
                knowledgeBuilder.addPackageFromDrl(new StringReader(rules), resource);
            } catch (IOException e) {
                // should never occur
                logger.error("IOException during addPackageFromDRL", e);
            } catch (DroolsParserException e) {
                // should never occur
                logger.error("DroolsParserException during addPackageFromDRL", e);
            }

            PackageRegistry pkgRegistry = this.knowledgeBuilder.getOrCreatePackageRegistry(new PackageDescr(process.getPackageName()));
            if (pkgRegistry != null) {
                InternalKnowledgePackage p = pkgRegistry.getPackage();
                ResourceTypePackageRegistry resourceTypePackages = p.getResourceTypePackages();
                ProcessPackage rpkg = ProcessPackage.getOrCreate(resourceTypePackages);

                if (validator != null) {
                    // NPE for validator
                    if (validator.compilationSupported()) {
                        ProcessDescr processDescr = new ProcessDescr();
                        processDescr.setName(process.getPackageName() + "." + process.getName());
                        processDescr.setResource(resource);
                        processDescr.setProcessId(process.getId());
                        DialectCompiletimeRegistry dialectRegistry = pkgRegistry.getDialectCompiletimeRegistry();
                        Dialect dialect = dialectRegistry.getDialect("java");
                        dialect.init(processDescr);

                        ProcessBuildContext buildContext = new ProcessBuildContext(
                                this.knowledgeBuilder,
                                p,
                                process,
                                processDescr,
                                dialectRegistry,
                                dialect);

                        buildContexts((ContextContainer) process, buildContext);
                        if (process instanceof WorkflowProcess) {
                            buildNodes((WorkflowProcess) process, buildContext);
                        }
                    }
                    Process duplicateProcess = rpkg.getRuleFlows().get(process.getId());
                    if (duplicateProcess != null) {
                        Resource duplicatedResource = duplicateProcess.getResource();
                        if (resource == null || duplicatedResource == null || duplicatedResource.getSourcePath() == null ||
                                duplicatedResource.getSourcePath().equals(resource.getSourcePath())) {
                            this.errors.add(new DuplicateProcess(process,
                                    this.knowledgeBuilder.getBuilderConfiguration()));
                        } else {
                            this.errors.add(new ParserError(resource,
                                    "Process with same id already exists: " + process.getId(),
                                    -1,
                                    -1));
                        }
                    }
                    rpkg.add(process);
                    // NPE for validator
                    if (validator.compilationSupported()) {
                        pkgRegistry.compileAll();
                        pkgRegistry.getDialectRuntimeRegistry().onBeforeExecute();
                    }
                }
            } else {
                // invalid package registry..there is an issue with the package
                // name of the process
                throw new RuntimeException("invalid package name");
            }
        }
    }