+ @Override
+ @Timed(value = "cps.data.service.datanode.delete",
+ description = "Time taken to delete a datanode")
+ public void deleteDataNode(final String dataspaceName, final String anchorName, final String dataNodeXpath,
+ final OffsetDateTime observedTimestamp) {
+ cpsValidator.validateNameCharacters(dataspaceName, anchorName);
+ final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName);
+ cpsDataPersistenceService.deleteDataNode(dataspaceName, anchorName, dataNodeXpath);
+ processDataUpdatedEventAsync(anchor, dataNodeXpath, DELETE, observedTimestamp);
+ }
+
+ @Override
+ @Timed(value = "cps.data.service.datanode.batch.delete",
+ description = "Time taken to delete a batch of datanodes")
+ public void deleteDataNodes(final String dataspaceName, final String anchorName,
+ final Collection<String> dataNodeXpaths, final OffsetDateTime observedTimestamp) {
+ cpsValidator.validateNameCharacters(dataspaceName, anchorName);
+ cpsDataPersistenceService.deleteDataNodes(dataspaceName, anchorName, dataNodeXpaths);
+ final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName);
+ dataNodeXpaths.forEach(dataNodeXpath ->
+ processDataUpdatedEventAsync(anchor, dataNodeXpath, DELETE, observedTimestamp));
+ }
+
+ @Override
+ @Timed(value = "cps.data.service.datanode.delete.anchor",
+ description = "Time taken to delete all datanodes for an anchor")
+ public void deleteDataNodes(final String dataspaceName, final String anchorName,
+ final OffsetDateTime observedTimestamp) {
+ cpsValidator.validateNameCharacters(dataspaceName, anchorName);
+ final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName);
+ processDataUpdatedEventAsync(anchor, ROOT_NODE_XPATH, DELETE, observedTimestamp);
+ cpsDataPersistenceService.deleteDataNodes(dataspaceName, anchorName);
+ }
+
+ @Override
+ @Timed(value = "cps.data.service.datanode.delete.anchor.batch",
+ description = "Time taken to delete all datanodes for multiple anchors")
+ public void deleteDataNodes(final String dataspaceName, final Collection<String> anchorNames,
+ final OffsetDateTime observedTimestamp) {
+ cpsValidator.validateNameCharacters(dataspaceName);
+ cpsValidator.validateNameCharacters(anchorNames);
+ for (final Anchor anchor : cpsAdminService.getAnchors(dataspaceName, anchorNames)) {
+ processDataUpdatedEventAsync(anchor, ROOT_NODE_XPATH, DELETE, observedTimestamp);
+ }
+ cpsDataPersistenceService.deleteDataNodes(dataspaceName, anchorNames);
+ }
+
+ @Override
+ @Timed(value = "cps.data.service.list.delete",
+ description = "Time taken to delete a list or list element")
+ public void deleteListOrListElement(final String dataspaceName, final String anchorName, final String listNodeXpath,
+ final OffsetDateTime observedTimestamp) {
+ cpsValidator.validateNameCharacters(dataspaceName, anchorName);
+ final Anchor anchor = cpsAdminService.getAnchor(dataspaceName, anchorName);
+ cpsDataPersistenceService.deleteListDataNode(dataspaceName, anchorName, listNodeXpath);
+ processDataUpdatedEventAsync(anchor, listNodeXpath, DELETE, observedTimestamp);
+ }
+
+ private DataNode buildDataNode(final Anchor anchor, final String parentNodeXpath, final String nodeData,
+ final ContentType contentType) {
+ final SchemaContext schemaContext = getSchemaContext(anchor);