/*
* (C) Copyright 2010 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*
* Contributors:
* Anahide Tchertchian
*/
package org.nuxeo.ecm.platform.query.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentModelFactory;
import org.nuxeo.ecm.core.test.CoreFeature;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.ecm.platform.query.api.AbstractPageProvider;
import org.nuxeo.ecm.platform.query.api.PageProvider;
import org.nuxeo.ecm.platform.query.api.PageProviderDefinition;
import org.nuxeo.ecm.platform.query.api.PageProviderService;
import org.nuxeo.ecm.platform.query.nxql.CoreQueryDocumentPageProvider;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
import org.nuxeo.runtime.test.runner.RuntimeHarness;
/**
* @since 7.4
*/
@RunWith(FeaturesRunner.class)
@Features(CoreFeature.class)
@RepositoryConfig(cleanup = Granularity.METHOD)
@Deploy({ "org.nuxeo.ecm.platform.query.api", "org.nuxeo.ecm.core.io" })
@LocalDeploy("org.nuxeo.ecm.platform.query.api.test:test-pageprovider-track-contrib.xml")
public class TestPageProviderTracking {
@Inject
protected RuntimeHarness harness;
@Inject
protected CoreSession coreSession;
@Inject
protected PageProviderService pps;
@Test
public void testTrackingFlag() throws Exception {
PageProviderDefinition def = pps.getPageProviderDefinition("CURRENT_DOCUMENT_CHILDREN");
assertFalse(def.isUsageTrackingEnabled());
def = pps.getPageProviderDefinition("CURRENT_DOCUMENT_CHILDREN_TRACK");
assertTrue(def.isUsageTrackingEnabled());
def = pps.getPageProviderDefinition("CURRENT_DOCUMENT_CHILDREN_FETCH");
assertTrue(def.isUsageTrackingEnabled());
}
@Test
public void testTrackingProperty() throws Exception {
Framework.getProperties().setProperty(AbstractPageProvider.PAGEPROVIDER_TRACK_PROPERTY_NAME, "CURRENT_DOCUMENT_CHILDREN2");
PageProviderDefinition def = pps.getPageProviderDefinition("CURRENT_DOCUMENT_CHILDREN2");
assertFalse(def.isUsageTrackingEnabled());
Map<String, Serializable> props = new HashMap<String, Serializable>();
props.put(CoreQueryDocumentPageProvider.CORE_SESSION_PROPERTY, (Serializable) coreSession);
PageProvider<?> pp = pps.getPageProvider("CURRENT_DOCUMENT_CHILDREN2", null, 10L, 0L, props,
coreSession.getRootDocument().getId());
assertNotNull(pp);
SearchEventsAccumulator.reset();
pp.getCurrentPage();
List<Map<String, Serializable>> events = SearchEventsAccumulator.getStackedEvents();
assertEquals(1, events.size());
}
@Test
public void testTrackingListener() throws Exception {
Map<String, Serializable> props = new HashMap<String, Serializable>();
props.put(CoreQueryDocumentPageProvider.CORE_SESSION_PROPERTY, (Serializable) coreSession);
PageProvider<?> pp = pps.getPageProvider("CURRENT_DOCUMENT_CHILDREN_TRACK", null, 10L, 0L, props,
coreSession.getRootDocument().getId());
assertNotNull(pp);
SearchEventsAccumulator.reset();
pp.getCurrentPage();
List<Map<String, Serializable>> events = SearchEventsAccumulator.getStackedEvents();
assertEquals(1, events.size());
pp = pps.getPageProvider("CURRENT_DOCUMENT_CHILDREN", null, 10L, 0L, props,
coreSession.getRootDocument().getId());
assertNotNull(pp);
SearchEventsAccumulator.reset();
pp.getCurrentPage();
events = SearchEventsAccumulator.getStackedEvents();
assertEquals(0, events.size());
}
protected DocumentModel getSearchDoc() {
DocumentModel doc = DocumentModelFactory.createDocumentModel("AdvancedSearch");
doc.setPropertyValue("search:title", "Title");
doc.setPropertyValue("search:subjects", new String[] { "S1", "S2" });
doc.setPropertyValue("search:fulltext_all", "whatever");
return doc;
}
@Test
public void testTrackingData() throws Exception {
Map<String, Serializable> props = new HashMap<String, Serializable>();
props.put(CoreQueryDocumentPageProvider.CORE_SESSION_PROPERTY, (Serializable) coreSession);
PageProvider<?> pp = pps.getPageProvider("CURRENT_DOCUMENT_CHILDREN_TRACK", null, 10L, 0L, props,
coreSession.getRootDocument().getId());
assertNotNull(pp);
SearchEventsAccumulator.reset();
pp.getCurrentPage();
List<Map<String, Serializable>> events = SearchEventsAccumulator.getStackedEvents();
assertEquals(1, events.size());
assertNotNull(events.get(0).get("effectiveQuery"));
assertEquals("Administrator", events.get(0).get("principal"));
assertNotNull(events.get(0).get("searchPattern"));
pp = pps.getPageProvider("ADVANCED_SEARCH", null, 10L, 0L, props, coreSession.getRootDocument().getId());
assertNotNull(pp);
pp.setSearchDocumentModel(getSearchDoc());
SearchEventsAccumulator.reset();
pp.getCurrentPage();
events = SearchEventsAccumulator.getStackedEvents();
assertEquals(1, events.size());
assertNotNull(events.get(0).get("effectiveQuery"));
assertNotNull(events.get(0).get("searchDocumentModelAsJson"));
assertNotNull(events.get(0).get("whereClause_fixedPart"));
assertNotNull(events.get(0).get("queryParams"));
}
}