1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.openehealth.ipf.commons.ihe.fhir.translation;
18
19 import org.openehealth.ipf.commons.core.URN;
20
21 import java.net.URISyntaxException;
22 import java.util.Objects;
23 import java.util.Optional;
24
25
26
27
28
29
30
31 public abstract class AbstractUriMapper implements UriMapper {
32
33 @Override
34 public Optional<String> uriToOid(String uri) {
35 return UriMapper.findFirst(
36 () -> translateURN(uri, URN.OID),
37 () -> mapUriToOid(uri));
38 }
39
40 @Override
41 public Optional<String> uriToNamespace(String uri) {
42 return UriMapper.findFirst(
43 () -> translateURN(uri, URN.PIN),
44 () -> mapUriToNamespace(uri));
45 }
46
47 @Override
48 public String oidToUri(String oid) {
49 return mapOidToUri(oid)
50 .filter(uri -> !oid.equals(uri))
51 .orElse(urn(URN.OID, oid).toString());
52 }
53
54 @Override
55 public String namespaceToUri(String namespace) {
56 return mapNamespaceToUri(namespace)
57 .filter(uri -> !namespace.equals(uri))
58 .orElse(urn(URN.PIN, namespace.replaceAll("\\s+", "_")).toString());
59 }
60
61
62
63
64
65
66
67 protected abstract Optional<String> mapUriToOid(String uri);
68
69
70
71
72
73
74
75 protected abstract Optional<String> mapUriToNamespace(String uri);
76
77
78
79
80
81
82
83
84
85 protected abstract Optional<String> mapOidToUri(String oid);
86
87
88
89
90
91
92
93
94
95 protected abstract Optional<String> mapNamespaceToUri(String namespace);
96
97
98
99
100
101
102
103
104
105 private Optional<String> translateURN(String uri, String nid) {
106 if (URN.isURN(uri)) {
107 URN urn = urn(uri);
108 if (Objects.equals(urn.getNamespaceId(), nid)) {
109 return Optional.of(urn.getNamespaceSpecificString());
110 }
111 }
112 return Optional.empty();
113 }
114
115 private URN urn(String uri) {
116 try {
117 return URN.create(uri);
118 } catch (URISyntaxException e) {
119 throw new InvalidUriSyntaxException(uri, e);
120 }
121 }
122
123 private URN urn(String nid, String nss) {
124 try {
125 return new URN(nid, nss);
126 } catch (URISyntaxException e) {
127 throw new InvalidUriSyntaxException("uri:urn:" + nss, e);
128 }
129 }
130
131 }