diff --git a/src/main/java/de/landsh/opendata/csw2dcat/MDMetadata2Dataset.java b/src/main/java/de/landsh/opendata/csw2dcat/MDMetadata2Dataset.java index 00bdc61e71a52c9a902eb148280651fe6dad6ebf..bcb2c1d40a9fab52c15bd12a038e2a0b383701ba 100644 --- a/src/main/java/de/landsh/opendata/csw2dcat/MDMetadata2Dataset.java +++ b/src/main/java/de/landsh/opendata/csw2dcat/MDMetadata2Dataset.java @@ -25,8 +25,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLEncoder; import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -47,6 +49,7 @@ public class MDMetadata2Dataset { boolean ignoreInvalidMapping = true; private CswInterface cswInterface; private BridgeSettings settings; + private final Map<String, JSONObject> url2license = new HashMap<>(); public MDMetadata2Dataset(Model model, CswInterface cswInterface, BridgeSettings bridgeSettings) { this(model); @@ -77,6 +80,12 @@ public class MDMetadata2Dataset { final String value = entry.getString(key); keywordMapping.put(key, value); } + + JSONArray licenses = new JSONArray(new JSONTokener(Objects.requireNonNull(getClass().getResourceAsStream("/licenses.json")))); + for (Object l : licenses) { + JSONObject license = (JSONObject) l; + url2license.put(license.getString("uri"), license); + } } static String getTextOrNull(Node node) { @@ -533,18 +542,43 @@ public class MDMetadata2Dataset { } private void addLicenseInformation(Resource resource, List<Node> otherLegalConstraints) { - final JSONObject licenceInformation = findLicenseInformation(otherLegalConstraints); - if (licenceInformation != null) { - resource.addLiteral(DCATAPde.licenseAttributionByText, licenceInformation.getString("quelle")); - if (licenceInformation.has("url") && licenceInformation.getString("url").startsWith("http://dcat-ap.de/def/licenses/")) { - // Some publishers specify the licence as the URL and not the id. - resource.addProperty(DCTerms.license, model.createResource(licenceInformation.getString("url"))); + final JSONObject licenseInformation = findLicenseInformation(otherLegalConstraints); + + if (licenseInformation != null) { + resource.addLiteral(DCATAPde.licenseAttributionByText, licenseInformation.getString("quelle")); + + if (licenseInformation.has("url")) { + String licenseURL = licenseInformation.getString("url"); + + if (licenseURL.startsWith("http://dcat-ap.de/def/licenses/")) { + resource.addProperty(DCTerms.license, model.createResource(licenseURL)); + } else { + final JSONObject license = url2license.get(licenseURL); + + if (license != null && license.has("uri")) { + resource.addProperty(DCTerms.license, model.createResource(license.getString("uri"))); + } else { + log.info("Unknown license: {}", licenseURL); + handleUnknownLicense(resource, licenseInformation.getString("id")); + } + } } else { - resource.addProperty(DCTerms.license, model.createResource("http://dcat-ap.de/def/licenses/" + licenceInformation.getString("id"))); + handleUnknownLicense(resource, licenseInformation.getString("id")); } } } - + + private void handleUnknownLicense(Resource resource, String licenseId) { + try { + licenseId = URLEncoder.encode(licenseId, "UTF-8") + .replaceAll("%2F", "/"); // Replace the encoded slash with the original slash + resource.addProperty(DCTerms.license, model.createResource("http://dcat-ap.de/def/licenses/" + licenseId)); + log.info("Falling back to: {}", licenseId); + } catch (UnsupportedEncodingException e) { + log.info("Unable to encode licenseId: {}", e); + } + } + private Resource guessFormat(String url) { final String lowerCaseURL = url.toLowerCase(); if (lowerCaseURL.contains("service=wms")) {