Search in sources :

Example 1 with FLocat

use of org.mycore.mets.model.files.FLocat 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 2 with FLocat

use of org.mycore.mets.model.files.FLocat in project mycore by MyCoRe-Org.

the class MCRMETSDefaultGenerator method sortFileToGrp.

private void sortFileToGrp(FileSec fileSec, Map.Entry<MCRPath, BasicFileAttributes> file, String fileID, final String href, MCRMetsFileUse fileUse) throws IOException {
    // file
    File metsFile = new File(fileID, MCRContentTypes.probeContentType(file.getKey()));
    FLocat fLocat = new FLocat(LOCTYPE.URL, href);
    metsFile.setFLocat(fLocat);
    for (FileGrp fileGrp : fileSec.getFileGroups()) {
        if (fileGrp.getUse().equalsIgnoreCase(fileUse.toString())) {
            fileGrp.addFile(metsFile);
        }
    }
}
Also used : FileGrp(org.mycore.mets.model.files.FileGrp) FLocat(org.mycore.mets.model.files.FLocat) File(org.mycore.mets.model.files.File)

Example 3 with FLocat

use of org.mycore.mets.model.files.FLocat in project mycore by MyCoRe-Org.

the class MCRMETSHierarchyGenerator method addFile.

private void addFile(String id, FileGrp fileGroup, MCRPath path, String mimeType) {
    File imageFile = new File(id, mimeType);
    try {
        final String href = MCRXMLFunctions.encodeURIPath(path.getOwnerRelativePath().substring(1), true);
        FLocat fLocat = new FLocat(LOCTYPE.URL, href);
        imageFile.setFLocat(fLocat);
        fileGroup.addFile(imageFile);
    } catch (URISyntaxException uriSyntaxException) {
        LOGGER.error("invalid href", uriSyntaxException);
    }
}
Also used : FLocat(org.mycore.mets.model.files.FLocat) URISyntaxException(java.net.URISyntaxException) File(org.mycore.mets.model.files.File)

Example 4 with FLocat

use of org.mycore.mets.model.files.FLocat in project mycore by MyCoRe-Org.

the class MCRMetsSave method updateFiles.

/**
 * Call this method to update the mets.xml if files of the derivate have changed. Files will be added or removed
 * from the mets:fileSec and mets:StructMap[@type=PHYSICAL]. The mets:structLink part will be rebuild after.
 *
 * <p>This method takes care of the group assignment. For example: image files will be added to the MASTER
 * group and ALTO files to the ALTO group. It will also bundle files with the same name e.g. sample1.tiff and
 * alto/sample1.xml to the same physical struct map div.</p>
 *
 * <p><b>Important:</b> This method does not update the mets.xml in the derivate, its just updating the given mets
 * instance.</p>
 *
 * @param mets the mets to update
 * @param derivatePath path to the derivate -&gt; required for looking up new files
 * @throws IOException derivate couldn't be read
 */
