/**
* 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.rest.filter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
import org.dspace.content.MetadataValue;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
import org.dspace.services.factory.DSpaceServicesFactory;
import com.ibm.icu.util.Calendar;
public class ItemFilterUtil {
protected static ItemService itemService = ContentServiceFactory.getInstance().getItemService();
static Logger log = Logger.getLogger(ItemFilterUtil.class);
public enum BundleName{ORIGINAL,TEXT,LICENSE,THUMBNAIL;}
static String[] getDocumentMimeTypes() {
return DSpaceServicesFactory.getInstance().getConfigurationService().getArrayProperty("rest.report-mime-document");
}
static String[] getSupportedDocumentMimeTypes() {
return DSpaceServicesFactory.getInstance().getConfigurationService().getArrayProperty("rest.report-mime-document-supported");
}
static String[] getSupportedImageMimeTypes() {
return DSpaceServicesFactory.getInstance().getConfigurationService().getArrayProperty("rest.report-mime-document-image");
}
static int countOriginalBitstream(Item item) {
return countBitstream(BundleName.ORIGINAL, item);
}
static int countBitstream(BundleName bundleName, Item item)
{
int count = 0;
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
count += bundle.getBitstreams().size();
}
return count;
}
static List<String> getBitstreamNames(BundleName bundleName, Item item)
{
ArrayList<String> names = new ArrayList<String>();
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
names.add(bit.getName());
}
}
return names;
}
static int countOriginalBitstreamMime(Context context, Item item, String[] mimeList) {
return countBitstreamMime(context, BundleName.ORIGINAL, item, mimeList);
}
static int countBitstreamMime(Context context, BundleName bundleName, Item item, String[] mimeList)
{
int count = 0;
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
for (String mime: mimeList)
{
try
{
if (bit.getFormat(context).getMIMEType().equals(mime.trim()))
{
count++;
}
}
catch (SQLException e)
{
log.error("Get format error for bitstream " + bit.getName());
}
}
}
}
return count;
}
static int countBitstreamByDesc(BundleName bundleName, Item item, String[] descList)
{
int count = 0;
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
for (String desc: descList)
{
String bitDesc = bit.getDescription();
if (bitDesc == null)
{
continue;
}
if (bitDesc.equals(desc.trim()))
{
count++;
}
}
}
}
return count;
}
static int countBitstreamSmallerThanMinSize(Context context, BundleName bundleName, Item item, String[] mimeList, String prop)
{
long size = DSpaceServicesFactory.getInstance().getConfigurationService().getLongProperty(prop);
int count = 0;
try
{
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
for (String mime: mimeList)
{
if (bit.getFormat(context).getMIMEType().equals(mime.trim()))
{
if (bit.getSize() < size)
{
count++;
}
}
}
}
}
} catch (SQLException e) {
}
return count;
}
static int countBitstreamLargerThanMaxSize(Context context, BundleName bundleName, Item item, String[] mimeList, String prop)
{
long size = DSpaceServicesFactory.getInstance().getConfigurationService().getLongProperty(prop);
int count = 0;
try
{
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
for (String mime: mimeList)
{
if (bit.getFormat(context).getMIMEType().equals(mime.trim()))
{
if (bit.getSize() > size)
{
count++;
}
}
}
}
}
}
catch (SQLException e)
{
}
return count;
}
static int countOriginalBitstreamMimeStartsWith(Context context, Item item, String prefix) {
return countBitstreamMimeStartsWith(context, BundleName.ORIGINAL, item, prefix);
}
static int countBitstreamMimeStartsWith(Context context, BundleName bundleName, Item item, String prefix)
{
int count = 0;
try
{
for (Bundle bundle: item.getBundles())
{
if (!bundle.getName().equals(bundleName.name()))
{
continue;
}
for (Bitstream bit: bundle.getBitstreams())
{
if (bit.getFormat(context).getMIMEType().startsWith(prefix))
{
count++;
}
}
}
}
catch (SQLException e)
{
}
return count;
}
static boolean hasUnsupportedBundle(Item item, String[] bundleList)
{
if (bundleList == null)
{
return false;
}
ArrayList<String> bundles = new ArrayList<String>();
for (String bundleName: bundleList)
{
bundles.add(bundleName.trim());
}
for (Bundle bundle: item.getBundles())
{
if (!bundles.contains(bundle.getName()))
{
return true;
}
}
return false;
}
static boolean hasOriginalBitstreamMime(Context context, Item item, String[] mimeList) {
return hasBitstreamMime(context, BundleName.ORIGINAL, item, mimeList);
}
static boolean hasBitstreamMime(Context context, BundleName bundleName, Item item, String[] mimeList) {
return countBitstreamMime(context, bundleName, item, mimeList) > 0;
}
static boolean hasMetadataMatch(Item item, String fieldList, Pattern regex)
{
if (fieldList.equals("*"))
{
for (MetadataValue md: itemService.getMetadata(item, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY))
{
if (regex.matcher(md.getValue()).matches())
{
return true;
}
}
}
else
{
for (String field: fieldList.split(","))
{
for (MetadataValue md: itemService.getMetadataByMetadataString(item, field.trim()))
{
if (regex.matcher(md.getValue()).matches())
{
return true;
}
}
}
}
return false;
}
static boolean hasOnlyMetadataMatch(Item item, String fieldList, Pattern regex)
{
boolean matches = false;
if (fieldList.equals("*"))
{
for (MetadataValue md: itemService.getMetadata(item, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY))
{
if (regex.matcher(md.getValue()).matches())
{
matches = true;
}
else
{
return false;
}
}
}
else
{
for (String field: fieldList.split(","))
{
for (MetadataValue md: itemService.getMetadataByMetadataString(item, field.trim()))
{
if (regex.matcher(md.getValue()).matches())
{
matches = true;
}
else
{
return false;
}
}
}
}
return matches;
}
static boolean recentlyModified(Item item, int days) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -days);
return cal.getTime().before(item.getLastModified());
}
}