org.goobi.production.importer.GoobiHotfolder.java Source code

Java tutorial

Introduction

Here is the source code for org.goobi.production.importer.GoobiHotfolder.java

Source

/*
 * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
 *
 * This file is part of the Kitodo project.
 *
 * It is licensed under GNU General Public License version 3 or later.
 *
 * For the full copyright and license information, please read the
 * GPL3-License.txt file that was distributed with this source code.
 */

package org.goobi.production.importer;

import de.sub.goobi.config.ConfigCore;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.goobi.production.plugin.interfaces.IGoobiHotfolder;
import org.kitodo.services.ServiceManager;
import org.kitodo.services.file.FileService;

public class GoobiHotfolder implements IGoobiHotfolder {

    /** Logger for this class. */
    private static final Logger logger = LogManager.getLogger(GoobiHotfolder.class);

    private String name;
    private URI folder;
    private Integer template;
    private String updateStrategy;
    private String collection;

    private final ServiceManager serviceManager = new ServiceManager();
    public final FileService fileService = serviceManager.getFileService();

    /**
     * Constructor.
     *
     * @param name
     *            String
     * @param folder
     *            SafeFile
     * @param template
     *            Integer
     * @param updateStrategy
     *            String
     * @param collection
     *            String
     */
    public GoobiHotfolder(String name, URI folder, Integer template, String updateStrategy, String collection) {
        this.setName(name);
        this.folder = folder;
        this.setTemplate(template);
        this.setUpdateStrategy(updateStrategy);
        this.setCollection(collection);
    }

    /**
     * Get current files.
     *
     * @return a list with all xml files in GoobiHotfolder
     */
    @Override
    public List<URI> getCurrentFiles() {
        return fileService.getSubUris(this.folder);
    }

    /**
     * Get files by name.
     *
     * @param name
     *            String
     * @return a list with all filenames containing the name in GoobiHotfolder
     */

    @Override
    public List<URI> getFilesByName(String name) {
        ArrayList<URI> files = fileService.getSubUris(this.folder);
        List<URI> answer = new ArrayList<>();
        for (URI file : files) {
            if (file.toString().contains(name) && !file.toString().contains("anchor")) {
                answer.add(file);
            }
        }
        return answer;
    }

    /**
     * Get file names by filter.
     *
     * @param filter
     *            FilenameFilter object
     * @return a list with all file names matching the filter
     */
    @Override
    public List<URI> getFileNamesByFilter(FilenameFilter filter) {
        return fileService.getSubUris(filter, this.folder);
    }

    /**
     * Get files by filter.
     *
     * @param filter
     *            FilenameFilter object
     * @return a list with all file matching the filter
     */
    @Override
    public List<URI> getFilesByFilter(FilenameFilter filter) {
        return fileService.getSubUris(filter, this.folder);
    }

    @Override
    public String getFolderAsString() {
        return this.folder.getPath() + File.separator;
    }

    @Override
    public File getFolderAsFile() {
        return new File(this.folder.getPath());
    }

    @Override
    public URI getFolderAsUri() {
        return this.folder;
    }

    /**
     * true if file is xml file and no anchor file.
     */
    public static final FilenameFilter filter = new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return !name.contains("anchor") && !name.endsWith("_") && name.endsWith(".xml");
        }
    };

    /**
     * Get instances.
     *
     * @return list of GoobiHotfolder objects
     */
    public static List<GoobiHotfolder> getInstances() {
        logger.trace("config 1");
        List<GoobiHotfolder> answer = new ArrayList<>();
        logger.trace("config 2");

        try {
            XMLConfiguration config = new XMLConfiguration(
                    ConfigCore.getKitodoConfigDirectory() + "kitodo_hotfolder.xml");

            logger.trace("config 3");

            config.setListDelimiter('&');

            logger.trace("config 4");
            config.setReloadingStrategy(new FileChangedReloadingStrategy());
            logger.trace("config 5");

            int count = config.getMaxIndex("hotfolder");
            logger.trace("config 6");

            for (int i = 0; i <= count; i++) {

                logger.trace("config 7");
                String name = config.getString("hotfolder(" + i + ")[@name]");
                logger.trace("config 8");
                URI folder = URI.create(config.getString("hotfolder(" + i + ")[@folder]"));
                logger.trace("config 9");
                Integer template = config.getInt("hotfolder(" + i + ")[@template]");
                logger.trace("config 10");

                String updateStrategy = config.getString("hotfolder(" + i + ")[@updateStrategy]");
                logger.trace("config 11");
                String collection = config.getString("hotfolder(" + i + ")[@collection]");
                logger.trace("config 12");
                if (name == null || name.equals("") || template == null) {
                    logger.trace("config 13");
                    break;
                }
                logger.trace("config 14");
                if (updateStrategy == null || updateStrategy.equals("")) {
                    logger.trace("config 15");
                    updateStrategy = "ignore";
                }
                if (collection.equals("")) {
                    logger.trace("config 16");
                    collection = null;
                }
                logger.trace("config 17");
                answer.add(new GoobiHotfolder(name, folder, template, updateStrategy, collection));
            }
            logger.trace("config 18");

        } catch (Exception e) {
            if (logger.isTraceEnabled()) {
                logger.trace("config 19" + e.getMessage());
            }
            return new ArrayList<>();
        }
        logger.trace("config 20");
        return answer;
    }

    /**
     * Set name.
     *
     * @param name
     *            the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Get name.
     *
     * @return the name
     */
    public String getName() {
        return this.name;
    }

    /**
     * Set template.
     *
     * @param template
     *            the template to set
     */
    public void setTemplate(Integer template) {
        this.template = template;
    }

    /**
     * Get template.
     *
     * @return the template
     */
    public Integer getTemplate() {
        return this.template;
    }

    /**
     * Set update strategy.
     *
     * @param updateStrategy
     *            the updateStrategy to set
     */
    public void setUpdateStrategy(String updateStrategy) {
        this.updateStrategy = updateStrategy;
    }

    /**
     * Get update strategy.
     *
     * @return the updateStrategy
     */
    public String getUpdateStrategy() {
        return this.updateStrategy;
    }

    /**
     * Set collection.
     *
     * @param collection
     *            the collection to set
     */
    public void setCollection(String collection) {
        this.collection = collection;
    }

    /**
     * Get collection.
     *
     * @return the collection
     */
    public String getCollection() {
        return this.collection;
    }

    public URI getLockFile() throws IOException {
        return fileService.createResource(this.folder, ".lock");

    }

    public boolean isLocked() throws IOException {
        return fileService.fileExist(getLockFile());
    }

    /**
     * Lock.
     */
    public void lock() throws IOException {
        URI f = getLockFile();
        if (!fileService.fileExist(f)) {
            fileService.createResource(f.toString());
        }
    }

    /**
     * Unlock.
     */
    public void unlock() throws IOException {
        URI f = getLockFile();
        if (fileService.fileExist(f)) {
            fileService.delete(f);
        }
    }
}