package gr.ntua.ivml.athena.db; import gr.ntua.ivml.athena.concurrent.Queues; import gr.ntua.ivml.athena.persistent.DataUpload; import gr.ntua.ivml.athena.persistent.Organization; import gr.ntua.ivml.athena.persistent.User; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Session; import org.hibernate.Transaction; public class DataUploadDAO extends DAO<DataUpload, Long> { public static final Logger log = Logger.getLogger(DataUploadDAO.class); static { Session ss = DB.getSession(); ss.beginTransaction(); try { List<DataUpload> toChange = ss.createQuery("from DataUpload where status != :ok and status != :error" ) .setInteger("ok", DataUpload.OK) .setInteger("error", DataUpload.ERROR) .list(); int count = 0; try { for( DataUpload du: toChange ) { du.setMessage("Failed due to server restart!"); du.setStatus(du.ERROR); DB.commit(); count++; } } catch( Exception e ) { log.error( "Error after " + count + " cancelled Uploads", e ); } log.info( "Cancelled " + count + " Uploads from DB."); } finally { ss.close(); } } public List<DataUpload> findByOrganizationUser( Organization o, User u ) { List<DataUpload> l = getSession().createQuery( "from DataUpload where organization = :org and uploader = :user order by uploadDate DESC" ) .setEntity("org", o) .setEntity("user", u) .list(); return l; } public List<DataUpload> findByOrganization( Organization o) { List<DataUpload> l = getSession().createQuery( "from DataUpload where organization = :org order by uploadDate DESC" ) .setEntity("org", o) .list(); return l; } public List<User> getUploaders( Organization o ) { List<User> l = getSession().createQuery( "select distinct(ul) from DataUpload du join du.uploader ul where du.organization = :org" ) .setEntity("org", o) .list(); return l; } public List<DataUpload> getByUser( User u ) { List<DataUpload> l = getSession().createQuery( "from DataUpload where uploader = :user order by uploadDate DESC" ) .setEntity("user", u) .list(); return l; } @Override public boolean makeTransient( DataUpload du ) { // interrupt a running Upload Indexer Queues.cancelUpload(du); DB.getSession().refresh(du); log.info( "Last message: " + du.getMessage() ); return super.makeTransient(du); } public List<DataUpload> getByUserOrg(User user, Organization org) { List<DataUpload> l = getSession().createQuery( "from DataUpload where uploader = :user and organization = :org order by uploadDate DESC" ) .setEntity("user", user) .setEntity("org", org) .list(); return l; } }