Search in sources :

Example 1 with PhysicalStructMap

use of org.mycore.mets.model.struct.PhysicalStructMap 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;
}
Also used : PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) MCRIIIFCanvas(org.mycore.iiif.presentation.model.basic.MCRIIIFCanvas) MCRIIIFImageUtil(org.mycore.iiif.image.MCRIIIFImageUtil) MCRIIIFImageImpl(org.mycore.iiif.image.impl.MCRIIIFImageImpl) MCRConstants(org.mycore.common.MCRConstants) MCRIIIFImageProvidingException(org.mycore.iiif.image.impl.MCRIIIFImageProvidingException) MCRIIIFImageProfile(org.mycore.iiif.image.model.MCRIIIFImageProfile) HashMap(java.util.HashMap) MCRIIIFSequence(org.mycore.iiif.presentation.model.basic.MCRIIIFSequence) MCRException(org.mycore.common.MCRException) ArrayList(java.util.ArrayList) Document(org.jdom2.Document) MCRIIIFService(org.mycore.iiif.presentation.model.attributes.MCRIIIFService) FileGrp(org.mycore.mets.model.files.FileGrp) Map(java.util.Map) MCRDCMIType(org.mycore.iiif.presentation.model.attributes.MCRDCMIType) MCRIIIFResource(org.mycore.iiif.presentation.model.attributes.MCRIIIFResource) MCRAccessException(org.mycore.access.MCRAccessException) File(org.mycore.mets.model.files.File) PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) MCRIIIFAnnotation(org.mycore.iiif.presentation.model.additional.MCRIIIFAnnotation) MCRIIIFViewingHint(org.mycore.iiif.presentation.model.attributes.MCRIIIFViewingHint) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) MCRIIIFManifest(org.mycore.iiif.presentation.model.basic.MCRIIIFManifest) Mets(org.mycore.mets.model.Mets) Collectors(java.util.stream.Collectors) MCRIIIFRange(org.mycore.iiif.presentation.model.basic.MCRIIIFRange) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) MDTYPE(org.mycore.mets.model.struct.MDTYPE) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv) Objects(java.util.Objects) List(java.util.List) Stream(java.util.stream.Stream) Logger(org.apache.logging.log4j.Logger) MCRIIIFImageNotFoundException(org.mycore.iiif.image.impl.MCRIIIFImageNotFoundException) MCRIIIFImageInformation(org.mycore.iiif.image.model.MCRIIIFImageInformation) LogicalStructMap(org.mycore.mets.model.struct.LogicalStructMap) DmdSec(org.mycore.mets.model.sections.DmdSec) MdWrap(org.mycore.mets.model.struct.MdWrap) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) MCRIIIFMetadata(org.mycore.iiif.presentation.model.attributes.MCRIIIFMetadata) PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) ArrayList(java.util.ArrayList) MCRIIIFSequence(org.mycore.iiif.presentation.model.basic.MCRIIIFSequence) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv) MCRIIIFRange(org.mycore.iiif.presentation.model.basic.MCRIIIFRange) LogicalStructMap(org.mycore.mets.model.struct.LogicalStructMap) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) MCRIIIFCanvas(org.mycore.iiif.presentation.model.basic.MCRIIIFCanvas) MCRIIIFMetadata(org.mycore.iiif.presentation.model.attributes.MCRIIIFMetadata) MCRIIIFService(org.mycore.iiif.presentation.model.attributes.MCRIIIFService) MCRIIIFImageImpl(org.mycore.iiif.image.impl.MCRIIIFImageImpl) MCRException(org.mycore.common.MCRException) MCRIIIFManifest(org.mycore.iiif.presentation.model.basic.MCRIIIFManifest) MCRIIIFImageInformation(org.mycore.iiif.image.model.MCRIIIFImageInformation) MCRIIIFResource(org.mycore.iiif.presentation.model.attributes.MCRIIIFResource) MCRAccessException(org.mycore.access.MCRAccessException) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) MCRIIIFImageProfile(org.mycore.iiif.image.model.MCRIIIFImageProfile) MCRIIIFAnnotation(org.mycore.iiif.presentation.model.additional.MCRIIIFAnnotation) Objects(java.util.Objects)

