diff --git a/src/main/java/de/nrw/hbz/genericSipLoader/impl/KtblLoaderImpl.java b/src/main/java/de/nrw/hbz/genericSipLoader/impl/KtblLoaderImpl.java index c3d4dcf..f5ba3c0 100644 --- a/src/main/java/de/nrw/hbz/genericSipLoader/impl/KtblLoaderImpl.java +++ b/src/main/java/de/nrw/hbz/genericSipLoader/impl/KtblLoaderImpl.java @@ -23,6 +23,7 @@ import de.nrw.hbz.genericSipLoader.util.JsonFileLoader; import de.nrw.hbz.genericSipLoader.util.PropertiesLoader; import de.nrw.hbz.genericSipLoader.util.ZipExtractor; +import de.nrw.hbz.genericSipLoader.util.md.AdHocUriProvider; import java.nio.file.Path; @@ -107,12 +108,9 @@ public void uploadJsonFile(File file, String parentId) { client.postJsonFile(parentId, file); } - - /** - * Method aims to persist a complete ktbl - * ResearchData item into appropriate to.science Objects with respect to each - * objects relation to each other + * Method aims to persist a complete ktbl ResearchData item into appropriate + * to.science Objects with respect to each objects relation to each other * * @param fList list of file names found by FileScanner */ @@ -130,7 +128,7 @@ public void persistKtblRD(Set fList) { */ Iterator fIt = ((TreeSet) fList).descendingIterator(); - + // Step 1: find json files and persist an empty ktblResearchData object for each // one while (fIt.hasNext()) { @@ -151,11 +149,13 @@ public void persistKtblRD(Set fList) { ktblDataId.put(fileName, pId); } } - + // Step 2: Modify json files to add logger.debug("search for associatedDataSets"); addRelatededDataSetMD(ktblDataId); - + + createMissingAdHocUris(ktblDataId); + // Step 3: Upload modified json files into empty ktblResearchData objects Set kSet = ktblDataId.keySet(); Iterator kIt = kSet.iterator(); @@ -167,7 +167,7 @@ public void persistKtblRD(Set fList) { File jsonFile = new File(fileName); uploadJsonFile(jsonFile, parentId); logger.info("Uploaded JSON-File: " + fileName); - + File zipFile = new File(fileName.replace(".json", ".zip")); if (zipFile.exists()) { String partId = createToScienceObject("file", parentId); @@ -189,19 +189,66 @@ public void persistKtblRD(Set fList) { FileUtil.removeWorkDir(basePath, workDir); } + /** + * For sanity reasons provide adHocUris whenever an @id is missing or empty + * + * @param ktblDataId + */ + private void createMissingAdHocUris(LinkedHashMap ktblDataId) { + // TODO Auto-generated method stub + + Set keySet = ktblDataId.keySet(); + Iterator kIt = keySet.iterator(); + + while (kIt.hasNext()) { + String fileName = kIt.next(); + JsonFileLoader jFl = new JsonFileLoader(); + JSONObject ktblJSONObj = jFl.loadJsonObject(fileName); + + String[] fields2check = new String[] { "other", "contributor", "creator", "publisher", "subject" }; + + for (String field : fields2check) { + if (ktblJSONObj.has(field)) { + JSONArray fieldArray = ktblJSONObj.getJSONArray(field); + for (int i = 0; i < fieldArray.length(); i++) { + JSONObject fieldObj = fieldArray.getJSONObject(i); + if (! fieldObj.has("@id") && fieldObj.has("prefLabel")) { + String adHocUri = new AdHocUriProvider("ktbl").encode(fieldObj.getString("prefLabel")); + fieldObj.put("@id", adHocUri); + logger.info("added adHocUri: " + adHocUri); + // fieldArray.put(i, fieldObj); + } + if(fieldObj.has("@id") && fieldObj.has("prefLabel")) { + if(fieldObj.getString("@id").equals("")){ + String adHocUri = new AdHocUriProvider("ktbl").encode(fieldObj.getString("prefLabel")); + fieldObj.put("@id", adHocUri); + logger.info("added adHocUri: " + adHocUri); + // fieldArray.put(i, fieldObj); + } + } + } + // ktblJSONObj.put(field, fieldArray); + } + } + FileUtil.saveStringToResultFile(fileName, ktblJSONObj.toString(2)); + + } + + } + private void addChildsToParent(LinkedHashMap ktblDataId) { - + TreeSet pIdSet = (TreeSet) ktblDataId.keySet(); NavigableSet descSet = pIdSet.descendingSet(); String parentId = descSet.pollFirst(); - + Iterator childPidIt = descSet.iterator(); - + while (childPidIt.hasNext()) { String childId = childPidIt.next(); createToScienceObject("part", parentId); } - + } /** @@ -219,7 +266,7 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { ArrayList> relatedDataset = new ArrayList<>(); ArrayList pids = new ArrayList<>(); - + Set keySet = ktblDataId.keySet(); Iterator pIt = keySet.iterator(); @@ -228,7 +275,7 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { String key = pIt.next(); localFileList.add(key); pids.add(ktblDataId.get(key)); - + logger.debug("id " + ktblDataId.get(key)); JsonFileLoader jFl = new JsonFileLoader(); @@ -238,17 +285,17 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { if (ktblJSONObj.has("relatedDatasets")) { - logger.debug("found related Datasets"); + logger.info("found related Datasets"); ktblRelDat = ktblJSONObj.getJSONArray("relatedDatasets"); - + logger.info("relatedDataset array has: " + ktblRelDat.length() + " items"); logger.info("localFileList has: " + localFileList.size() + " items"); Hashtable related = null; - + Iterator kIt = ktblRelDat.iterator(); - int j = localFileList.size() -2 ; + int j = localFileList.size() - 2; while (kIt.hasNext()) { if (localFileList != null && localFileList.size() > 0) { @@ -267,7 +314,6 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { } } - } } @@ -279,7 +325,7 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { String jsonFileName = localFileList.get(i); logger.info("load file: " + jsonFileName); - + JsonFileLoader jFl = new JsonFileLoader(); JSONObject ktblJSONObj = jFl.loadJsonObject(jsonFileName); JSONArray tosRelDat = new JSONArray(); @@ -287,22 +333,24 @@ public void addRelatededDataSetMD(LinkedHashMap ktblDataId) { logger.info("relations count: " + relatedDataset.size()); + if (jsonFileName != localFileList.get(localFileList.size() - 1)) { relDat = new JSONObject(); relDat.put("prefLabel", "Parent publication"); - relDat.put("@id", client.getResouceUri() + ktblDataId.get(localFileList.get(localFileList.size() -1 ))); - tosRelDat.put(relDat); + relDat.put("@id", client.getResouceUri() + ktblDataId.get(localFileList.get(localFileList.size() - 1))); + tosRelDat.put(relDat); + } for (int k = 0; k < relatedDataset.size(); k++) { - if (relatedDataset.size() -1 - i != k) { + if (relatedDataset.size() - 1 - i != k) { relDat = new JSONObject(); relDat.put("prefLabel", relatedDataset.get(k).get("prefLabel")); relDat.put("@id", relatedDataset.get(k).get("@id")); tosRelDat.put(relDat); - } + } } ktblJSONObj.put("relatedDatasets", tosRelDat); ktblJSONObj.put("associatedDataset", tosRelDat); - + logger.debug(ktblJSONObj.toString(2)); FileUtil.saveStringToResultFile(jsonFileName, ktblJSONObj.toString(2)); diff --git a/src/main/java/de/nrw/hbz/genericSipLoader/restClient/KtblClient.java b/src/main/java/de/nrw/hbz/genericSipLoader/restClient/KtblClient.java index c3d8a68..62325b2 100644 --- a/src/main/java/de/nrw/hbz/genericSipLoader/restClient/KtblClient.java +++ b/src/main/java/de/nrw/hbz/genericSipLoader/restClient/KtblClient.java @@ -73,7 +73,7 @@ private void loadProperties() { e.printStackTrace(); } } else { - apiProps = new PropertiesLoader().getApiProperties(); + apiProps = new PropertiesLoader("ktbl-api.properties").getApiProperties(); } } diff --git a/src/main/java/de/nrw/hbz/genericSipLoader/util/PropertiesLoader.java b/src/main/java/de/nrw/hbz/genericSipLoader/util/PropertiesLoader.java index 8b18c5b..a6a6f49 100644 --- a/src/main/java/de/nrw/hbz/genericSipLoader/util/PropertiesLoader.java +++ b/src/main/java/de/nrw/hbz/genericSipLoader/util/PropertiesLoader.java @@ -25,6 +25,14 @@ public class PropertiesLoader { private static Properties apiProps = new Properties(); private Hashtable config = new Hashtable<>(); + public PropertiesLoader() { + loadProperties(); + } + + public PropertiesLoader(String propertiesFileName) { + loadProperties(propertiesFileName); + } + private void loadProperties() { InputStream propStream = null; @@ -55,6 +63,27 @@ private void loadProperties() { } } + private void loadProperties(String propertiesFileName) { + InputStream propStream = null; + + propStream = this.getClass().getClassLoader() + .getResourceAsStream(propertiesFileName); + + if (propStream != null) { + try { + apiProps.load(propStream); + } catch (IOException e) { + e.printStackTrace(); + } + + Enumeration eProps = apiProps.keys(); + while (eProps.hasMoreElements()) { + String key = (String) eProps.nextElement(); + config.put(key, apiProps.getProperty(key)); + } + } + } + public Hashtable getProperties() { loadProperties(); return config; diff --git a/src/main/java/de/nrw/hbz/genericSipLoader/util/md/AdHocUriProvider.java b/src/main/java/de/nrw/hbz/genericSipLoader/util/md/AdHocUriProvider.java new file mode 100644 index 0000000..91c36a1 --- /dev/null +++ b/src/main/java/de/nrw/hbz/genericSipLoader/util/md/AdHocUriProvider.java @@ -0,0 +1,40 @@ +/** + * + */ +package de.nrw.hbz.genericSipLoader.util.md; + +import java.util.Base64; +import java.util.Base64.Encoder; +import java.util.Properties; + +import de.nrw.hbz.genericSipLoader.util.PropertiesLoader; +/** + * + */ +public class AdHocUriProvider { + + private Properties apiProperties; + + public AdHocUriProvider(String apiName) { + + PropertiesLoader propertiesLoader = new PropertiesLoader(apiName + "-api.properties"); + propertiesLoader.getApiProperties(); + apiProperties = propertiesLoader.getApiProperties(); + } + + + public String encode(String label) { + + String adHocUri = apiProperties.getProperty("protocol") + + "://" + + apiProperties.getProperty("host") + "/adhoc/uri/"; + byte[] bytes = label.getBytes(); + + Encoder encoder = Base64.getEncoder(); + String result = encoder.encodeToString(bytes); + + adHocUri = adHocUri + result; + + return adHocUri; + } +} diff --git a/src/test/java/genericSipLoader/TestAdHocProvider.java b/src/test/java/genericSipLoader/TestAdHocProvider.java new file mode 100644 index 0000000..c3eaeef --- /dev/null +++ b/src/test/java/genericSipLoader/TestAdHocProvider.java @@ -0,0 +1,34 @@ +/** + * + */ +package genericSipLoader; + +import java.util.Properties; +import de.nrw.hbz.genericSipLoader.util.PropertiesLoader; +import de.nrw.hbz.genericSipLoader.util.md.AdHocUriProvider; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; +/** + * + */ +public class TestAdHocProvider { + + @Test + public void getApiProperties() { + String propertiesFileName = "ktbl-api.properties"; + Properties apiProp = new PropertiesLoader(propertiesFileName).getApiProperties(); + System.out.println(apiProp.getProperty("host")); + assertEquals("frl.publisso.de", apiProp.getProperty("host")); + } + + @Test + public void getAdHocUri() { + AdHocUriProvider aHP = new AdHocUriProvider("ktbl"); + String adHocUri = aHP.encode("Goethe, Johann W."); + System.out.println(adHocUri); + assertEquals("https://frl.publisso.de/adhoc/uri/R29ldGhlLCBKb2hhbm4gVy4=", adHocUri); + } + + +}