Generate lightblue metadata from java classes.
Given this:
@Version(value = "1.0.0", changelog = "Do some stuff")
staticclassUser {
privateString_id;
privateStringfirstName;
privateStringlastName;
privateDatelastUpdateDate;
privateDatebirthdate;
privateList<Address> addresses;
privatePhoneNumberphoneNumber;
privatePhoneNumberfaxNumber;
privateStatusstatus;
publicStringget_id() {
return_id;
}
@Identity@IntSequence(name = "userIdSequence")
publicvoidset_id(String_id) {
this._id = _id;
}
publicStringgetFirstName() {
returnfirstName;
}
@Required@MinLength(2)
publicvoidsetFirstName(StringfirstName) {
this.firstName = firstName;
}
publicStringgetLastName() {
returnlastName;
}
publicvoidsetLastName(StringlastName) {
this.lastName = lastName;
}
publicDategetLastUpdateDate() {
returnlastUpdateDate;
}
@Required@CurrentTime(overwrite = true)
publicvoidsetLastUpdateDate(DatelastUpdateDate) {
this.lastUpdateDate = lastUpdateDate;
}
publicDategetBirthdate() {
returnbirthdate;
}
publicvoidsetBirthdate(Datebirthdate) {
this.birthdate = birthdate;
}
publicList<Address> getAddresses() {
returnaddresses;
}
@MinItems(1)
publicvoidsetAddresses(List<Address> addresses) {
this.addresses = addresses;
}
publicPhoneNumbergetPhoneNumber() {
returnphoneNumber;
}
publicvoidsetPhoneNumber(PhoneNumberphoneNumber) {
this.phoneNumber = phoneNumber;
}
publicPhoneNumbergetFaxNumber() {
returnfaxNumber;
}
publicvoidsetFaxNumber(PhoneNumberfaxNumber) {
this.faxNumber = faxNumber;
}
publicStatusgetStatus() {
returnstatus;
}
@RequiredpublicvoidsetStatus(Statusstatus) {
this.status = status;
}
enumStatus {
enabled,
@Description("Use instead of deleting users")
disabled;
}
staticclassAddress {
privateStringusage;
privateStringaddress1;
privateStringaddress2;
privateintpostalCode;
privateStringcity;
privateStatestate;
privateStringuuid;
publicStringgetUuid() {
returnuuid;
}
@ElementIdentity@UuidpublicvoidsetUuid(Stringuuid) {
this.uuid = uuid;
}
publicStringgetUsage() {
returnusage;
}
publicvoidsetUsage(Stringusage) {
this.usage = usage;
}
publicStringgetAddress1() {
returnaddress1;
}
@RequiredpublicvoidsetAddress1(Stringaddress1) {
this.address1 = address1;
}
publicStringgetAddress2() {
returnaddress2;
}
publicvoidsetAddress2(Stringaddress2) {
this.address2 = address2;
}
publicintgetPostalCode() {
returnpostalCode;
}
@RequiredpublicvoidsetPostalCode(intpostalCode) {
this.postalCode = postalCode;
}
publicStringgetCity() {
returncity;
}
@RequiredpublicvoidsetCity(Stringcity) {
this.city = city;
}
publicStategetState() {
returnstate;
}
@RequiredpublicvoidsetState(Statestate) {
this.state = state;
}
staticclassState {
privateStringcode;
privateStringname;
publicStringgetCode() {
returncode;
}
@RequiredpublicvoidsetCode(Stringcode) {
this.code = code;
}
publicStringgetName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name = name;
}
}
}
staticclassPhoneNumber {
privateintareaCode;
privateintdigits;
publicintgetAreaCode() {
returnareaCode;
}
@RequiredpublicvoidsetAreaCode(intareaCode) {
this.areaCode = areaCode;
}
publicintgetDigits() {
returndigits;
}
@RequiredpublicvoidsetDigits(intdigits) {
this.digits = digits;
}
}
}Get this:
{
"entityInfo": {
"enums": [
{
"annotatedValues": [
{
"description": "Use instead of deleting users",
"name": "disabled"
},
{
"description": null,
"name": "enabled"
}
],
"name": "status",
"values": [
"disabled",
"enabled"
]
}
],
"name": "user"
},
"schema": {
"access": {
"delete": [],
"find": [],
"insert": [],
"update": []
},
"fields": {
"_id": {
"constraints": {
"identity": true
},
"description": null,
"type": "string",
"valueGenerator": {
"configuration": {
"name": "userIdSequence"
},
"type": "IntSequence"
}
},
"addresses": {
"constraints": {
"minItems": 1
},
"description": null,
"items": {
"fields": {
"address1": {
"constraints": {
"required": true
},
"description": null,
"type": "string"
},
"address2": {
"description": null,
"type": "string"
},
"city": {
"constraints": {
"required": true
},
"description": null,
"type": "string"
},
"postalCode": {
"constraints": {
"required": true
},
"description": null,
"type": "integer"
},
"state": {
"constraints": {
"required": true
},
"description": null,
"fields": {
"code": {
"constraints": {
"required": true
},
"description": null,
"type": "string"
},
"name": {
"description": null,
"type": "string"
}
},
"type": "object"
},
"usage": {
"description": null,
"type": "string"
},
"uuid": {
"constraints": {
"element-identity": true
},
"description": null,
"type": "string",
"valueGenerator": {
"type": "UUID"
}
}
},
"type": "object"
},
"type": "array"
},
"birthdate": {
"description": null,
"type": "date"
},
"faxNumber": {
"description": null,
"fields": {
"areaCode": {
"constraints": {
"required": true
},
"description": null,
"type": "integer"
},
"digits": {
"constraints": {
"required": true
},
"description": null,
"type": "integer"
}
},
"type": "object"
},
"firstName": {
"constraints": {
"minLength": 2,
"required": true
},
"description": null,
"type": "string"
},
"lastName": {
"description": null,
"type": "string"
},
"lastUpdateDate": {
"constraints": {
"required": true
},
"description": null,
"type": "date",
"valueGenerator": {
"overwrite": true,
"type": "CurrentTime"
}
},
"phoneNumber": {
"description": null,
"fields": {
"areaCode": {
"constraints": {
"required": true
},
"description": null,
"type": "integer"
},
"digits": {
"constraints": {
"required": true
},
"description": null,
"type": "integer"
}
},
"type": "object"
},
"status": {
"constraints": {
"enum": "status",
"required": true
},
"description": null,
"type": "string"
}
},
"name": "user",
"status": {
"value": "active"
},
"version": {
"changelog": "Do some stuff",
"value": "1.0.0"
}
}
}- simple fields
- object fields
- array fields
- constraints (see #1)
- references (see #3)
- versions (see #2)
- enums (see #5)
- generators (see #6)
- element identity
- generate java from metadata (see #4). This is lowest priority since java to metadata is lossy therefore going the other direction will require a small amount of "magic" to compute that missing information. For this reason I think it's better to simply use Java classes as the starting point / source of truth since they're much easier to write, usable in other code, and retain more information.
