From 831f55a2af56bc097146a9a8f5bacefd8e6f28dc Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 15 Sep 2020 10:08:06 +0200 Subject: [PATCH] moved an api messsage in common module --- .../controllers/OpenairePublicController.java | 39 +++++-- .../broker/oa/integration/ScrollTest.java | 6 +- .../dnetlib/broker/api/ShortEventMessage.java | 108 +++++++----------- 3 files changed, 75 insertions(+), 78 deletions(-) rename apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/NotificationMessage.java => libs/dnet-openaire-broker-common/src/main/java/eu/dnetlib/broker/api/ShortEventMessage.java (62%) diff --git a/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/OpenairePublicController.java b/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/OpenairePublicController.java index d14bcc43..b1da3108 100644 --- a/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/OpenairePublicController.java +++ b/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/OpenairePublicController.java @@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.search.join.ScoreMode; @@ -35,11 +36,13 @@ import org.springframework.web.bind.annotation.RestController; import com.google.gson.Gson; import eu.dnetlib.broker.BrokerConfiguration; +import eu.dnetlib.broker.api.ShortEventMessage; import eu.dnetlib.broker.common.controllers.AbstractLbsController; import eu.dnetlib.broker.common.elasticsearch.Notification; import eu.dnetlib.broker.common.properties.ElasticSearchProperties; import eu.dnetlib.broker.common.subscriptions.Subscription; import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository; +import eu.dnetlib.broker.objects.OaBrokerEventPayload; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -64,7 +67,7 @@ public class OpenairePublicController extends AbstractLbsController { @ApiOperation("Returns notifications by subscription using scrolls (first page)") @GetMapping("/scroll/notifications/bySubscriptionId/{subscrId}") - public ScrollPage prepareScrollNotificationsBySubscrId(@PathVariable final String subscrId) { + public ScrollPage prepareScrollNotificationsBySubscrId(@PathVariable final String subscrId) { final Optional optSub = subscriptionRepo.findById(subscrId); @@ -82,7 +85,7 @@ public class OpenairePublicController extends AbstractLbsController { final SearchScrollHits scroll = esTemplate.searchScrollStart(SCROLL_TIMEOUT_IN_MILLIS, searchQuery, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName())); if (scroll.hasSearchHits()) { - final List values = calculateNotificationMessages(scroll); + final List values = calculateNotificationMessages(scroll); return new ScrollPage<>(scroll.getScrollId(), values.isEmpty() || scroll.getScrollId() == null, values); } else { esTemplate.searchScrollClear(Arrays.asList(scroll.getScrollId())); @@ -97,7 +100,7 @@ public class OpenairePublicController extends AbstractLbsController { @ApiOperation("Returns notifications by opendorar Id (for example: 301) using scrolls (first page)") @GetMapping("/scroll/notifications/byOpenDoarId/{opendoarId}") - public ScrollPage prepareScrollNotificationsByOpendoarId(@PathVariable final String opendoarId) { + public ScrollPage prepareScrollNotificationsByOpendoarId(@PathVariable final String opendoarId) { final ElasticsearchRestTemplate esTemplate = (ElasticsearchRestTemplate) esOperations; @@ -112,7 +115,7 @@ public class OpenairePublicController extends AbstractLbsController { final SearchScrollHits scroll = esTemplate.searchScrollStart(SCROLL_TIMEOUT_IN_MILLIS, searchQuery, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName())); if (scroll.hasSearchHits()) { - final List values = calculateNotificationMessages(scroll); + final List values = calculateNotificationMessages(scroll); return new ScrollPage<>(scroll.getScrollId(), values.isEmpty() || scroll.getScrollId() == null, values); } else { esTemplate.searchScrollClear(Arrays.asList(scroll.getScrollId())); @@ -127,14 +130,14 @@ public class OpenairePublicController extends AbstractLbsController { @ApiOperation("Returns notifications using scrolls (other pages)") @GetMapping("/scroll/notifications/{scrollId}") - public ScrollPage scrollNotifications(@PathVariable final String scrollId) { + public ScrollPage scrollNotifications(@PathVariable final String scrollId) { final ElasticsearchRestTemplate esTemplate = (ElasticsearchRestTemplate) esOperations; final SearchScrollHits scroll = esTemplate.searchScrollContinue(scrollId, SCROLL_TIMEOUT_IN_MILLIS, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName())); if (scroll.hasSearchHits()) { - final List values = calculateNotificationMessages(scroll); + final List values = calculateNotificationMessages(scroll); return new ScrollPage<>(scroll.getScrollId(), values.isEmpty() || scroll.getScrollId() == null, values); } else { esTemplate.searchScrollClear(Arrays.asList(scroll.getScrollId())); @@ -156,12 +159,12 @@ public class OpenairePublicController extends AbstractLbsController { IOUtils.write("[\n", gzOut); - ScrollPage page = null; + ScrollPage page = null; do { page = page == null ? prepareScrollNotificationsBySubscrId(subscrId) : scrollNotifications(page.getId()); - for (final NotificationMessage msg : page.getValues()) { + for (final ShortEventMessage msg : page.getValues()) { if (first) { first = false; } else { @@ -179,15 +182,31 @@ public class OpenairePublicController extends AbstractLbsController { } - private List calculateNotificationMessages(final SearchScrollHits scroll) { + private List calculateNotificationMessages(final SearchScrollHits scroll) { if (scroll.getSearchHits().size() > 0) { return scroll.stream() .map(SearchHit::getContent) - .map(NotificationMessage::fromNotification) + .map(this::messageFromNotification) .collect(Collectors.toList()); } else { return new ArrayList<>(); } } + private ShortEventMessage messageFromNotification(final Notification n) { + final Gson gson = new Gson(); + + final OaBrokerEventPayload payload = gson.fromJson(n.getPayload(), OaBrokerEventPayload.class); + + final ShortEventMessage res = new ShortEventMessage(); + + res.setOriginalId(payload.getResult().getOriginalId()); + res.setTitle(payload.getResult().getTitles().stream().filter(StringUtils::isNotBlank).findFirst().orElse(null)); + res.setTopic(n.getTopic()); + res.setTrust(payload.getTrust()); + res.generateMessageFromObject(payload.getHighlight()); + + return res; + } + } diff --git a/apps/dhp-broker-public-application/src/test/java/eu/dnetlib/broker/oa/integration/ScrollTest.java b/apps/dhp-broker-public-application/src/test/java/eu/dnetlib/broker/oa/integration/ScrollTest.java index c0a7dd44..e8e60941 100644 --- a/apps/dhp-broker-public-application/src/test/java/eu/dnetlib/broker/oa/integration/ScrollTest.java +++ b/apps/dhp-broker-public-application/src/test/java/eu/dnetlib/broker/oa/integration/ScrollTest.java @@ -4,7 +4,7 @@ import org.junit.Ignore; import org.junit.Test; import org.springframework.web.client.RestTemplate; -import eu.dnetlib.broker.oa.controllers.NotificationMessage; +import eu.dnetlib.broker.api.ShortEventMessage; import eu.dnetlib.broker.oa.controllers.ScrollPage; public class ScrollTest { @@ -15,7 +15,7 @@ public class ScrollTest { private static final String subscriptionId = "sub-c9767c84-3597-462b-803b-2d3e09de44c4"; - public class TestScrollPage extends ScrollPage {} + public class TestScrollPage extends ScrollPage {} @Test @Ignore @@ -29,7 +29,7 @@ public class ScrollTest { while (!page.isCompleted()) { page = getPage(baseUrl + "/api/openaireBroker/scroll/notifications/ " + page.getId()); total += page.getValues().size(); - for (final NotificationMessage p : page.getValues()) { + for (final ShortEventMessage p : page.getValues()) { // DO SOMETHING } } diff --git a/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/NotificationMessage.java b/libs/dnet-openaire-broker-common/src/main/java/eu/dnetlib/broker/api/ShortEventMessage.java similarity index 62% rename from apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/NotificationMessage.java rename to libs/dnet-openaire-broker-common/src/main/java/eu/dnetlib/broker/api/ShortEventMessage.java index 8f9edfed..1cbde4f9 100644 --- a/apps/dhp-broker-public-application/src/main/java/eu/dnetlib/broker/oa/controllers/NotificationMessage.java +++ b/libs/dnet-openaire-broker-common/src/main/java/eu/dnetlib/broker/api/ShortEventMessage.java @@ -1,4 +1,4 @@ -package eu.dnetlib.broker.oa.controllers; +package eu.dnetlib.broker.api; import java.beans.Introspector; import java.beans.PropertyDescriptor; @@ -9,15 +9,8 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import com.google.gson.Gson; - -import eu.dnetlib.broker.common.elasticsearch.Notification; -import eu.dnetlib.broker.objects.OaBrokerEventPayload; - -public class NotificationMessage implements Serializable { +public class ShortEventMessage implements Serializable { /** * @@ -34,62 +27,6 @@ public class NotificationMessage implements Serializable { private Map message = new LinkedHashMap<>(); - private static final Log log = LogFactory.getLog(NotificationMessage.class); - - public static NotificationMessage fromNotification(final Notification n) { - final Gson gson = new Gson(); - - final OaBrokerEventPayload payload = gson.fromJson(n.getPayload(), OaBrokerEventPayload.class); - - final NotificationMessage res = new NotificationMessage(); - - res.setOriginalId(payload.getResult().getOriginalId()); - res.setTitle(payload.getResult().getTitles().stream().filter(StringUtils::isNotBlank).findFirst().orElse(null)); - res.setTopic(n.getTopic()); - res.setTrust(payload.getTrust()); - res.setMessage(highlightAsMap("", payload.getHighlight())); - - return res; - } - - private static Map highlightAsMap(final String prefix, final Object bean) { - - final Map res = new LinkedHashMap<>(); - - try { - for (final PropertyDescriptor pd : Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors()) { - if (pd.getReadMethod() != null) { - final Object v = pd.getReadMethod().invoke(bean); - if (v != null) { - if (v instanceof List && !((List) v).isEmpty()) { - final List list = (List) v; - for (int i = 0; i < list.size(); i++) { - final Object x = list.get(i); - if (x instanceof String && StringUtils.isNotBlank(x.toString())) { - res.put(prefix + pd.getName() + "[" + i + "]", x.toString()); - } else { - res.putAll(highlightAsMap(prefix + pd.getName() + "[" + i + "].", x)); - } - } - } else if (v instanceof String) { - res.put(prefix + pd.getName(), v.toString()); - } else { - res.putAll(highlightAsMap(pd.getName() + ".", v)); - } - } - } - - } - - return res; - - } catch (final Exception e) { - log.warn(e); - return Collections.emptyMap(); - } - - } - public String getOriginalId() { return originalId; } @@ -130,4 +67,45 @@ public class NotificationMessage implements Serializable { this.message = message; } + public void generateMessageFromObject(final Object bean) { + this.message = generateMessageFromObject("", bean); + } + + private static Map generateMessageFromObject(final String prefix, final Object bean) { + + final Map res = new LinkedHashMap<>(); + + try { + for (final PropertyDescriptor pd : Introspector.getBeanInfo(bean.getClass(), Object.class).getPropertyDescriptors()) { + if (pd.getReadMethod() != null) { + final Object v = pd.getReadMethod().invoke(bean); + if (v != null) { + if (v instanceof List && !((List) v).isEmpty()) { + final List list = (List) v; + for (int i = 0; i < list.size(); i++) { + final Object x = list.get(i); + if (x instanceof String && StringUtils.isNotBlank(x.toString())) { + res.put(prefix + pd.getName() + "[" + i + "]", x.toString()); + } else { + res.putAll(generateMessageFromObject(prefix + pd.getName() + "[" + i + "].", x)); + } + } + } else if (v instanceof String) { + res.put(prefix + pd.getName(), v.toString()); + } else { + res.putAll(generateMessageFromObject(pd.getName() + ".", v)); + } + } + } + + } + + return res; + + } catch (final Exception e) { + return Collections.emptyMap(); + } + + } + }