UNPKG

terriajs

Version:

Geospatial data visualization platform.

127 lines (80 loc) 4.12 kB
# 6. Dynamic groups and `shareKeys` / share link compatibility Date: 2020-12-10 Version: 1 ## Status Accepted ## Context See [architecture\0005-root-group-ids-and-shareKeys.md](architecture\0005-root-group-ids-and-shareKeys.md) for background. ### Glossary - `wms-group` is `WebMapServiceCatalogGroup` - it loads `GetCapabilities` request to create `WebMapServiceCatalogItem`... - `wms` is `WebMapServiceCatalogItem` ### How to handle loadable (dynamic) groups with ids - for example `wms-group` #### Using autoIDs autoIDs are generated hierarchically - using catalog member `name`. - v7 autoID has format `Root Group/$someContainerId/$someLowerContainerId/$catalogName` - v8 autoID has format `//$someContainerId/$someLowerContainerId/$catalogName` For example - a `wms-group` will have: - v7 autoID: `Root Group/$wmsGroup.name` - v8 autoID: `//$wmsGroup.name` and when it is loaded - `wms` items will have: - v7 autoID: `Root Group/$wmsGroup.name/$wmsItem.name` - v8 autoID: `//$wmsGroup.name/$wmsItem.name` #### Missing `shareKeys` Even if the `wms-group` has `shareKeys`, the `wms` item ID will be incorrect for a v7 share link - wms-group v7 autoID will be `Root Group/$wmsGroup.name` - which will be in `shareKeys` (this is added by `catalog-converter`) - so ID will be resolved correctly - A wms-item v7 autoID will be `Root Group/$wmsGroup.name/$wmsItem.name` - the item won't have any `shareKeys`, therefore the ID will **not** be resolved #### Using manual `id` for `wms-group` What happens when we set an explicit `id` for a `wms-group`? - A `wms-group` used to have no `id`, therefore it had a v8 autoID `//$wmsGroup.name` - Now the `wms-group` has `id`:`wms-group-random-id` (and `shareKeys=["//$wmsGroup.name"]`) - All share links which refer to `//$wmsGroup.name` will automatically resolve to `wms-group-random-id` - The `wms-group` is loaded and creates a bunch of `wms` items: - Before `wms-group` `id` change, items had v8 autoID of form `//$wmsGroup.name/$wmsItem.name` - After `id` change - `wms-group-random-id/$wmsItem.name` - Items have **no `shareKeys`** - Therefore, `wms` items in old share links **will not work!** This is also relevant if moving from v8 JSON to v8 Magda catalog - or any other transformation which sets explicit `id`s for catalog members. ### Auto IDs for `CatalogGroups` Different dynamic `CatalogGroups` may generate member autoIDs differently. #### WMS-Group For example - `wms-group` autoIDs for `wms` items are generated from the item `name`: - in v8: `${layer.Name || layer.Title}` - in v7: ```js if (wmsGroup.titleField === "name") { return layer.Name; } else if (wmsGroup.titleField === "abstract") { return layer.Abstract; } else { return layer.Title; } ``` #### CKAN Resource - in v8: `parentId + "/" + ckanDataset.id + "/" + ckanResource.id` ### Summary How do we add `shareKeys` to items created by dynamic groups? ## Decisions ### Add `shareKeys` to group items on load - Go through each share key in `group.shareKeys` and create new `member.shareKeys`: - Look at current `member.uniqueId` - Replace instances of `group.uniqueID` in `member.uniqueId` with `shareKey` - For example: - `group.uniqueId = "some-group-id"` - `member.uniqueId = "some-group-id/some-member-id"` - `group.shareKeys = ["old-group-id"]` - So we want to create `member.shareKeys = ["old-group-id/some-member-id"]` To do this, we need a reverse map of `id` -> `shareKeys`. ### Revert v8 WMS-group member ids to match v7 ~~This means we don't need to add manual `shareKeys` to WMS-groups.~~ WMS-group IDs will now use `Layer.Name` if is defined - otherwise `Layer.Title`. Sharekeys will be added so both cases are covered. ## Consequences This does not solve for the different methods of generating autoIDs across v7 and v8. Changing `wms-group` IDs will break sharekeys for existing v8 maps. ### Known incompatible groups - CKAN Group If we have compatibility issues with certain `CatalogGroup`s, we can either: - Change id generation in v8 to match v7 - Add manual `shareKey` generation to each `CatalogGroup`