/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.listener.persistence.dao; import java.math.BigInteger; import java.util.Date; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; import org.orcid.listener.persistence.entities.RecordStatusEntity; import org.orcid.listener.persistence.util.AvailableBroker; import org.springframework.stereotype.Component; @Component public class RecordStatusDao { @PersistenceContext protected EntityManager entityManager; public RecordStatusEntity get(String orcid) { Query query = entityManager.createNativeQuery("SELECT * FROM record_status WHERE orcid = :orcid", RecordStatusEntity.class); query.setParameter("orcid", orcid); return (RecordStatusEntity) query.getSingleResult(); } public boolean exists(String orcid) { Query query = entityManager.createNativeQuery("SELECT count(*) FROM record_status WHERE orcid=:orcid"); query.setParameter("orcid", orcid); Long result = ((BigInteger) query.getSingleResult()).longValue(); return (result != null && result > 0); } public void create(String orcid, AvailableBroker broker, Integer status) { RecordStatusEntity entity = new RecordStatusEntity(); entity.setId(orcid); switch (broker) { case DUMP_STATUS_1_2_API: entity.setDumpStatus12Api(status); break; case DUMP_STATUS_2_0_API: entity.setDumpStatus20Api(status); break; case SOLR: entity.setSolrStatus20Api(status); break; } Date now = new Date(); entity.setDateCreated(now); entity.setLastModified(now); entityManager.persist(entity); } public boolean updateStatus(String orcid, AvailableBroker broker, Integer status) { Query query = entityManager.createNativeQuery("UPDATE record_status SET " + broker + " = :status, last_modified = now() WHERE orcid = :orcid"); query.setParameter("orcid", orcid); query.setParameter("status", status); return query.executeUpdate() > 0; } public boolean updateStatus(String orcid, AvailableBroker broker) { Query query = entityManager.createNativeQuery("UPDATE record_status SET " + broker + " = (" + broker + " + 1), last_modified = now() WHERE orcid = :orcid"); query.setParameter("orcid", orcid); return query.executeUpdate() > 0; } public List<RecordStatusEntity> getFailedElements(int batchSize) { TypedQuery<RecordStatusEntity> query = entityManager.createQuery("FROM RecordStatusEntity WHERE dumpStatus12Api > 0 OR dumpStatus20Api > 0 OR solrStatus20Api > 0 ORDER BY id", RecordStatusEntity.class); query.setMaxResults(batchSize); return query.getResultList(); } }