package sushi.monitoring;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityTransaction;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Query;
import javax.persistence.Table;
import sushi.persistence.Persistable;
import sushi.persistence.Persistor;
import sushi.process.SushiProcess;
import sushi.process.SushiProcessInstance;
import sushi.query.SushiQuery;
/**
* Connects a query and a process to enable monitoring without BPMN-model.
* This monitoring point saves a percentage that represents the percent of how far a process instance is when the query is triggered.
*/
@Entity
@Table(name = "QueryMonitoringPoint")
public class QueryMonitoringPoint extends Persistable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected int ID;
@ManyToOne
private SushiProcess process;
@ManyToOne
private SushiQuery query;
@Column(name="percentage")
private int percentage;
@Column(name="isAbsolute")
private boolean isAbsolute;
/**
* JPA-default constructor
*/
public QueryMonitoringPoint() {
}
/**
* Creates a new query monitoring point.
* @param process
* @param query
* @param percentage
* @param isAbsolute
*/
public QueryMonitoringPoint(SushiProcess process, SushiQuery query, int percentage, boolean isAbsolute) {
this.process = process;
this.query = query;
this.percentage = percentage;
this.isAbsolute = isAbsolute;
}
/**
* This method is called when a query is triggered.
* It updates the progress of the process instance.
* @param instance
*/
public void trigger(SushiProcessInstance instance) {
if (isAbsolute) {
instance.setProgress(this.percentage);
System.out.println(instance + " was updated to" + percentage + "%");
}
else {
instance.addToProgress(this.percentage);
System.out.println(instance + " was updated with " + percentage + "%");
}
}
//Getter and Setter
public SushiProcess getProcess() {
return process;
}
public void setProcess(SushiProcess process) {
this.process = process;
}
public SushiQuery getQuery() {
return query;
}
public void setQuery(SushiQuery query) {
this.query = query;
}
public int getPercentage() {
return percentage;
}
public void setPercentage(int percentage) {
this.percentage = percentage;
}
public boolean isAbsolute() {
return isAbsolute;
}
public void setAbsolute(boolean isAbsolute) {
this.isAbsolute = isAbsolute;
}
@Override
public int getID() {
return ID;
}
//JPA-Methods
/**
* Returns all {@link QueryMonitoringPoint}s from the database.
* @return
*/
@SuppressWarnings("unchecked")
public static List<QueryMonitoringPoint> findAll() {
Query q = Persistor.getEntityManager().createQuery("select t from QueryMonitoringPoint t");
return q.getResultList();
}
/**
* Deletes all query monitoring points from the database.
*/
public static void removeAll() {
try {
EntityTransaction entr = Persistor.getEntityManager().getTransaction();
entr.begin();
Query query = Persistor.getEntityManager().createQuery("DELETE FROM QueryMonitoringPoint");
int deleteRecords = query.executeUpdate();
entr.commit();
System.out.println(deleteRecords + " records are deleted.");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
/**
* Finds a query monitoring point with a certain ID.
* @param ID
* @return
*/
public static QueryMonitoringPoint findByID(int ID){
return Persistor.getEntityManager().find(QueryMonitoringPoint.class, ID);
}
/**
* Finds query monitoring points that are connected with a certain query.
* @param query
* @return
*/
@SuppressWarnings("unchecked")
public static List<QueryMonitoringPoint> findByQuery(SushiQuery query){
Query q = Persistor.getEntityManager().createNativeQuery("SELECT * FROM QueryMonitoringPoint WHERE QUERY_ID = '" + query.getID() + "'", QueryMonitoringPoint.class);
return q.getResultList();
}
}