See: http://www.ibm.com/developerworks/java/library/j-jtp03216.html [1] org.sakaiproject.reports.logic.impl.LoadArtifactResultProcessor Failure to close statement line 274, need to make non anonymous and expressly close in finally protected void loadArtifactTypes(String artifactIds, Map artifactsToLoad) { Connection conn = null; ResultSet rs = null; try { conn = getDataSource().getConnection(); rs = conn.createStatement().executeQuery( "select id, sub_type from dw_resource where id in (" + artifactIds + ")"); while (rs.next()) { String id = rs.getString(1); String type = rs.getString(2); ArtifactHolder holder = (ArtifactHolder) artifactsToLoad.get(id); if (holder != null) { holder.artifactType = type; } } } catch (SQLException e) { logger.error("", e); throw new RuntimeException(e); } finally { //ensure that the results set is clsoed if (rs != null) { try { rs.close(); } catch (SQLException e) { if (logger.isDebugEnabled()) { logger.debug("loadArtifactTypes(String, Map) caught " + e); } } } //ensure that the connection is closed if (conn != null) { try { conn.close(); } catch (SQLException e) { if (logger.isDebugEnabled()) { logger.debug("loadArtifactTypes(String, Map) caught " + e); } } } } } [2] org.sakaiproject.reports.logic.impl.ReportsManagerImpl Line 1271 Useless object creation, result never used JDOMResult result = new JDOMResult(); [3] org.sakaiproject.reports.logic.impl.ReportsManagerImpl NPE if scheduler is null line 2054 if (scheduler == null) { logger.error("Scheduler is down!"); } JobDetail jd = null; try { JobBeanWrapper job = getJobBeanWrapper(); if (job != null) { jd = scheduler.getJobDetail(report.getReportId().toString(), reportGroup); [4,5] org.sakaiproject.reports.logic.impl.ReportsManagerImpl Failure to close InputStream can cause File descriptor leakage InputStream stream = wrapper.getParentClass().getResourceAsStream(wrapper.getDefinitionFileLocation()); if (wrapper.getParentClass().getResourceAsStream(xsl.getXslLink()) != null){ Wow this is difficult, the whole method should be looked at as by catching Exception with catch (Exception e) { throw new RuntimeException("Loaded report def failed", e); } You are hidding java.io.Exceptions etc, that have to be closed properly. I would suggest reimplementing the try catch block as a series with a finally. The anonymous creation of streams etc should be removed.