/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.xmlui.aspect.discovery;
import org.apache.cocoon.caching.CacheableProcessingComponent;
import org.apache.cocoon.util.HashUtil;
import org.apache.excalibur.source.SourceValidity;
import org.apache.log4j.Logger;
import org.dspace.app.xmlui.cocoon.AbstractDSpaceTransformer;
import org.dspace.app.xmlui.utils.DSpaceValidity;
import org.dspace.app.xmlui.utils.HandleUtil;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants;
import org.dspace.discovery.*;
import org.dspace.discovery.configuration.DiscoveryConfiguration;
import org.dspace.discovery.configuration.DiscoveryRecentSubmissionsConfiguration;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
/**
* An abstract class containing the shared methods which all recent submission transformers use
*
* @author Kevin Van de Velde (kevin at atmire dot com)
*/
public abstract class AbstractRecentSubmissionTransformer extends AbstractDSpaceTransformer implements CacheableProcessingComponent {
private static final Logger log = Logger.getLogger(AbstractRecentSubmissionTransformer.class);
/**
* Cached query results
*/
protected DiscoverResult queryResults;
/** Cached validity object */
private SourceValidity validity;
/**
* Generate the unique caching key.
* This key must be unique inside the space of this component.
*/
@Override
public Serializable getKey() {
try
{
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
if (dso == null)
{
return "0";
}
return HashUtil.hash(dso.getHandle());
}
catch (SQLException sqle)
{
// Ignore all errors and just return that the component is not
// cachable.
return "0";
}
}
/**
* Generate the cache validity object.
*
* The validity object all recently submitted items.
* This does not include the community / collection
* hierarchy, when this changes they will not be reflected in the cache.
*/
public SourceValidity getValidity()
{
if (this.validity == null)
{
try
{
DSpaceObject dso = HandleUtil.obtainHandle(objectModel);
DSpaceValidity validity = new DSpaceValidity();
// Add the actual collection;
validity.add(dso);
getRecentlySubmittedItems(dso);
if(queryResults != null){
List<DSpaceObject> resultingObjects = queryResults.getDspaceObjects();
for(DSpaceObject resultObject : resultingObjects){
validity.add(resultObject);
}
validity.add("numFound:" + resultingObjects.size());
}
this.validity = validity.complete();
}
catch (Exception e)
{
// Just ignore all errors and return an invalid cache.
}
}
return this.validity;
}
/**
* Retrieves the recent submitted items of the given scope
*
* @param dso the DSpace object can either be null (indicating home page), a collection or a community
*/
protected void getRecentlySubmittedItems(DSpaceObject dso) {
if(queryResults != null)
{
return; // queryResults;
}
try {
DiscoverQuery queryArgs = new DiscoverQuery();
//Add the default filter queries
DiscoveryConfiguration discoveryConfiguration = SearchUtils.getDiscoveryConfiguration(dso);
List<String> defaultFilterQueries = discoveryConfiguration.getDefaultFilterQueries();
queryArgs.addFilterQueries(defaultFilterQueries.toArray(new String[defaultFilterQueries.size()]));
queryArgs.setDSpaceObjectFilter(Constants.ITEM);
DiscoveryRecentSubmissionsConfiguration recentSubmissionConfiguration = discoveryConfiguration.getRecentSubmissionConfiguration();
if(recentSubmissionConfiguration != null){
queryArgs.setMaxResults(recentSubmissionConfiguration.getMax());
String sortField = SearchUtils.getSearchService().toSortFieldIndex(recentSubmissionConfiguration.getMetadataSortField(), recentSubmissionConfiguration.getType());
if(sortField != null){
queryArgs.setSortField(
sortField,
DiscoverQuery.SORT_ORDER.desc
);
}
SearchService service = SearchUtils.getSearchService();
queryResults = service.search(context, dso, queryArgs);
}else{
//No configuration, no results
queryResults = null;
}
}catch (SearchServiceException se){
log.error("Caught SearchServiceException while retrieving recent submission for: " + (dso == null ? "home page" : dso.getHandle()), se);
}
}
@Override
public void recycle() {
queryResults = null;
validity = null;
super.recycle();
}
}