Search in sources :

Example 1 with RuleSetVO

use of com.centurylink.mdw.model.value.attribute.RuleSetVO in project mdw-designer by CenturyLinkCloud.

the class Importer method importPackage.

public void importPackage(String xml, boolean overwrite) throws DataAccessException, RemoteException, ActionCancelledException, XmlException {
    int preexistingVersion = -1;
    System.out.println("Parsing XML...");
    importedPackageVO = parsePackageXml(xml);
    PackageVO existing = null;
    try {
        existing = dataAccess.getPackage(importedPackageVO.getPackageName());
    } catch (DataAccessException ex) {
        if (!ex.getMessage().startsWith("Package does not exist:"))
            throw ex;
    }
    if (existing != null) {
        if (existing.getVersion() == importedPackageVO.getVersion()) {
            String msg = "Target already contains Package '" + importedPackageVO.getPackageName() + "' v" + importedPackageVO.getVersionString();
            if (!overwrite)
                throw new ActionCancelledException(msg + " and overwrite argument NOT specified.");
            else
                System.out.println(msg + " -- will overwrite existing package.");
            // overwrite existing
            importedPackageVO.setPackageId(existing.getId());
            if (!isLocal())
                importedPackageVO.setVersion(0);
            preexistingVersion = existing.getVersion();
        } else if (existing.getVersion() > importedPackageVO.getVersion()) {
            String msg = "Target already contains Package '" + importedPackageVO.getPackageName() + "' v" + existing.getVersionString() + ", whose version is greater than that of the imported package.  Cannot continue.";
            throw new ActionCancelledException(msg);
        }
    }
    System.out.println("Checking elements...");
    final List<RuleSetVO> conflicts = new ArrayList<>();
    final List<RuleSetVO> conflictsWithDifferences = new ArrayList<>();
    List<ProcessVO> existingProcessVOs = new ArrayList<>();
    List<ProcessVO> processVOsToBeImported = new ArrayList<>();
    ProcessExporter exporter = null;
    System.out.println("Comparing processes...");
    for (ProcessVO importedProcessVO : importedPackageVO.getProcesses()) {
        ProcessVO existingProcess = null;
        try {
            existingProcess = dataAccess.getProcessDefinition(importedProcessVO.getProcessName(), importedProcessVO.getVersion());
        } catch (DataAccessException ex) {
            // trap process does not exist
            if (!ex.getMessage().startsWith("Process does not exist;"))
                throw ex;
        }
        if (existingProcess != null) {
            conflicts.add(existingProcess);
            if (dataAccess.getSupportedSchemaVersion() >= DataAccess.schemaVersion52) {
                // content comparison
                if (exporter == null) {
                    boolean isOldNamespaces = dataAccess.getDatabaseSchemaVersion() < DataAccess.schemaVersion55;
                    exporter = DataAccess.getProcessExporter(dataAccess.getDatabaseSchemaVersion(), isOldNamespaces ? DesignerCompatibility.getInstance() : null);
                }
                String existingProcessXml = dataAccess.getRuleSet(existingProcess.getId()).getRuleSet();
                String importedProcessXml = exporter.exportProcess(importedProcessVO, dataAccess.getDatabaseSchemaVersion(), null);
                if (dataAccess.getSupportedSchemaVersion() < DataAccess.schemaVersion55) {
                    // may need to replace old namespace prefix in existing
                    // to avoid false positives in 5.2
                    String oldNamespaceDecl = "xmlns:xs=\"http://mdw.qwest.com/XMLSchema\"";
                    int oldNsIdx = existingProcessXml.indexOf(oldNamespaceDecl);
                    if (oldNsIdx > 0) {
                        String newNamespaceDecl = "xmlns:bpm=\"http://mdw.qwest.com/XMLSchema\"";
                        existingProcessXml = existingProcessXml.substring(0, oldNsIdx) + newNamespaceDecl + importedProcessXml.substring(oldNsIdx + oldNamespaceDecl.length() + 2);
                        existingProcessXml = existingProcessXml.replaceAll("<xs:", "<bpm:");
                        existingProcessXml = existingProcessXml.replaceAll("</xs:", "</bpm:");
                    }
                }
                // avoid false positives
                existingProcessXml = existingProcessXml.replaceAll("\\s*<bpm:Attribute Name=\"REFERENCED_ACTIVITIES\".*/>", "");
                existingProcessXml = existingProcessXml.replaceAll("\\s*<bpm:Attribute Name=\"REFERENCED_PROCESSES\".*/>", "");
                existingProcessXml = existingProcessXml.replaceFirst(" packageVersion=\"0.0\"", "");
                existingProcessXml = existingProcessXml.replaceAll("\\s*<bpm:Attribute Name=\"processid\".*/>", "");
                if (!existingProcessXml.equals(importedProcessXml))
                    conflictsWithDifferences.add(existingProcess);
            }
            if (isLocal())
                processVOsToBeImported.add(importedProcessVO);
            else
                existingProcessVOs.add(existingProcess);
        } else {
            if (dataAccess.getSupportedSchemaVersion() >= DataAccess.schemaVersion52)
                // not optional
                importedProcessVO.setInRuleSet(true);
            processVOsToBeImported.add(importedProcessVO);
        }
        for (ProcessVO subProcVO : importedProcessVO.getSubProcesses()) {
            ProcessVO existingSubProc = null;
            try {
                existingSubProc = dataAccess.getProcessDefinition(subProcVO.getProcessName(), subProcVO.getVersion());
            } catch (DataAccessException ex) {
                // trap process does not exist
                if (!ex.getMessage().startsWith("Process does not exist;"))
                    throw ex;
            }
            if (existingSubProc != null) {
                conflicts.add(existingSubProc);
                existingProcessVOs.add(existingSubProc);
                if (!isLocal())
                    existingProcessVOs.add(existingSubProc);
            }
        }
    }
    List<RuleSetVO> existingRuleSets = new ArrayList<>();
    List<RuleSetVO> ruleSetsToBeImported = new ArrayList<>();
    List<RuleSetVO> emptyRuleSets = new ArrayList<>();
    if (importedPackageVO.getRuleSets() != null) {
        System.out.println("Comparing assets...");
        for (RuleSetVO importedRuleSet : importedPackageVO.getRuleSets()) {
            RuleSetVO existingAsset = null;
            if (dataAccess.getSupportedSchemaVersion() >= DataAccess.schemaVersion55) {
                // supports same-named assets in different packages
                if (existing != null) {
                    RuleSetVO latestAsset = dataAccess.getRuleSet(existing.getPackageId(), importedRuleSet.getName());
                    if (latestAsset != null && latestAsset.getVersion() >= importedRuleSet.getVersion())
                        existingAsset = latestAsset;
                }
            } else {
                existingAsset = dataAccess.getRuleSet(importedRuleSet.getName(), importedRuleSet.getLanguage(), importedRuleSet.getVersion());
            }
            if (existingAsset != null) {
                conflicts.add(existingAsset);
                if (dataAccess.getSupportedSchemaVersion() >= DataAccess.schemaVersion52) {
                    // content comparison
                    existingAsset = dataAccess.getRuleSet(existingAsset.getId());
                    String existingAssetStr = existingAsset.getRuleSet().trim();
                    String importedAssetStr = importedRuleSet.getRuleSet().trim();
                    if (!existingAsset.isBinary()) {
                        existingAssetStr = existingAssetStr.replaceAll("\r", "");
                        importedAssetStr = importedAssetStr.replaceAll("\r", "");
                    }
                    if (!existingAssetStr.equals(importedAssetStr))
                        conflictsWithDifferences.add(existingAsset);
                }
                if (isLocal())
                    ruleSetsToBeImported.add(importedRuleSet);
                else
                    existingRuleSets.add(existingAsset);
            } else if (importedRuleSet.getRuleSet().trim().isEmpty()) {
                emptyRuleSets.add(importedRuleSet);
            } else {
                ruleSetsToBeImported.add(importedRuleSet);
            }
        }
    }
    if (existing != null && importedPackageVO.getTaskTemplates() != null && existing.getTaskTemplates() != null) {
        for (TaskVO importedTask : importedPackageVO.getTaskTemplates()) {
            for (TaskVO taskTemplate : existing.getTaskTemplates()) {
                if (taskTemplate.getName().equals(importedTask.getName()) && taskTemplate.getVersion() == importedTask.getVersion()) {
                    conflicts.add(taskTemplate);
                    String existingTemplStr = taskTemplate.toTemplate().xmlText();
                    String importedTemplStr = importedTask.toTemplate().xmlText();
                    if (!existingTemplStr.equals(importedTemplStr))
                        conflictsWithDifferences.add(taskTemplate);
                }
            }
        }
    }
    if (!conflicts.isEmpty()) {
        Collections.sort(conflicts, new Comparator<RuleSetVO>() {

            public int compare(RuleSetVO rs1, RuleSetVO rs2) {
                return rs1.getLabel().compareToIgnoreCase(rs2.getLabel());
            }
        });
        String msg;
        if (isLocal())
            msg = "The following versions exist locally in '" + importedPackageVO.getPackageName() + "' and will be overwritten:";
        else
            msg = "The following versions from package '" + importedPackageVO.getPackageName() + "' will not be imported:\n(The same or later versions already exist in the target environment";
        if (dataAccess.getDatabaseSchemaVersion() >= DataAccess.schemaVersion52)
            msg += " -- * indicates content differs";
        msg += ").";
        System.out.println(msg);
        for (RuleSetVO rs : conflicts) {
            String flag = conflictsWithDifferences.contains(rs) ? " *" : "";
            System.out.println("   " + rs.getLabel() + flag);
        }
    }
    if (!emptyRuleSets.isEmpty()) {
        System.out.println("The following assets from package '" + importedPackageVO.getPackageName() + "' will not be imported because they're empty:");
        for (RuleSetVO rs : emptyRuleSets) System.out.println("   " + rs.getLabel());
    }
    importedPackageVO.setProcesses(processVOsToBeImported);
    importedPackageVO.setRuleSets(ruleSetsToBeImported);
    // designer fix for backward compatibility
    ProcessWorker worker = new ProcessWorker();
    if (importedPackageVO.getProcesses() != null) {
        NodeMetaInfo nodeMetaInfo = new NodeMetaInfo();
        nodeMetaInfo.init(dataAccess.getActivityImplementors(), dataAccess.getDatabaseSchemaVersion());
        NodeMetaInfo syncedNodeMetaInfo = syncNodeMetaInfo(nodeMetaInfo, importedPackageVO);
        for (ProcessVO p : importedPackageVO.getProcesses()) {
            worker.convert_to_designer(p);
            worker.convert_from_designer(p, syncedNodeMetaInfo);
        }
    }
    System.out.println("Saving package...");
    if (isLocal())
        dataAccess.savePackageNoAudit(importedPackageVO, ProcessPersister.PersistType.IMPORT);
    else
        dataAccess.savePackage(importedPackageVO, ProcessPersister.PersistType.IMPORT);
    if (preexistingVersion > 0)
        // reset version
        importedPackageVO.setVersion(preexistingVersion);
    if (importedPackageVO.getProcesses() != null) {
        System.out.println("Reloading processes...");
        for (ProcessVO importedProcessVO : importedPackageVO.getProcesses()) {
            ProcessVO reloaded = dataAccess.getProcessDefinition(importedProcessVO.getProcessName(), importedProcessVO.getVersion());
            importedProcessVO.setProcessId(reloaded.getProcessId());
        }
        if (dataAccess.getSupportedSchemaVersion() < DataAccess.schemaVersion52) {
            for (ProcessVO importedProcessVO : importedPackageVO.getProcesses()) updateSubProcessIdAttributes(importedProcessVO);
        }
    }
    if (!existingProcessVOs.isEmpty()) {
        // add back existing processes
        importedPackageVO.getProcesses().addAll(existingProcessVOs);
        dataAccess.savePackage(importedPackageVO);
    }
    if (importedPackageVO.getRuleSets() != null) {
        System.out.println("Reloading workflow assets");
        for (RuleSetVO importedRuleSet : importedPackageVO.getRuleSets()) {
            RuleSetVO reloaded;
            if (dataAccess.getSupportedSchemaVersion() >= DataAccess.schemaVersion55) {
                reloaded = dataAccess.getRuleSet(importedPackageVO.getId(), importedRuleSet.getName());
                if (// need to verify whether the above is
                reloaded == null)
                    // even needed
                    reloaded = dataAccess.getRuleSet(importedRuleSet.getId());
            } else {
                reloaded = dataAccess.getRuleSet(importedRuleSet.getName(), importedRuleSet.getLanguage(), importedRuleSet.getVersion());
            }
            importedRuleSet.setId(reloaded.getId());
        }
    }
    if (!existingRuleSets.isEmpty()) {
        importedPackageVO.getRuleSets().addAll(existingRuleSets);
        System.out.println("Saving Package...");
        if (isLocal())
            dataAccess.savePackageNoAudit(importedPackageVO);
        else
            dataAccess.savePackage(importedPackageVO);
    }
    if (preexistingVersion > 0 && existingProcessVOs.isEmpty() && existingRuleSets.isEmpty()) {
        System.out.println("Saving Package...");
        if (isLocal())
            // force
            dataAccess.savePackageNoAudit(importedPackageVO);
        else
            // associate
            // processes
            // force associate
            dataAccess.savePackage(importedPackageVO);
    // processes
    }
}
Also used : NodeMetaInfo(com.centurylink.mdw.designer.utils.NodeMetaInfo) PackageVO(com.centurylink.mdw.model.value.process.PackageVO) ArrayList(java.util.ArrayList) ProcessExporter(com.centurylink.mdw.dataaccess.ProcessExporter) RuleSetVO(com.centurylink.mdw.model.value.attribute.RuleSetVO) ProcessWorker(com.centurylink.mdw.designer.utils.ProcessWorker) ActionCancelledException(com.centurylink.mdw.common.utilities.timer.ActionCancelledException) ProcessVO(com.centurylink.mdw.model.value.process.ProcessVO) TaskVO(com.centurylink.mdw.model.value.task.TaskVO) DataAccessException(com.centurylink.mdw.common.exception.DataAccessException)

