001/** 002 * Copyright 2015 DuraSpace, Inc. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.fcrepo.jms.headers; 017 018import static org.fcrepo.kernel.RdfLexicon.REPOSITORY_NAMESPACE; 019import static org.modeshape.jcr.api.JcrConstants.JCR_CONTENT; 020import static org.slf4j.LoggerFactory.getLogger; 021 022import java.io.IOException; 023import java.util.Set; 024 025import javax.jms.JMSException; 026import javax.jms.Message; 027 028import org.apache.commons.lang.StringUtils; 029import org.fcrepo.jms.observer.JMSEventMessageFactory; 030import org.fcrepo.kernel.observer.FedoraEvent; 031import org.fcrepo.kernel.utils.EventType; 032import org.slf4j.Logger; 033 034import com.fasterxml.jackson.databind.ObjectMapper; 035import com.fasterxml.jackson.databind.JsonNode; 036import com.google.common.base.Function; 037import com.google.common.base.Joiner; 038import com.google.common.collect.Iterables; 039 040/** 041 * Generates JMS {@link Message}s composed entirely of headers, based entirely 042 * on information found in the {@link FedoraEvent} that triggers publication. 043 * 044 * @author ajs6f 045 * @author escowles 046 * @since Dec 2, 2013 047 */ 048public class DefaultMessageFactory implements JMSEventMessageFactory { 049 050 public static final String JMS_NAMESPACE = "org.fcrepo.jms."; 051 052 public static final String TIMESTAMP_HEADER_NAME = JMS_NAMESPACE 053 + "timestamp"; 054 055 public static final String IDENTIFIER_HEADER_NAME = JMS_NAMESPACE 056 + "identifier"; 057 058 public static final String EVENT_TYPE_HEADER_NAME = JMS_NAMESPACE 059 + "eventType"; 060 061 public static final String BASE_URL_HEADER_NAME = JMS_NAMESPACE 062 + "baseURL"; 063 064 public static final String PROPERTIES_HEADER_NAME = JMS_NAMESPACE 065 + "properties"; 066 067 public static final String USER_HEADER_NAME = JMS_NAMESPACE + "user"; 068 public static final String USER_AGENT_HEADER_NAME = JMS_NAMESPACE + "userAgent"; 069 070 private String baseURL; 071 private String userAgent; 072 073 @Override 074 public Message getMessage(final FedoraEvent jcrEvent, 075 final javax.jms.Session jmsSession) throws JMSException { 076 077 final Message message = jmsSession.createMessage(); 078 message.setLongProperty(TIMESTAMP_HEADER_NAME, jcrEvent.getDate()); 079 String path = jcrEvent.getPath(); 080 if ( path.endsWith("/" + JCR_CONTENT) ) { 081 path = path.replaceAll("/" + JCR_CONTENT,""); 082 } 083 084 // extract baseURL and userAgent from event UserData 085 try { 086 final String userdata = jcrEvent.getUserData(); 087 if (!StringUtils.isBlank(userdata)) { 088 final ObjectMapper mapper = new ObjectMapper(); 089 final JsonNode json = mapper.readTree(userdata); 090 String url = json.get("baseURL").asText(); 091 while (url.endsWith("/")) { 092 url = url.substring(0, url.length() - 1); 093 } 094 this.baseURL = url; 095 this.userAgent = json.get("userAgent").asText(); 096 LOGGER.debug("MessageFactory baseURL: {}, userAgent: {}", baseURL, userAgent); 097 098 } else { 099 LOGGER.warn("MessageFactory event UserData is empty!"); 100 } 101 102 } catch ( final IOException ex ) { 103 LOGGER.warn("Error setting baseURL or userAgent", ex); 104 } 105 106 message.setStringProperty(IDENTIFIER_HEADER_NAME, path); 107 message.setStringProperty(EVENT_TYPE_HEADER_NAME, getEventURIs( jcrEvent 108 .getTypes())); 109 message.setStringProperty(BASE_URL_HEADER_NAME, baseURL); 110 message.setStringProperty(USER_HEADER_NAME, jcrEvent.getUserID()); 111 message.setStringProperty(USER_AGENT_HEADER_NAME, userAgent); 112 message.setStringProperty(PROPERTIES_HEADER_NAME, Joiner.on(',').join(jcrEvent.getProperties())); 113 114 LOGGER.trace("getMessage() returning: {}", message); 115 return message; 116 } 117 118 private static String getEventURIs(final Set<Integer> types) { 119 final String uris = Joiner.on(',').join(Iterables.transform(types, new Function<Integer, String>() { 120 121 @Override 122 public String apply(final Integer type) { 123 return REPOSITORY_NAMESPACE + EventType.valueOf(type); 124 } 125 })); 126 LOGGER.debug("Constructed event type URIs: {}", uris); 127 return uris; 128 } 129 130 private static final Logger LOGGER = getLogger(DefaultMessageFactory.class); 131 132}