Example 2 with PhysicalStructMap

use of org.mycore.mets.model.struct.PhysicalStructMap in project mycore by MyCoRe-Org.

the class MCRMETSHierarchyGenerator method createPhysicalStruct.

/**
 * This method creates the physical structure map.
 *
 * @return generated pyhiscal struct map secion.
 */
protected PhysicalStructMap createPhysicalStruct() {
    PhysicalStructMap pstr = new PhysicalStructMap();
    PhysicalDiv physicalDiv = new PhysicalDiv("phys_" + this.mcrDer.getId(), PhysicalDiv.TYPE_PHYS_SEQ);
    pstr.setDivContainer(physicalDiv);
    // run through file references
    for (FileRef ref : this.files) {
        String physId = ref.toPhysId();
        PhysicalSubDiv page = physicalDiv.get(physId);
        if (page == null) {
            page = new PhysicalSubDiv(physId, PhysicalSubDiv.TYPE_PAGE);
            getOrderLabel(ref.toId()).ifPresent(page::setOrderLabel);
            physicalDiv.add(page);
        }
        page.add(new Fptr(ref.toId()));
    }
    return pstr;
}
Also used : PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) Fptr(org.mycore.mets.model.struct.Fptr) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv)

Example 3 with PhysicalStructMap

use of org.mycore.mets.model.struct.PhysicalStructMap 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();
}
Also used : PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) FileGrp(org.mycore.mets.model.files.FileGrp) ArrayList(java.util.ArrayList) Fptr(org.mycore.mets.model.struct.Fptr) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) URISyntaxException(java.net.URISyntaxException) JDOMException(org.jdom2.JDOMException) MCRPersistenceException(org.mycore.common.MCRPersistenceException) SAXException(org.xml.sax.SAXException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) IOException(java.io.IOException) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv) LogicalStructMap(org.mycore.mets.model.struct.LogicalStructMap) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) SmLink(org.mycore.mets.model.struct.SmLink) Mets(org.mycore.mets.model.Mets) File(org.mycore.mets.model.files.File)

Example 4 with PhysicalStructMap

use of org.mycore.mets.model.struct.PhysicalStructMap in project mycore by MyCoRe-Org.

the class MCRDFGLinkServlet method getOrderNumber.

private static int getOrderNumber(Document metsDoc, String fileHref) {
    int orderNumber = -1;
    String fileID = null;
    try {
        Mets mets = new Mets(metsDoc);
        List<FileGrp> fileGroups = mets.getFileSec().getFileGroups();
        for (FileGrp fileGrp : fileGroups) {
            List<File> fileList = fileGrp.getFileList();
            for (File file : fileList) {
                FLocat fLocat = file.getFLocat();
                if (fLocat.getHref().equals(MCRXMLFunctions.encodeURIPath(fileHref)))
                    fileID = file.getId();
            }
        }
        if (fileID != null) {
            PhysicalStructMap structMap = (PhysicalStructMap) mets.getStructMap(PhysicalStructMap.TYPE);
            PhysicalDiv rootDiv = structMap.getDivContainer();
            List<PhysicalSubDiv> children = rootDiv.getChildren();
            for (int index = 0; index < children.size(); index++) {
                PhysicalSubDiv physicalSubDiv = children.get(index);
                List<Fptr> fptrList = physicalSubDiv.getChildren();
                for (Fptr fptr : fptrList) {
                    if (fptr.getFileId().equals(fileID))
                        orderNumber = index + 1;
                }
            }
        }
    } catch (Exception e) {
        throw new MCRPersistenceException("could not parse mets.xml", e);
    }
    return orderNumber;
}
Also used : PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) FileGrp(org.mycore.mets.model.files.FileGrp) Fptr(org.mycore.mets.model.struct.Fptr) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) MCRPersistenceException(org.mycore.common.MCRPersistenceException) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv) Mets(org.mycore.mets.model.Mets) FLocat(org.mycore.mets.model.files.FLocat) File(org.mycore.mets.model.files.File) MCRPersistenceException(org.mycore.common.MCRPersistenceException)

