/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.monitor.hib; import static org.junit.Assert.*; import static org.geoserver.monitor.MonitorTestData.assertCovered; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.apache.commons.io.IOUtils; import org.geoserver.hibernate.HibUtil; import org.geoserver.monitor.Filter; import org.geoserver.monitor.MonitorConfig.Mode; import org.geoserver.monitor.MonitorDAOTestSupport; import org.geoserver.monitor.Query; import org.geoserver.monitor.Query.Comparison; import org.geoserver.monitor.Query.SortOrder; import org.geoserver.monitor.RequestData; import org.geoserver.monitor.RequestDataVisitor; import org.geoserver.monitor.hib.HibernateMonitorDAO2.Sync; import org.h2.tools.DeleteDbFiles; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.web.context.support.XmlWebApplicationContext; public class HibernateMonitorDAO2Test extends MonitorDAOTestSupport { private static XmlWebApplicationContext ctx; @BeforeClass public static void initHibernate() throws Exception { // setup in memory h2 db Properties p = new Properties(); p.put("driver", "org.h2.Driver"); p.put("url", "jdbc:h2:mem:monitoring"); File file = new File("./target/monitoring/db.properties"); FileOutputStream fos = null; try { if(!file.getParentFile().exists()) { assertTrue(file.getParentFile().mkdirs()); } fos = new FileOutputStream(file); p.store(fos, null); } finally { IOUtils.closeQuietly(fos); } ctx = new XmlWebApplicationContext() { public String[] getConfigLocations() { return new String[]{ "classpath*:applicationContext-hibtest.xml", "classpath*:applicationContext-hib2.xml"}; } }; ctx.refresh(); HibernateMonitorDAO2 hibdao = (HibernateMonitorDAO2) ctx.getBean("hibMonitorDAO"); hibdao.setSync(Sync.SYNC); hibdao.setMode(Mode.HYBRID); dao = hibdao; setUpData(); } @AfterClass public static void destroy() throws Exception { dao.dispose(); ctx.close(); DeleteDbFiles.execute("target/monitoring", "monitoring", false); } @Before public void setUpSession() throws Exception { HibUtil.setUpSession(((HibernateMonitorDAO2)dao).getSessionFactory()); } @After public void tearDownSession() throws Exception { HibUtil.tearDownSession(((HibernateMonitorDAO2)dao).getSessionFactory(), null); } @Test public void testGetRequestsFilterIN3() throws Exception { List<RequestData> datas = dao.getRequests( new Query().filter( "widgets", "resources", Comparison.IN )); assertCovered(datas, 11, 14, 18); } @Test public void testGetRequestsAggregate() throws Exception { final List<RequestData> datas = new ArrayList(); final List<Object> aggs = new ArrayList(); RequestDataVisitor v = new RequestDataVisitor() { public void visit(RequestData data, Object... aggregates) { datas.add(data); aggs.addAll(Arrays.asList(aggregates)); } }; dao.getRequests(new Query().properties("path").filter("path","/foo", Comparison.EQ). aggregate("count()").group("path"), v); assertEquals(1, datas.size()); assertEquals("/foo", datas.get(0).getPath()); assertEquals(4, ((Number)aggs.get(0)).intValue()); datas.clear(); aggs.clear(); dao.getRequests(new Query().properties("service", "operation") .filter("service", null, Comparison.NEQ).aggregate("count()") .group("service", "operation").sort("count()", SortOrder.DESC), v); RequestData r = datas.get(0); assertEquals("foo", r.getService()); assertEquals("x", r.getOperation()); assertEquals(4, ((Number)aggs.get(0)).intValue()); r = datas.get(1); assertEquals("bam", r.getService()); assertEquals("y", r.getOperation()); assertEquals(2, ((Number)aggs.get(1)).intValue()); } @Test public void testGetRequestsCount() throws Exception { final List<Object> aggs = new ArrayList(); RequestDataVisitor v = new RequestDataVisitor() { public void visit(RequestData data, Object... aggregates) { aggs.addAll(Arrays.asList(aggregates)); } }; dao.getRequests(new Query().aggregate("count()").filter("path","/foo", Comparison.EQ), v); assertEquals(1, aggs.size()); assertEquals(4, ((Number)aggs.get(0)).intValue()); } @Test public void testGetRequestsFilterAnd() throws Exception { assertEquals(1, dao.getRequests(new Query().filter("path", "/foo", Comparison.EQ) .filter("widgets", "resources", Comparison.IN)).size()); } @Test public void testGetRequestsFilterOr() throws Exception { assertEquals(4, dao.getRequests(new Query().filter("path", "/seven", Comparison.EQ) .or("widgets", "resources", Comparison.IN)).size()); } @Test public void testGetRequestsJoin() throws Exception { List<RequestData> datas = dao.getRequests(new Query().properties("path", "resource") .filter("path","/foo", Comparison.EQ). group("path", "resource") .sort("resource", SortOrder.ASC)); assertEquals(3, datas.size()); assertEquals("stuff", datas.get(0).getResources().get(0)); assertEquals("things", datas.get(1).getResources().get(0)); assertEquals("widgets", datas.get(2).getResources().get(0)); } @Test public void testGetRequestsJoinVisitor() throws Exception { final List<RequestData> datas = new ArrayList(); final List<Object> aggs = new ArrayList(); RequestDataVisitor v = new RequestDataVisitor() { public void visit(RequestData data, Object... aggregates) { datas.add(data); //aggs.addAll(Arrays.asList(aggregates)); } }; dao.getRequests(new Query().properties("path", "resource").filter("path","/foo", Comparison.EQ). group("path", "resource").sort("resource", SortOrder.ASC), v); assertEquals(3, datas.size()); assertEquals(1, datas.get(0).getResources().size()); assertEquals("stuff", datas.get(0).getResources().get(0)); assertEquals(1, datas.get(1).getResources().size()); assertEquals("things", datas.get(1).getResources().get(0)); assertEquals(1, datas.get(2).getResources().size()); assertEquals("widgets", datas.get(2).getResources().get(0)); } @Test public void testGetRequestsJoin2() throws Exception { final List<RequestData> datas = new ArrayList(); final List<Object> aggs = new ArrayList(); dao.getRequests(new Query().properties("resource").aggregate("count()") .filter("resource", null, Comparison.NEQ).group("resource"), new RequestDataVisitor() { public void visit(RequestData data, Object... aggregates) { datas.add(data); aggs.add(aggregates[0]); } }); //assertEquals(3, datas.size()); for (RequestData data : datas) { System.out.println(data.getResources()); } } @Test public void testGetRequestsJoinIN() throws Exception { List<String> resources = Arrays.asList("widgets", "things"); List<RequestData> datas = dao.getRequests(new Query().properties("resource") .aggregate("count()").filter("resource", resources, Comparison.IN) .group("resource").sort("resource", SortOrder.ASC)); assertEquals(2, datas.size()); assertEquals("things", datas.get(0).getResources().get(0)); assertEquals("widgets", datas.get(1).getResources().get(0)); } @Test public void testGetRequestsAdvancedFilter() throws Exception { Filter filter = new Filter("path", "/four", Comparison.EQ) .or(new Filter("service", "foo", Comparison.EQ).and( new Filter("resource", Arrays.asList("widgets"), Comparison.IN))); List<RequestData> datas = dao.getRequests(new Query().filter(filter)); assertEquals(2, datas.size()); assertCovered(datas, 4, 11); } // @Test // public void testFoo() throws Exception { // SessionFactory sessionFactory = ((HibernateMonitorDAO2)dao).getSessionFactory(); // Session session = sessionFactory.getCurrentSession(); // // /*Query q = session.createQuery("SELECT rd.path FROM RequestData rd, LayerData ld " + // "WHERE ld in elements(rd.layers) " + // "AND ld.name = 'things'");*/ // /*Query q = session.createQuery("SELECT rd.path FROM RequestData rd " + // "INNER JOIN rd.layers as layer WITH layer.name = 'things'");*/ // Query q = session.createQuery( // "SELECT r.path, layer FROM RequestData r LEFT JOIN r.layers as layer " + // " WHERE r.path = '/foo' GROUP BY r.path, layer"); // // for (Object o : q.list()) { // Object[] vals = (Object[]) o; // System.out.println(String.format("%s, %s", vals[0].toString(), vals[1].toString())); // } // // } }