org.mycore.datamodel.niofs.MCRPathXML.java Source code

Java tutorial

Introduction

Here is the source code for org.mycore.datamodel.niofs.MCRPathXML.java

Source

/**
 * 
 * $Revision: 28688 $ $Date: 2013-12-18 15:27:20 +0100 (Wed, 18 Dec 2013) $
 *
 * This file is part of ** M y C o R e **
 * Visit our homepage at http://www.mycore.de/ for details.
 *
 * This program is free software; you can use it, redistribute it
 * and / or modify it under the terms of the GNU General Public License
 * (GPL) as published by the Free Software Foundation; either version 2
 * of the License or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program, normally in the file license.txt.
 * If not, write to the Free Software Foundation Inc.,
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307 USA
 *
 **/
package org.mycore.datamodel.niofs;

import static org.mycore.datamodel.niofs.MCRAbstractFileSystem.SEPARATOR;
import static org.mycore.datamodel.niofs.MCRAbstractFileSystem.SEPARATOR_STRING;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
import java.util.Collection;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jdom2.Document;
import org.jdom2.Element;
import org.mycore.common.MCRConstants;
import org.mycore.datamodel.classifications2.MCRCategLinkReference;
import org.mycore.datamodel.classifications2.MCRCategLinkServiceFactory;
import org.mycore.datamodel.classifications2.MCRCategoryID;
import org.mycore.datamodel.metadata.MCRMetadataManager;
import org.mycore.datamodel.metadata.MCRObjectID;

;

/**
 * @author Thomas Scheffler (yagee)
 * @version $Revision: 28688 $ $Date: 2013-12-18 15:27:20 +0100 (Wed, 18 Dec 2013) $
 */
public class MCRPathXML {

    static Logger LOGGER = LogManager.getLogger(MCRPathXML.class);

    private MCRPathXML() {
    }

    public static Document getDirectoryXML(MCRPath path) throws IOException {
        BasicFileAttributes attr = path.getFileSystem().provider().readAttributes(path, BasicFileAttributes.class);
        return getDirectoryXML(path, attr);
    }

    /**
     * Sends the contents of an MCRDirectory as XML data to the client
     */
    public static Document getDirectoryXML(MCRPath path, BasicFileAttributes attr) throws IOException {
        LOGGER.debug("MCRDirectoryXML: start listing of directory " + path.toString());

        Element root = new Element("mcr_directory");
        Document doc = new org.jdom2.Document(root);

        addString(root, "uri", path.toUri().toString(), false);
        addString(root, "ownerID", path.getOwner(), false);
        MCRPath relativePath = path.getRoot().relativize(path);
        boolean isRoot = relativePath.toString().isEmpty();
        addString(root, "name", (isRoot ? "" : relativePath.getFileName().toString()), true);
        addString(root, "path", toStringValue(relativePath), true);
        if (!isRoot) {
            addString(root, "parentPath", toStringValue(relativePath.getParent()), true);
        }
        addBasicAttributes(root, attr, path);
        Element numChildren = new Element("numChildren");
        Element here = new Element("here");
        root.addContent(numChildren);
        numChildren.addContent(here);

        Element nodes = new Element("children");
        root.addContent(nodes);
        SortedMap<MCRPath, MCRFileAttributes<?>> directories = new TreeMap<>();
        SortedMap<MCRPath, MCRFileAttributes<?>> files = new TreeMap<>();
        try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(path)) {
            for (Path child : dirStream) {
                MCRFileAttributes<?> childAttrs = Files.readAttributes(child, MCRFileAttributes.class);
                if (childAttrs.isDirectory()) {
                    directories.put(MCRPath.toMCRPath(child), childAttrs);
                } else {
                    files.put(MCRPath.toMCRPath(child), childAttrs);
                }
            }
        }
        //store current directory statistics
        addString(here, "directories", Integer.toString(directories.size()), false);
        addString(here, "files", Integer.toString(files.size()), false);
        for (Map.Entry<MCRPath, MCRFileAttributes<?>> dirEntry : directories.entrySet()) {
            Element child = new Element("child");
            child.setAttribute("type", "directory");
            addString(child, "name", dirEntry.getKey().getFileName().toString(), true);
            addString(child, "uri", dirEntry.getKey().toUri().toString(), false);
            nodes.addContent(child);
            addBasicAttributes(child, dirEntry.getValue(), dirEntry.getKey());
        }
        for (Map.Entry<MCRPath, MCRFileAttributes<?>> fileEntry : files.entrySet()) {
            Element child = new Element("child");
            child.setAttribute("type", "file");
            addString(child, "name", fileEntry.getKey().getFileName().toString(), true);
            addString(child, "uri", fileEntry.getKey().toUri().toString(), false);
            nodes.addContent(child);
            addAttributes(child, fileEntry.getValue(), fileEntry.getKey());
        }