Example 2 with RuleSetVO

use of com.centurylink.mdw.model.value.attribute.RuleSetVO in project mdw-designer by CenturyLinkCloud.

the class DesignerDataModel method reloadRuleSets.

public void reloadRuleSets(DesignerDataAccess dao) throws DataAccessException, RemoteException {
    rulesets = new HashMap<String, RuleSetVO>();
    rulesetsById = new HashMap<Long, RuleSetVO>();
    if (dao == null)
        return;
    List<RuleSetVO> flatList = dao.getRuleSets();
    rulesetCustomAttributes = new HashMap<String, CustomAttributeVO>();
    for (RuleSetVO one : flatList) {
        String key = getResourceKey(one);
        RuleSetVO last = rulesets.get(key);
        if (last != null) {
            last.setPrevVersion(one);
            one.setNextVersion(last);
        } else {
            one.setNextVersion(null);
            if (one.getLanguage() != null && !rulesetCustomAttributes.containsKey(one.getLanguage())) {
                CustomAttributeVO custAttrVO = dao.getCustomAttribute("RULE_SET", one.getLanguage());
                rulesetCustomAttributes.put(one.getLanguage(), custAttrVO);
            }
            rulesets.put(key, one);
        }
        rulesetsById.put(one.getId(), one);
        one.setPrevVersion(null);
    }
}
Also used : CustomAttributeVO(com.centurylink.mdw.model.value.attribute.CustomAttributeVO) RuleSetVO(com.centurylink.mdw.model.value.attribute.RuleSetVO)

