A document is an object that contains a number of properties. A property can for an example be a value like a number or a string, or it can be a list of other documents. Every property is referenced using a key.[2] When traversing the document tree, the user specifies a constructor to be used for creating the implementation class of the next level. The implementations are often a union of various traits that extend the Document interface, making it possible for them to handle setting and getting properties on their own.
See Abstract Document Pattern on Wikipedia.
List of repository modules/files being visualised in the above diagram:
abstract-document/src/main/java/com/iluwatar/abstractdocument/AbstractDocument.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/App.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/Document.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Car.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasModel.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasParts.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasPrice.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/HasType.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/Part.java
abstract-document/src/main/java/com/iluwatar/abstractdocument/domain/enums/Property.java
abstract-document/src/test/java/com/iluwatar/abstractdocument/AbstractDocumentTest.java
abstract-document/src/test/java/com/iluwatar/abstractdocument/AppTest.java
abstract-document/src/test/java/com/iluwatar/abstractdocument/DomainTest.java