/**
* 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.junit.Assert.assertEquals;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.google.common.collect.ImmutableSet;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.portlet.PortletMode;
import javax.portlet.WindowState;
import javax.servlet.http.HttpServletRequest;
import org.apereo.portal.mock.portlet.om.MockPortletWindowId;
import org.apereo.portal.rendering.AnalyticsIncorporationComponent;
import org.apereo.portal.security.SystemPerson;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class AnalyticsIncorporationComponentEventSerializationTest {
@InjectMocks private TestableAnalyticsIncorporationComponent analyticsIncorporationComponent;
// private ObjectMapper objectMapper;
@Before
public void setup() throws Exception {
analyticsIncorporationComponent.afterPropertiesSet();
// final ObjectMapperFactoryBean omfb = new ObjectMapperFactoryBean();
// omfb.afterPropertiesSet();
// objectMapper = omfb.getObject();
// analyticsIncorporationComponent.setMapper(objectMapper);
}
@Test
public void testEventFiltering() 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"),
"fname1",
123450000,
Collections.<String, List<String>>emptyMap(),
WindowState.NORMAL,
PortletMode.VIEW);
final Set<PortalEvent> portalEvents =
ImmutableSet.<PortalEvent>of(
new PortletRenderExecutionEvent(
portletExecutionEventBuilder, false, false));
final String result =
analyticsIncorporationComponent.serializePortletRenderExecutionEvents(portalEvents);
assertEquals("{\"pw1\":{\"fname\":\"fname1\",\"executionTimeNano\":123450000}}", result);
}
private static class TestableAnalyticsIncorporationComponent
extends AnalyticsIncorporationComponent {
protected String serializePortletRenderExecutionEvents(Set<PortalEvent> portalEvents) {
// TODO Auto-generated method stub
return super.serializePortletRenderExecutionEvents(portalEvents);
}
@Override
protected String serializePageData(HttpServletRequest request, long startTime) {
// TODO Auto-generated method stub
return super.serializePageData(request, startTime);
}
}
//Tests to demonstrate: https://github.com/FasterXML/jackson-databind/issues/245
@JsonFilter(PortletRenderExecutionEventFilterMixIn.FILTER_NAME)
private interface PortletRenderExecutionEventFilterMixIn {
static final String FILTER_NAME = "PortletRenderExecutionEventFilter";
}
private PortalEvent createEvent() {
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"),
"fname1",
123450000,
Collections.<String, List<String>>emptyMap(),
WindowState.NORMAL,
PortletMode.VIEW);
return new PortletRenderExecutionEvent(portletExecutionEventBuilder, false, false);
}
@Test
public void testMixinNoCopy() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
mapper.addMixInAnnotations(Object.class, PortletRenderExecutionEventFilterMixIn.class);
final FilterProvider filterProvider =
new SimpleFilterProvider()
.addFilter(
PortletRenderExecutionEventFilterMixIn.FILTER_NAME,
SimpleBeanPropertyFilter.filterOutAllExcept(
"fname", "executionTimeNano", "parameters"));
final ObjectWriter portletEventWriter = mapper.writer(filterProvider);
final String result = portletEventWriter.writeValueAsString(createEvent());
assertEquals(
"{\"@c\":\".PortletRenderExecutionEvent\",\"fname\":\"fname1\",\"executionTimeNano\":123450000,\"parameters\":{}}",
result);
}
/**
* Fails as actual output is:
* {"@c":".PortletRenderExecutionEvent","timestamp":1371671516798,"serverId":"example.com","eventSessionId":"1234567890123_system_AAAAAAAAAAA","userName":"system","fname":"fname1","executionTimeNano":123450000,"parameters":{},"targeted":false,"usedPortalCache":false}
*/
@Ignore
@Test
public void testMixinWithCopy() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
//Clone from "shared" ObjectMapper
mapper = mapper.copy();
mapper.addMixInAnnotations(Object.class, PortletRenderExecutionEventFilterMixIn.class);
final FilterProvider filterProvider =
new SimpleFilterProvider()
.addFilter(
PortletRenderExecutionEventFilterMixIn.FILTER_NAME,
SimpleBeanPropertyFilter.filterOutAllExcept(
"fname", "executionTimeNano", "parameters"));
final ObjectWriter portletEventWriter = mapper.writer(filterProvider);
final String result = portletEventWriter.writeValueAsString(createEvent());
assertEquals(
"{\"@c\":\".PortletRenderExecutionEvent\",\"fname\":\"fname1\",\"executionTimeNano\":123450000,\"parameters\":{}}",
result);
}
}