package io.cattle.platform.api.pubsub.manager; import io.cattle.platform.api.pubsub.model.Publish; import io.cattle.platform.api.pubsub.util.SubscriptionUtils; import io.cattle.platform.api.pubsub.util.SubscriptionUtils.SubscriptionStyle; import io.cattle.platform.api.utils.ApiUtils; import io.cattle.platform.eventing.EventService; import io.cattle.platform.eventing.model.Event; import io.cattle.platform.eventing.model.EventVO; import io.cattle.platform.framework.event.FrameworkEvents; import io.cattle.platform.object.ObjectManager; import io.github.ibuildthecloud.gdapi.context.ApiContext; import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException; import io.github.ibuildthecloud.gdapi.id.IdFormatter; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.impl.AbstractNoOpResourceManager; import io.github.ibuildthecloud.gdapi.util.ResponseCodes; import java.util.Date; import java.util.List; import java.util.regex.Pattern; import javax.inject.Inject; public class PublishManager extends AbstractNoOpResourceManager { final static Pattern SERVICE_PATTERN = Pattern.compile("^service\\.[a-z.]+$"); @Inject ObjectManager objectManager; EventService eventService; @Override public Class<?>[] getTypeClasses() { return new Class<?>[] { Publish.class }; } @Override protected Object createInternal(String type, ApiRequest request) { Publish publish = request.proxyRequestObject(Publish.class); Event event = createEvent(publish); if (isServiceEvent(event)) { eventService.publish(EventVO.newEvent(FrameworkEvents.SERVICE_EVENT) .withData(event) .withResourceId(Long.toString(ApiUtils.getPolicy().getAccountId()))); return publish; } if (SubscriptionUtils.getSubscriptionStyle(ApiUtils.getPolicy()) != SubscriptionStyle.RAW && !event.getName().startsWith(Event.REPLY_PREFIX)) { throw new ClientVisibleException(ResponseCodes.FORBIDDEN); } eventService.publish(event); return publish; } protected boolean isServiceEvent(Event event) { String eventName = event.getName(); if (eventName == null) { return false; } return SERVICE_PATTERN.matcher(eventName).matches(); } protected Event createEvent(Publish publish) { EventVO<Object> event = new EventVO<Object>(); if (publish.getId() != null) { event.setId(publish.getId()); } event.setId(publish.getId()); event.setName(publish.getName()); event.setResourceId(getResourceId(publish.getResourceId())); event.setResourceType(publish.getResourceType()); event.setData(publish.getData()); event.setPublisher(publish.getPublisher()); event.setTransitioning(publish.getTransitioning()); event.setTransitioningInternalMessage(publish.getTransitioningInternalMessage()); event.setTransitioningMessage(publish.getTransitioningMessage()); event.setTransitioningProgress(publish.getTransitioningProgress()); if (publish.getTime() != null) { event.setTime(new Date(publish.getTime())); } List<String> previous = publish.getPreviousIds(); if (previous != null) { event.setPreviousIds(previous.toArray(new String[previous.size()])); } return event; } protected String getResourceId(String resourceId) { IdFormatter formatter = ApiContext.getContext().getIdFormatter(); return formatter.parseId(resourceId); } public EventService getEventService() { return eventService; } @Inject public void setEventService(EventService eventService) { this.eventService = eventService; } }