Example 5 with PhysicalStructMap

use of org.mycore.mets.model.struct.PhysicalStructMap in project mycore by MyCoRe-Org.

the class MCRMETSDefaultGenerator method createMets.

private Mets createMets() throws IOException {
    Mets mets = new Mets();
    String owner = getOwner();
    // add dmdsec
    DmdSec dmdSec = new DmdSec("dmd_" + owner);
    // add amdsec
    AmdSec amdSec = new AmdSec("amd_" + owner);
    // file sec
    FileSec fileSec = new FileSec();
    for (MCRMetsFileUse fileUse : MCRMetsFileUse.values()) {
        FileGrp fileGrp = new FileGrp(fileUse.toString());
        fileSec.addFileGrp(fileGrp);
    }
    // physical structure
    PhysicalStructMap physicalStructMap = new PhysicalStructMap();
    PhysicalDiv physicalDiv = new PhysicalDiv("phys_" + owner, "physSequence");
    physicalStructMap.setDivContainer(physicalDiv);
    // logical structure
    MCRILogicalStructMapTypeProvider typeProvider = getTypeProvider();
    LogicalStructMap logicalStructMap = new LogicalStructMap();
    LogicalDiv logicalDiv = new LogicalDiv("log_" + owner, typeProvider.getType(MCRObjectID.getInstance(owner)), owner, amdSec.getId(), dmdSec.getId());
    logicalDiv.setDmdId(dmdSec.getId());
    logicalStructMap.setDivContainer(logicalDiv);
    // struct Link
    StructLink structLink = new StructLink();
    // create internal structure
    structureMets(getDerivatePath(), getIgnorePaths(), fileSec, physicalDiv, logicalDiv, structLink, 0);
    hrefIdMap.clear();
    // add to mets
    mets.addDmdSec(dmdSec);
    mets.addAmdSec(amdSec);
    mets.setFileSec(fileSec);
    mets.addStructMap(physicalStructMap);
    mets.addStructMap(logicalStructMap);
    mets.setStructLink(structLink);
    return mets;
}
Also used : AmdSec(org.mycore.mets.model.sections.AmdSec) PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) FileGrp(org.mycore.mets.model.files.FileGrp) StructLink(org.mycore.mets.model.struct.StructLink) DmdSec(org.mycore.mets.model.sections.DmdSec) MCRMetsFileUse(org.mycore.mets.model.simple.MCRMetsFileUse) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) LogicalStructMap(org.mycore.mets.model.struct.LogicalStructMap) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) FileSec(org.mycore.mets.model.files.FileSec)

Aggregations

PhysicalStructMap (org.mycore.mets.model.struct.PhysicalStructMap)8 FileGrp (org.mycore.mets.model.files.FileGrp)7 PhysicalDiv (org.mycore.mets.model.struct.PhysicalDiv)7 PhysicalSubDiv (org.mycore.mets.model.struct.PhysicalSubDiv)7 Mets (org.mycore.mets.model.Mets)5 File (org.mycore.mets.model.files.File)5 Fptr (org.mycore.mets.model.struct.Fptr)5 LogicalDiv (org.mycore.mets.model.struct.LogicalDiv)5 LogicalStructMap (org.mycore.mets.model.struct.LogicalStructMap)5 ArrayList (java.util.ArrayList)4 MCRMetsFileUse (org.mycore.mets.model.simple.MCRMetsFileUse)4 List (java.util.List)3 Map (java.util.Map)3 Document (org.jdom2.Document)3 IOException (java.io.IOException)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 URISyntaxException (java.net.URISyntaxException)2 Collections (java.util.Collections)2 HashMap (java.util.HashMap)2 Objects (java.util.Objects)2