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}