private static string GetDTMI()

in OWL2DTDL/Program.cs [1052:1117]


        private static string GetDTMI(OntologyResource resource)
        {
            if (!resource.IsNamed())
            {
                throw new RdfException($"Could not generate DTMI for OntologyResource '{resource}'; resource is anonymous.");
            }

            // Get the resource namespace for DTMI minting (see below)
            Uri resourceNamespace = resource.GetNamespace();
            char[] uriTrimChars = { '#', '/' };

            // Ensure that the resource is in the namespace mapper. Why do we do this again?
            if (!namespacePrefixes.ContainsKey(resourceNamespace))
            {
                string namespaceShortName = resourceNamespace.AbsoluteUri.Trim(uriTrimChars).Split('/').Last();
                namespacePrefixes[resourceNamespace] = namespaceShortName;
            }

            // Combine (reversed) host and path component arrays to create namespace components array
            string[] hostComponents = resourceNamespace.Host.Split('.');
            Array.Reverse(hostComponents);
            string[] pathComponents = resourceNamespace.AbsolutePath.Trim(uriTrimChars).Split('/');
            string[] namespaceComponents = hostComponents.Concat(pathComponents).ToArray();

            // The ontologyName is the last component in the namespace array
            string ontologyName = namespaceComponents.Last();

            // If an ontology source has been set at CLI option, use it; otherwise generate from the namespace
            // components array (omitting the previously extracted ontologyName component)
            string ontologySource;
            if (_ontologySource != null)
            {
                ontologySource = _ontologySource;
            }
            else
            {
                string[] ontologySourceComponents = namespaceComponents.Take(namespaceComponents.Count() - 1).ToArray();
                ontologySource = string.Join(':', ontologySourceComponents);
            }

            // Put together the pieces
            string dtmi = $"{ontologySource}:{ontologyName}:{resource.GetLocalName()}";

            // Run the candidate DTMI through validation per the spec, removing non-conforming chars
            string[] pathSegments = dtmi.Split(':');
            for (int i = 0; i < pathSegments.Length; i++)
            {
                string pathSegment = pathSegments[i];
                pathSegment = new string((from c in pathSegment
                                          where char.IsLetterOrDigit(c) || c.Equals('_')
                                          select c
                                          ).ToArray());
                pathSegment = pathSegment.TrimEnd('_');
                pathSegment = pathSegment.TrimStart(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'});
                pathSegments[i] = pathSegment;
            }
            dtmi = string.Join(':', pathSegments);

            string dtmiVersion = "1";
            if (resource.HasOwlVersionInfo()) {
                dtmiVersion = resource.GetOwlVersionInfo();;
            }

            // Add prefix and suffix
            return $"dtmi:digitaltwins:{dtmi};{dtmiVersion}";
        }