/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE file at the root of the source * tree and available online at * * https://github.com/keeps/roda */ package org.roda.core.model.iterables; import java.io.IOException; import java.util.Iterator; import org.apache.commons.io.IOUtils; import org.roda.core.common.iterables.CloseableIterable; import org.roda.core.data.common.RodaConstants; import org.roda.core.data.exceptions.RODAException; import org.roda.core.data.v2.ip.StoragePath; import org.roda.core.storage.DefaultStoragePath; import org.roda.core.storage.Resource; import org.roda.core.storage.StorageService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AIPDescriptiveMetadataIterable implements CloseableIterable<Resource> { private static final Logger LOGGER = LoggerFactory.getLogger(AIPDescriptiveMetadataIterable.class); private final CloseableIterable<Resource> aipResourcesTop; private final Iterator<Resource> aipIteratorTop; private final StorageService storage; public AIPDescriptiveMetadataIterable(StorageService storage, CloseableIterable<Resource> aipResourcesTop, Iterator<Resource> aipIteratorTop) { this.aipResourcesTop = aipResourcesTop; this.aipIteratorTop = aipIteratorTop; this.storage = storage; } @Override public void close() throws IOException { aipResourcesTop.close(); } @Override public Iterator<Resource> iterator() { return new Iterator<Resource>() { CloseableIterable<Resource> metadataResources = null; Iterator<Resource> metadataIterator = null; Resource nextResource = null; @Override public boolean hasNext() { if (metadataResources == null) { try { while (aipIteratorTop.hasNext()) { StoragePath metadataPath = DefaultStoragePath.parse(aipIteratorTop.next().getStoragePath(), RodaConstants.STORAGE_DIRECTORY_METADATA, RodaConstants.STORAGE_DIRECTORY_DESCRIPTIVE); if (storage.hasDirectory(metadataPath)) { metadataResources = storage.listResourcesUnderDirectory(metadataPath, false); metadataIterator = metadataResources.iterator(); if (metadataIterator.hasNext()) { nextResource = metadataIterator.next(); break; } else { IOUtils.closeQuietly(metadataResources); } } } } catch (RODAException e) { return false; } } return nextResource != null; } @Override public Resource next() { Resource ret = nextResource; nextResource = null; if (metadataIterator.hasNext()) { nextResource = metadataIterator.next(); } else { while (aipIteratorTop.hasNext()) { try { StoragePath metadataPath = DefaultStoragePath.parse(aipIteratorTop.next().getStoragePath(), RodaConstants.STORAGE_DIRECTORY_METADATA, RodaConstants.STORAGE_DIRECTORY_DESCRIPTIVE); if (storage.hasDirectory(metadataPath)) { metadataResources = storage.listResourcesUnderDirectory(metadataPath, false); metadataIterator = metadataResources.iterator(); if (metadataIterator.hasNext()) { nextResource = metadataIterator.next(); break; } else { IOUtils.closeQuietly(metadataResources); } } } catch (RODAException e) { LOGGER.error("Could not list resources under AIP data directory", e); } } } return ret; } }; } }