package uk.ac.ebi.fg.myequivalents.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;
import uk.ac.ebi.fg.myequivalents.model.Service;
/**
* the {@link Service} DAO.
*
* <dl><dt>date</dt><dd>Jul 19, 2012</dd></dl>
* @author Marco Brandizi
*
*/
public class ServiceDAO extends DescribeableDAO<Service>
{
public ServiceDAO ( EntityManager entityManager )
{
super ( entityManager );
}
/**
* When a public-only restriction is needed, it cascades repository's visibility attributes to all its services
* having no specified visibility attribute.
*/
@Override
public Service findByName ( String serviceName, boolean mustBePublic )
{
serviceName = StringUtils.trimToNull ( serviceName );
if ( serviceName == null ) return null;
String hqlName = "service.findByName"; if ( mustBePublic ) hqlName += ".publicOnly";
Query q = getEntityManager ().createNamedQuery ( hqlName, Service.class )
.setParameter ( "serviceName", serviceName );
@SuppressWarnings ( "unchecked" )
List<Service> results = q.getResultList ();
return results.isEmpty () ? null : results.iterator ().next ();
}
/**
* First deletes linked entities.
*/
@Override
@SuppressWarnings ( "unchecked" )
public boolean delete ( String serviceName )
{
serviceName = StringUtils.trimToNull ( serviceName );
if ( serviceName == null ) return false;
if ( !exists ( serviceName ) ) return false;
EntityManager em = getEntityManager ();
em.createNativeQuery ( "DELETE FROM entity_mapping WHERE service_name = '" + serviceName + "'" ).executeUpdate ();
Query qDanglingBundles = em.createNativeQuery (
"SELECT bundle FROM ENTITY_MAPPING GROUP BY bundle HAVING count(accession) = 1"
);
Query qDelBundle = em.createNativeQuery ( "DELETE FROM entity_mapping WHERE bundle = :bundle" );
boolean result = false;
for ( String bundle: (List<String>) qDanglingBundles.getResultList () )
result |= qDelBundle.setParameter ( "bundle", bundle ).executeUpdate () > 0;
return result | super.delete ( serviceName );
}
public List<Service> findByUriPattern ( String uriPattern, boolean mustBePublic )
{
uriPattern = StringUtils.trimToNull ( uriPattern );
if ( uriPattern == null ) return null;
String hqlName = "service.findByUriPattern"; if ( mustBePublic ) hqlName += ".publicOnly";
Query q = getEntityManager ().createNamedQuery ( hqlName ).setParameter ( "uriPattern", uriPattern );
@SuppressWarnings ( "unchecked" )
List<Service> results = q.getResultList ();
return results;
}
public List<Service> findByUriPattern ( String uriPattern )
{
return findByUriPattern ( uriPattern, true );
}
@SuppressWarnings ( "unchecked" )
public List<Service> findByUriPatternLike ( String uriPattern, boolean mustBePublic )
{
uriPattern = StringUtils.trimToNull ( uriPattern );
if ( uriPattern == null ) return null;
String hqlName = "service.findByUriPattern.like"; if ( mustBePublic ) hqlName += ".publicOnly";
Query q = getEntityManager ().createNamedQuery ( hqlName, Service.class )
.setParameter ( "uriPattern", uriPattern );
return q.getResultList ();
}
public List<Service> findByUriPatternLike ( String uriPattern )
{
return findByUriPatternLike ( uriPattern, true );
}
}