37
37
import org .apache .commons .lang3 .tuple .Pair ;
38
38
import org .elasticsearch .common .geo .GeoPoint ;
39
39
40
+ import com .fasterxml .jackson .core .JsonProcessingException ;
41
+ import com .fasterxml .jackson .databind .JsonMappingException ;
40
42
import com .fasterxml .jackson .databind .JsonNode ;
41
43
import com .fasterxml .jackson .databind .ObjectMapper ;
44
+ import com .fasterxml .jackson .databind .type .MapType ;
45
+ import com .fasterxml .jackson .databind .type .TypeFactory ;
42
46
import com .typesafe .config .Config ;
43
47
import com .typesafe .config .ConfigFactory ;
44
48
@@ -508,6 +512,11 @@ private static Promise<Result> okPromise(final String q, final String person,
508
512
issued , medium , rpbspatial , rpbsubject , from , size , owner , t , sort ,
509
513
details , location , word , corporation , raw , format );
510
514
return result .recover ((Throwable throwable ) -> {
515
+ Logger .error ("Error on Lobid call with q={}, person={}, name={}, subject={}, id={}, publisher={},\n "
516
+ + "issued={}, medium={}, rpbspatial={}, rpbsubject={}, from={}, size={}, owner={}, t={}, sort={},\n "
517
+ + "details={}, location={}, word={}, corporation={}, raw={}, format={}" , //
518
+ q , person , name , subject , id , publisher , issued , medium , rpbspatial , rpbsubject , from , size , owner ,
519
+ t , sort , details , location , word , corporation , raw , format );
511
520
Logger .error ("Could not call Lobid" , throwable );
512
521
flashError ();
513
522
return internalServerError (search .render ("[]" , q , person , name , subject ,
@@ -970,6 +979,14 @@ public static Promise<Result> delete(String id, String secret) throws FileNotFou
970
979
}
971
980
}
972
981
982
+ public static Promise <Result > putIdFromData (String secret ) throws FileNotFoundException , RecognitionException , IOException {
983
+ return put (request ().body ().asJson ().get ("rpbId" ).textValue (), secret );
984
+ }
985
+
986
+ public static Promise <Result > deleteIdFromData (String secret ) throws FileNotFoundException , RecognitionException , IOException {
987
+ return delete (request ().body ().asJson ().get ("rpbId" ).textValue (), secret );
988
+ }
989
+
973
990
private static Promise <Result > deleteFromIndex (String id ) throws UnsupportedEncodingException {
974
991
Cache .remove (String .format ("/%s" , id ));
975
992
WSRequest request = WS .url (elasticsearchUrl (id )).setHeader ("Content-Type" , "application/json" );
@@ -978,16 +995,60 @@ private static Promise<Result> deleteFromIndex(String id) throws UnsupportedEnco
978
995
979
996
private static Promise <Result > transformAndIndex (String id , JsonNode jsonBody )
980
997
throws IOException , FileNotFoundException , RecognitionException , UnsupportedEncodingException {
998
+ JsonNode transformedJson = transform (jsonBody );
999
+ Promise <JsonNode > dataPromise = id .startsWith ("f" ) && transformedJson .has ("hbzId" ) ? // hbz-Fremddaten
1000
+ addToLobidData (transformedJson ) : Promise .pure (transformedJson );
1001
+ return dataPromise .flatMap (result -> {
1002
+ Cache .remove (String .format ("/%s" , id ));
1003
+ WSRequest request = WS .url (elasticsearchUrl (id )).setHeader ("Content-Type" , "application/json" );
1004
+ return request .put (result ).map (response -> status (response .getStatus (), response .getBody ()));
1005
+ });
1006
+ }
1007
+
1008
+ private static JsonNode transform (JsonNode jsonBody )
1009
+ throws IOException , FileNotFoundException , RecognitionException {
981
1010
File input = new File ("conf/output/test-output-strapi.json" );
982
1011
File output = new File ("conf/output/test-output-0.json" );
983
1012
Files .write (Paths .get (input .getAbsolutePath ()), jsonBody .toString ().getBytes (Charset .forName (UTF_8 )));
984
1013
ETL .main (new String [] {"conf/rpb-test-titel-to-lobid.flux" });
985
1014
String result = Files .readAllLines (Paths .get (output .getAbsolutePath ())).stream ().collect (Collectors .joining ("\n " ));
986
- Cache .remove (String .format ("/%s" , id ));
987
- WSRequest request = WS .url (elasticsearchUrl (id )).setHeader ("Content-Type" , "application/json" );
988
- return request .put (result ).map (response -> status (response .getStatus (), response .getBody ()));
1015
+ return Json .parse (result );
989
1016
}
990
-
1017
+
1018
+ private static Promise <JsonNode > addToLobidData (JsonNode transformedJson ) {
1019
+ String lobidUrl = transformedJson .get ("hbzId" ).textValue ();
1020
+ WSRequest lobidRequest = WS .url (lobidUrl ).setQueryParameter ("format" , "json" );
1021
+ Promise <JsonNode > lobidPromise = lobidRequest .get ().map (WSResponse ::asJson );
1022
+ Promise <JsonNode > merged = lobidPromise .map (lobidJson -> mergeRecords (transformedJson , lobidJson ));
1023
+ return merged ;
1024
+ }
1025
+
1026
+ private static JsonNode mergeRecords (JsonNode transformedJson , JsonNode lobidJson )
1027
+ throws JsonMappingException , JsonProcessingException {
1028
+ ObjectMapper objectMapper = new ObjectMapper ();
1029
+ MapType mapType = TypeFactory .defaultInstance ().constructMapType (Map .class , String .class , Object .class );
1030
+ Map <String , Object > transformedMap = objectMapper .readValue (transformedJson .toString (), mapType );
1031
+ Map <String , Object > lobidMap = objectMapper .readValue (lobidJson .toString (), mapType );
1032
+ lobidMap .remove ("describedBy" );
1033
+ transformedMap .put ("hbzId" , lobidMap .get ("hbzId" ));
1034
+ transformedMap .remove ("type" );
1035
+ transformedMap .keySet ().forEach (key -> {
1036
+ Object transformedObject = transformedMap .get (key );
1037
+ Object lobidObject = lobidMap .getOrDefault (key , new ArrayList <Object >());
1038
+ Object values = transformedObject instanceof List ? mergeValues (transformedObject , lobidObject )
1039
+ : transformedObject ;
1040
+ lobidMap .put (key , values );
1041
+ });
1042
+ return Json .toJson (lobidMap );
1043
+ }
1044
+
1045
+ private static Object mergeValues (Object transformedObject , Object lobidObject ) {
1046
+ List <Object > mergedValues = lobidObject instanceof List ? new ArrayList <>((List <?>) lobidObject )
1047
+ : Arrays .asList (lobidObject );
1048
+ mergedValues .addAll ((List <?>) transformedObject );
1049
+ return mergedValues ;
1050
+ }
1051
+
991
1052
private static String elasticsearchUrl (String id ) throws UnsupportedEncodingException {
992
1053
return "http://weywot3:9200/resources-rpb-test/resource/"
993
1054
+ URLEncoder .encode ("https://lobid.org/resources/" + id , UTF_8 );
0 commit comments