Example 3 with RuleSetVO

use of com.centurylink.mdw.model.value.attribute.RuleSetVO in project mdw-designer by CenturyLinkCloud.

the class DesignerPage method lockUnlockRuleset.

public boolean lockUnlockRuleset(RuleSetVO ruleset, boolean lock) {
    try {
        if (ruleset.getNextVersion() != null) {
            showError("You can only edit the latest version");
            return false;
        }
        boolean changed;
        if (!lock) {
            if (getConfirmation("You will lose your changes by unlock; are you sure?")) {
                String errmsg = frame.dao.lockUnlockRuleSet(ruleset.getId(), frame.getCuid(), false);
                if (errmsg != null) {
                    changed = false;
                    this.showError(errmsg);
                } else
                    changed = true;
            } else
                changed = false;
        } else {
            String errmsg = frame.dao.lockUnlockRuleSet(ruleset.getId(), frame.getCuid(), true);
            if (errmsg != null) {
                changed = false;
                this.showError(errmsg);
            } else
                changed = true;
        }
        if (changed) {
            RuleSetVO loaded = frame.dao.getRuleSet(ruleset.getId());
            ruleset.setRuleSet(loaded.getRuleSet());
            ruleset.setModifyingUser(loaded.getModifyingUser());
            ruleset.setModifyDate(loaded.getModifyDate());
        }
        return changed;
    } catch (Exception e) {
        this.showError("Failed to edit/unedit the resource", e);
        e.printStackTrace();
        return false;
    }
}
Also used : DataAccessException(com.centurylink.mdw.common.exception.DataAccessException) RemoteException(java.rmi.RemoteException) ValidationException(com.centurylink.mdw.designer.utils.ValidationException) RuleSetVO(com.centurylink.mdw.model.value.attribute.RuleSetVO)

