001/* 002 * The contents of this file are subject to the license and copyright 003 * detailed in the LICENSE and NOTICE files at the root of the source 004 * tree. 005 */ 006package org.fcrepo.jms; 007 008import static java.lang.String.join; 009import static java.util.stream.Collectors.joining; 010import static org.slf4j.LoggerFactory.getLogger; 011 012import java.util.Set; 013import javax.jms.JMSException; 014import javax.jms.Message; 015import javax.jms.Session; 016 017import org.fcrepo.kernel.api.observer.Event; 018import org.fcrepo.kernel.api.observer.EventType; 019import org.fcrepo.event.serialization.EventSerializer; 020import org.fcrepo.event.serialization.JsonLDSerializer; 021 022import org.slf4j.Logger; 023 024/** 025 * Generates JMS {@link Message}s composed entirely of headers, based entirely 026 * on information found in the {@link Event} that triggers publication. 027 * 028 * @author ajs6f 029 * @author escowles 030 * @since Dec 2, 2013 031 */ 032public class DefaultMessageFactory implements JMSEventMessageFactory { 033 034 private static final String JMS_NAMESPACE = "org.fcrepo.jms."; 035 036 public static final String TIMESTAMP_HEADER_NAME = JMS_NAMESPACE 037 + "timestamp"; 038 039 public static final String IDENTIFIER_HEADER_NAME = JMS_NAMESPACE 040 + "identifier"; 041 042 public static final String EVENT_TYPE_HEADER_NAME = JMS_NAMESPACE 043 + "eventType"; 044 045 public static final String BASE_URL_HEADER_NAME = JMS_NAMESPACE 046 + "baseURL"; 047 048 public static final String RESOURCE_TYPE_HEADER_NAME = JMS_NAMESPACE + "resourceType"; 049 050 public static final String USER_HEADER_NAME = JMS_NAMESPACE + "user"; 051 public static final String USER_AGENT_HEADER_NAME = JMS_NAMESPACE + "userAgent"; 052 public static final String EVENT_ID_HEADER_NAME = JMS_NAMESPACE + "eventID"; 053 054 @Override 055 public Message getMessage(final Event event, final Session jmsSession) 056 throws JMSException { 057 058 final EventSerializer serializer = new JsonLDSerializer(); 059 final String body = serializer.serialize(event); 060 final Message message = jmsSession.createTextMessage(body); 061 062 message.setLongProperty(TIMESTAMP_HEADER_NAME, event.getDate().toEpochMilli()); 063 message.setStringProperty(BASE_URL_HEADER_NAME, event.getBaseUrl()); 064 065 if (event.getUserAgent() != null) { 066 message.setStringProperty(USER_AGENT_HEADER_NAME, event.getUserAgent()); 067 } 068 069 message.setStringProperty(IDENTIFIER_HEADER_NAME, event.getPath()); 070 message.setStringProperty(EVENT_TYPE_HEADER_NAME, getEventURIs(event.getTypes())); 071 message.setStringProperty(USER_HEADER_NAME, event.getUserID()); 072 message.setStringProperty(RESOURCE_TYPE_HEADER_NAME, join(",", event.getResourceTypes())); 073 message.setStringProperty(EVENT_ID_HEADER_NAME, event.getEventID()); 074 075 LOGGER.trace("getMessage() returning: {}", message); 076 return message; 077 } 078 079 private static String getEventURIs(final Set<EventType> types) { 080 final String uris = types.stream() 081 .map(EventType::getType) 082 .collect(joining(",")); 083 084 LOGGER.debug("Constructed event type URIs: {}", uris); 085 return uris; 086 } 087 088 private static final Logger LOGGER = getLogger(DefaultMessageFactory.class); 089 090}