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
}
}
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);
}
}
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;
}
}
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;
}
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);
}
}
Aggregations