/* * EuroCarbDB, a framework for carbohydrate bioinformatics * * Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as * indicated by the @author tags or express copyright attribution * statements applied by the authors. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * A copy of this license accompanies this distribution in the file LICENSE.txt. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * Last commit: $Rev: 1549 $ by $Author: glycoslave $ on $Date:: 2009-07-19 #$ */ package org.eurocarbdb.action; // stdlib imports import java.util.List; import java.util.Collections; // 3rd party imports import org.apache.log4j.Logger; import org.hibernate.Criteria; // eurocarb imports import org.eurocarbdb.action.BrowseAction; import org.eurocarbdb.dataaccess.indexes.Index; import org.eurocarbdb.dataaccess.indexes.Indexable; // static imports import static org.eurocarbdb.dataaccess.Eurocarb.getEntityManager; public abstract class AbstractBrowseAction<T> extends BrowseAction<T> { /** logging handle */ protected static Logger log = Logger.getLogger( AbstractBrowseAction.class ); /** The Query that populates the {@link #results} {@link List}. */ protected Criteria query = null; /** The results {@link List} */ protected List<T> results; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ METHODS ~~~~~~~~~~~~~~~~~~~~~~~~~~ public abstract Class<T> getIndexableType() ; /** * Returns the core query that obtains the main result set for * this browse action. */ public Criteria getQuery() { if ( query == null ) { query = getEntityManager().createQuery( getIndexableType() ); initQuery( query ); } return query; } /** * Adds comments and offset/limit restrictions to the passed {@link Criteria} query. * Note that offset ({@link #getOffset}) and limit ({@link #getMaxResults}) parameters * and their dependant values must be set <em>prior</em> to this method being called. */ protected void initQuery( Criteria q ) { if ( log.isDebugEnabled() ) { log.debug( "initialising query: offset = " + this.getOffset() + ", max results = " + this.getMaxResults() ); } q.setComment( this.getClass().getName() ); q.setMaxResults( this.getMaxResults() ); q.setFirstResult( this.getOffset() ); } public String execute() { List<T> results = this.getResults(); //(List<GlycanSequence>) q.list(); //this.setResults( results ); assert results != null; log.debug( results.size() + " result(s)"); return SUCCESS; } @Override public List<T> getResults() { if ( results == null ) { Criteria q = getQuery(); this.getIndex().apply( q ); results = (List<T>) q.list(); if ( results == null ) return Collections.emptyList(); } return results; } @Override public int getTotalResults() { if ( totalResults <= 0 ) { totalResults = getEntityManager().countAll( getIndexableType() ); log.debug("calculated totalResults = " + totalResults ); } return totalResults; } }