public static void updateFiles(Mets mets, final MCRPath derivatePath) throws IOException {
    List<String> metsFiles = mets.getFileSec().getFileGroups().stream().flatMap(g -> g.getFileList().stream()).map(File::getFLocat).map(FLocat::getHref).collect(Collectors.toList());
    List<String> derivateFiles = Files.walk(derivatePath).filter(MCRStreamUtils.not(Files::isDirectory)).map(MCRPath::toMCRPath).map(MCRPath::getOwnerRelativePath).map(path -> path.substring(1)).filter(href -> !"mets.xml".equals(href)).collect(Collectors.toList());
    ArrayList<String> removedFiles = new ArrayList<>(metsFiles);
    removedFiles.removeAll(derivateFiles);
    ArrayList<String> addedFiles = new ArrayList<>(derivateFiles);
    Collections.sort(addedFiles);
    addedFiles.removeAll(metsFiles);
    StructLink structLink = mets.getStructLink();
    PhysicalStructMap physicalStructMap = mets.getPhysicalStructMap();
    List<String> unlinkedLogicalIds = new ArrayList<>();
    // remove files
    PhysicalDiv physicalDiv = physicalStructMap.getDivContainer();
    removedFiles.forEach(href -> {
        File file = null;
        // remove from fileSec
        for (FileGrp grp : mets.getFileSec().getFileGroups()) {
            file = grp.getFileByHref(href);
            if (file != null) {
                grp.removeFile(file);
                break;
            }
        }
        if (file == null) {
            return;
        }
        // remove from physical
        PhysicalSubDiv physicalSubDiv = physicalDiv.byFileId(file.getId());
        physicalSubDiv.remove(physicalSubDiv.getFptr(file.getId()));
        if (physicalSubDiv.getChildren().isEmpty()) {
            physicalDiv.remove(physicalSubDiv);
        }
        // remove from struct link
        structLink.getSmLinkByTo(physicalSubDiv.getId()).forEach(smLink -> {
            structLink.removeSmLink(smLink);
            if (structLink.getSmLinkByFrom(smLink.getFrom()).isEmpty()) {
                unlinkedLogicalIds.add(smLink.getFrom());
            }
        });
    });
    // fix unlinked logical divs
    if (!unlinkedLogicalIds.isEmpty()) {
        // get first physical div
        List<PhysicalSubDiv> physicalChildren = physicalStructMap.getDivContainer().getChildren();
        String firstPhysicalID = physicalChildren.isEmpty() ? physicalStructMap.getDivContainer().getId() : physicalChildren.get(0).getId();
        // a logical div is not linked anymore -> link with first physical div
        unlinkedLogicalIds.forEach(from -> structLink.addSmLink(new SmLink(from, firstPhysicalID)));
    }
    // get last logical div
    LogicalDiv divContainer = mets.getLogicalStructMap().getDivContainer();
    List<LogicalDiv> descendants = divContainer.getDescendants();
    LogicalDiv lastLogicalDiv = descendants.isEmpty() ? divContainer : descendants.get(descendants.size() - 1);
    // add files
    addedFiles.forEach(href -> {
        MCRPath filePath = (MCRPath) derivatePath.resolve(href);
        String fileBase = getFileBase(href);
        try {
            String fileGroupUse = MCRMetsSave.getFileGroupUse(filePath);
            // build file
            String mimeType = MCRContentTypes.probeContentType(filePath);
            String fileId = fileGroupUse.toLowerCase(Locale.ROOT) + "_" + fileBase;
            File file = new File(fileId, mimeType);
            file.setFLocat(new FLocat(LOCTYPE.URL, href));
            // fileSec
            FileGrp fileGroup = mets.getFileSec().getFileGroup(fileGroupUse);
            if (fileGroup == null) {
                fileGroup = new FileGrp(fileGroupUse);
                mets.getFileSec().addFileGrp(fileGroup);
            }
            fileGroup.addFile(file);
            // structMap physical
            String existingFileID = mets.getFileSec().getFileGroups().stream().filter(grp -> !grp.getUse().equals(fileGroupUse)).flatMap(grp -> grp.getFileList().stream()).filter(brotherFile -> fileBase.equals(getFileBase(brotherFile.getFLocat().getHref()))).map(File::getId).findAny().orElse(null);
            PhysicalSubDiv physicalSubDiv;
            if (existingFileID != null) {
                // there is a file (e.g. img or alto) which the same file base -> add the file to this mets:div
                physicalSubDiv = physicalDiv.byFileId(existingFileID);
                physicalSubDiv.add(new Fptr(file.getId()));
            } else {
                // there is no mets:div with this file
                physicalSubDiv = new PhysicalSubDiv(PhysicalSubDiv.ID_PREFIX + fileBase, PhysicalSubDiv.TYPE_PAGE);
                physicalSubDiv.add(new Fptr(file.getId()));
                physicalDiv.add(physicalSubDiv);
            }
            // add to struct link
            structLink.addSmLink(new SmLink(lastLogicalDiv.getId(), physicalSubDiv.getId()));
        } catch (Exception exc) {
            LOGGER.error("Unable to add file {} to mets.xml of {}", href, derivatePath.getOwner(), exc);
        }
    });
}
Also used : Arrays(java.util.Arrays) URLDecoder(java.net.URLDecoder) StructLink(org.mycore.mets.model.struct.StructLink) URISyntaxException(java.net.URISyntaxException) LOCTYPE(org.mycore.mets.model.struct.LOCTYPE) MCRMarkManager(org.mycore.datamodel.common.MCRMarkManager) MCRDerivate(org.mycore.datamodel.metadata.MCRDerivate) Document(org.jdom2.Document) JDOMException(org.jdom2.JDOMException) Locale(java.util.Locale) FileGrp(org.mycore.mets.model.files.FileGrp) Map(java.util.Map) MCRMetsFileUse(org.mycore.mets.model.simple.MCRMetsFileUse) File(org.mycore.mets.model.files.File) Path(java.nio.file.Path) SimpleFileVisitor(java.nio.file.SimpleFileVisitor) PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) Format(org.jdom2.output.Format) MCRPath(org.mycore.datamodel.niofs.MCRPath) Collection(java.util.Collection) MCRPersistenceException(org.mycore.common.MCRPersistenceException) Set(java.util.Set) Mets(org.mycore.mets.model.Mets) Collectors(java.util.stream.Collectors) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) XPathExpression(org.jdom2.xpath.XPathExpression) SmLink(org.mycore.mets.model.struct.SmLink) Objects(java.util.Objects) FileVisitResult(java.nio.file.FileVisitResult) List(java.util.List) Logger(org.apache.logging.log4j.Logger) MCRObjectID(org.mycore.datamodel.metadata.MCRObjectID) LogicalStructMap(org.mycore.mets.model.struct.LogicalStructMap) SAXException(org.xml.sax.SAXException) MCRStreamUtils(org.mycore.common.MCRStreamUtils) MCRPathContent(org.mycore.common.content.MCRPathContent) UnsupportedEncodingException(java.io.UnsupportedEncodingException) Element(org.jdom2.Element) PhysicalDiv(org.mycore.mets.model.struct.PhysicalDiv) XPathFactory(org.jdom2.xpath.XPathFactory) MCRConstants(org.mycore.common.MCRConstants) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) MCRConfiguration(org.mycore.common.config.MCRConfiguration) MessageFormat(java.text.MessageFormat) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) MCRXMLFunctions(org.mycore.common.xml.MCRXMLFunctions) MCRDirectory(org.mycore.datamodel.ifs2.MCRDirectory) OutputStream(java.io.OutputStream) MCRContentTypes(org.mycore.datamodel.niofs.MCRContentTypes) Files(java.nio.file.Files) IOException(java.io.IOException) BasicFileAttributes(java.nio.file.attribute.BasicFileAttributes) PhysicalSubDiv(org.mycore.mets.model.struct.PhysicalSubDiv) XMLOutputter(org.jdom2.output.XMLOutputter) Attribute(org.jdom2.Attribute) Fptr(org.mycore.mets.model.struct.Fptr) Paths(java.nio.file.Paths) FLocat(org.mycore.mets.model.files.FLocat) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) Filters(org.jdom2.filter.Filters) PhysicalStructMap(org.mycore.mets.model.struct.PhysicalStructMap) ArrayList(java.util.ArrayList) StructLink(org.mycore.mets.model.struct.StructLink) FileGrp(org.mycore.mets.model.files.FileGrp) 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) LogicalDiv(org.mycore.mets.model.struct.LogicalDiv) SmLink(org.mycore.mets.model.struct.SmLink) FLocat(org.mycore.mets.model.files.FLocat) Files(java.nio.file.Files) MCRPath(org.mycore.datamodel.niofs.MCRPath) File(org.mycore.mets.model.files.File)

