Skip to content
This repository has been archived by the owner on Aug 20, 2021. It is now read-only.

Commit

Permalink
feat(repository): Preserve a single method to search for events.
Browse files Browse the repository at this point in the history
  • Loading branch information
brasseld committed Sep 2, 2016
1 parent ce08439 commit 067da55
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 97 deletions.
Expand Up @@ -18,14 +18,13 @@
import io.gravitee.common.data.domain.Page;
import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.EventRepository;
import io.gravitee.repository.management.api.search.EventCriteria;
import io.gravitee.repository.management.api.search.Pageable;
import io.gravitee.repository.management.model.Event;
import io.gravitee.repository.management.model.EventType;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

/**
* @author David BRASSELY (david at gravitee.io)
Expand All @@ -34,16 +33,6 @@
@Component
public class EventRepositoryProxy extends AbstractProxy<EventRepository> implements EventRepository {

@Override
public Set<Event> findByProperty(String s, String s1) {
return target.findByProperty(s, s1);
}

@Override
public Set<Event> findByType(List<EventType> list) {
return target.findByType(list);
}

@Override
public Event create(Event event) throws TechnicalException {
return target.create(event);
Expand All @@ -65,7 +54,12 @@ public Event update(Event event) throws TechnicalException {
}

@Override
public Page<Event> search(Map<String, Object> map, long l, long l1, int i, int i1) {
return target.search(map, l, l1, i, i1);
public Page<Event> search(EventCriteria filter, Pageable pageable) {
return target.search(filter, pageable);
}

@Override
public List<Event> search(EventCriteria filter) {
return target.search(filter);
}
}
Expand Up @@ -43,21 +43,21 @@ public class PlatformEventsResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Page<EventEntity> list(@BeanParam EventSearchParam eventSearchParam) {

eventSearchParam.validate();

Map<String, Object> values = new HashMap<>();
values.put(EVENT_TYPE, eventSearchParam.getEventTypeListParam().getEventTypes());
Map<String, Object> properties = new HashMap<>();
if (eventSearchParam.getApiIdsParam() != null &&
eventSearchParam.getApiIdsParam().getIds() != null &&
!eventSearchParam.getApiIdsParam().getIds().isEmpty()) {
values.put(EVENT_API_PROPERTY, eventSearchParam.getApiIdsParam().getIds());
properties.put(EVENT_API_PROPERTY, eventSearchParam.getApiIdsParam().getIds());
}

return eventService.search(values,
eventSearchParam.getFrom(),
eventSearchParam.getTo(),
eventSearchParam.getPage(),
eventSearchParam.getSize());
return eventService.search(
eventSearchParam.getEventTypeListParam().getEventTypes(),
properties,
eventSearchParam.getFrom(),
eventSearchParam.getTo(),
eventSearchParam.getPage(),
eventSearchParam.getSize());
}
}
Expand Up @@ -45,5 +45,6 @@ public interface EventService {

Set<EventEntity> findByOrigin(String origin);

Page<EventEntity> search(Map<String, Object> values, long from, long to, int page, int size);
Page<EventEntity> search(
List<EventType> eventTypes, Map<String, Object> properties, long from, long to, int page, int size);
}
Expand Up @@ -475,26 +475,29 @@ public boolean isAPISynchronized(String apiId) {
try {
ApiEntity api = findById(apiId);

Set<EventEntity> events = eventService.findByType(Arrays.asList(EventType.PUBLISH_API, EventType.UNPUBLISH_API));
List<EventEntity> eventsSorted = events.stream().sorted((e1, e2) -> e1.getCreatedAt().compareTo(e2.getCreatedAt())).collect(Collectors.toList());
Collections.reverse(eventsSorted);
Map<String, Object> properties = new HashMap<>();
properties.put(Event.EventProperties.API_ID.getValue(), apiId);

for (EventEntity event : eventsSorted) {
JsonNode node = objectMapper.readTree(event.getPayload());
io.gravitee.common.data.domain.Page<EventEntity> events =
eventService.search(Arrays.asList(EventType.PUBLISH_API, EventType.UNPUBLISH_API),
properties, 0, 0, 0, 1);

if (! events.getContent().isEmpty()) {
// According to page size, we know that we have only one element in the list
EventEntity lastEvent = events.getContent().get(0);
JsonNode node = objectMapper.readTree(lastEvent.getPayload());
Api payloadEntity = objectMapper.convertValue(node, Api.class);
if (api.getId().equals(payloadEntity.getId())) {
if (api.getUpdatedAt().compareTo(payloadEntity.getUpdatedAt()) <= 0) {
return true;
} else {
// API is synchronized if API required deployment fields are the same as the event payload
return apiSynchronizationProcessor.processCheckSynchronization(convert(payloadEntity), api);
}
if (api.getUpdatedAt().compareTo(payloadEntity.getUpdatedAt()) <= 0) {
return true;
} else {
// API is synchronized if API required deployment fields are the same as the event payload
return apiSynchronizationProcessor.processCheckSynchronization(convert(payloadEntity), api);
}
}
} catch (Exception e) {
LOGGER.error("An error occurs while trying to check API synchronization state {}", apiId, e);
return false;
}

return false;
}

Expand Down
Expand Up @@ -24,6 +24,8 @@
import io.gravitee.management.service.exceptions.TechnicalManagementException;
import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.EventRepository;
import io.gravitee.repository.management.api.search.EventCriteria;
import io.gravitee.repository.management.api.search.builder.PageableBuilder;
import io.gravitee.repository.management.model.Event;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -72,6 +74,8 @@ public EventEntity create(NewEventEntity newEventEntity) {
LOGGER.debug("Create {} for server {}", newEventEntity, hostAddress);

Event event = convert(newEventEntity);
event.setId(io.gravitee.common.utils.UUID.random().toString());

// Set origin
event.getProperties().put(Event.EventProperties.ORIGIN.getValue(), hostAddress);
// Set date fields
Expand Down Expand Up @@ -112,55 +116,59 @@ public void delete(String eventId) {

@Override
public Set<EventEntity> findByType(List<EventType> eventTypes) {
Set<Event> events = eventRepository.findByType(convert(eventTypes));
io.gravitee.repository.management.model.EventType[] eventTypesArr = eventTypes.stream()
.map(eventType -> io.gravitee.repository.management.model.EventType.valueOf(eventType.toString()))
.toArray(io.gravitee.repository.management.model.EventType[]::new);

return convert(events);
return convert(eventRepository.search(new EventCriteria.Builder().types(eventTypesArr).build()));
}

@Override
public Set<EventEntity> findByApi(String apiId) {
Set<Event> events = eventRepository.findByProperty(Event.EventProperties.API_ID.getValue(), apiId);

return convert(events);
return findByProperty(Event.EventProperties.API_ID.getValue(), apiId);
}

@Override
public Set<EventEntity> findByUser(String username) {
Set<Event> events = eventRepository.findByProperty(Event.EventProperties.USERNAME.getValue(), username);

return convert(events);
return findByProperty(Event.EventProperties.USERNAME.getValue(), username);
}

@Override
public Set<EventEntity> findByOrigin(String origin) {
Set<Event> events = eventRepository.findByProperty(Event.EventProperties.ORIGIN.getValue(), origin);
return findByProperty(Event.EventProperties.ORIGIN.getValue(), origin);
}

return convert(events);
private Set<EventEntity> findByProperty(String property, String value) {
return convert(eventRepository.search(new EventCriteria.Builder().property(property, value).build()));
}

@Override
public Page<EventEntity> search(Map<String, Object> values, long from, long to, int page, int size) {
Page<Event> pageEvent = eventRepository.search(values, from, to, page, size);
public Page<EventEntity> search(List<EventType> eventTypes,
Map<String, Object> properties, long from, long to, int page, int size) {
EventCriteria.Builder builder = new EventCriteria.Builder().from(from).to(to);

List<EventEntity> content = pageEvent.getContent().stream().map(this::convert).collect(Collectors.toList());
Page<EventEntity> pageEventEntity = new Page<>(content, page, size, pageEvent.getTotalElements());
if (eventTypes != null) {
io.gravitee.repository.management.model.EventType[] eventTypesArr = eventTypes.stream()
.map(eventType -> io.gravitee.repository.management.model.EventType.valueOf(eventType.toString()))
.toArray(io.gravitee.repository.management.model.EventType[]::new);

return pageEventEntity;
}
builder.types(eventTypesArr);
}

private List<io.gravitee.repository.management.model.EventType> convert(List<EventType> eventTypes) {
List<io.gravitee.repository.management.model.EventType> convertedEvents = new ArrayList<io.gravitee.repository.management.model.EventType>();
for (EventType eventType : eventTypes) {
convertedEvents.add(convert(eventType));
if (properties != null) {
properties.forEach(builder::property);
}
return convertedEvents;
}

private io.gravitee.repository.management.model.EventType convert(EventType eventType) {
return io.gravitee.repository.management.model.EventType.valueOf(eventType.toString());
Page<Event> pageEvent = eventRepository.search(
builder.build(),
new PageableBuilder().pageNumber(page).pageSize(size).build());

List<EventEntity> content = pageEvent.getContent().stream().map(this::convert).collect(Collectors.toList());

return new Page<>(content, page, size, pageEvent.getTotalElements());
}

private Set<EventEntity> convert(Set<Event> events) {
private Set<EventEntity> convert(List<Event> events) {
return events.stream().map(this::convert).collect(Collectors.toSet());
}

Expand Down

0 comments on commit 067da55

Please sign in to comment.