package jpaoletti.jpm.hibernate.core.monitor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import jpaoletti.jpm.core.monitor.MonitorLine; import jpaoletti.jpm.core.monitor.MonitorSource; import org.hibernate.SQLQuery; import org.hibernate.Session; /** * Todo */ public class SQLMonitorSource extends MonitorSource { private String query; private String lastLineQuery; private Integer idColumn; @Override public void init() { setQuery(getConfig("query")); setLastLineQuery(getConfig("last-line-query")); setIdColumn(Integer.parseInt(getConfig("id-column", "0"))); } @Override public List<MonitorLine> getLinesFrom(Object actual) throws Exception { final List<MonitorLine> result = new ArrayList<MonitorLine>(); String sql; if (actual == null) { sql = getQuery().trim(); } else { sql = getLastLineQuery().trim(); } sql = sql.replaceAll("\\$actual", (actual == null) ? "" : actual.toString()); getPersistenceManager().init(getPersistenceManager().newConnection()); try { final SQLQuery c = ((Session) getPersistenceManager().getConnection()).createSQLQuery(sql); final List<?> l = c.list(); for (Iterator<?> iterator = l.iterator(); iterator.hasNext();) { final Object item = iterator.next(); if (item instanceof Object[]) { final Object[] objects = (Object[]) item; result.add(new MonitorLine(objects[getIdColumn()], objects)); } else { final Object[] objects = {item}; result.add(new MonitorLine(item, objects)); } } } finally { getPersistenceManager().finish(null); } return result; } @Override public List<MonitorLine> getLastLine(Integer count) throws Exception { final List<MonitorLine> result = new ArrayList<MonitorLine>(); getPersistenceManager().init(getPersistenceManager().newConnection()); try { final SQLQuery c = ((Session) getPersistenceManager().getConnection()).createSQLQuery(getLastLineQuery().trim()); c.setMaxResults(1); final Object item = c.uniqueResult(); if (item instanceof Object[]) { final Object[] objects = (Object[]) item; result.add(new MonitorLine(objects[getIdColumn()], objects)); } else { final Object[] objects = {item}; result.add(new MonitorLine(item, objects)); } } finally { getPersistenceManager().finish(null); } return result; } /** * @param query the query to set */ public void setQuery(String query) { this.query = query; } /** * @return the query */ public String getQuery() { return query; } /** * @param lastLineQuery the lastLineQuery to set */ public void setLastLineQuery(String lastLineQuery) { this.lastLineQuery = lastLineQuery; } /** * @return the lastLineQuery */ public String getLastLineQuery() { return lastLineQuery; } /** * @param idColumn the idColumn to set */ public void setIdColumn(Integer idColumn) { this.idColumn = idColumn; } /** * @return the idColumn */ public Integer getIdColumn() { return idColumn; } }