All files / src/objects domain.ts

92.79% Statements 103/111
82.14% Branches 46/56
87.5% Functions 7/8
92.79% Lines 103/111

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 1111x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 187x 187x 1x 1x 7x 7x 1x 1x     1x 1x 4x 4x 4x 4x 4x 1x 1x 31x 31x 31x 1x 1x 17x 17x 17x     17x     17x 17x 17x 17x 17x 17x 17x 17x 17x 17x 1x 1x 32x 3x 3x 29x 29x 29x 29x 32x     29x 32x 32x 32x 32x 55x 55x 55x 55x 55x 55x 55x 55x 29x 29x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 1x 1x 26x 26x 1x 1x
import {AbstractObject} from "./_abstract_object";
import {AbstractType} from "../abap/types/basic/_abstract_type";
import * as Types from "../abap/types/basic";
import {IRegistry} from "../_iregistry";
import {DDIC} from "../ddic";
import {xmlToArray} from "../xml_utils";
 
export interface DomainValue {
  language: string,
  low: string,
  high: string,
  description: string
}
 
export class Domain extends AbstractObject {
 
  private parsedXML: {
    description?: string,
    datatype?: string,
    length?: string,
    decimals?: string,
    conversionExit?: string,
    values?: DomainValue[],
  } | undefined;
 
  public getType(): string {
    return "DOMA";
  }
 
  public getDescription(): string | undefined {
    return this.parsedXML?.description;
  }
 
  public getConversionExit(): string | undefined {
    return this.parsedXML?.conversionExit;
  }
 
  public getAllowedNaming() {
    return {
      maxLength: 30,
      allowNamespace: true,
    };
  }
 
  public setDirty(): void {
    this.parsedXML = undefined;
    super.setDirty();
  }
 
  public parseType(reg: IRegistry, dataElement?: string): AbstractType {
    // dont cache the DOMA parsed type, they are cached on DTEL level
    // also note that the type carries the name of the DTEL
    if (this.parsedXML === undefined) {
      this.parse();
    }
    if (this.parsedXML === undefined) {
      return new Types.UnknownType("Domain " + this.getName() + " parser error", this.getName());
    }
    const ddic = new DDIC(reg);
    return ddic.textToType(
      this.parsedXML.datatype,
      this.parsedXML.length,
      this.parsedXML.decimals,
      this.getName(),
      dataElement,
      this.parsedXML.conversionExit,
      dataElement);
  }
 
  public parse() {
    if (this.parsedXML) {
      return {updated: false, runtime: 0};
    }
 
    const start = Date.now();
    this.parsedXML = {};
    const parsed = super.parseRaw2();
    if (parsed === undefined) {
      return {updated: false, runtime: 0};
    }
 
    const dd01v = parsed.abapGit?.["asx:abap"]?.["asx:values"]?.DD01V;
    const dd07v_tab = xmlToArray(parsed.abapGit?.["asx:abap"]?.["asx:values"]?.DD07V_TAB?.DD07V);
    const values: DomainValue[] = [];
    for (const ddo7v of dd07v_tab) {
      const value: DomainValue = {
        description: ddo7v?.DDTEXT,
        low: ddo7v?.DOMVALUE_L,
        high: ddo7v?.DOMVALUE_H,
        language: ddo7v?.DDLANGUAGE,
      };
      values.push(value);
    }
 
    this.parsedXML = {
      description: dd01v?.DDTEXT,
      datatype: dd01v?.DATATYPE,
      length: dd01v?.LENG,
      conversionExit: dd01v?.CONVEXIT,
      decimals: dd01v?.DECIMALS,
      values: values,
    };
    const end = Date.now();
    return {updated: true, runtime: end - start};
  }
 
  public getFixedValues() {
    return this.parsedXML?.values ?? [];
  }
 
}