Skip to content

Commit

Permalink
Adding userID and userAgent to events
Browse files Browse the repository at this point in the history
  • Loading branch information
escowles committed Mar 31, 2015
1 parent c94958a commit 1227c61
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 36 deletions.
Expand Up @@ -27,6 +27,7 @@

import javax.jcr.Session;
import javax.jcr.observation.ObservationManager;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;

import java.net.URI;
Expand Down Expand Up @@ -74,13 +75,15 @@ public FedoraResource getResourceFromPath(final String externalPath) {
/**
* Set the baseURL for JMS events.
* @param uriInfo the uri info
* @param headers HTTP headers
**/
protected void setUpJMSBaseURIs(final UriInfo uriInfo) {
protected void setUpJMSBaseURIs(final UriInfo uriInfo, final HttpHeaders headers) {
try {
final URI baseURL = uriInfo.getBaseUri();
LOGGER.debug("setting baseURL = " + baseURL.toString());
final ObservationManager obs = session().getWorkspace().getObservationManager();
final String json = "{\"baseURL\":\"" + baseURL.toString() + "\"}";
final String json = "{\"baseURL\":\"" + baseURL.toString() + "\","
+ "\"userAgent\":\"" + headers.getHeaderString("user-agent") + "\"}";
obs.setUserData(json);
} catch ( Exception ex ) {
LOGGER.warn("Error setting baseURL", ex);
Expand Down
Expand Up @@ -132,7 +132,7 @@ public FedoraLdp(final String externalPath) {
*/
@PostConstruct
public void postConstruct() {
setUpJMSBaseURIs(uriInfo);
setUpJMSBaseURIs(uriInfo, headers);
}

/**
Expand Down
Expand Up @@ -96,7 +96,7 @@ public FedoraNodes(final String externalPath) {
*/
@PostConstruct
public void postConstruct() {
setUpJMSBaseURIs(uriInfo);
setUpJMSBaseURIs(uriInfo, headers);
}

/**
Expand Down
Expand Up @@ -65,9 +65,12 @@
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Workspace;
import javax.jcr.observation.ObservationManager;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.ClientErrorException;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
Expand Down Expand Up @@ -147,6 +150,9 @@ public class FedoraLdpTest {
@Mock
private FedoraHttpConfiguration mockHttpConfiguration;

@Mock
private HttpHeaders mockHeaders;

private static final Logger log = getLogger(FedoraLdpTest.class);


Expand All @@ -166,6 +172,7 @@ public void setUp() {
setField(testObj, "request", mockRequest);
setField(testObj, "servletResponse", mockResponse);
setField(testObj, "uriInfo", getUriInfoImpl());
setField(testObj, "headers", mockHeaders);
setField(testObj, "idTranslator", idTranslator);
setField(testObj, "nodeService", mockNodeService);
setField(testObj, "containerService", mockContainerService);
Expand All @@ -184,6 +191,8 @@ public void setUp() {
when(mockBinary.getEtagValue()).thenReturn("");
when(mockBinary.getPath()).thenReturn(binaryPath);
when(mockBinary.getDescription()).thenReturn(mockNonRdfSourceDescription);

when(mockHeaders.getHeaderString("user-agent")).thenReturn("Test UserAgent");
}

private FedoraResource setResource(final Class<? extends FedoraResource> klass) throws RepositoryException {
Expand Down Expand Up @@ -833,4 +842,16 @@ public void testGetSimpleContentType() {

assertEquals("text/plain", sanitizedMediaType.toString());
}
}

@Test
public void testSetUpJMSBaseURIs() throws RepositoryException {
final ObservationManager mockManager = mock(ObservationManager.class);
final Workspace mockWorkspace = mock(Workspace.class);
doReturn(mockWorkspace).when(mockSession).getWorkspace();
doReturn(mockManager).when(mockWorkspace).getObservationManager();
final String json = "{\"baseURL\":\"http://localhost/fcrepo\",\"userAgent\":\"Test UserAgent\"}";

testObj.setUpJMSBaseURIs(getUriInfoImpl(), mockHeaders);
verify(mockManager).setUserData(eq(json));
}
}
Expand Up @@ -17,6 +17,7 @@

import javax.inject.Inject;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;

import com.hp.hpl.jena.rdf.model.Resource;
Expand Down Expand Up @@ -56,6 +57,12 @@ public class AbstractResource {
@Context
protected UriInfo uriInfo;

/**
* For getting user agent
*/
@Context
protected HttpHeaders headers;

@Autowired
protected SessionFactory sessions;

Expand Down
Expand Up @@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.mockito.MockitoAnnotations.initMocks;

import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;

import org.fcrepo.kernel.identifiers.PidMinter;
Expand Down Expand Up @@ -46,6 +47,9 @@ public class AbstractResourceTest {
@Mock
private UriInfo mockUris;

@Mock
private HttpHeaders mockHeaders;

@Mock
private NamespaceRegistry mockNames;

Expand Down Expand Up @@ -73,4 +77,10 @@ public void testSetUriInfo() {
assertEquals(mockUris, testObj.uriInfo);
}

@Test
public void testSetHeaders() {
setField(testObj, "headers", mockHeaders);
assertEquals(mockHeaders, testObj.headers);
}

}
Expand Up @@ -42,6 +42,7 @@
* on information found in the {@link FedoraEvent} that triggers publication.
*
* @author ajs6f
* @author escowles
* @since Dec 2, 2013
*/
public class DefaultMessageFactory implements JMSEventMessageFactory {
Expand All @@ -63,52 +64,52 @@ public class DefaultMessageFactory implements JMSEventMessageFactory {
public static final String PROPERTIES_HEADER_NAME = JMS_NAMESPACE
+ "properties";

public static final String USER_HEADER_NAME = JMS_NAMESPACE + "user";
public static final String USER_AGENT_HEADER_NAME = JMS_NAMESPACE + "userAgent";

private String baseURL;
private String user;
private String userAgent;

@Override
public Message getMessage(final FedoraEvent jcrEvent,
final javax.jms.Session jmsSession) throws RepositoryException,
JMSException {

final Message message = jmsSession.createMessage();
message.setLongProperty(TIMESTAMP_HEADER_NAME, jcrEvent.getDate());
String path = jcrEvent.getPath();
if ( path.endsWith("/" + JCR_CONTENT) ) {
path = path.replaceAll("/" + JCR_CONTENT,"");
}

/**
* Set baseURL.
* @param event Fedora event object containing user data with baseURL specified.
*/
private void setBaseURL(final FedoraEvent event) {
// extract baseURL and userAgent from event UserData
try {
final String userdata = event.getUserData();
final String userdata = jcrEvent.getUserData();
if (!StringUtils.isBlank(userdata)) {
final JsonObject json = new JsonParser().parse(userdata).getAsJsonObject();
String url = json.get("baseURL").getAsString();
while (url.endsWith("/")) {
url = url.substring(0, url.length() - 1);
}
this.baseURL = url;
LOGGER.debug("MessageFactory baseURL: {}", baseURL);
this.userAgent = json.get("userAgent").getAsString();
LOGGER.debug("MessageFactory baseURL: {}, userAgent: {}", baseURL, userAgent);

} else {
LOGGER.warn("MessageFactory baseURL is empty!");
LOGGER.warn("MessageFactory event UserData is empty!");
}

} catch ( final Exception ex ) {
LOGGER.warn("Error setting baseURL", ex);
LOGGER.warn("Error setting baseURL or userAgent", ex);
}
}

@Override
public Message getMessage(final FedoraEvent jcrEvent,
final javax.jms.Session jmsSession) throws RepositoryException,
JMSException {

if ( baseURL == null ) {
setBaseURL(jcrEvent);
}

final Message message = jmsSession.createMessage();
message.setLongProperty(TIMESTAMP_HEADER_NAME, jcrEvent.getDate());
String path = jcrEvent.getPath();
if ( path.endsWith("/" + JCR_CONTENT) ) {
path = path.replaceAll("/" + JCR_CONTENT,"");
}
message.setStringProperty(IDENTIFIER_HEADER_NAME, path);
message.setStringProperty(EVENT_TYPE_HEADER_NAME, getEventURIs( jcrEvent
.getTypes()));
message.setStringProperty(BASE_URL_HEADER_NAME, baseURL);
message.setStringProperty(USER_HEADER_NAME, jcrEvent.getUserID());
message.setStringProperty(USER_AGENT_HEADER_NAME, userAgent);
message.setStringProperty(PROPERTIES_HEADER_NAME, Joiner.on(',').join(jcrEvent.getProperties()));

LOGGER.trace("getMessage() returning: {}", message);
Expand Down
Expand Up @@ -22,6 +22,8 @@
import static org.fcrepo.jms.headers.DefaultMessageFactory.IDENTIFIER_HEADER_NAME;
import static org.fcrepo.jms.headers.DefaultMessageFactory.PROPERTIES_HEADER_NAME;
import static org.fcrepo.jms.headers.DefaultMessageFactory.TIMESTAMP_HEADER_NAME;
import static org.fcrepo.jms.headers.DefaultMessageFactory.USER_AGENT_HEADER_NAME;
import static org.fcrepo.jms.headers.DefaultMessageFactory.USER_HEADER_NAME;
import static org.fcrepo.kernel.RdfLexicon.REPOSITORY_NAMESPACE;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
Expand Down Expand Up @@ -70,7 +72,8 @@ public void setUp() throws JMSException {
@Test
public void testBuildMessage() throws RepositoryException, JMSException {
final String testPath = "/path/to/resource";
final Message msg = doTestBuildMessage("base-url", testPath);
final String userAgent = "Test UserAgent (Like Mozilla)";
final Message msg = doTestBuildMessage("base-url", "Test UserAgent", testPath);
assertEquals("Got wrong identifier in message!", testPath, msg.getStringProperty(IDENTIFIER_HEADER_NAME));
}

Expand All @@ -83,25 +86,28 @@ public void testBuildMessageException() throws RepositoryException, JMSException
@Test
public void testBuildMessageNullUrl() throws RepositoryException, JMSException {
final String testPath = "/path/to/resource";
final Message msg = doTestBuildMessage(null, testPath);
final Message msg = doTestBuildMessage(null, null, testPath);
assertEquals("Got wrong identifier in message!", testPath, msg.getStringProperty(IDENTIFIER_HEADER_NAME));
}
@Test
public void testBuildMessageContent() throws RepositoryException, JMSException {
final String testPath = "/path/to/resource";
final Message msg = doTestBuildMessage("base-url/", testPath + "/" + JCR_CONTENT);
final Message msg = doTestBuildMessage("base-url/", "Test UserAgent", testPath + "/" + JCR_CONTENT);
assertEquals("Got wrong identifier in message!", testPath, msg.getStringProperty(IDENTIFIER_HEADER_NAME));
}

private Message doTestBuildMessage(final String baseUrl, final String id) throws RepositoryException, JMSException {
private Message doTestBuildMessage(final String baseUrl, final String userAgent, final String id)
throws RepositoryException, JMSException {
final Long testDate = 46647758568747L;
when(mockEvent.getDate()).thenReturn(testDate);

String url = null;
if (!StringUtils.isBlank(baseUrl)) {
url = "{\"baseURL\":\"" + baseUrl + "\"}";
if (!StringUtils.isBlank(baseUrl) || !StringUtils.isBlank(userAgent)) {
url = "{\"baseURL\":\"" + baseUrl + "\",\"userAgent\":\"" + userAgent + "\"}";
}
when(mockEvent.getUserData()).thenReturn(url);
final String testUser = "testUser";
when(mockEvent.getUserID()).thenReturn(testUser);
when(mockEvent.getPath()).thenReturn(id);
final Set<Integer> testTypes = singleton(NODE_ADDED);
final String testReturnType = REPOSITORY_NAMESPACE + EventType.valueOf(NODE_ADDED).toString();
Expand All @@ -120,6 +126,8 @@ private Message doTestBuildMessage(final String baseUrl, final String id) throws
assertEquals("Got wrong type in message!", testReturnType, msg.getStringProperty(EVENT_TYPE_HEADER_NAME));
assertEquals("Got wrong base-url in message", trimmedBaseUrl, msg.getStringProperty(BASE_URL_HEADER_NAME));
assertEquals("Got wrong property in message", prop, msg.getStringProperty(PROPERTIES_HEADER_NAME));
assertEquals("Got wrong userID in message", testUser, msg.getStringProperty(USER_HEADER_NAME));
assertEquals("Got wrong userAgent in message", userAgent, msg.getStringProperty(USER_AGENT_HEADER_NAME));
return msg;
}

Expand Down

0 comments on commit 1227c61

Please sign in to comment.