Complete code sample for one-to-ones

The following code snippets define a new entity and a new one-to-one referencing that entity. In this example, the Activity resource has a activityLegalInfo_Ext inline object whose fields map to the ActivityLegalInfo_Ext entity.

Data model extension

File name: Activity.etx

<extension
  xmlns="http://guidewire.com/datamodel"
  entityName="Activity">
  ...
  <onetoone
    fkentity="ActivityLegalInfo_Ext"
    name="ActivityLegalInfo_Ext"
    nullok="true"/>
  ...

File name: ActivityLegalInfo_Ext.eti

<?xml version="1.0"?>
<entity
  xmlns="http://guidewire.com/datamodel"
  entity="ActivityLegalInfo_Ext"
  table="activitylegalinfo_ext"
  type="retireable">
  <column
    name="LegalCaseNumber"
    nullok="true"
    type="varchar">
    <columnParam
      name="size"
      value="30"/>
  </column>
  <column
    name="LegalReviewDate"
    nullok="true"
    type="datetime"/>
  <foreignkey
    fkentity="Activity"
    name="Activity"
    nullok="false"/>
  <implementsEntity
    name="Extractable"/>
</entity>

Schema extension file

File name: common_ext-1.0.schema.json

  "definitions": {
    "Activity": {
      "properties": {
        "activityLegalInfo_Ext": {
          "title": "ActivityLegalInfo_Ext",
          "description": "One-to-one association to ActivityLegalInfo_Ext",
          "$ref": "#/definitions/ActivityLegalInfo_Ext"
        }
      }
    },
    "ActivityLegalInfo_Ext": {
      "properties": {
        "id": {
          "title": "ID",
          "description": "Object ID",
          "type": "string",
          "readOnly": true
        },
        "legalCaseNumber": {
          "title": "LegalCaseNumber",
          "description": "Legal case number",
          "type": "string"
        },
        "legalReviewDate": {
          "title": "LegalReviewDate",
          "description": "Legal review date",
          "type": "string",
          "format": "date-time"
        }
      }
    }
  }
  ...

Mapping extension file

File name: common_ext-1.0.mapping.json

  "mappers": {
    "Activity": {
      "properties": {
        "activityLegalInfo_Ext": {
          "path": "Activity.ActivityLegalInfo_Ext",
          "mapper": "#/mappers/ActivityLegalInfo_Ext"
        }
      }
    },
    "ActivityLegalInfo_Ext": {
      "schemaDefinition": "ActivityLegalInfo_Ext",
      "root": "entity.ActivityLegalInfo_Ext",
      "properties": {
        "id": {
          "path": "ActivityLegalInfo_Ext.RestId"
        },
        "legalCaseNumber": {
          "path": "ActivityLegalInfo_Ext.LegalCaseNumber"
        },
        "legalReviewDate": {
          "path": "ActivityLegalInfo_Ext.LegalReviewDate"
        }
      }
    }
  }

Updater extension file

File name: common_ext-1.0.updater.json

  "updaters": {
    "Activity": {
      "properties": {
        "activityLegalInfo_Ext": {
          "path": "Activity.ActivityLegalInfo_Ext",
          "create": "new ActivityLegalInfo_Ext(Activity)",
          "updaterRef": "#/updaters/ActivityLegalInfo_Ext"
        }
      }
    },
    "ActivityLegalInfo_Ext": {
      "schemaDefinition": "ActivityLegalInfo_Ext",
      "root": "entity.ActivityLegalInfo_Ext",
      "properties": {
        "legalCaseNumber": {
          "path": "ActivityLegalInfo_Ext.LegalCaseNumber"
        },
        "legalReviewDate": {
          "path": "ActivityLegalInfo_Ext.LegalReviewDate"
        }
      }
    }
  }

Resource extension (to reserve IDs and extend checksums)

File name: ActivityExtResource.gs

package gw.rest.ext.cc.common.v1.activities

uses gw.api.modules.rest.framework.v1.batch.BatchUpdateMap
uses gw.api.modules.rest.framework.v1.checksum.ChecksumUtil
uses gw.api.modules.rest.framework.v1.json.DataEnvelope
uses gw.rest.core.cc.common.v1.activities.ActivityCoreResource

@Export
class ActivityExtResource extends ActivityCoreResource {

  override function finishCreate(data : DataEnvelope, batchUpdateMap : BatchUpdateMap) {
    super.finishCreate(data, batchUpdateMap)
    reserveIdsIfNecessary({this.Element.ActivityLegalInfo_Ext})
  }

  override property get Checksum() : String {
    return ChecksumUtil.extendChecksumWithEntities(super.Checksum, {this.Element.ActivityLegalInfo_Ext})
  }
  
}