Example 4 with RuleSetVO

use of com.centurylink.mdw.model.value.attribute.RuleSetVO in project mdw-designer by CenturyLinkCloud.

the class FormPanel method loadForm.

private DomDocument loadForm(String formname) throws Exception {
    if (dao.isVcsPersist())
        formname = formname + ".xml";
    RuleSetVO ruleset = dao.getRuleSet(formname, RuleSetVO.FORM, 0);
    String content;
    if (ruleset == null) {
        if (dao.isVcsPersist()) {
            content = dao.getServerResourceRest(formname);
        } else {
            StringBuffer request = new StringBuffer();
            request.append("<_mdw_get_resource>");
            request.append("<name>").append(formname).append("</name>");
            request.append("<language>").append(RuleSetVO.FORM).append("</language>");
            request.append("</_mdw_get_resource>");
            content = dao.engineCall(request.toString());
            if (content.startsWith("ERROR:"))
                throw new Exception("Failed to load form " + formname + " - " + content);
        }
    } else
        content = ruleset.getRuleSet();
    FormatDom fmter = new FormatDom();
    DomDocument formdoc = new DomDocument();
    fmter.load(formdoc, content);
    return formdoc;
}
Also used : FormatDom(com.qwest.mbeng.FormatDom) MbengException(com.qwest.mbeng.MbengException) RuleSetVO(com.centurylink.mdw.model.value.attribute.RuleSetVO) DomDocument(com.qwest.mbeng.DomDocument)