        LOGGER.debug("MCRDirectoryXML: end listing of directory " + path);

        return doc;

    }

    /**
     * Returns metadata of the file retrievable by 'path' in XML form. Same as
     * {@link #getFileXML(MCRPath, BasicFileAttributes)}, but attributes are retrieved first.
     */
    public static Document getFileXML(MCRPath path) throws IOException {
        MCRFileAttributes<?> attrs = Files.readAttributes(path, MCRFileAttributes.class);
        return getFileXML(path, attrs);
    }

    /**
     * Returns metadata of the file retrievable by 'path' in XML form.
     * 
     * @param path
     *            Path to File
     * @param attrs
     *            file attributes of given file
     */
    public static Document getFileXML(MCRPath path, BasicFileAttributes attrs) throws IOException {
        Element root = new Element("file");
        root.setAttribute("uri", path.toUri().toString());
        root.setAttribute("ownerID", path.getOwner());
        String fileName = path.getFileName().toString();
        root.setAttribute("name", fileName);
        String absolutePath = path.getOwnerRelativePath();
        root.setAttribute("path", absolutePath);
        root.setAttribute("extension", getFileExtension(fileName));
        root.setAttribute("returnId", MCRMetadataManager
                .getObjectId(MCRObjectID.getInstance(path.getOwner()), 10, TimeUnit.SECONDS).toString());
        Collection<MCRCategoryID> linksFromReference = MCRCategLinkServiceFactory.getInstance()
                .getLinksFromReference(new MCRCategLinkReference(path));
        for (MCRCategoryID category : linksFromReference) {
            Element catEl = new Element("category");
            catEl.setAttribute("id", category.toString());
            root.addContent(catEl);
        }
        if (!attrs.isDirectory() && attrs instanceof MCRFileAttributes<?>) {
            addAttributes(root, (MCRFileAttributes<?>) attrs, path);
        } else {
            addBasicAttributes(root, attrs, path);
        }
        return new Document(root);
    }

    private static String getFileExtension(String fileName) {
        if (fileName.endsWith(".")) {
            return "";
        }
        int pos = fileName.lastIndexOf(".");
        return pos == -1 ? "" : fileName.substring(pos + 1);
    }

    private static String toStringValue(MCRPath relativePath) {
        if (relativePath == null) {
            return SEPARATOR_STRING;
        }
        String pathString = relativePath.toString();
        if (pathString.isEmpty()) {
            return SEPARATOR_STRING;
        }
        if (pathString.equals(SEPARATOR_STRING)) {
            return pathString;
        }
        return SEPARATOR + pathString + SEPARATOR;
    }

    private static void addBasicAttributes(Element root, BasicFileAttributes attr, MCRPath path)
            throws IOException {
        addString(root, "size", String.valueOf(attr.size()), false);
        addDate(root, "created", attr.creationTime());
        addDate(root, "lastModified", attr.lastModifiedTime());
        addDate(root, "lastAccessed", attr.lastAccessTime());
        if (attr.isRegularFile()) {
            addString(root, "contentType", MCRContentTypes.probeContentType(path), false);
        }
    }

    private static void addAttributes(Element root, MCRFileAttributes<?> attr, MCRPath path) throws IOException {
        addBasicAttributes(root, attr, path);
        addString(root, "md5", attr.md5sum(), false);
    }

    private static void addDate(Element parent, String type, FileTime date) {
        Element xDate = new Element("date");
        parent.addContent(xDate);
        xDate.setAttribute("type", type);
        xDate.addContent(date.toString());
    }

    private static void addString(Element parent, String itemName, String content, boolean preserve) {
        if (content == null) {
            return;
        }
        Element child = new Element(itemName).addContent(content);
        if (preserve) {
            child.setAttribute("space", "preserve", MCRConstants.XML_NAMESPACE);
        }
        parent.addContent(child);
    }
}