/**
* Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright ownership. Apereo
* licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
* this file except in compliance with the License. You may obtain a copy of the License at the
* following location:
*
* <p>http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apereo.portal.events;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import java.io.StringReader;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
import javax.xml.namespace.QName;
import org.apereo.portal.mock.portlet.om.MockPortletWindowId;
import org.apereo.portal.portlet.rendering.worker.IPortletExecutionWorker;
import org.apereo.portal.security.SystemPerson;
import org.apereo.portal.spring.beans.factory.ObjectMapperFactoryBean;
import org.apereo.portal.tenants.ITenant;
import org.apereo.portal.url.UrlState;
import org.apereo.portal.url.UrlType;
import org.junit.Before;
import org.junit.Test;
import org.skyscreamer.jsonassert.JSONAssert;
/**
*/
public class JacksonPortalEventTest {
private ObjectMapper mapper;
@Before
public void setup() throws Exception {
final ObjectMapperFactoryBean omfb = new ObjectMapperFactoryBean();
omfb.afterPropertiesSet();
mapper = omfb.getObject();
}
@Test
public void testPortalEventSerialization() throws Exception {
final String sessionId = "1234567890123_system_AAAAAAAAAAA";
final PortalEvent.PortalEventBuilder eventBuilder =
new PortalEvent.PortalEventBuilder(
this, "example.com", sessionId, SystemPerson.INSTANCE, null);
final Set<String> groups = ImmutableSet.of("Student", "Employee");
final Map<String, List<String>> attributes =
ImmutableMap.of(
"username",
(List<String>) ImmutableList.of("system"),
"roles",
(List<String>) ImmutableList.of("student", "employee"));
final LoginEvent loginEvent = new LoginEvent(eventBuilder, groups, attributes);
final String json =
assertEventJsonEquals(
"{\"@c\":\".LoginEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"groups\":[\"Student\",\"Employee\"],\"attributes\":{\"username\":[\"system\"],\"roles\":[\"student\",\"employee\"]}}",
loginEvent);
final PortalEvent event = mapper.readValue(new StringReader(json), PortalEvent.class);
assertEventJsonEquals(json, event);
}
@Test
public void verifyOutputFormat() throws Exception {
final String sessionId = "1234567890123_system_AAAAAAAAAAA";
final PortalEvent.PortalEventBuilder eventBuilder =
new PortalEvent.PortalEventBuilder(
this, "example.com", sessionId, SystemPerson.INSTANCE, null);
final PortletExecutionEvent.PortletExecutionEventBuilder portletExecutionEventBuilder =
new PortletExecutionEvent.PortletExecutionEventBuilder(
eventBuilder,
new MockPortletWindowId("pw1"),
"fname",
12345,
Collections.EMPTY_MAP,
WindowState.NORMAL,
PortletMode.VIEW);
PortalEvent event;
//TODO: Will uncomment once we add in attribute swapper event processing.
/*event = new AttributeSwapEvent(eventBuilder, Collections.EMPTY_MAP);
assertEventJsonEquals("{\"@c\":\".AttributeSwapEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"swappedAttributes\":{}}", event);
event = new AttributeSwapResetEvent(eventBuilder);
assertEventJsonEquals("{\"@c\":\".AttributeSwapResetEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\"}", event);
event = new IdentitySwapStartEvent(eventBuilder, "originalUserName", "originalEventSessionId");
assertEventJsonEquals("{\"@c\":\".IdentitySwapStartEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"originalUserName\":\"originalUserName\",\"originalEventSessionId\":\"originalEventSessionId\"}", event);
event = new IdentitySwapStopEvent(eventBuilder, "targetUserName");
assertEventJsonEquals("{\"@c\":\".IdentitySwapStopEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"targetUserName\":\"targetUserName\"}", event);
*/
event =
new FolderAddedToLayoutPortalEvent(
eventBuilder, SystemPerson.INSTANCE, 1, "newFolderId");
assertEventJsonEquals(
"{\"@c\":\".FolderAddedToLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"newFolderId\":\"newFolderId\"}",
event);
event =
new FolderDeletedFromLayoutPortalEvent(
eventBuilder,
SystemPerson.INSTANCE,
1,
"oldParentFolderId",
"deletedFolderId",
"deletedFolderName");
assertEventJsonEquals(
"{\"@c\":\".FolderDeletedFromLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"oldParentFolderId\":\"oldParentFolderId\",\"deletedFolderId\":\"deletedFolderId\",\"deletedFolderName\":\"deletedFolderName\"}",
event);
event =
new FolderMovedInLayoutPortalEvent(
eventBuilder,
SystemPerson.INSTANCE,
1,
"oldParentFolderId",
"movedFolderId");
assertEventJsonEquals(
"{\"@c\":\".FolderMovedInLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"oldParentFolderId\":\"oldParentFolderId\",\"movedFolderId\":\"movedFolderId\"}",
event);
event =
new PortletAddedToLayoutPortalEvent(
eventBuilder, SystemPerson.INSTANCE, 1, "parentFolderId", "fname");
assertEventJsonEquals(
"{\"@c\":\".PortletAddedToLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"fname\":\"fname\",\"parentFolderId\":\"parentFolderId\"}",
event);
event =
new PortletDeletedFromLayoutPortalEvent(
eventBuilder, SystemPerson.INSTANCE, 1, "oldParentFolderId", "fname");
assertEventJsonEquals(
"{\"@c\":\".PortletDeletedFromLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"fname\":\"fname\",\"oldParentFolderId\":\"oldParentFolderId\"}",
event);
event =
new PortletMovedInLayoutPortalEvent(
eventBuilder,
SystemPerson.INSTANCE,
1,
"oldParentFolderId",
"newParentFolderId",
"fname");
assertEventJsonEquals(
"{\"@c\":\".PortletMovedInLayoutPortalEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"layoutId\":1,\"layoutOwner\":\"system\",\"fname\":\"fname\",\"oldParentFolderId\":\"oldParentFolderId\",\"newParentFolderId\":\"newParentFolderId\"}",
event);
event = new LoginEvent(eventBuilder, Collections.EMPTY_SET, Collections.EMPTY_MAP);
assertEventJsonEquals(
"{\"@c\":\".LoginEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"groups\":[],\"attributes\":{}}",
event);
event = new LogoutEvent(eventBuilder);
assertEventJsonEquals(
"{\"@c\":\".LogoutEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\"}",
event);
event =
new PortalRenderEvent(
eventBuilder,
"requestPathInfo",
12345,
UrlState.NORMAL,
UrlType.RENDER,
Collections.EMPTY_MAP,
"targetedLayoutNodeId");
assertEventJsonEquals(
"{\"@c\":\".PortalRenderEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"requestPathInfo\":\"requestPathInfo\",\"urlState\":\"NORMAL\",\"urlType\":\"RENDER\",\"parameters\":{},\"targetedLayoutNodeId\":\"targetedLayoutNodeId\",\"executionTimeNano\":12345}",
event);
event = new PortletActionExecutionEvent(portletExecutionEventBuilder);
assertEventJsonEquals(
"{\"@c\":\".PortletActionExecutionEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\",\"windowState\":\"normal\",\"portletMode\":\"view\",\"executionTimeNano\":12345,\"parameters\":{}}",
event);
event =
new PortletEventExecutionEvent(
portletExecutionEventBuilder,
new QName("http://example.com/uri", "EventName"));
assertEventJsonEquals(
"{\"@c\":\".PortletEventExecutionEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\",\"windowState\":\"normal\",\"portletMode\":\"view\",\"executionTimeNano\":12345,\"parameters\":{},\"eventName\":\"{http://example.com/uri}EventName\"}",
event);
event = new PortletRenderExecutionEvent(portletExecutionEventBuilder, true, false);
assertEventJsonEquals(
"{\"@c\":\".PortletRenderExecutionEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\",\"windowState\":\"normal\",\"portletMode\":\"view\",\"executionTimeNano\":12345,\"parameters\":{},\"targeted\":true,\"usedPortalCache\":false}",
event);
event = new PortletRenderHeaderExecutionEvent(portletExecutionEventBuilder, true, false);
assertEventJsonEquals(
"{\"@c\":\".PortletRenderHeaderExecutionEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\",\"windowState\":\"normal\",\"portletMode\":\"view\",\"executionTimeNano\":12345,\"parameters\":{},\"targeted\":true,\"cached\":false}",
event);
event =
new PortletResourceExecutionEvent(
portletExecutionEventBuilder, "resourceId", false, false);
assertEventJsonEquals(
"{\"@c\":\".PortletResourceExecutionEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\",\"windowState\":\"normal\",\"portletMode\":\"view\",\"executionTimeNano\":12345,\"parameters\":{},\"resourceId\":\"resourceId\",\"usedBrowserCache\":false,\"usedPortalCache\":false}",
event);
final IPortletExecutionWorker hungWorker = mock(IPortletExecutionWorker.class);
when(hungWorker.getPortletFname()).thenReturn("fname");
event = new PortletHungCompleteEvent(eventBuilder, hungWorker);
assertEventJsonEquals(
"{\"@c\":\".PortletHungCompleteEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\"}",
event);
event = new PortletHungEvent(eventBuilder, hungWorker);
assertEventJsonEquals(
"{\"@c\":\".PortletHungEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\",\"fname\":\"fname\"}",
event);
final ITenant tenant =
new ITenant() {
private static final long serialVersionUID = 1L;
@Override
public int compareTo(ITenant o) {
return 0;
}
@Override
public long getId() {
return 1L;
}
@Override
public String getName() {
return "Mordor";
}
@Override
public void setName(String name) {}
@Override
public String getFname() {
return "mordor";
}
@Override
public void setFname(String fname) {}
@Override
public String getAttribute(String name) {
return null;
}
@Override
public void setAttribute(String name, String value) {}
@Override
public Map<String, String> getAttributesMap() {
return Collections.emptyMap();
}
};
event = new TenantCreatedTenantEvent(eventBuilder, tenant);
assertEventJsonEquals(
"{\"@c\":\".TenantCreatedTenantEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\"}",
event);
event = new TenantUpdatedTenantEvent(eventBuilder, tenant);
assertEventJsonEquals(
"{\"@c\":\".TenantUpdatedTenantEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\"}",
event);
event = new TenantRemovedTenantEvent(eventBuilder, tenant);
assertEventJsonEquals(
"{\"@c\":\".TenantRemovedTenantEvent\",\"timestamp\":1371745598080,\"serverId\":\"example.com\",\"eventSessionId\":\"1234567890123_system_AAAAAAAAAAA\",\"userName\":\"system\"}",
event);
}
private static final Pattern TIMESTAMP_SPLIT = Pattern.compile("(?<=\"timestamp\":)\\d+");
private static final String TEST_NOW = "1371745598080";
protected String assertEventJsonEquals(String expected, PortalEvent event) throws Exception {
String actual = mapper.writeValueAsString(event);
actual = TIMESTAMP_SPLIT.matcher(actual).replaceAll(TEST_NOW);
expected = TIMESTAMP_SPLIT.matcher(expected).replaceAll(TEST_NOW);
JSONAssert.assertEquals(expected, actual, false);
return actual;
}
}