Example 5 with FLocat

use of org.mycore.mets.model.files.FLocat in project mycore by MyCoRe-Org.

the class MCRMetsSave method updateOnFileAdd.

// TODO: should use mets-model api
/**
 * Alters the mets file
 *
 * @param mets
 *            the unmodified source
 * @param file
 *            the file to add
 * @return the modified mets or null if an exception occures
 */
private static Document updateOnFileAdd(Document mets, MCRPath file) {
    try {
        // check for file existance (if a derivate with mets.xml is uploaded
        String relPath = MCRXMLFunctions.encodeURIPath(file.getOwnerRelativePath().substring(1));
        // Check if file already exists -> if yes do nothing
        String fileExistPathString = "mets:mets/mets:fileSec/mets:fileGrp/mets:file/mets:FLocat[@xlink:href='" + relPath + "']";
        XPathExpression<Element> xpath = XPathFactory.instance().compile(fileExistPathString, Filters.element(), null, MCRConstants.METS_NAMESPACE, MCRConstants.XLINK_NAMESPACE);
        if (xpath.evaluate(mets).size() > 0) {
            String msgTemplate = "The File : '%s' already exists in mets.xml";
            LOGGER.warn(String.format(Locale.ROOT, msgTemplate, relPath));
            return null;
        } else {
            String msgTemplate = "The File : '%s' does not exists in mets.xml";
            LOGGER.warn(String.format(Locale.ROOT, msgTemplate, relPath));
        }
        // add to file section
        String contentType = MCRContentTypes.probeContentType(file);
        LOGGER.warn(MessageFormat.format("Content Type is : {0}", contentType));
        String fileGrpUSE = getFileGroupUse(file);
        String fileId = MessageFormat.format("{0}_{1}", fileGrpUSE.toLowerCase(Locale.ROOT), getFileBase(relPath));
        org.mycore.mets.model.files.File fileAsMetsFile = new org.mycore.mets.model.files.File(fileId, contentType);
        FLocat fLocat = new FLocat(LOCTYPE.URL, relPath);
        fileAsMetsFile.setFLocat(fLocat);
        Element fileSec = getFileGroup(mets, fileGrpUSE);
        fileSec.addContent(fileAsMetsFile.asElement());
        if (fileGrpUSE.equals(MCRMetsFileUse.DEFAULT.toString())) {
            updateOnImageFile(mets, fileId, relPath);
        } else {
            updateOnCustomFile(mets, fileId, relPath);
        }
    } catch (Exception ex) {
        LOGGER.error("Error occured while adding file {} to the existing mets file", file, ex);
        return null;
    }
    return mets;
}
Also used : Element(org.jdom2.Element) FLocat(org.mycore.mets.model.files.FLocat) File(org.mycore.mets.model.files.File) File(org.mycore.mets.model.files.File) 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)

Aggregations

FLocat (org.mycore.mets.model.files.FLocat)6 File (org.mycore.mets.model.files.File)6 FileGrp (org.mycore.mets.model.files.FileGrp)4 URISyntaxException (java.net.URISyntaxException)3 MCRPersistenceException (org.mycore.common.MCRPersistenceException)3 Fptr (org.mycore.mets.model.struct.Fptr)3 PhysicalDiv (org.mycore.mets.model.struct.PhysicalDiv)3 PhysicalStructMap (org.mycore.mets.model.struct.PhysicalStructMap)3 PhysicalSubDiv (org.mycore.mets.model.struct.PhysicalSubDiv)3 IOException (java.io.IOException)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 Element (org.jdom2.Element)2 JDOMException (org.jdom2.JDOMException)2 MCRMetsFileUse (org.mycore.mets.model.simple.MCRMetsFileUse)2 SAXException (org.xml.sax.SAXException)2 OutputStream (java.io.OutputStream)1 URLDecoder (java.net.URLDecoder)1 FileVisitResult (java.nio.file.FileVisitResult)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1