AQuAMan

Overview

As a Peer Reviewer I want to have a fast and predictable method of checking the quality of application patches so that I do not have to exert a lot of time and energy manually checking these against the application standards.

As a Lead Developer I want to define and manage the quality standards that comprise the 'Definition of Good' for my application so that they can be applied and reported on in a peer review against an application patch.

Key Features & Functionality

  • Automate 80% of the Peer Review checklist items
  • Register Appian applications and define common standards across that application
  • Run a suite of tests across an application patch
  • Report on failed tests
  • Copy tests between applications
  • Define new object/attribute tests (including database table and view objects) and apply within an application
  • Set the reported significance for a failed test (Fail/Warning/Information)
  • Report on unused variables in Expression Rules and Interfaces
  • Report on the complexity score for Expression Rules and Interfaces
  • Report on missing labels/accessibility text for Interface Object components

Anonymous
  • Hi  - whilst you cannot export the whole of an analysis in a WebAPI the WebAPIs you mention can be used as part of a CI/CD pipeline.:

    • AQA_WA_analysePatch - you can use this WebAPI to trigger an analysis. You need to pass AQuAMan the patch you want to analyse as a zip document; and you need to pass it the target Application UUID so that AQuAMan knows which registered application you want to conduct the analysis under. This WebAPI will return the PatchId to be used in the other WebAPI
    • AQA_WA_getPatchAnalysisSummary - your CI/CD pipeline can call this WebAPI (using the PatchId value returned from the previous WebAPI) to determine if the analysis has completed or not; and it it has what the overall analysis result is (which will either be "Pass" or "Fail")

    Were you expecting/wanting a WebAPI to be able to do something else?

  • Hi   - thanks for adding this clarification. I've tried to articulate in the documentation that AQuAMan simply presents some findings (always expressed as "risks") and that it's entirely up to the user to establish what the risks are and whether what - if anything - should be done to address them. And, of course, context is key in any such  assessment.

    In short: AQuAMan should not be used as a blunt tool where the findings are Boolean (good versus bad!) but as a source of insight from which actions may be taken.

  • Hi Team, 

    The client has asked us if it would be possible to export the Aquaman analyzes. I have seen that the application has this two web apis: 

    But it seems that none of them work for what the client is asking for.

    Is there a way to expose these analyzes in a web api so that they are consumed by a CI/CD tool?

    Thanks! 

  • Hello Dimitark,

    I faced this too and found the the  Xpath function is using XPATH to OBJECT attribute from [AQA_OBJECT_ATTRIBUTE]  wrt to Object type ID.

    That attribute is corrupted when we are converting  mssql to Mysql to server.   

    First verify the Object type

    Verify the object attribute which is getting the call  when rule is failing and then try to pass that attribute.  Once you able to find out the attribute. Please compare it with  the one which is provided in package and see the difference.

    Also c heck case : "612282 - Please make an incident for Xpath broken"

    Thanks

  • Hi Team,
    For the first time we've tried deploying AQuAMan QA application (in Cloud) but we're seeing behavior which is almost identical to the issue posted by subhadeepr3242 6 months ago - where issue occurs only when evaluation some Process Models, but not others. Here's a stack trace of the error: - any ideas on what can be done?

    [1] object: pv!Object, attributeName: #"_a-0000e385-9976-8000-9bac-011c48011c48_3445850", objectAttributes: pv!objectAttributes ) =>(EXCEPTION) [2] 2024-04-15 06:48:58,298 [Appian Work Item - 194049 - WorkID 339 - execution02 - process 536878506 - model 1159 : ExpressionGroupRequest] DEBUG com.appiancorp.core.expr.tree.Variable - Variable local!xPathDocument => Context Reference local!xPathDocument Îåà 2024-04-15 06:48:58,298 [Appian Work Item - 194049 - WorkID 339 - execution02 - process 536878506 - model 1159 : ExpressionGroupRequest] DEBUG com.appiancorp.core.expr.tree.Variable - Variable local!xPathDocument => Context Reference local!xPathDocument Îåà 2024-04-15 06:48:58,299 [Appian Work Item - 194049 - WorkID 339 - execution02 - process 536878506 - model 1159 : ExpressionGroupRequest] DEBUG com.appiancorp.core.expr.Parse - =#"_a-0000e385-9976-8000-9bac-011c48011c48_3446005"( object: pv!Object, attributeName: #"_a-0000e385-9976-8000-9bac-011c48011c48_3445850", objectAttributes: pv!objectAttributes ) =>(EXCEPTION) 2024-04-15 06:48:58,299 [Appian Work Item - 194049 - WorkID 339 - execution02 - process 536878506 - model 1159 : ExpressionGroupRequest] DEBUG com.appiancorp.core.expr.Parse - Could not evaluate expression parse tree: =#"_a-0000e385-9976-8000-9bac-011c48011c48_3446005"( object: pv!Object, attributeName: #"_a-0000e385-9976-8000-9bac-011c48011c48_3445850", objectAttributes: pv!objectAttributes ) com.appiancorp.core.expr.exceptions.ExpressionRuntimeException$AppianExceptionProvider: Expression evaluation error in rule 'aqa_er_getobjectattributevaluebyattributename': Invalid index (1) for list: valid range is empty (APNX-1-4198-000) at <DESIGNER RULE>.(_a-0000e385-9976-8000-9bac-011c48011c48_3446005:1) at ______________________________SAIL_TO_JAVA_BOUNDARY______________________________.esId=BFH2LI9O(Unknown Source) at com.appiancorp.core.expr.exceptions.ExpressionRuntimeException.<init>(ExpressionRuntimeException.java:112) at com.appiancorp.core.expr.exceptions.AppianScriptException.<init>(AppianScriptException.java:28) at com.appiancorp.core.expr.exceptions.AppianScriptException.<init>(AppianScriptException.java:24) at com.appiancorp.core.expr.tree.Select.evalWrapped(Select.java:207) at com.appiancorp.core.expr.Tree.eval(Tree.java:448) at com.appiancorp.core.expr.Tree.eval0(Tree.java:438) at com.appiancorp.core.expr.Tree.eval(Tree.java:341) at com.appiancorp.core.expr.rule.Rule.evalBody(Rule.java:1569) at com.appiancorp.core.expr.rule.Rule.doEval(Rule.java:962) at com.appiancorp.core.expr.rule.Rule.eval(Rule.java:849) at com.appiancorp.core.expr.rule.Rule.evalAndCache(Rule.java:743) at com.appiancorp.core.expr.rule.Rule.eval(Rule.java:735) at com.appiancorp.core.expr.rule.Rule.evalWithMetrics(Rule.java:716) at com.appiancorp.core.expr.rule.Rule.eval(Rule.java:702) at com.appiancorp.core.expr.tree.FreeformRule.evalWrapped(FreeformRule.java:162) at com.appiancorp.core.expr.Tree.eval(Tree.java:448) at com.appiancorp.core.expr.tree.FreeformRule.eval0(FreeformRule.java:133) at com.appiancorp.core.expr.Tree.eval(Tree.java:341) at com.appiancorp.core.expr.Parse.evalInner(Parse.java:433) at com.appiancorp.core.expr.Parse.eval(Parse.java:383) at com.appiancorp.core.expr.Parse.eval(Parse.java:369) at com.appiancorp.core.expr.AppianScriptEngine.eval(AppianScriptEngine.java:79) at com.appiancorp.process.engine.ExpressionGroup.eval(ExpressionGroup.java:290) at com.appiancorp.process.engine.ExpressionGroup.eval(ExpressionGroup.java:354) at com.appiancorp.process.engine.ExpressionGroupRequest.execute0(ExpressionGroupRequest.java:106) at com.appiancorp.common.persistence.data.AppianDataUserContextProvider.executeWithConsistentDataReads(AppianDataUserContextProvider.java:143) at com.appiancorp.process.engine.ProcessContinuationRequest.executeOuter(ProcessContinuationRequest.java:68) at com.appiancorp.process.engine.ContinuationRequest.execute(ContinuationRequest.java:129) at com.appiancorp.process.workpoller.UnattendedRequestHandlerBean.onMessage(UnattendedRequestHandlerBean.java:36) at com.appiancorp.process.workpoller.WorkItem.run(WorkItem.java:110) at org.springframework.jca.work.SimpleTaskWorkManager$DelegatingWorkAdapter.run(SimpleTaskWorkManager.java:241) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.ArrayIndexOutOfBoundsException: Invalid index (1) for list: valid range is empty at com.appiancorp.core.expr.portable.storage.StorageArray.arrayIndexOutOfBoundsException(StorageArray.java:360) at com.appiancorp.core.expr.portable.storage.StorageArray.doSelect_integerScalarIndex(StorageArray.java:737) at com.appiancorp.core.expr.portable.storage.Storage.doSelect(Storage.java:735) at com.appiancorp.core.expr.portable.storage.Storage._select(Storage.java:693) at com.appiancorp.core.expr.portable.storage.Storage.select(Storage.java:673) at com.appiancorp.core.expr.portable.Value.select(Value.java:209) at com.appiancorp.core.Data.select(Data.java:124) at com.appiancorp.core.expr.tree.Select.eval(Select.java:223) -- 2024-04-15 06:48:58,300 [Appian Work Item - 194049 - WorkID 339 - execution02 - process 536878506 - model 1159 : ExpressionGroupRequest] ERROR com.appiancorp.process.engine.ExpressionGroup - An error occurred while evaluating expression: =rule!AQA_ER_getObjectAttributeValueByAttributeName( object: pv!Object, attributeName: cons!AQA_TEXT_OBJECT_ATTRIBUTE_NAME, objectAttributes: pv!objectAttributes ) (Expression evaluation error in rule 'aqa_er_getobjectattributevaluebyattributename': Invalid index (1) for list: valid range is empty) com.appiancorp.core.expr.exceptions.ExpressionRuntimeException$AppianExceptionProvider: Expression evaluation error in rule 'aqa_er_getobjectattributevaluebyattributename': Invalid index (1) for list: valid range is empty (APNX-1-4198-000) at <DESIGNER RULE>.(_a-0000e385-9976-8000-9bac-011c48011c48_3446005:1) at ______________________________SAIL_TO_JAVA_BOUNDARY______________________________.esId=BFH2LI9O(Unknown Source) at com.appiancorp.core.expr.exceptions.ExpressionRuntimeException.<init>(ExpressionRuntimeException.java:112) at com.appiancorp.core.expr.exceptions.AppianScriptException.<init>(AppianScriptException.java:28) at com.appiancorp.core.expr.exceptions.AppianScriptException.<init>(AppianScriptException.java:24) at com.appiancorp.core.expr.tree.Select.evalWrapped(Select.java:207) at com.appiancorp.core.expr.Tree.eval(Tree.java:448) ....

  • The last list item for Key Features and Functionality indicates a test is performed for missing accessibilityText parameter values. Note that no one should be relying on this test (the labels test is valid). Just because a component does not have accessibility text does not mean it fails any a11y requirement. In fact, accessibility text should not need to be used in most cases. It should only be used to provide additional information to non-sighted users. However, the need to do so is based on context. If you design your content correctly, accessibility text should never be needed. In cases where you may believe it IS needed, then you should consider redesigning your content so the information is available to all users, not just non-sighted users. The accessibilityText parameter is one of the most overused of Appian component parameters. In most cases where it is used, it either creates redundancy or confusion for users who rely on a screen reader. The parameter name is misleading because its use does not necessarily make content accessible or even "more accessible".

  • Hi, can you please adapt scripts from Maria DB to Oracle and/or other DBs as well? GPT isn't quite able to adapt it yet Slight smile

  • Just to clarify - the fix worked in the environment where an existing instance of AQuAMan was running so it's not an (AQuAMan) application issue.

    Regarding support for MSSQL - apologies, I do not have the scripts for any other DB other than MariaDB.