diff --git a/index.md b/index.md index 954a4c40650..25b60144bf9 100644 --- a/index.md +++ b/index.md @@ -47,6 +47,8 @@ type system, frameworks, connectors, APIs, event payloads and interchange protoc engines and platforms to exchange metadata in order to get the best value from data and tools for a wide range of use cases. +## Eager to Get Started Now + If you are interested in getting started with Egeria, try our [tutorials](open-metadata-resources/open-metadata-tutorials). They show people with different roles in a fictitious organization called [Coco Pharmaceuticals](https://opengovernance.odpi.org/coco-pharmaceuticals/) making use of different capabilities @@ -86,6 +88,8 @@ If you would like to browse to see what is available then these pages may be of the scope and usage of metadata supported by Egeria "out of the box". * [Egeria Glossary](open-metadata-publication/website/open-metadata-glossary.md) - provides definitions to terms used in the Egeria project. +* [Egeria Status and Road Map](open-metadata-publication/website/roadmap) - describes the various +components of Egeria, how they fit together and their current status. * [Egeria Module Organization](Content-Organization.md) - defines the hierarchical structure of the modules in the Egeria project. @@ -94,7 +98,7 @@ Egeria project. The following articles may answer additional questions that you have. * [Where is the code?](https://github.com/odpi/egeria) - link to GitHub. -* [Who is contributing?](https://lfanalytics.io/projects/5b554807-b041-4f98-a6ba-3306f688e05e/dashboard) - see the project activity. +* [Who is contributing?](https://lfanalytics.io/projects/5b554807-b041-4f98-a6ba-3306f688e05e/dashboard) - see the project activity by logging n with your GitHub Account. * [How do I join the mailing list?](https://lists.odpi.org/g/odpi-project-egeria) - go to the sign up page. * [What is the ODPi?](https://www.odpi.org/) - visit their website. * [Why is the project called Egeria?](open-metadata-publication/website/why-egeria) - understand the background of the project. diff --git a/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/RepositoryConformanceTestCase.java b/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/RepositoryConformanceTestCase.java index f9d64be2596..ad2e672fa32 100644 --- a/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/RepositoryConformanceTestCase.java +++ b/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/RepositoryConformanceTestCase.java @@ -387,7 +387,7 @@ private PrimitivePropertyValue getPrimitivePropertyValue(String propertyN propertyValue.setPrimitiveValue((byte)(1 + instanceCount)); // always distinct break; case OM_PRIMITIVE_TYPE_CHAR: - propertyValue.setPrimitiveValue((char)('o')); // never distinct + propertyValue.setPrimitiveValue('o'); // never distinct break; case OM_PRIMITIVE_TYPE_LONG: if (distinct) diff --git a/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/instances/TestGraphQueries.java b/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/instances/TestGraphQueries.java index 1c21501da39..19283882e8a 100644 --- a/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/instances/TestGraphQueries.java +++ b/open-metadata-conformance-suite/open-metadata-conformance-suite-server/src/main/java/org/odpi/openmetadata/conformance/tests/repository/instances/TestGraphQueries.java @@ -436,7 +436,7 @@ private void extendGraph(String userId, String entityGUID, int currentDepth) thr */ EntityDetail connectToEntity = metadataCollection.getEntityDetail(workPad.getLocalServerUserId(), entityGUID); String connectToEntityTypeName = connectToEntity.getType().getTypeDefName(); - List> possibleRelTypeNames = ((RepositoryConformanceWorkPad) workPad).getEntityRelationshipTypes(connectToEntityTypeName); + List> possibleRelTypeNames = workPad.getEntityRelationshipTypes(connectToEntityTypeName); int fanout = 0; int endChoice = 1; diff --git a/open-metadata-distribution/open-metadata-assemblies/src/main/assemblies/egeria-omag.xml b/open-metadata-distribution/open-metadata-assemblies/src/main/assemblies/egeria-omag.xml index 50b9f1c5f18..fd76f151f2f 100644 --- a/open-metadata-distribution/open-metadata-assemblies/src/main/assemblies/egeria-omag.xml +++ b/open-metadata-distribution/open-metadata-assemblies/src/main/assemblies/egeria-omag.xml @@ -593,7 +593,7 @@ - ../../open-metadata-implementation/governance-servers/admin-services/admin-services-client/target + ../../open-metadata-implementation/admin-services/admin-services-client/target ./clients *.jar diff --git a/open-metadata-implementation/adapters/open-connectors/connector-configuration-factory/src/main/java/org/odpi/openmetadata/adapters/repositoryservices/ConnectorConfigurationFactory.java b/open-metadata-implementation/adapters/open-connectors/connector-configuration-factory/src/main/java/org/odpi/openmetadata/adapters/repositoryservices/ConnectorConfigurationFactory.java index 4ebe149a970..42738b5739b 100644 --- a/open-metadata-implementation/adapters/open-connectors/connector-configuration-factory/src/main/java/org/odpi/openmetadata/adapters/repositoryservices/ConnectorConfigurationFactory.java +++ b/open-metadata-implementation/adapters/open-connectors/connector-configuration-factory/src/main/java/org/odpi/openmetadata/adapters/repositoryservices/ConnectorConfigurationFactory.java @@ -142,7 +142,7 @@ public Connection getConsoleAuditLogConnection(List supportedSeverities) public Connection getFileBasedAuditLogConnection(String localServerName, List supportedSeverities) { - String endpointAddress = localServerName + ".auditlog"; + String endpointAddress = "omag.server." + localServerName + ".auditlog"; Endpoint endpoint = new Endpoint(); @@ -711,7 +711,7 @@ private ConnectorType getDynamicConnectorType(String connectorProviderClassName) if (connectorProviderClassName != null) { - Class connectorProviderClass = Class.forName(connectorProviderClassName); + Class connectorProviderClass = Class.forName(connectorProviderClassName); Object potentialConnectorProvider = connectorProviderClass.newInstance(); ConnectorProvider connectorProvider = (ConnectorProvider)potentialConnectorProvider; diff --git a/open-metadata-implementation/admin-services/docs/user/migrating-configuration-documents.md b/open-metadata-implementation/admin-services/docs/user/migrating-configuration-documents.md index 524baa02239..51f9517c21a 100644 --- a/open-metadata-implementation/admin-services/docs/user/migrating-configuration-documents.md +++ b/open-metadata-implementation/admin-services/docs/user/migrating-configuration-documents.md @@ -16,7 +16,7 @@ configuration document and a message similar to this is returned: "exceptionClassName": "org.odpi.openmetadata.adminservices.ffdc.exception.OMAGInvalidParameterException", "exceptionErrorMessage": "OMAG-ADMIN-400-022 The configuration document for OMAG server cocoMDS1 is at version V1.0 which is not compatible with this OMAG Server Platform which supports versions [V2.0]", "exceptionSystemAction": "The system is unable to configure the local server because it can not read the configuration document.", - "exceptionUserAction": "Migrate the configuration document to a compatible version (or delete and recreate it). See https://egeria.odpi.org/open-metadata-implementation/governance-servers/admin-services/docs/user/migrating-configuration-documents.html" + "exceptionUserAction": "Migrate the configuration document to a compatible version (or delete and recreate it). See https://egeria.odpi.org/open-metadata-implementation/admin-services/docs/user/migrating-configuration-documents.html" } ``` diff --git a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationBuilder.java b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationBuilder.java index c5fcdc39367..3a4ddf1a224 100644 --- a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationBuilder.java +++ b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationBuilder.java @@ -4,11 +4,9 @@ import org.odpi.openmetadata.commonservices.odf.metadatamanagement.mappers.AnnotationMapper; import org.odpi.openmetadata.frameworks.connectors.ffdc.InvalidParameterException; -import org.odpi.openmetadata.frameworks.discovery.properties.AnnotationStatus; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.InstanceProperties; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.repositoryconnector.OMRSRepositoryHelper; -import java.util.Date; import java.util.Map; /** @@ -24,13 +22,7 @@ public class AnnotationBuilder protected String explanation; protected String analysisStep; protected String jsonProperties; - protected int numAttachedAnnotations; - protected AnnotationStatus annotationStatus; - protected Date reviewDate; - protected String steward; - protected String reviewComment; protected Map additionalProperties; - protected Map extendedProperties; protected OMRSRepositoryHelper repositoryHelper; protected String serviceName; protected String serverName; @@ -46,12 +38,7 @@ public class AnnotationBuilder * @param explanation explanation of the results * @param analysisStep analysis step in the discovery service that produced this annotation * @param jsonProperties JSON properties passed to discovery service - * @param annotationStatus status of annotation - * @param reviewDate date annotation reviewed - * @param steward name of steward - * @param reviewComment comments from the steward * @param additionalProperties additional properties - * @param extendedProperties properties from the subtype. * @param repositoryHelper helper methods * @param serviceName name of this OMAS * @param serverName name of local server @@ -63,12 +50,7 @@ public AnnotationBuilder(String annotationType, String explanation, String analysisStep, String jsonProperties, - AnnotationStatus annotationStatus, - Date reviewDate, - String steward, - String reviewComment, Map additionalProperties, - Map extendedProperties, OMRSRepositoryHelper repositoryHelper, String serviceName, String serverName) @@ -80,12 +62,7 @@ public AnnotationBuilder(String annotationType, this.explanation = explanation; this.analysisStep = analysisStep; this.jsonProperties = jsonProperties; - this.annotationStatus = annotationStatus; - this.reviewDate = reviewDate; - this.steward = steward; - this.reviewComment = reviewComment; this.additionalProperties = additionalProperties; - this.extendedProperties = extendedProperties; this.repositoryHelper = repositoryHelper; this.serviceName = serviceName; this.serverName = serverName; @@ -172,160 +149,6 @@ public InstanceProperties getAnnotationInstanceProperties(String methodName) th methodName); } - if (extendedProperties != null) - { - // todo what happens here? - } - - return properties; - } - - - /** - * Return the supplied bean properties that represent a name in an InstanceProperties object. - * - * @param methodName name of the calling method - * @return InstanceProperties object - */ - public InstanceProperties getReviewLinkInstanceProperties(String methodName) - { - InstanceProperties properties = new InstanceProperties(); - - if (annotationStatus != null) - { - properties = this.addAnnotationStatusToProperties(properties, methodName); - } - - return properties; - } - - - /** - * Return the supplied bean properties that represent a name in an InstanceProperties object. - * - * @param methodName name of the calling method - * @return InstanceProperties object - */ - public InstanceProperties getAnnotationReviewInstanceProperties(String methodName) - { - InstanceProperties properties = new InstanceProperties(); - - if (reviewDate != null) - { - properties = repositoryHelper.addDatePropertyToInstance(serviceName, - properties, - AnnotationMapper.REVIEW_DATE_PROPERTY_NAME, - reviewDate, - methodName); - } - - if (steward != null) - { - properties = repositoryHelper.addStringPropertyToInstance(serviceName, - properties, - AnnotationMapper.STEWARD_PROPERTY_NAME, - steward, - methodName); - } - - if (reviewComment != null) - { - properties = repositoryHelper.addStringPropertyToInstance(serviceName, - properties, - AnnotationMapper.COMMENT_PROPERTY_NAME, - reviewComment, - methodName); - } - return properties; } - - - /** - * Add the AnnotationStatus enum to the properties. - * - * @param properties current properties - * @param methodName calling method - * @return updated properties - */ - protected InstanceProperties addAnnotationStatusToProperties(InstanceProperties properties, - String methodName) - { - InstanceProperties resultingProperties = properties; - - switch (annotationStatus) - { - case NEW_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 0, - "New", - "The annotation is new.", - methodName); - break; - - case REVIEWED_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 1, - "Reviewed", - "The annotation has been reviewed by a steward.", - methodName); - break; - - case APPROVED_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 2, - "Approved", - "The annotation has been approved.", - methodName); - break; - - case ACTIONED_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 3, - "Actioned", - "The request has been actioned.", - methodName); - break; - - case INVALID_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 4, - "Invalid", - "The annotation is invalid or incorrect.", - methodName); - break; - - case IGNORE_ANNOTATION: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 5, - "Ignore", - "The annotation should be ignored.", - methodName); - break; - - case OTHER_STATUS: - resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, - resultingProperties, - AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, - 99, - "Other", - "Another status.", - methodName); - break; - } - - return resultingProperties; - } } diff --git a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationReviewBuilder.java b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationReviewBuilder.java new file mode 100644 index 00000000000..daf04c057d3 --- /dev/null +++ b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/AnnotationReviewBuilder.java @@ -0,0 +1,213 @@ +/* SPDX-License-Identifier: Apache 2.0 */ +/* Copyright Contributors to the ODPi Egeria project. */ +package org.odpi.openmetadata.commonservices.odf.metadatamanagement.builders; + +import org.odpi.openmetadata.commonservices.odf.metadatamanagement.mappers.AnnotationMapper; +import org.odpi.openmetadata.frameworks.discovery.properties.AnnotationStatus; +import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.InstanceProperties; +import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.repositoryconnector.OMRSRepositoryHelper; + +import java.util.Date; +import java.util.Map; + +/** + * AnnotationReviewBuilder supports the creation of the entities and + * relationships that describe an Governance Action Framework (GAF) AnnotationReview and the link to the + * annotation. + */ +public class AnnotationReviewBuilder +{ + protected AnnotationStatus annotationStatus; + protected Date reviewDate; + protected String steward; + protected String reviewComment; + protected Map additionalProperties; + protected Map extendedProperties; + protected OMRSRepositoryHelper repositoryHelper; + protected String serviceName; + protected String serverName; + + + /** + * Create a builder to convert the properties of the annotation review bean into repository services instances. + * + * @param annotationStatus status of annotation + * @param reviewDate date annotation reviewed + * @param steward name of steward + * @param reviewComment comments from the steward + * @param additionalProperties additional properties + * @param extendedProperties properties from the subtype. + * @param repositoryHelper helper methods + * @param serviceName name of this OMAS + * @param serverName name of local server + */ + public AnnotationReviewBuilder(AnnotationStatus annotationStatus, + Date reviewDate, + String steward, + String reviewComment, + Map additionalProperties, + Map extendedProperties, + OMRSRepositoryHelper repositoryHelper, + String serviceName, + String serverName) + { + this.annotationStatus = annotationStatus; + this.reviewDate = reviewDate; + this.steward = steward; + this.reviewComment = reviewComment; + this.additionalProperties = additionalProperties; + this.extendedProperties = extendedProperties; + this.repositoryHelper = repositoryHelper; + this.serviceName = serviceName; + this.serverName = serverName; + } + + + /** + * Return the supplied bean properties that represent a name in an InstanceProperties object. + * + * @param methodName name of the calling method + * @return InstanceProperties object + */ + public InstanceProperties getReviewLinkInstanceProperties(String methodName) + { + InstanceProperties properties = new InstanceProperties(); + + if (annotationStatus != null) + { + properties = this.addAnnotationStatusToProperties(properties, methodName); + } + + return properties; + } + + + /** + * Return the supplied bean properties that represent a name in an InstanceProperties object. + * + * @param methodName name of the calling method + * @return InstanceProperties object + */ + public InstanceProperties getAnnotationReviewInstanceProperties(String methodName) + { + InstanceProperties properties = new InstanceProperties(); + + if (reviewDate != null) + { + properties = repositoryHelper.addDatePropertyToInstance(serviceName, + properties, + AnnotationMapper.REVIEW_DATE_PROPERTY_NAME, + reviewDate, + methodName); + } + + if (steward != null) + { + properties = repositoryHelper.addStringPropertyToInstance(serviceName, + properties, + AnnotationMapper.STEWARD_PROPERTY_NAME, + steward, + methodName); + } + + if (reviewComment != null) + { + properties = repositoryHelper.addStringPropertyToInstance(serviceName, + properties, + AnnotationMapper.COMMENT_PROPERTY_NAME, + reviewComment, + methodName); + } + + return properties; + } + + + /** + * Add the AnnotationStatus enum to the properties. + * + * @param properties current properties + * @param methodName calling method + * @return updated properties + */ + protected InstanceProperties addAnnotationStatusToProperties(InstanceProperties properties, + String methodName) + { + InstanceProperties resultingProperties = properties; + + switch (annotationStatus) + { + case NEW_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 0, + "New", + "The annotation is new.", + methodName); + break; + + case REVIEWED_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 1, + "Reviewed", + "The annotation has been reviewed by a steward.", + methodName); + break; + + case APPROVED_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 2, + "Approved", + "The annotation has been approved.", + methodName); + break; + + case ACTIONED_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 3, + "Actioned", + "The request has been actioned.", + methodName); + break; + + case INVALID_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 4, + "Invalid", + "The annotation is invalid or incorrect.", + methodName); + break; + + case IGNORE_ANNOTATION: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 5, + "Ignore", + "The annotation should be ignored.", + methodName); + break; + + case OTHER_STATUS: + resultingProperties = repositoryHelper.addEnumPropertyToInstance(serviceName, + resultingProperties, + AnnotationMapper.ANNOTATION_STATUS_PROPERTY_NAME, + 99, + "Other", + "Another status.", + methodName); + break; + } + + return resultingProperties; + } +} diff --git a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/SuspectDuplicateAnnotationBuilder.java b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/SuspectDuplicateAnnotationBuilder.java new file mode 100644 index 00000000000..1800c05e183 --- /dev/null +++ b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/builders/SuspectDuplicateAnnotationBuilder.java @@ -0,0 +1,141 @@ +/* SPDX-License-Identifier: Apache 2.0 */ +/* Copyright Contributors to the ODPi Egeria project. */ +package org.odpi.openmetadata.commonservices.odf.metadatamanagement.builders; + +import org.odpi.openmetadata.commonservices.odf.metadatamanagement.mappers.AnnotationMapper; +import org.odpi.openmetadata.frameworks.connectors.ffdc.InvalidParameterException; +import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.InstanceProperties; +import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.repositoryconnector.OMRSRepositoryHelper; + +import java.util.List; +import java.util.Map; + +/** + * SuspectDuplicateAnnotationBuilder supports the creation of the entities and + * relationships that describe an Open Discovery Framework (ODF) SuspectDuplicateAnnotation. + */ +public class SuspectDuplicateAnnotationBuilder extends AnnotationBuilder +{ + protected List duplicateAnchorGUIDs; + protected List matchingPropertyNames; + protected List matchingClassificationNames; + protected List matchingAttachmentGUIDs; + protected List matchingRelationshipGUIDs; + + + /** + * Create a builder to convert the properties of the SuspectDuplicateAnnotation bean into repository services instances. + * + * @param annotationType type of annotation + * @param summary summary of the annotation + * @param confidenceLevel how confident was discovery service that the results are correct + * @param expression expression that summarizes the results + * @param explanation explanation of the results + * @param analysisStep analysis step in the discovery service that produced this annotation + * @param jsonProperties JSON properties passed to discovery service + * @param duplicateAnchorGUIDs the unique identifiers of the matching assets + * @param matchingPropertyNames the property names that match + * @param matchingClassificationNames the classification names that match + * @param matchingAttachmentGUIDs the unique identifiers of matching attachments + * @param matchingRelationshipGUIDs the unique identifiers of matching relationships + * @param additionalProperties additional properties + * @param repositoryHelper helper methods + * @param serviceName name of this OMAS + * @param serverName name of local server + */ + public SuspectDuplicateAnnotationBuilder(String annotationType, + String summary, + int confidenceLevel, + String expression, + String explanation, + String analysisStep, + String jsonProperties, + List duplicateAnchorGUIDs, + List matchingPropertyNames, + List matchingClassificationNames, + List matchingAttachmentGUIDs, + List matchingRelationshipGUIDs, + Map additionalProperties, + OMRSRepositoryHelper repositoryHelper, + String serviceName, + String serverName) + { + super(annotationType, + summary, + confidenceLevel, + expression, + explanation, + analysisStep, + jsonProperties, + additionalProperties, + repositoryHelper, + serviceName, + serverName); + + this.duplicateAnchorGUIDs = duplicateAnchorGUIDs; + this.matchingPropertyNames = matchingPropertyNames; + this.matchingClassificationNames = matchingClassificationNames; + this.matchingAttachmentGUIDs = matchingAttachmentGUIDs; + this.matchingRelationshipGUIDs = matchingRelationshipGUIDs; + } + + + /** + * Return the supplied bean properties in an InstanceProperties object for the annotation entity. + * + * @param methodName name of the calling method + * @return InstanceProperties object + * @throws InvalidParameterException there is a problem with the properties + */ + public InstanceProperties getAnnotationInstanceProperties(String methodName) throws InvalidParameterException + { + InstanceProperties properties = super.getAnnotationInstanceProperties(methodName); + + if (duplicateAnchorGUIDs != null) + { + properties = repositoryHelper.addStringArrayPropertyToInstance(serviceName, + properties, + AnnotationMapper.DUPLICATE_ANCHOR_GUIDS_PROPERTY_NAME, + duplicateAnchorGUIDs, + methodName); + } + + if (matchingPropertyNames != null) + { + properties = repositoryHelper.addStringArrayPropertyToInstance(serviceName, + properties, + AnnotationMapper.MATCHING_PROPERTY_NAMES_PROPERTY_NAME, + matchingPropertyNames, + methodName); + } + + if (matchingClassificationNames != null) + { + properties = repositoryHelper.addStringArrayPropertyToInstance(serviceName, + properties, + AnnotationMapper.MATCHING_CLASSIFICATION_NAMES_PROPERTY_NAME, + matchingClassificationNames, + methodName); + } + + if (matchingAttachmentGUIDs != null) + { + properties = repositoryHelper.addStringArrayPropertyToInstance(serviceName, + properties, + AnnotationMapper.MATCHING_ATTACHMENT_GUIDS_PROPERTY_NAME, + matchingAttachmentGUIDs, + methodName); + } + + if (matchingRelationshipGUIDs != null) + { + properties = repositoryHelper.addStringArrayPropertyToInstance(serviceName, + properties, + AnnotationMapper.MATCHING_RELATIONSHIP_GUIDS_PROPERTY_NAME, + matchingRelationshipGUIDs, + methodName); + } + + return properties; + } +} diff --git a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/handlers/AnnotationHandler.java b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/handlers/AnnotationHandler.java index 11eba1c46d9..8a17b6eb2f1 100644 --- a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/handlers/AnnotationHandler.java +++ b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/handlers/AnnotationHandler.java @@ -5,6 +5,7 @@ import org.odpi.openmetadata.commonservices.ffdc.InvalidParameterHandler; import org.odpi.openmetadata.commonservices.odf.metadatamanagement.builders.AnnotationBuilder; +import org.odpi.openmetadata.commonservices.odf.metadatamanagement.builders.SuspectDuplicateAnnotationBuilder; import org.odpi.openmetadata.commonservices.odf.metadatamanagement.converters.AnnotationConverter; import org.odpi.openmetadata.commonservices.odf.metadatamanagement.mappers.AnnotationMapper; import org.odpi.openmetadata.commonservices.repositoryhandler.RepositoryHandler; @@ -14,7 +15,9 @@ import org.odpi.openmetadata.frameworks.connectors.ffdc.UserNotAuthorizedException; import org.odpi.openmetadata.frameworks.discovery.properties.Annotation; import org.odpi.openmetadata.frameworks.discovery.properties.AnnotationStatus; +import org.odpi.openmetadata.frameworks.discovery.properties.SuspectDuplicateAnnotation; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.EntityDetail; +import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.InstanceProperties; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.instances.Relationship; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.properties.typedefs.TypeDef; import org.odpi.openmetadata.repositoryservices.connectors.stores.metadatacollectionstore.repositoryconnector.OMRSRepositoryHelper; @@ -315,8 +318,165 @@ public String addAnnotationToAnnotation(String userId, } + /** + * Convert the properties in the annotation into OMRS instance properties. + * + * @param userId calling user + * @param annotation annotation to save + * @param methodName calling method + * @return unique identifier of the annotation + * @throws InvalidParameterException one of the parameters is invalid + * @throws UserNotAuthorizedException the user id not authorized to issue this request + * @throws PropertyServerException there was a problem saving annotations in the annotation store. + */ + private InstanceProperties getAnnotationInstanceProperties(String userId, + Annotation annotation, + String methodName) throws InvalidParameterException, + UserNotAuthorizedException, + PropertyServerException + { + final String parameterName = "annotation"; + + invalidParameterHandler.validateObject(annotation, parameterName, methodName); + invalidParameterHandler.validateUserId(userId, methodName); + + if (annotation instanceof SuspectDuplicateAnnotation) + { + SuspectDuplicateAnnotation suspectDuplicateAnnotation = (SuspectDuplicateAnnotation)annotation; + + SuspectDuplicateAnnotationBuilder builder + = new SuspectDuplicateAnnotationBuilder(suspectDuplicateAnnotation.getAnnotationType(), + suspectDuplicateAnnotation.getSummary(), + suspectDuplicateAnnotation.getConfidenceLevel(), + suspectDuplicateAnnotation.getExpression(), + suspectDuplicateAnnotation.getExplanation(), + suspectDuplicateAnnotation.getAnalysisStep(), + suspectDuplicateAnnotation.getJsonProperties(), + suspectDuplicateAnnotation.getDuplicateAnchorGUIDs(), + suspectDuplicateAnnotation.getMatchingPropertyNames(), + suspectDuplicateAnnotation.getMatchingClassificationNames(), + suspectDuplicateAnnotation.getMatchingAttachmentGUIDs(), + suspectDuplicateAnnotation.getMatchingRelationshipGUIDs(), + suspectDuplicateAnnotation.getAdditionalProperties(), + repositoryHelper, + serviceName, + serverName); + + return builder.getAnnotationInstanceProperties(methodName); + } + else + { + // todo this implementation is storing all annotations as the root object. + // todo specific builders need to be created for specific types of annotations. + AnnotationBuilder builder = new AnnotationBuilder(annotation.getAnnotationType(), + annotation.getSummary(), + annotation.getConfidenceLevel(), + annotation.getExpression(), + annotation.getExplanation(), + annotation.getAnalysisStep(), + annotation.getJsonProperties(), + annotation.getAdditionalProperties(), + repositoryHelper, + serviceName, + serverName); + + return builder.getAnnotationInstanceProperties(methodName); + } + } + + + /** + * Determine the type identifier of the entity to save. + * + * @param annotation annotation to save + * @return unique identifier of the annotation's type + */ + String getAnnotationTypeGUID(Annotation annotation) + { + String typeGUID = null; + + /* + * If the type is defined in the annotation then this value is used. + */ + if ((annotation != null) && (annotation.getType() != null)) + { + typeGUID = annotation.getType().getElementTypeId(); + } + + /* + * If no type is provided in the annotation then we use the class of the bean. + */ + if (typeGUID == null) + { + if (annotation instanceof SuspectDuplicateAnnotation) + { + typeGUID = AnnotationMapper.SUSPECT_DUPLICATE_ANNOTATION_TYPE_GUID; + } + } + + /* + * If we have a type detected then use it. + */ + if (typeGUID != null) + { + return typeGUID; + } + + /* + * Otherwise use the default annotation type guid. + */ + return AnnotationMapper.ANNOTATION_TYPE_GUID; + } + + + + /** + * Determine the type name of the entity to save. + * + * @param annotation annotation to save + * @return unique name of the annotation's type + */ + String getAnnotationTypeName(Annotation annotation) + { + String typeName = null; + + /* + * If the type is defined in the annotation then this value is used. + */ + if ((annotation != null) && (annotation.getType() != null)) + { + typeName = annotation.getType().getElementTypeName(); + } + + /* + * If no type is provided in the annotation then we use the class of the bean. + */ + if (typeName == null) + { + if (annotation instanceof SuspectDuplicateAnnotation) + { + typeName = AnnotationMapper.SUSPECT_DUPLICATE_ANNOTATION_TYPE_NAME; + } + } + + /* + * If we have a type detected then use it. + */ + if (typeName != null) + { + return typeName; + } + + /* + * Otherwise use the default annotation type name. + */ + return AnnotationMapper.ANNOTATION_TYPE_NAME; + } + + /** * Save a new annotation as an entity. The calling method will link it to its anchor. + * * @param userId calling user * @param annotation annotation to save * @param methodName calling method @@ -331,36 +491,13 @@ String addNewAnnotation(String userId, UserNotAuthorizedException, PropertyServerException { - final String parameterName = "annotation"; - - invalidParameterHandler.validateObject(annotation, parameterName, methodName); + InstanceProperties instanceProperties = getAnnotationInstanceProperties(userId, annotation, methodName); - // todo this implementation is storing all annotations as the root object. - // todo specific builders need to be created for specific types of annotations. - AnnotationBuilder builder = new AnnotationBuilder(annotation.getAnnotationType(), - annotation.getSummary(), - annotation.getConfidenceLevel(), - annotation.getExpression(), - annotation.getExplanation(), - annotation.getAnalysisStep(), - annotation.getJsonProperties(), - annotation.getAnnotationStatus(), - annotation.getReviewDate(), - annotation.getSteward(), - annotation.getReviewComment(), - annotation.getAdditionalProperties(), - annotation.getExtendedProperties(), - repositoryHelper, - serviceName, - serverName); - - String annotationGUID = repositoryHandler.createEntity(userId, - AnnotationMapper.ANNOTATION_TYPE_GUID, - AnnotationMapper.ANNOTATION_TYPE_NAME, - builder.getAnnotationInstanceProperties(methodName), - methodName); - - return annotationGUID; + return repositoryHandler.createEntity(userId, + getAnnotationTypeGUID(annotation), + getAnnotationTypeName(annotation), + instanceProperties, + methodName); } /** @@ -382,34 +519,17 @@ public void updateAnnotation(String userId, UserNotAuthorizedException, PropertyServerException { - final String annotationParameterName = "annotation"; final String annotationGUIDParameterName = "annotationGUID"; - invalidParameterHandler.validateUserId(userId, methodName); - invalidParameterHandler.validateObject(annotation, annotationParameterName, methodName); invalidParameterHandler.validateGUID(annotationGUID, annotationGUIDParameterName, methodName); - AnnotationBuilder builder = new AnnotationBuilder(annotation.getAnnotationType(), - annotation.getSummary(), - annotation.getConfidenceLevel(), - annotation.getExpression(), - annotation.getExplanation(), - annotation.getAnalysisStep(), - annotation.getJsonProperties(), - annotation.getAnnotationStatus(), - annotation.getReviewDate(), - annotation.getSteward(), - annotation.getReviewComment(), - annotation.getAdditionalProperties(), - annotation.getExtendedProperties(), - repositoryHelper, - serviceName, - serverName); + InstanceProperties instanceProperties = getAnnotationInstanceProperties(userId, annotation, methodName); + repositoryHandler.updateEntity(userId, annotationGUID, AnnotationMapper.ANNOTATION_TYPE_GUID, AnnotationMapper.ANNOTATION_TYPE_NAME, - builder.getAnnotationInstanceProperties(methodName), + instanceProperties, methodName); } diff --git a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/mappers/AnnotationMapper.java b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/mappers/AnnotationMapper.java index 2aba2261538..9a8de10f837 100644 --- a/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/mappers/AnnotationMapper.java +++ b/open-metadata-implementation/common-services/odf-metadata-management/odf-metadata-handlers/src/main/java/org/odpi/openmetadata/commonservices/odf/metadatamanagement/mappers/AnnotationMapper.java @@ -67,7 +67,7 @@ public class AnnotationMapper public static final String QUALITY_SCORE_PROPERTY_NAME = "qualityScore"; /* from QualityAnnotation entity */ /* For SuspectDuplicateAnnotation entity */ - public static final String SUSPECT_DUPLICATE_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String SUSPECT_DUPLICATE_ANNOTATION_TYPE_GUID = "f703a621-4078-4c07-ab22-e7c334b94235"; public static final String SUSPECT_DUPLICATE_ANNOTATION_TYPE_NAME = "SuspectDuplicateAnnotation"; /* plus Annotation */ @@ -78,42 +78,42 @@ public class AnnotationMapper public static final String MATCHING_RELATIONSHIP_GUIDS_PROPERTY_NAME = "matchingRelationshipGUIDs"; /* from SuspectDuplicateAnnotation entity */ /* For DivergentDuplicateAnnotation entity */ - public static final String DIVERGENT_DUPLICATE_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_DUPLICATE_ANNOTATION_TYPE_GUID = "251e443c-dee0-47fa-8a73-1a9d511915a0"; public static final String DIVERGENT_DUPLICATE_ANNOTATION_TYPE_NAME = "DivergentDuplicateAnnotation"; /* plus Annotation */ /* For DivergentValueAnnotation entity */ - public static final String DIVERGENT_VALUE_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_VALUE_ANNOTATION_TYPE_GUID = "b86cdded-1078-4e42-b6ba-a718c2c67f62"; public static final String DIVERGENT_VALUE_ANNOTATION_TYPE_NAME = "DivergentValueAnnotation"; /* plus DivergentDuplicateAnnotation */ /* For DivergentClassificationAnnotation entity */ - public static final String DIVERGENT_CLASSIFICATION_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_CLASSIFICATION_ANNOTATION_TYPE_GUID = "8efd6257-a53e-451d-abfc-8e4899c38b1f"; public static final String DIVERGENT_CLASSIFICATION_ANNOTATION_TYPE_NAME = "DivergentClassificationAnnotation"; /* plus DivergentDuplicateAnnotation */ /* For DivergentRelationshipAnnotation entity */ - public static final String DIVERGENT_RELATIONSHIP_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_RELATIONSHIP_ANNOTATION_TYPE_GUID = "b6c6938a-fdc9-438f-893c-0b5b1d4a5bb3"; public static final String DIVERGENT_RELATIONSHIP_ANNOTATION_TYPE_NAME = "DivergentRelationshipAnnotation"; /* plus DivergentDuplicateAnnotation */ /* For DivergentAttachmentAnnotation entity */ - public static final String DIVERGENT_ATTACHMENT_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_ATTACHMENT_ANNOTATION_TYPE_GUID = "f3ed48bc-b0ea-4e1f-a8ab-75f9f3cf87a6"; public static final String DIVERGENT_ATTACHMENT_ANNOTATION_TYPE_NAME = "DivergentAttachmentAnnotation"; /* plus DivergentDuplicateAnnotation */ /* For DivergentAttachmentValueAnnotation entity */ - public static final String DIVERGENT_ATTACHMENT_VALUE_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_ATTACHMENT_VALUE_ANNOTATION_TYPE_GUID = "e22a1ffe-bd90-4faf-b6a1-13fafb7948a2"; public static final String DIVERGENT_ATTACHMENT_VALUE_ANNOTATION_TYPE_NAME = "DivergentAttachmentValueAnnotation"; /* plus DivergentAttachmentAnnotation */ /* For DivergentAttachmentClassificationAnnotation entity */ - public static final String DIVERGENT_ATTACHMENT_CLASS_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_ATTACHMENT_CLASS_ANNOTATION_TYPE_GUID = "a2a5cb74-f8e0-470f-be71-26b7e32166a6"; public static final String DIVERGENT_ATTACHMENT_CLASS_ANNOTATION_TYPE_NAME = "DivergentAttachmentClassificationAnnotation"; /* plus DivergentAttachmentAnnotation */ /* For DivergentAttachmentRelationshipAnnotation entity */ - public static final String DIVERGENT_ATTACHMENT_REL_ANNOTATION_TYPE_GUID = "6cea5b53-558c-48f1-8191-11d48db29fb4"; + public static final String DIVERGENT_ATTACHMENT_REL_ANNOTATION_TYPE_GUID = "5613677a-865f-474e-8044-4167fa5a31b9"; public static final String DIVERGENT_ATTACHMENT_REL_ANNOTATION_TYPE_NAME = "DivergentAttachmentRelationshipAnnotation"; /* plus DivergentAttachmentAnnotation */ diff --git a/open-metadata-implementation/frameworks/README.md b/open-metadata-implementation/frameworks/README.md index 097c4f162cf..2900a9bfd1e 100644 --- a/open-metadata-implementation/frameworks/README.md +++ b/open-metadata-implementation/frameworks/README.md @@ -22,7 +22,11 @@ or the organization in some way. (called discovery services) that access data-related assets and extract characteristics about the data that can be stored in an open metadata repository. -Both the discovery services and the governance actions +* **[Audit Log Framework (ALF)](audit-log-framework)** provides interfaces and classes to +enable connectors of all types to support natural language diagnostic messages for both +exceptions and the audit log. + +**Note:** Both the discovery services and the governance actions are specialized OCF connectors, making the OCF the only plug-in mechanism in the open metadata and governance technology. diff --git a/open-metadata-implementation/frameworks/audit-log-framework/README.md b/open-metadata-implementation/frameworks/audit-log-framework/README.md new file mode 100644 index 00000000000..f9254e0321f --- /dev/null +++ b/open-metadata-implementation/frameworks/audit-log-framework/README.md @@ -0,0 +1,12 @@ + + + +# Audit Log Framework (ALF) + +The Audit Log Framework (ALF) provides interface definitions +and classes to enable connectors to support natural language enabled +diagnostics such as exception messages and log messages. + +---- +License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), +Copyright Contributors to the ODPi Egeria project. \ No newline at end of file diff --git a/open-metadata-implementation/governance-servers/discovery-engine-services/discovery-engine-services-server/src/main/java/org/odpi/openmetadata/governanceservers/discoveryengineservices/handlers/DiscoveryConfigurationRefreshHandler.java b/open-metadata-implementation/governance-servers/discovery-engine-services/discovery-engine-services-server/src/main/java/org/odpi/openmetadata/governanceservers/discoveryengineservices/handlers/DiscoveryConfigurationRefreshHandler.java index b0392131f1a..11a0246e873 100644 --- a/open-metadata-implementation/governance-servers/discovery-engine-services/discovery-engine-services-server/src/main/java/org/odpi/openmetadata/governanceservers/discoveryengineservices/handlers/DiscoveryConfigurationRefreshHandler.java +++ b/open-metadata-implementation/governance-servers/discovery-engine-services/discovery-engine-services-server/src/main/java/org/odpi/openmetadata/governanceservers/discoveryengineservices/handlers/DiscoveryConfigurationRefreshHandler.java @@ -144,6 +144,8 @@ public void run() while (configToRetrieve.size() != 0) { + List configFailed = new ArrayList<>(); + for (DiscoveryEngineHandler discoveryEngineHandler : configToRetrieve) { if (discoveryEngineHandler != null) @@ -156,7 +158,6 @@ public void run() try { discoveryEngineHandler.refreshConfig(); - configToRetrieve.remove(discoveryEngineHandler); } catch (Throwable error) { @@ -171,10 +172,14 @@ public void run() auditCode.getSystemAction(), auditCode.getUserAction(), error); + + configFailed.add(discoveryEngineHandler); } } } + configToRetrieve = configFailed; + waitToRetry(); } } diff --git a/open-metadata-implementation/platform-services/README.md b/open-metadata-implementation/platform-services/README.md index 1f9637c268f..8ee359d3f64 100644 --- a/open-metadata-implementation/platform-services/README.md +++ b/open-metadata-implementation/platform-services/README.md @@ -3,8 +3,9 @@ # Platform Services -The platform services provides the APIs for configuring the -[Open Metadata and Governance (OMAG) Server Platform](../../open-metadata-publication/website/omag-server) +The platform services provides the +APIs for querying the +[Open Metadata and Governance (OMAG) Server Platform](../admin-services/docs/concepts/omag-server-platform.md) and discovering information about the OMAG Servers that it is hosting. diff --git a/open-metadata-implementation/repository-services/docs/open-metadata-repository-cohort.md b/open-metadata-implementation/repository-services/docs/open-metadata-repository-cohort.md index b0dfa9e3b72..d5d8a2a5695 100644 --- a/open-metadata-implementation/repository-services/docs/open-metadata-repository-cohort.md +++ b/open-metadata-implementation/repository-services/docs/open-metadata-repository-cohort.md @@ -3,11 +3,10 @@ # Open Metadata Repository Cohort -An **open metadata repository cohort** is a collection of metadata servers -and repository proxies +An **open metadata repository cohort** is a collection of [servers](../../admin-services/docs/concepts/cohort-member.md) sharing metadata using the **[Open Metadata Repository Services (OMRS)](..)**. This sharing is peer-to-peer. -Once a metadata repository becomes a member of the cohort, it can share +Once a server becomes a member of the cohort, it can share metadata with, and receive metadata from, any other member. OMRS needs to be flexible to support different performance and availability requirements. diff --git a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnection.java b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnection.java index 48ad27084fb..9508c3a558c 100644 --- a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnection.java +++ b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnection.java @@ -11,6 +11,8 @@ */ public class EnterpriseOMRSConnection extends ConnectionProperties { + private static final long serialVersionUID = 1L; + /** * Default Constructor that sets up the connector */ diff --git a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProperties.java b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProperties.java index 3634c0ac9b4..2d9bc8dd531 100644 --- a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProperties.java +++ b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProperties.java @@ -13,6 +13,8 @@ */ public class EnterpriseOMRSConnectorProperties extends ConnectedAssetProperties { + private static final long serialVersionUID = 1L; + public EnterpriseOMRSConnectorProperties(EnterpriseOMRSRepositoryConnector parentConnector, OMRSConnectorManager connectorManager, String enterpriseMetadataCollectionId, diff --git a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProvider.java b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProvider.java index 1d72e8038b1..1719c3f8cfe 100644 --- a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProvider.java +++ b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/enterprise/repositoryconnector/EnterpriseOMRSConnectorProvider.java @@ -73,7 +73,7 @@ public EnterpriseOMRSConnectorProvider(OMRSConnectorManager connectorMan { super(); - Class connectorClass = EnterpriseOMRSRepositoryConnector.class; + Class connectorClass = EnterpriseOMRSRepositoryConnector.class; super.setConnectorClassName(connectorClass.getName()); diff --git a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/localrepository/repositorycontentmanager/OMRSRepositoryContentValidator.java b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/localrepository/repositorycontentmanager/OMRSRepositoryContentValidator.java index 186361e95cd..484dcd48157 100644 --- a/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/localrepository/repositorycontentmanager/OMRSRepositoryContentValidator.java +++ b/open-metadata-implementation/repository-services/repository-services-implementation/src/main/java/org/odpi/openmetadata/repositoryservices/localrepository/repositorycontentmanager/OMRSRepositoryContentValidator.java @@ -2040,7 +2040,7 @@ public void validatePropertiesForType(String sourceName, * Need to step through each of the proposed properties and validate that the name and value are * present and they match the typeDef */ - Iterator propertyList = properties.getPropertyNames(); + Iterator propertyList = properties.getPropertyNames(); while (propertyList.hasNext()) { diff --git a/open-metadata-publication/website/roadmap/README.md b/open-metadata-publication/website/roadmap/README.md index 4d7de4838b0..0b9ee210d66 100644 --- a/open-metadata-publication/website/roadmap/README.md +++ b/open-metadata-publication/website/roadmap/README.md @@ -17,22 +17,41 @@ Although some progress has been made on all layers, they do build on one another. So, not surprisingly, most of the work has been focused on establishing the frameworks, connector APIs and other -services to provide the developer toolkit. +services to provide the developer platform. In recent months, and going into 2020, our focus is shifting to the integration platform as we add connector implementations for popular third party -technologies and expand out the governance servers. +technologies and expand out the user interfaces (UIs). -The support for the governance solution will then naturally -follow along. +The support for the governance solutions will then naturally +follow along. -Follow the links for more information about the -three layers: +The governance solutions themselves sit naturally along side specific metadata and governance +solutions available in the market today. Egeria is focused on filling in the gaps to +support individuals that are setting up and running an open metadata ecosystem and wish to +take advantage of the enterprise perspective it beings. + +Figure 2 steps into a little more detail and expands out the types of functions +found in each layer: + +![Figure 2](functional-organization.png#pagewidth) +> **Figure 2:** Functions found in each layer of capability for Egeria + +Follow the links for more information about the functions shown in the three layers: * [Governance Solution](governance-solution-functional-detail.md) * [Integration Platform](integration-platform-functional-detail.md) -* [Developer Toolkit](developer-toolkit-functional-detail.md) +* [Developer Platform](developer-platform-functional-detail.md) + +Figure 3 shows an overview of the status of the functions. Green means that +there is function that is either [released or technical preview](../content-status). +Orange means there is work going on and red means it is planned by not started. + +![Figure 3](functional-organization-showing-implementation-status-for-1.5.png#pagewidth) +> **Figure 3:** Status of the functions found in each layer of capability for Egeria release 1.5 + +This chart will be updated with each [release](../../../release-notes). ---- Return to [Home Page](../../../index.md) diff --git a/open-metadata-publication/website/roadmap/developer-platform-functional-detail.md b/open-metadata-publication/website/roadmap/developer-platform-functional-detail.md new file mode 100644 index 00000000000..0f20fabb99a --- /dev/null +++ b/open-metadata-publication/website/roadmap/developer-platform-functional-detail.md @@ -0,0 +1,143 @@ + + + +# Developer Platform Functional Detail + + +![Developer Platform Logo](developer-platform-logo.png) + +Egeria's **Developer Platform** contains the core Egeria implementation and provides support for: + * Integrating third party technology into the open metadata ecosystem; + * Extending Egeria to run in different environments or to use different infrastructure services. + +Below is a summary of the capabilities it includes. +These capabilities support the [Integration Platform](integration-platform-functional-detail.md) +and the [Governance Solutions](governance-solution-functional-detail.md). +Its use is described in the [Developer's Guide](../developer-guide). + + +## Access Services +The Access Services provide specialist APIs/Events for different +types of tools. They work with the pre-defined open metadata types +described [below](#Open-Metadata-Types) and use the +[repository services](#Repository-Services) to access metadata. + +There are access services for +[data catalogs](../../../open-metadata-implementation/access-services/asset-consumer) and +[curation](../../../open-metadata-implementation/access-services/asset-owner) tools; +[glossary tools](../../../open-metadata-implementation/access-services/subject-area); +[data platforms](../../../open-metadata-implementation/access-services/data-platform) and +[engines](../../../open-metadata-implementation/access-services/data-engine); +[data science/AI workbenches](../../../open-metadata-implementation/access-services/data-science), +[Business Intelligence (BI) and reporting platforms](../../../open-metadata-implementation/access-services/information-view); +[dev-ops pipelines and tools](../../../open-metadata-implementation/access-services/dev-ops); +[digital service management](../../../open-metadata-implementation/access-services/digital-architecture); +[software development tools](../../../open-metadata-implementation/access-services/software-developer), +[governance](../../../open-metadata-implementation/access-services/governance-program), +[privacy](../../../open-metadata-implementation/access-services/data-privacy) and +[security](../../../open-metadata-implementation/access-services/governance-engine) tools; +[design modeling tools](../../../open-metadata-implementation/access-services/design-model), +[IT infrastructure management](../../../open-metadata-implementation/access-services/it-infrastructure), +[automated metadata discovery](../../../open-metadata-implementation/access-services/discovery-engine) tools, +[stewardship and workflow](../../../open-metadata-implementation/access-services/stewardship-action) tools. + +The access services run in the following types of [cohort members](../../../open-metadata-implementation/admin-services/docs/concepts/cohort-member.md): +[Metadata Access Point](../../../open-metadata-implementation/admin-services/docs/concepts/metadata-access-point.md), +[Metadata Server](../../../open-metadata-implementation/admin-services/docs/concepts/metadata-server.md) and +[Repository Proxy](../../../open-metadata-implementation/admin-services/docs/concepts/repository-proxy.md). + +## Governance Services + +The [governance services](../../../open-metadata-implementation/governance-servers) provide +support for automatic exchange of metadata with third party tools as well as +supporting metadata management for [governance solutions](governance-solution-functional-detail.md). +The governance services each form the principle subsystem of a +[governance server](../../../open-metadata-implementation/admin-services/docs/concepts/governance-server-types.md). + +## View Services + +The [view services](../../../open-metadata-implementation/view-services) provide the services used by UIs. +They are typically fine-grained services and they +run in the [view server](../../../open-metadata-implementation/admin-services/docs/concepts/view-server.md). + +## Open Metadata Types +The [open metadata types](../open-metadata-types) provide common definitions for the different types of +metadata needed by an organization. The open metadata type system is +[extendable](../../../open-metadata-resources/open-metadata-archives/open-metadata-types). +However, by providing a comprehensive starter set, and encouraging tools +to use them, then Egeria ensures metadata can be seamlessly shared amongst them. + +The predefined types are organized as follows: +IT Infrastructure ([Area 0](../open-metadata-types/Area-0-models.md)); +Collaboration ([Area 1](../open-metadata-types/Area-1-models.md)); +Assets ([Area 2](../open-metadata-types/Area-2-models.md)); +Glossary ([Area 3](../open-metadata-types/Area-3-models.md)); +Governance ([Area 4](../open-metadata-types/Area-4-models.md)); +Schemas, Reference Data, Models ([Area 5](../open-metadata-types/Area-5-models.md)); +Automatic Metadata Discovery ([Area 6](../open-metadata-types/Area-6-models.md)); +Lineage ([Area 7](../open-metadata-types/Area-7-models.md)). + +## Repository Services +The [Open Metadata Repository Services (OMRS)](../../../open-metadata-implementation/repository-services) provide +the basic ability to share metadata between +metadata repositories. The metadata repositories are organized into +[open metadata repository cohorts](../../../open-metadata-implementation/repository-services/docs/open-metadata-repository-cohort.md). +These cohorts define the scope of the metadata sharing. +There are two complementary mechanisms that +are operating together to ensure metadata is available to all consumers +in the cohort. The first is the ability for any member of a cohort to issue +a federated query that includes all other members of the cohort. +There is also optional metadata replication occurring across the cohort +allowing a repository to selectively cache metadata from other members. + +The repository services implementation includes the +[Type Definitions and Instance Structures](../../../open-metadata-implementation/repository-services/docs/metadata-meta-model.md) +that are used to support the open metadata types described above; +[Event Payloads](../../../open-metadata-implementation/repository-services/docs/event-descriptions) +for the asynchronous exchange of metadata between repositories in a cohort; +[Repository connector APIs](../../../open-metadata-implementation/repository-services/docs/component-descriptions/connectors/repository-connector.md) +to allow third party tools to "plug in" to open metadata +and [repository implementations](../../../open-metadata-implementation/adapters/open-connectors/repository-services-connectors/open-metadata-collection-store-connectors) +to expand the metadata storage capability; +[Cohort Registration and Membership](../../../open-metadata-implementation/admin-services/docs/concepts/cohort-member.md) +that broadcasts details of new members to automatically configure the repository services in +other members of the cohort; +Federated queries through the [enterprise repository services](../../../open-metadata-implementation/repository-services/docs/subsystem-descriptions/enterprise-repository-services.md); +a [Repository Conformance Workbench](../../../open-metadata-conformance-suite/docs/repository-workbench) +to test the ability of a cohort member to operate correctly in the cohort; +[Open Metadata Archives](../../../open-metadata-resources/open-metadata-archives) +for managing metadata import/export as well as content packs of standard definitions; +[Audit Log Implementation](../../../open-metadata-implementation/repository-services/docs/component-descriptions/audit-log.md) with routing to +[multiple destinations](../../../open-metadata-implementation/admin-services/docs/user/configuring-the-audit-log.md) as needed by the +operations teams. + +## OMAG Server Platform + +The [Open Metadata and Governance (OMAG) Server Platform](../../../open-metadata-implementation/admin-services/docs/concepts/omag-server-platform.md) +provides a multi-tenant runtime platform for [OMAG Servers](../../../open-metadata-implementation/admin-services/docs/concepts/omag-server.md). +Each OMAG Server hosts the connectors along with the Egeria services to integrate third party technology. + +Specifically the OMAG Server Platform provides +support for the +[configuration document store connector](../../../open-metadata-implementation/admin-services/docs/user/configuring-the-configuration-document-store.md) +and [the connector that is responsible for authorization of platform services requests](); +Platform Services; Multi-tenancy; Metadata Security; +[Administration Services](../../../open-metadata-implementation/admin-services) for configuring and operating the OMAG Platform and Servers. + +## Open Metadata Frameworks for plug-in components + +The [open metadata frameworks](../../../open-metadata-implementation/frameworks) define the interfaces implemented by components that +"plug-in" to Egeria, either to integrate calls to third party technology or extend the function of Egeria. The frameworks are as follows: + +* [Open Connector Framework (OCF)](../../../open-metadata-implementation/frameworks/open-connector-framework) - base framework for all types of plug-in components called connectors. +* [Open Discovery Framework (ODF)](../../../open-metadata-implementation/frameworks/open-discovery-framework) - specialized connectors called discovery services that support automated metadata discovery, +* [Governance Action Framework (GAF)](../../../open-metadata-implementation/frameworks/governance-action-framework) - +* [Audit Log Framework (ALF)](../../../open-metadata-implementation/frameworks/audit-log-framework) - extensions for all types of connectors to enable natural language diagnostics +such as exceptions and audit log messages. + +---- +Return to [Status Overview](.) + +---- +License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), +Copyright Contributors to the ODPi Egeria project. \ No newline at end of file diff --git a/open-metadata-publication/website/roadmap/developer-platform-functional-detail.png b/open-metadata-publication/website/roadmap/developer-platform-functional-detail.png new file mode 100644 index 00000000000..7c14ba6451e Binary files /dev/null and b/open-metadata-publication/website/roadmap/developer-platform-functional-detail.png differ diff --git a/open-metadata-publication/website/roadmap/developer-platform-logo.png b/open-metadata-publication/website/roadmap/developer-platform-logo.png new file mode 100644 index 00000000000..5b2e97eedc4 Binary files /dev/null and b/open-metadata-publication/website/roadmap/developer-platform-logo.png differ diff --git a/open-metadata-publication/website/roadmap/developer-toolkit-functional-detail.md b/open-metadata-publication/website/roadmap/developer-toolkit-functional-detail.md deleted file mode 100644 index e4da3bd7df7..00000000000 --- a/open-metadata-publication/website/roadmap/developer-toolkit-functional-detail.md +++ /dev/null @@ -1,17 +0,0 @@ - - - -# Developer Toolkit Functional Detail - -Figure 1 summarizes the function that belongs in Egeria's -**Developer Toolkit**. - -![Figure 1](egeria-status-developer-toolkit-functional-detail.png#pagewidth) -> **Figure 1:** Key capabilities in Egeria's Developer Toolkit - ----- -Return to [Status Overview](.) - ----- -License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), -Copyright Contributors to the ODPi Egeria project. \ No newline at end of file diff --git a/open-metadata-publication/website/roadmap/egeria-status-developer-toolkit-functional-detail.png b/open-metadata-publication/website/roadmap/egeria-status-developer-toolkit-functional-detail.png deleted file mode 100644 index a42c2d1b7fb..00000000000 Binary files a/open-metadata-publication/website/roadmap/egeria-status-developer-toolkit-functional-detail.png and /dev/null differ diff --git a/open-metadata-publication/website/roadmap/egeria-status-governance-solution-functional-detail.png b/open-metadata-publication/website/roadmap/egeria-status-governance-solution-functional-detail.png deleted file mode 100644 index 3990a9c4a92..00000000000 Binary files a/open-metadata-publication/website/roadmap/egeria-status-governance-solution-functional-detail.png and /dev/null differ diff --git a/open-metadata-publication/website/roadmap/egeria-status-integration-platform-functional-detail.png b/open-metadata-publication/website/roadmap/egeria-status-integration-platform-functional-detail.png deleted file mode 100644 index ac778ec5732..00000000000 Binary files a/open-metadata-publication/website/roadmap/egeria-status-integration-platform-functional-detail.png and /dev/null differ diff --git a/open-metadata-publication/website/roadmap/egeria-status-overview.png b/open-metadata-publication/website/roadmap/egeria-status-overview.png index 1296832db44..cc416a95f5d 100644 Binary files a/open-metadata-publication/website/roadmap/egeria-status-overview.png and b/open-metadata-publication/website/roadmap/egeria-status-overview.png differ diff --git a/open-metadata-publication/website/roadmap/egeria-status-roadmap-logo.png b/open-metadata-publication/website/roadmap/egeria-status-roadmap-logo.png index a4b1d4fa1c3..345d4b63d44 100644 Binary files a/open-metadata-publication/website/roadmap/egeria-status-roadmap-logo.png and b/open-metadata-publication/website/roadmap/egeria-status-roadmap-logo.png differ diff --git a/open-metadata-publication/website/roadmap/egeria-status.drawio b/open-metadata-publication/website/roadmap/egeria-status.drawio index 250fd820674..669864bdc9d 100644 --- a/open-metadata-publication/website/roadmap/egeria-status.drawio +++ b/open-metadata-publication/website/roadmap/egeria-status.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/open-metadata-publication/website/roadmap/functional-organization-showing-implementation-status-for-1.5.png b/open-metadata-publication/website/roadmap/functional-organization-showing-implementation-status-for-1.5.png new file mode 100644 index 00000000000..c4709621a03 Binary files /dev/null and b/open-metadata-publication/website/roadmap/functional-organization-showing-implementation-status-for-1.5.png differ diff --git a/open-metadata-publication/website/roadmap/functional-organization.png b/open-metadata-publication/website/roadmap/functional-organization.png new file mode 100644 index 00000000000..b1d0e2bde75 Binary files /dev/null and b/open-metadata-publication/website/roadmap/functional-organization.png differ diff --git a/open-metadata-publication/website/roadmap/governance-solution-functional-detail.md b/open-metadata-publication/website/roadmap/governance-solution-functional-detail.md index d8514a75482..b9b55372f32 100644 --- a/open-metadata-publication/website/roadmap/governance-solution-functional-detail.md +++ b/open-metadata-publication/website/roadmap/governance-solution-functional-detail.md @@ -1,14 +1,23 @@ -# Governance Solution Functional Detail +# Governance Solutions Functional Detail + +![Figure 1](governance-solution-logo.png) Figure 1 summarizes the function that belongs in Egeria's -**Governance Solution**. +**Governance Solutions**. -![Figure 1](egeria-status-governance-solution-functional-detail.png#pagewidth) +![Figure 1](governance-solution-functional-detail.png#pagewidth) > **Figure 1:** Key capabilities in Egeria's Governance Solution +The implementation of a governance solution is focused mainly on the extension of +the Egeria UI to support additional roles and functions. They make use of +the services provided by the [Developer Platform](developer-platform-functional-detail.md) +and may exploit additional content, utilities and connector implementations from the +integration platform. + + ---- Return to [Status Overview](.) diff --git a/open-metadata-publication/website/roadmap/governance-solution-functional-detail.png b/open-metadata-publication/website/roadmap/governance-solution-functional-detail.png new file mode 100644 index 00000000000..0bbf517f1ea Binary files /dev/null and b/open-metadata-publication/website/roadmap/governance-solution-functional-detail.png differ diff --git a/open-metadata-publication/website/roadmap/governance-solution-logo.png b/open-metadata-publication/website/roadmap/governance-solution-logo.png new file mode 100644 index 00000000000..4281efcfb9d Binary files /dev/null and b/open-metadata-publication/website/roadmap/governance-solution-logo.png differ diff --git a/open-metadata-publication/website/roadmap/integration-platform-functional-detail.md b/open-metadata-publication/website/roadmap/integration-platform-functional-detail.md index be2f91fc26e..efc31cf3e1b 100644 --- a/open-metadata-publication/website/roadmap/integration-platform-functional-detail.md +++ b/open-metadata-publication/website/roadmap/integration-platform-functional-detail.md @@ -3,12 +3,31 @@ # Integration Platform Functional Detail +![log](integration-platform-logo.png) + + Figure 1 summarizes the function that belongs in Egeria's **Integration Platform**. -![Figure 1](egeria-status-integration-platform-functional-detail.png#pagewidth) +![Figure 1](integration-platform-functional-detail.png#pagewidth) > **Figure 1:** Key capabilities in Egeria's Integration Platform +## Egeria Integration User Interface + +Server and platform configuration; cohort monitoring; type explorer and repository explorer. + + +## Utilities and converters +Support for different standard formats to load industry standard definitions, models, glossaries, +and other content packs built on industry standard definitions, models, +glossaries and other content packs. Examples include JSON-LD, OWL/RDF, XML, ... + +## Pre-canned Connectors to third party technologies +Popular metadata repositories, databases, data formats and platforms; +data movement engines, data virtualization engines, dev ops tools, +analytics/AI tools, data catalogs, MDM and user directories, CMDBs, SDLC tools, ... + + ---- Return to [Status Overview](.) diff --git a/open-metadata-publication/website/roadmap/integration-platform-functional-detail.png b/open-metadata-publication/website/roadmap/integration-platform-functional-detail.png new file mode 100644 index 00000000000..9c793402608 Binary files /dev/null and b/open-metadata-publication/website/roadmap/integration-platform-functional-detail.png differ diff --git a/open-metadata-publication/website/roadmap/integration-platform-logo.png b/open-metadata-publication/website/roadmap/integration-platform-logo.png new file mode 100644 index 00000000000..ef4ceece97b Binary files /dev/null and b/open-metadata-publication/website/roadmap/integration-platform-logo.png differ diff --git a/open-metadata-publication/website/roadmap/roadmap-logo.png b/open-metadata-publication/website/roadmap/roadmap-logo.png new file mode 100644 index 00000000000..345d4b63d44 Binary files /dev/null and b/open-metadata-publication/website/roadmap/roadmap-logo.png differ diff --git a/open-metadata-resources/open-metadata-labs/administration-labs/open-discovery-config.ipynb b/open-metadata-resources/open-metadata-labs/administration-labs/open-discovery-config.ipynb index 367b02f833d..aa4df953d39 100644 --- a/open-metadata-resources/open-metadata-labs/administration-labs/open-discovery-config.ipynb +++ b/open-metadata-resources/open-metadata-labs/administration-labs/open-discovery-config.ipynb @@ -86,6 +86,8 @@ "metadata": {}, "outputs": [], "source": [ + "\n", + "# Start up the metadata servers\n", "%run ../common/environment-check.ipynb\n", "\n", "print(\"Start up the Discovery Server\")\n", @@ -101,7 +103,7 @@ "----\n", "You should see that both the metadata server `cocoMDS1` and the discovery engine `findItDL01` are started.\n", "If any of the platforms are not running, follow [this link to set up and run the platform](https://egeria.odpi.org/open-metadata-resources/open-metadata-labs/). If any server is reporting that it is not configured then\n", - "run the steps in the **[Server Configuration](../egeria-server-config.ipynb)** lab to configure\n", + "run the steps in the [Server Configuration](../egeria-server-config.ipynb) lab to configure\n", "the servers. Then re-run the previous step to ensure all of the servers are started.\n", "\n", "----\n", @@ -390,7 +392,9 @@ "The next exercise is to run a metadata discovery service on a selection of asset descriptions in the metadata repositories to determine if they each represent a unique real asset, or if there are duplicate descriptions.\n", "\n", "Duplicate asset descriptions are inevitable when Egeria combines metadata from different tools and the users of these tools are working with the same physical assets. Each tool will load their own private description of the\n", - "asset. When the tools are linked together, and Egeria queries the combined " + "asset. When the tools are linked together, and Egeria shares the combined metadata.\n", + "\n", + "The command below creates some duplicate assets to analyze." ] }, { @@ -398,7 +402,30 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "displayName = \"Week 1: Drop Foot Clinical Trial Measurements\"\n", + "description = \"One week's data covering foot angle, hip displacement and mobility measurements.\"\n", + "fullPath = \"file://secured/research/clinical-trials/drop-foot/DropFootMeasurementsWeek1.csv\"\n", + "\n", + "asset1guids = assetOwnerCreateCSVAsset(cocoMDS1Name, cocoMDS1PlatformName, cocoMDS1PlatformURL, petersUserId, displayName, description, fullPath)\n", + "asset1guid = getLastGUID(asset1guids)\n", + "\n", + "print (\" \")\n", + "print (\"The GUID for asset 1 is: \" + asset1guid)\n", + "\n", + "asset2guids = assetOwnerCreateCSVAsset(cocoMDS1Name, cocoMDS1PlatformName, cocoMDS1PlatformURL, petersUserId, displayName, description, fullPath)\n", + "asset2guid = getLastGUID(asset2guids)\n", + "\n", + "print (\" \")\n", + "print (\"The GUID for asset 2 is: \" + asset2guid)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next command issues a discovery request to detect duplicates in the open metadata." + ] }, { "cell_type": "code", @@ -406,6 +433,31 @@ "metadata": {}, "outputs": [], "source": [ + "\n", + "reportGUID = runDiscoveryService(findItDL01Name, findItDL01PlatformName, findItDL01PlatformURL, petersUserId, \"AssetDeduplicator\", \"identify-duplicates\", asset1guid)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is how to query the result of a discovery request." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Return the report header\n", + "getDiscoveryReport(findItDL01Name, findItDL01PlatformName, findItDL01PlatformURL, petersUserId, \"AssetDeduplicator\", reportGUID)\n", + "\n", + "\n", + "\n", + "# Return the annotations\n", + "getDiscoveryReportAnnotations(findItDL01Name, findItDL01PlatformName, findItDL01PlatformURL, petersUserId, \"AssetDeduplicator\", reportGUID)\n", "\n" ] }, @@ -416,9 +468,32 @@ "----\n", "## Exercise 3 - Exploring Asset Contents\n", "\n", - "The final exercise is to run metadata discovery on a new asset to discovery its schema (structure) and the\n", - "characteristics of its content." + "The next exercise is to run metadata discovery on a new asset to discovery its schema (structure) and the\n", + "characteristics of its content.\n", + "\n", + "\n", + " __Details coming soon ...__" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "## Exercise 3 - Assessing the quality of assets\n", + "\n", + "The final exercise is to use metadata discovery to report on errors in the data from an asset and provide an assessment of its quality.\n", + "\n", + "\n", + "__Details coming soon ...__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/open-metadata-resources/open-metadata-labs/common/environment-check.ipynb b/open-metadata-resources/open-metadata-labs/common/environment-check.ipynb index 1fafc32923d..73f04fa37c6 100644 --- a/open-metadata-resources/open-metadata-labs/common/environment-check.ipynb +++ b/open-metadata-resources/open-metadata-labs/common/environment-check.ipynb @@ -1288,7 +1288,68 @@ " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", " except Exception as error:\n", " print(\"Exception: %s\" % error)\n", - " print(\"Platform \" + serverPlatformURL + \" is returning an error\")" + " print(\"Platform \" + serverPlatformURL + \" is returning an error\")\n", + " \n", + " \n", + "def runDiscoveryService(serverName, serverPlatformName, serverPlatformURL, userId, discoveryEngineName, discoveryRequestType, assetGUID):\n", + " try:\n", + " discoveryServerRootURL = serverPlatformURL + '/servers/' + serverName + '/open-metadata/discovery-server/users/' + userId\n", + " requestDiscoveryURL = discoveryServerRootURL + '/discovery-engines/' + discoveryEngineName + '/discovery-request-types/' + discoveryRequestType + '/assets/' + assetGUID\n", + " jsonHeader = {'content-type':'application/json'}\n", + " body = {\n", + " \"class\" : \"DiscoveryRequestRequestBody\",\n", + " }\n", + " response=requests.post(requestDiscoveryURL, json=body, headers=jsonHeader)\n", + " if response.status_code == 200:\n", + " relatedHTTPCode = response.json().get('relatedHTTPCode')\n", + " if relatedHTTPCode == 200:\n", + " reportGUID = response.json().get('guid')\n", + " if reportGUID:\n", + " return reportGUID\n", + " else:\n", + " print(\"No discovery returned from discovery server \" + serverName) \n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " except Exception as error:\n", + " print(\"Exception: %s\" % error)\n", + " print(\"Platform \" + serverPlatformURL + \" is returning an error\")\n", + "\n", + "\n", + "def getDiscoveryReport(serverName, serverPlatformName, serverPlatformURL, userId, discoveryEngineName, reportGUID):\n", + " try:\n", + " discoveryServerRootURL = serverPlatformURL + '/servers/' + serverName + '/open-metadata/discovery-server/users/' + userId\n", + " requestReportURL = discoveryServerRootURL + '/discovery-engines/' + discoveryEngineName + '/discovery-analysis-reports/' + reportGUID\n", + " response=requests.get(requestReportURL)\n", + " if response.status_code == 200:\n", + " relatedHTTPCode = response.json().get('relatedHTTPCode')\n", + " if relatedHTTPCode == 200:\n", + " printResponse(response)\n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " except Exception as error:\n", + " print(\"Exception: %s\" % error)\n", + " print(\"Platform \" + serverPlatformURL + \" is returning an error\")\n", + " \n", + "def getDiscoveryReportAnnotations(serverName, serverPlatformName, serverPlatformURL, userId, discoveryEngineName, reportGUID):\n", + " try:\n", + " discoveryServerRootURL = serverPlatformURL + '/servers/' + serverName + '/open-metadata/discovery-server/users/' + userId\n", + " requestReportURL = discoveryServerRootURL + '/discovery-engines/' + discoveryEngineName + '/discovery-analysis-reports/' + reportGUID + '/annotations?startingFrom=0&maximumResults=100'\n", + " response=requests.get(requestReportURL)\n", + " if response.status_code == 200:\n", + " relatedHTTPCode = response.json().get('relatedHTTPCode')\n", + " if relatedHTTPCode == 200:\n", + " printResponse(response)\n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " else:\n", + " printUnexpectedResponse(serverName, serverPlatformName, serverPlatformURL, response)\n", + " except Exception as error:\n", + " print(\"Exception: %s\" % error)\n", + " print(\"Platform \" + serverPlatformURL + \" is returning an error\")\n" ] }, {