Example 5 with RuleSetVO

use of com.centurylink.mdw.model.value.attribute.RuleSetVO in project mdw-designer by CenturyLinkCloud.

the class GroovyTestCaseRun method getAsset.

TestCaseAsset getAsset(String path) throws TestException {
    try {
        int lastSlash = path.lastIndexOf('/');
        String name = path;
        String pkg = null;
        if (lastSlash >= 0) {
            pkg = path.substring(0, lastSlash);
            name = name.substring(lastSlash + 1);
        }
        if (pkg == null && testcase.isLegacy())
            throw new TestException("Asset path must be fully-qualified for legacy tests");
        if (testcase.isLegacy() || !testCaseAsset.isVcs()) {
            int lastDot = name.lastIndexOf('.');
            if (lastDot < 0)
                throw new TestException("Asset format must be inferable from extension: " + name);
            String language = RuleSetVO.getLanguage(name.substring(lastDot));
            RuleSetVO ruleSet = dao.getRuleSet(name, language, 0);
            if (ruleSet == null) {
                // placeholder
                ruleSet = new RuleSetVO();
                ruleSet.setName(name);
            }
            ruleSet.setPackageName(pkg == null ? testCaseAsset.getPackageName() : pkg);
            return new TestCaseAsset(ruleSet);
        } else {
            // VCS
            PackageDir pkgDir = testCaseAsset.getPackageDir();
            if (pkg != null && !pkg.equals(pkgDir.getPackageName()))
                pkgDir = new PackageDir(dao.getVcsBase(), new File(dao.getVcsBase() + "/" + pkg.replace('.', '/')), dao.getVersionControl());
            if (!pkgDir.exists())
                return null;
            AssetFile assetFile = pkgDir.getAssetFile(new File(pkgDir + "/" + name));
            return new TestCaseAsset(pkgDir, assetFile);
        }
    } catch (Exception ex) {
        throw new TestException("Cannot load " + path, ex);
    }
}
Also used : PackageDir(com.centurylink.mdw.dataaccess.file.PackageDir) AssetFile(com.centurylink.mdw.dataaccess.file.AssetFile) File(java.io.File) AssetFile(com.centurylink.mdw.dataaccess.file.AssetFile) JSONException(org.json.JSONException) DataAccessException(com.centurylink.mdw.common.exception.DataAccessException) IOException(java.io.IOException) XmlException(org.apache.xmlbeans.XmlException) RuleSetVO(com.centurylink.mdw.model.value.attribute.RuleSetVO)

