use of org.mycore.mets.model.struct.LogicalDiv in project mycore by MyCoRe-Org.
the class MCRMetsMods2IIIFConverter method convert.
public MCRIIIFManifest convert() {
MCRIIIFManifest manifest = new MCRIIIFManifest();
// root chapter ^= manifest metadata
LogicalStructMap logicalStructMap = (LogicalStructMap) mets.getStructMap("LOGICAL");
LogicalDiv divContainer = logicalStructMap.getDivContainer();
List<MCRIIIFMetadata> metadata = extractMedataFromLogicalDiv(mets, divContainer);
manifest.metadata = metadata;
manifest.setId(this.identifier);
PhysicalStructMap physicalStructMap = (PhysicalStructMap) mets.getStructMap("PHYSICAL");
PhysicalDiv physicalDivContainer = physicalStructMap.getDivContainer();
String id = physicalDivContainer.getId();
MCRIIIFSequence sequence = new MCRIIIFSequence(id);
List<PhysicalSubDiv> children = physicalDivContainer.getChildren();
MCRIIIFImageImpl imageImpl = MCRIIIFImageImpl.getInstance(getImageImplName());
MCRIIIFImageProfile profile = imageImpl.getProfile();
profile.setId(MCRIIIFImageUtil.getProfileLink(imageImpl));
sequence.canvases = children.stream().map(physicalSubDiv -> {
String order = physicalSubDiv.asElement().getAttributeValue("ORDER");
String orderLabel = physicalSubDiv.getOrderLabel();
String contentids = physicalSubDiv.getContentids();
String label = Stream.of(order, orderLabel, contentids).filter(o -> o != null && !o.isEmpty()).collect(Collectors.joining(" - "));
String identifier = this.physicalIdentifierMap.get(physicalSubDiv);
try {
MCRIIIFImageInformation information = imageImpl.getInformation(identifier);
MCRIIIFCanvas canvas = new MCRIIIFCanvas(identifier, label, information.width, information.height);
MCRIIIFAnnotation annotation = new MCRIIIFAnnotation(identifier, canvas);
canvas.images.add(annotation);
MCRIIIFResource resource = new MCRIIIFResource(information.getId(), MCRDCMIType.Image);
resource.setWidth(information.width);
resource.setHeight(information.height);
MCRIIIFService service = new MCRIIIFService(information.getId(), profile.getContext());
service.profile = MCRIIIFImageProfile.IIIF_PROFILE_2_0;
resource.setService(service);
annotation.setResource(resource);
return canvas;
} catch (MCRIIIFImageNotFoundException | MCRIIIFImageProvidingException e) {
throw new MCRException("Error while providing ImageInfo for " + identifier, e);
} catch (MCRAccessException e) {
LOGGER.warn("User has no access to {}", identifier);
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList());
manifest.sequences.add(sequence);
List<MCRIIIFRange> complete = new ArrayList<>();
processDivContainer(complete, divContainer);
manifest.structures.addAll(complete);
manifest.setLabel(metadata.stream().filter(m -> m.getLabel().equals("title")).findFirst().get().getStringValue().get());
return manifest;
}
use of org.mycore.mets.model.struct.LogicalDiv in project mycore by MyCoRe-Org.
the class MCRMETSHierarchyGenerator method newLogicalStructMap.
protected LogicalStructMap newLogicalStructMap() {
LogicalStructMap lstr = new LogicalStructMap();
MCRObjectID objId = this.rootObj.getId();
// create main div
String amdId = this.amdSection.getId();
String dmdId = this.dmdSection.getId();
LogicalDiv logicalDiv = new LogicalDiv(objId.toString(), getType(this.rootObj), getLabel(this.rootObj), amdId, dmdId);
lstr.setDivContainer(logicalDiv);
// run through all children
newLogicalStructMap(this.rootObj, logicalDiv);
// remove not linked logical divs
logicalDiv.getChildren().removeIf(child -> !validateLogicalStruct(child));
return lstr;
}
use of org.mycore.mets.model.struct.LogicalDiv in project mycore by MyCoRe-Org.
the class MCRMETSHierarchyGenerator method mergeOldLogicalStructMap.
/**
* Runs through the logical part of the old mets and copies the ALTO part (mets:fptr/mets:seq/mets:area)
* to the newly created logical struct map. This is done by comparing the mets:div @ID's of the old and the new
* logical struct map. If two @ID's are equal, we can assume that it is the same mets:div and we just copy all
* the old mets:fptr's.
*
* @param logicalStructMap the logical struct map to enhance
*/
protected void mergeOldLogicalStructMap(LogicalStructMap logicalStructMap) {
if (!this.getOldMets().isPresent()) {
return;
}
Mets oldMets = this.getOldMets().get();
LogicalStructMap oldLsm = oldMets.getLogicalStructMap();
FileGrp oldAltoGroup = oldMets.getFileSec().getFileGroup("ALTO");
FileGrp newAltoGroup = this.fileSection.getFileGroup("ALTO");
List<LogicalDiv> descendants = oldLsm.getDivContainer().getDescendants();
descendants.stream().filter(div -> !div.getFptrList().isEmpty()).forEach(oldDiv -> {
String id = oldDiv.getId();
LogicalDiv newDiv = logicalStructMap.getDivContainer().getLogicalSubDiv(id);
if (newDiv != null) {
for (Fptr fptr : oldDiv.getFptrList()) {
copyFptr(oldAltoGroup, newAltoGroup, fptr).ifPresent(newFptr -> newDiv.getFptrList().add(newFptr));
}
}
updateStructLinkMapUsingALTO(newDiv);
});
}
use of org.mycore.mets.model.struct.LogicalDiv in project mycore by MyCoRe-Org.
the class MCRMetsSave method updateOnFileDelete.
/**
* @param mets
* @param file
* @return
*/
private static Document updateOnFileDelete(Document mets, MCRPath file) {
Mets modifiedMets;
try {
modifiedMets = new Mets(mets);
String href = file.getOwnerRelativePath().substring(1);
PhysicalStructMap physStructMap = (PhysicalStructMap) modifiedMets.getStructMap(PhysicalStructMap.TYPE);
PhysicalDiv divContainer = physStructMap.getDivContainer();
// search the right group and remove the file from the group
List<FileGrp> fileGroups = modifiedMets.getFileSec().getFileGroups();
for (FileGrp fileGrp : fileGroups) {
if (fileGrp.contains(href)) {
org.mycore.mets.model.files.File fileToRemove = fileGrp.getFileByHref(href);
fileGrp.removeFile(fileToRemove);
ArrayList<PhysicalSubDiv> physicalSubDivsToRemove = new ArrayList<>();
// remove file from mets:mets/mets:structMap[@TYPE='PHYSICAL']
for (PhysicalSubDiv physicalSubDiv : divContainer.getChildren()) {
ArrayList<Fptr> fptrsToRemove = new ArrayList<>();
for (Fptr fptr : physicalSubDiv.getChildren()) {
if (fptr.getFileId().equals(fileToRemove.getId())) {
if (fileGrp.getUse().equals(FileGrp.USE_MASTER)) {
physicalSubDivsToRemove.add(physicalSubDiv);
} else {
fptrsToRemove.add(fptr);
}
}
}
for (Fptr fptrToRemove : fptrsToRemove) {
LOGGER.warn(String.format(Locale.ROOT, "remove fptr \"%s\" from mets.xml of \"%s\"", fptrToRemove.getFileId(), file.getOwner()));
physicalSubDiv.remove(fptrToRemove);
}
}
for (PhysicalSubDiv physicalSubDivToRemove : physicalSubDivsToRemove) {
// remove links in mets:structLink section
List<SmLink> list = modifiedMets.getStructLink().getSmLinkByTo(physicalSubDivToRemove.getId());
LogicalStructMap logicalStructMap = (LogicalStructMap) modifiedMets.getStructMap(LogicalStructMap.TYPE);
for (SmLink linkToRemove : list) {
LOGGER.warn(String.format(Locale.ROOT, "remove smLink from \"%s\" to \"%s\"", linkToRemove.getFrom(), linkToRemove.getTo()));
modifiedMets.getStructLink().removeSmLink(linkToRemove);
// modify logical struct Map
String logID = linkToRemove.getFrom();
// the deleted file was not directly assigned to a structure
if (logicalStructMap.getDivContainer().getId().equals(logID)) {
continue;
}
LogicalDiv logicalDiv = logicalStructMap.getDivContainer().getLogicalSubDiv(logID);
if (logicalDiv == null) {
LOGGER.error("Could not find {} with id {}", LogicalDiv.class.getSimpleName(), logID);
LOGGER.error("Mets document remains unchanged");
return mets;
}
// there are still files for this logical sub div, nothing to do
if (modifiedMets.getStructLink().getSmLinkByFrom(logicalDiv.getId()).size() > 0) {
continue;
}
// the logical div has other divs included, nothing to do
if (logicalDiv.getChildren().size() > 0) {
continue;
}
/*
* the log div might be in a hierarchy of divs, which may now be empty
* (only containing empty directories), if so the parent of the log div
* must be deleted
* */
handleParents(logicalDiv, modifiedMets);
logicalStructMap.getDivContainer().remove(logicalDiv);
}
divContainer.remove(physicalSubDivToRemove);
}
}
}
} catch (Exception ex) {
LOGGER.error("Error occured while removing file {} from the existing mets file", file, ex);
return null;
}
return modifiedMets.asDocument();
}
use of org.mycore.mets.model.struct.LogicalDiv in project mycore by MyCoRe-Org.
the class MCRMetsSave method handleParents.
/**
* @param logDiv
* @param mets
*/
private static void handleParents(LogicalDiv logDiv, Mets mets) {
LogicalDiv parent = logDiv.getParent();
// there are files for the parent of the log div, thus nothing to do
if (mets.getStructLink().getSmLinkByFrom(parent.getId()).size() > 0) {
return;
}
// no files associated to the parent of the log div
LogicalDiv logicalDiv = ((LogicalStructMap) mets.getStructMap(LogicalStructMap.TYPE)).getDivContainer();
if (parent.getParent() == logicalDiv) {
// the parent the log div container itself, thus we quit here and remove the log div
logicalDiv.remove(parent);
} else {
handleParents(parent, mets);
}
}
Aggregations