Nombre d’objets numériques conforme¶
Ce module permet de vérifier que le nombre d’objets contenu dans un SIP correspond au nombre d’objets déclarés dans le bordereau afin de s’assurer de l’intégralité du SIP.
Le format supporté file SEDA et les schémas est :
- xml
- sxd
Usage¶
Pour l’usage interne Vitam¶
- Extraction XML d’informations en parcourant le fichier manifest:
public ExtractUriResponse getAllDigitalObjectUriFromManifest(WorkParams params) throws ProcessingException, XMLStreamException {}
- Parcours du fichier manifest avec la technologie StAX pour extraire 1 par 1 des Uri dans la balise Binary Data Object.
private void getUri(ExtractUriResponse extractUriResponse, XMLEventReader evenReader) throws XMLStreamException, URISyntaxException {
while (evenReader.hasNext()) {
XMLEvent event = evenReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
// If we have an Tag Uri element equal Uri into SEDA
if (startElement.getName().getLocalPart() == (SedaUtils.TAG_URI)){
event = evenReader.nextEvent();
String uri = event.asCharacters().getData();
// Check element is duplicate
checkDuplicatedUri(extractUriResponse, uri);
extractUriResponse.getUriListManifest().add(new URI(uri));
}
}
}
}
- Vérification des éléménts dans la liste d’Uri sans doublon.
- Ajout de l’élément de la liste d’Uri en capsulant dans l’object ExtractUriResponse.
public class ExtractUriResponse extends ProcessResponse{
private boolean errorDuplicateUri;
// list contains Uri for Binary Object
private List<URI> uriListManifest;
...
- Récupération de la liste d’Uri des objets numériques stockés dans un conteneur du workspace (de manière récursive).
Chemin pour récupérer les objets numériques : «GuidContainer/sip/content».
public List<URI> getListUriDigitalObjectFromFolder(String containerName, String folderName) throws ContentAddressableStorageException {
...
List<URI> uriFolderListFromContainer;
try {
BlobStore blobStore = context.getBlobStore();
// It's like a filter
ListContainerOptions listContainerOptions = new ListContainerOptions();
// List of all resources in a container recursively
final PageSet<? extends StorageMetadata> blobStoreList =
blobStore.list(containerName, listContainerOptions.inDirectory(folderName).recursive());
uriFolderListFromContainer = new ArrayList<>();
LOGGER.info(WorkspaceMessage.BEGINNING_GET_URI_LIST_OF_DIGITAL_OBJECT.getMessage());
for (Iterator<? extends StorageMetadata> iterator = blobStoreList.iterator(); iterator.hasNext();) {
StorageMetadata storageMetada = iterator.next();
// select BLOB only, not folder nor relative path
if ((storageMetada.getType().equals(StorageType.BLOB) && storageMetada.getName() != null &&
!storageMetada.getName().isEmpty())) {
uriFolderListFromContainer.add(new URI(UriUtils.splitUri(storageMetada.getName())));
}
}
}
...
}
- Vérification conformité du nombre d’objets numériques.
6.1) Vérification de présence de doublons dans la liste des Uri du bordereau
Si présence de doublons la comparaison avec la liste des Uri provenant du SIP n’est pas déclenchée
if (extractUriResponse != null && !extractUriResponse.isErrorDuplicateUri()) {
...
}
6.2)Comparaison des listes
-Comparaison de la taille des liste. -Comparaison des URI. -Identification des Uri non référencés dans le SIP. -Identification des Uri non déclarés dans le bordereau.
private void checkCountDigitalObjectConformity(List<URI> uriListManifest, List<URI> uriListWorkspace,
Response response) {
...
}