Aggregations

RuleSetVO (com.centurylink.mdw.model.value.attribute.RuleSetVO)32 ArrayList (java.util.ArrayList)13 ProcessVO (com.centurylink.mdw.model.value.process.ProcessVO)10 DataAccessException (com.centurylink.mdw.common.exception.DataAccessException)7 PackageVO (com.centurylink.mdw.model.value.process.PackageVO)7 ActivityImplementorVO (com.centurylink.mdw.model.value.activity.ActivityImplementorVO)6 WorkflowAsset (com.centurylink.mdw.plugin.designer.model.WorkflowAsset)6 ActionCancelledException (com.centurylink.mdw.common.utilities.timer.ActionCancelledException)5 ExternalEventVO (com.centurylink.mdw.model.value.event.ExternalEventVO)5 File (java.io.File)5 IOException (java.io.IOException)5 HashMap (java.util.HashMap)5 ProcessExporter (com.centurylink.mdw.dataaccess.ProcessExporter)4 ValidationException (com.centurylink.mdw.designer.utils.ValidationException)4 CustomAttributeVO (com.centurylink.mdw.model.value.attribute.CustomAttributeVO)4 RemoteException (java.rmi.RemoteException)4 ProcessWorker (com.centurylink.mdw.designer.utils.ProcessWorker)3 WorkflowPackage (com.centurylink.mdw.plugin.designer.model.WorkflowPackage)3 MbengException (com.qwest.mbeng.MbengException)3 PackageDir (com.centurylink.mdw.dataaccess.file.PackageDir)2