diff --git a/ace-am/src/main/java/edu/umiacs/ace/monitor/core/MonitoredItemManager.java b/ace-am/src/main/java/edu/umiacs/ace/monitor/core/MonitoredItemManager.java index 836818074d57b1ee15c81499db382dadffe3024e..3570d3201d4bdbfa6ff85e0b3ba9a20f526366ff 100644 --- a/ace-am/src/main/java/edu/umiacs/ace/monitor/core/MonitoredItemManager.java +++ b/ace-am/src/main/java/edu/umiacs/ace/monitor/core/MonitoredItemManager.java @@ -34,6 +34,11 @@ package edu.umiacs.ace.monitor.core; import edu.umiacs.ace.monitor.log.LogEnum; import edu.umiacs.ace.monitor.log.LogEventManager; import edu.umiacs.ace.util.PersistUtil; +import org.apache.log4j.Logger; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import javax.persistence.Query; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -42,10 +47,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import javax.persistence.Query; -import org.apache.log4j.Logger; /** * @@ -58,13 +59,13 @@ public class MonitoredItemManager { MonitoredItemManager.class); EntityManager em; // TODO: This may leak... - private Set existingParents = new HashSet(); + private Set existingParents = new HashSet<>(); public MonitoredItemManager( EntityManager em ) { this.em = em; } - public List listItemsBefore( Collection c, Date d ) { + public Iterable listItemsBefore( Collection c, Date d ) { lock.lock(); try { diff --git a/ace-am/src/main/java/edu/umiacs/ace/monitor/reporting/SummaryGenerator.java b/ace-am/src/main/java/edu/umiacs/ace/monitor/reporting/SummaryGenerator.java index 575c3392ab079c5289642d5e04ea76d28a07fc24..72ac788aa735dd37b2326c2f4d00a24d6103d783 100644 --- a/ace-am/src/main/java/edu/umiacs/ace/monitor/reporting/SummaryGenerator.java +++ b/ace-am/src/main/java/edu/umiacs/ace/monitor/reporting/SummaryGenerator.java @@ -31,12 +31,17 @@ package edu.umiacs.ace.monitor.reporting; -import edu.umiacs.ace.monitor.log.*; -import edu.umiacs.ace.util.PersistUtil; import edu.umiacs.ace.monitor.core.Collection; +import edu.umiacs.ace.monitor.log.LogEnum; +import edu.umiacs.ace.util.PersistUtil; import edu.umiacs.sql.SQL; import edu.umiacs.util.Argument; import edu.umiacs.util.Strings; +import org.apache.log4j.Logger; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -45,10 +50,6 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; -import javax.sql.DataSource; -import org.apache.log4j.Logger; /** * Log summary generator, this will generate a report summarizing all log entries @@ -168,7 +169,7 @@ public class SummaryGenerator extends ReportItemTypes { + "MIN(logevent.ID), logevent.LOGTYPE, count(logevent.LOGTYPE)" + "FROM logevent WHERE logevent.COLLECTION_ID = ? " + "GROUP BY logevent.LOGTYPE"); - ps.setLong(2, collection.getId()); + ps.setLong(1, collection.getId()); } // create entries for each result, for start date and session id diff --git a/ace-am/src/main/java/edu/umiacs/ace/rest/ListController.java b/ace-am/src/main/java/edu/umiacs/ace/rest/ListController.java index ba9b11a044d7bdfbc51176a2493d6cdb352c4606..5cfbf70af01830f3d94fa434a84c34ef45a702e0 100644 --- a/ace-am/src/main/java/edu/umiacs/ace/rest/ListController.java +++ b/ace-am/src/main/java/edu/umiacs/ace/rest/ListController.java @@ -1,23 +1,32 @@ package edu.umiacs.ace.rest; import edu.umiacs.ace.monitor.core.Collection; +import edu.umiacs.ace.monitor.core.MonitoredItem; import edu.umiacs.ace.util.PersistUtil; +import org.apache.log4j.Logger; import javax.persistence.EntityManager; import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import java.util.ArrayList; import java.util.List; /** + * Get a listing of groups/collections in ACE + * * Created by shake on 10/22/14. */ @Path("/") public class ListController { + private static final Logger LOG = Logger.getLogger(ListController.class); /** * Get a list of all the groups registered in ACE @@ -64,7 +73,7 @@ public class ListController { // Get all Query q = em.createNamedQuery("Collection.listAllCollections"); List results = q.getResultList(); - List groupless = new ArrayList(); + List groupless = new ArrayList<>(); // Filter if the group == null for (Collection result : results) { @@ -75,4 +84,65 @@ public class ListController { return groupless; } + /** + * New API method to get all collections with query parameters + * + * @return + */ + @GET + @Path("collections") + @Produces(MediaType.APPLICATION_JSON) + public List getCollections(@QueryParam("group") String group, + @QueryParam("active") Boolean active, + @QueryParam("corrupt") Boolean corrupt) { + EntityManager entityManager = PersistUtil.getEntityManager(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Collection.class); + Root coll = cq.from(Collection.class); + cq.select(coll); + if (active != null && active) { + cq.where(cb.equal(coll.get("state"), 'A')); + } + + if (corrupt != null && corrupt) { + cq.where(cb.equal(coll.get("state"), 'E')); + } + + return entityManager.createQuery(cq).getResultList(); + } + + /** + * API for getting items in a collection. We can offer more query parameters (path, last seen, etc), + * but for now just query based on state + * + * @param id The id of the collection + * @param state The state of the monitored items + * @return a list of monitored items for the collection + */ + @GET + @Path("collections/{id}/items") + @Produces(MediaType.APPLICATION_JSON) + public List getCollectionItems(@PathParam("id") Long id, + @QueryParam("state") String state) { + EntityManager entityManager = PersistUtil.getEntityManager(); + Collection c = entityManager.find(Collection.class, id); + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(MonitoredItemBean.class); + Root mi = cq.from(MonitoredItem.class); + + cq.select(cb.construct(MonitoredItemBean.class, + mi.get("id"), mi.get("path"), + mi.get("state"), mi.get("fileDigest"), + mi.get("size"), mi.get("lastSeen"), + mi.get("stateChange"), mi.get("lastVisited"))); + + cq.where(cb.equal(mi.get("parentCollection"), c)); + if (state != null && !state.isEmpty()) { + cq.where(cb.equal(mi.get("state"), state)); + } + + return entityManager.createQuery(cq).getResultList(); + } + } diff --git a/ace-am/src/main/java/edu/umiacs/ace/rest/MonitoredItemBean.java b/ace-am/src/main/java/edu/umiacs/ace/rest/MonitoredItemBean.java new file mode 100644 index 0000000000000000000000000000000000000000..ec94553a8e225d4f41b51d5f9b214241c654da73 --- /dev/null +++ b/ace-am/src/main/java/edu/umiacs/ace/rest/MonitoredItemBean.java @@ -0,0 +1,107 @@ +package edu.umiacs.ace.rest; + +import java.util.Date; + +/** + * Bean for displaying certain MonitoredItem properties in our api + * + * Created by shake on 11/14/16. + */ +public class MonitoredItemBean { + + private Long id; + private String path; + private String state; + private String fileDigest; + private Long size; + private Date lastSeen; + private Date stateChange; + private Date lastVisited; + + public MonitoredItemBean() { + } + + public MonitoredItemBean(Long id, String path, char state, String fileDigest, Long size , Date lastSeen, Date stateChange, Date lastVisited) { + this.id = id; + this.path = path; + this.state = String.valueOf(state); + this.fileDigest = fileDigest; + this.size = size; + this.lastSeen = lastSeen; + this.stateChange = stateChange; + this.lastVisited = lastVisited; + } + + + public Long getId() { + return id; + } + + public MonitoredItemBean setId(Long id) { + this.id = id; + return this; + } + + public String getPath() { + return path; + } + + public MonitoredItemBean setPath(String path) { + this.path = path; + return this; + } + + public String getState() { + return state; + } + + public MonitoredItemBean setState(String state) { + this.state = state; + return this; + } + + public String getFileDigest() { + return fileDigest; + } + + public MonitoredItemBean setFileDigest(String fileDigest) { + this.fileDigest = fileDigest; + return this; + } + + public Long getSize() { + return size; + } + + public MonitoredItemBean setSize(Long size) { + this.size = size; + return this; + } + + public Date getLastSeen() { + return lastSeen; + } + + public MonitoredItemBean setLastSeen(Date lastSeen) { + this.lastSeen = lastSeen; + return this; + } + + public Date getStateChange() { + return stateChange; + } + + public MonitoredItemBean setStateChange(Date stateChange) { + this.stateChange = stateChange; + return this; + } + + public Date getLastVisited() { + return lastVisited; + } + + public MonitoredItemBean setLastVisited(Date lastVisited) { + this.lastVisited = lastVisited; + return this; + } +} diff --git a/ace-am/src/main/java/edu/umiacs/ace/rest/SettingsManagement.java b/ace-am/src/main/java/edu/umiacs/ace/rest/SettingsManagement.java index 3fcd0fa37ad3e48bda5e8588f9b40136583362d4..bba44d3fa2b06fe21fba01aea4403abc65a26a4a 100644 --- a/ace-am/src/main/java/edu/umiacs/ace/rest/SettingsManagement.java +++ b/ace-am/src/main/java/edu/umiacs/ace/rest/SettingsManagement.java @@ -4,10 +4,11 @@ */ package edu.umiacs.ace.rest; -import com.sun.istack.logging.Logger; import edu.umiacs.ace.driver.irods.IrodsSetting; import edu.umiacs.ace.monitor.core.Collection; import edu.umiacs.ace.util.PersistUtil; +import org.apache.log4j.Logger; + import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.NoResultException; diff --git a/ace-am/src/main/java/edu/umiacs/ace/util/KSFuture.java b/ace-am/src/main/java/edu/umiacs/ace/util/KSFuture.java index 5ad819dd9f0a25133194a4ebb5eff3cc680f27c0..c62ababec4746cf0b55060a8bfe6c9d5216f822a 100644 --- a/ace-am/src/main/java/edu/umiacs/ace/util/KSFuture.java +++ b/ace-am/src/main/java/edu/umiacs/ace/util/KSFuture.java @@ -49,6 +49,7 @@ public class KSFuture extends KnownFuture> { Submittable result = getKnownResult(); beforeExecute(result); super.run(); + // TODO: Check exception and print if true? afterExecute(result); } diff --git a/ace-am/src/main/resources/META-INF/persistence.xml b/ace-am/src/main/resources/META-INF/persistence.xml index ff2ccf4b97528f5e09506402c62945bdd404fa75..52e93a238502272bb8df168b149e32818b97b1b3 100644 --- a/ace-am/src/main/resources/META-INF/persistence.xml +++ b/ace-am/src/main/resources/META-INF/persistence.xml @@ -23,6 +23,9 @@ true + + +