Split C++ generated code into "enums" and "parser" parts

The "enums" part contains only the enum definitions from the
xsd file. This part is lightweight and doesn't depend on libxml2.
The "parser" complements the "enums" part and depends on it.

By default both parts are generated. To generate the "enums"
part only, enable "enums_only" property in the xsdc module.
To generate the "parser" part only, enable "parser_only".
These properties are mutually exclusive.

New unit tests added to verify that the decomposition works.

Bug: 180449205
Test: atest xsdc-cpp-tests xsdc-cpp-tests-split xsdc-cpp-tests-enums
Change-Id: I89833f23cdd2ed087b3258a4bc5deb68f95b47bf
11 files changed
tree: 57624dfde525ab400676998f859f7c2c2cd80232
  1. build/
  2. src/
  3. tests/
  4. utils/
  5. Android.bp
  6. MANIFEST.MF
  7. OWNERS
  8. README.md
README.md

ConfigFile as API

The ConfigFile as API is a formal Treble interface describing schemas of configuration files used across system and vendor partitions. The Java APIs in the current.txt file are not Java APIs for apps. It's a proxy for the schema of a xml file used between the system and vendor partition. The xml files are only ever parsed by apps on the system partition.

Add Schema

Add the schema (attribute, element or new complexType …) you want to add to the xsd file.

before

<xs:element name="class">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="student" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="name" type=”xs:string”/>
  </xs:complexType>
</xs:element>

after

<xs:element name="class">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="student" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="name" type=”xs:string”/>
    <xs:attribute name="number" type="xs:int"/>
  </xs:complexType>
</xs:element>

Then run “make {xsd_config module_name} .docs-update-current-api” or “make update-api” to update all the xsd_config modules.

In the above example, two functions are added as below.

  • method public int getNumber();
  • method public void setNumber(int);

Remove Schema

To remove a tag, add an annotation tag with the name of “Deprecated” into the tag to be deleted. Partners are not allowed to create new vendor images using deprecated tags

before

<xs:element name="class">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="student" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="name" type=”xs:string”/>
  </xs:complexType>
</xs:element>

after

<xs:element name="class">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="student" type="xs:string">
        <annotation name=”Deprecated”/>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="name" type=”xs:string”/>
  </xs:complexType>
</xs:element>

After adding “Deprecated” annotation, we need to update the api or schema just like when adding a tag. In the above example, a @Deprecate annotation is added.

  • method @Deprecated public java.util.List<java.lang.String> getStudent(); After 2 years we can delete the tag. When deleting, delete the tag in the xsd file and the api in last_current.txt, and update it.

Release Schema

If there are any changes, we update last_current.txt and last_removed.txt before release by copying current.txt and removed.txt to last_current.txt and last_removed.txt.

Supported/Unsupported Tags

Only the follow tags and attributes are allowed:

Supported

"xsd:schema" [
]

"xsd:element" [
    "xsd:name" {
        values: any valid java name
    }
    "xsd:type" {
        values: built-in data type, simpleType or complexType
    },
    "xsd:ref" {
        values: another element
    },
    "xsd:minOccurs" {
        values: [ 0, maxOccurs ]
    },
    "xsd:maxOccurs" {
        values: [ 1, unbounded ]
    },
]

"xsd:attribute" [
    "xsd:name" {
        values: any valid java name
    }
    "xsd:type" {
        values: built-in data type, simpleType or complexType
    },
    "xsd:ref" {
        values: another element
    },
]

"xsd:complexType" [
    "xsd:name" {
        values: any valid java name
    }
]

"xsd:complexContent" [
]

"xsd:simpleContent" [
]

"xsd:restriction": [
    "xsd:base" {
        values: built-in data type
    }
]

"xsd:extension": [
    "xsd:base" {
        values: built-in data type, simpleType or complexType
    }
]

"xsd:simpleType": [
    "xsd:name" {
        values: any valid java name
    }
]

"xsd:list": [
    "xsd:itemType" {
        values: built-in data type, or simpleType
    }
]

"xsd:union": [
    "xsd:memberTypes" {
        values: built-in data type, or simpleType
    }
]

"xsd:sequence": [
]

"xsd:choice": [
]

"xsd:all": [
]

"xsd:enumeration": [
    "xsd:value" {
        values: built-in data type
    }
]