at.tuwien.minimee.registry.MiniMeeRegistry.java Source code

Java tutorial

Introduction

Here is the source code for at.tuwien.minimee.registry.MiniMeeRegistry.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 Vienna University of Technology, 
 * Department of Software Technology and Interactive Systems
 *
 * All rights reserved. This program and the accompanying
 * materials are made available under the terms of the
 * Apache License, Version 2.0 which accompanies
 * this distribution, and is available at
 * http://www.apache.org/licenses/LICENSE-2.0 
 *******************************************************************************/
package at.tuwien.minimee.registry;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;

import at.tuwien.minimee.model.ToolConfig;
import at.tuwien.minimee.registry.xml.PreservationActionServiceFactory;
import eu.planets_project.pp.plato.model.FormatInfo;
import eu.planets_project.pp.plato.services.PlatoServiceException;
import eu.planets_project.pp.plato.xml.StrictErrorHandler;

/**
 * This class is the external entry point for MiniMEE - it contains all {@link PreservationActionService services}
 * that are configured in this instance.
 * The services have to have a corresponding back part configured in the {@link ToolRegistry}
 * @author cbu
 *
 */
public class MiniMeeRegistry {
    private List<PreservationActionService> services = new ArrayList<PreservationActionService>();

    public MiniMeeRegistry() {
    }

    /**
     * Returns all services for the given source- and target format.
     * Currently not exposed as a web service since it has been integrated
     * with Plato.
     * @param sourceFormat
     * @param targetFormat
     * @return
     */
    public List<PreservationActionService> findServices(FormatInfo sourceFormat, FormatInfo targetFormat) {
        ArrayList<PreservationActionService> matching = new ArrayList<PreservationActionService>();

        for (PreservationActionService service : services) {
            boolean doesSourceMatch = false;
            // check if at least one source format of the service matches sourceFormat
            for (FormatInfo info : service.getSourceFormats()) {
                if (doMatch(sourceFormat, info))
                    doesSourceMatch = true;

            }
            if (doesSourceMatch) {
                // check if the target format matches too
                if (doMatch(targetFormat, service.getTargetFormat()))
                    matching.add(service);
            }
        }
        return matching;
    }

    /**
     * Checks if the pattern matches the format:
     * - partially true, if info is missing in format or pattern (e.g: null, empty string)
     * - if PUIDs are equal AND 
     * - (format.name contains(!) pattern.name OR pattern.name contains(!) format.name) AND
     * - defaultExtensions are equal
     */
    private boolean doMatch(FormatInfo srcFormat, FormatInfo regInfo) {
        if (srcFormat == null || regInfo == null) {
            return true;
        }
        return
        // one of the puids is null OR they are equal
        (isEmptyOrNull(srcFormat.getPuid()) || isEmptyOrNull(regInfo.getPuid())
                || srcFormat.getPuid().equals(regInfo.getPuid()))

                // one of the formats is null OR one of them is contained in the other
                && (isEmptyOrNull(srcFormat.getName()) || isEmptyOrNull(regInfo.getName())
                        || regInfo.getName().toUpperCase().contains(srcFormat.getName().toUpperCase())
                        || srcFormat.getName().toUpperCase().contains(regInfo.getName().toUpperCase()))
                &&
                // one of the extensions is null OR they are equal
                (isEmptyOrNull(srcFormat.getDefaultExtension()) || isEmptyOrNull(regInfo.getDefaultExtension())
                        || srcFormat.getDefaultExtension().toUpperCase()
                                .equals(regInfo.getDefaultExtension().toUpperCase()));
    }

    private static boolean isEmptyOrNull(String value) {
        return (value == null) || ("".equals(value));
    }

    /**
     * Trashes current registry information and loads the information of the XML file, which is provided
     * by the input stream <param>config</config>.
     * 
     *  @throws PlatoServiceException if the stream can't be parsed. 
     */
    public void reloadFrom(String configFile) throws PlatoServiceException {
        Digester d = new Digester();
        d.setValidating(false);
        StrictErrorHandler errorHandler = new StrictErrorHandler();
        d.setErrorHandler(errorHandler);
        d.setClassLoader(PreservationActionServiceFactory.class.getClassLoader());

        services.clear();

        d.push(services);
        d.addFactoryCreate("*/preservationActionService", PreservationActionServiceFactory.class);
        d.addSetNext("*/preservationActionService", "add");
        d.addCallMethod("*/preservationActionService/name", "setName", 0);
        d.addCallMethod("*/preservationActionService/description", "setDescription", 0);
        d.addCallMethod("*/preservationActionService/descriptor", "setDescriptor", 0);

        d.addObjectCreate("*/preservationActionService/sourceFormats", ArrayList.class);
        d.addSetNext("*/preservationActionService/sourceFormats", "setSourceFormats");

        d.addObjectCreate("*/preservationActionService/sourceFormats/format", FormatInfo.class);
        d.addBeanPropertySetter("*/format/puid", "puid");
        d.addBeanPropertySetter("*/format/name", "name");
        d.addBeanPropertySetter("*/format/extension", "defaultExtension");
        d.addSetNext("*/preservationActionService/sourceFormats/format", "add");

        d.addObjectCreate("*/preservationActionService/targetFormat", FormatInfo.class);
        d.addBeanPropertySetter("*/targetFormat/puid", "puid");
        d.addBeanPropertySetter("*/targetFormat/name", "name");
        d.addBeanPropertySetter("*/targetFormat/extension", "defaultExtension");
        d.addSetNext("*/preservationActionService/targetFormat", "setTargetFormat");

        d.addCallMethod("*/preservationActionService/url", "setUrl", 0);

        d.addObjectCreate("*/preservationActionService/externalInfo", ArrayList.class);
        d.addSetNext("*/preservationActionService/externalInfo", "setExternalInfo");
        d.addCallMethod("*/preservationActionService/externalInfo/url", "add", 0);

        try {
            InputStream config = Thread.currentThread().getContextClassLoader().getResourceAsStream(configFile);

            d.parse(config);
        } catch (IOException e) {
            throw new PlatoServiceException("Could not read registry data.", e);
        } catch (SAXException e) {
            throw new PlatoServiceException("Could not read registry data.", e);
        }
    }

    /**
     * Reloads registry data, at the moment from an XML file
     */
    public void reload() throws PlatoServiceException {
        String configFile = "data/services/miniMEE-actions.xml";

        reloadFrom(configFile);

    }

    public String getToolIdentifier(String url) {

        ToolRegistry toolRegistry = ToolRegistry.getInstance();

        ToolConfig toolConfig = toolRegistry.getToolConfig(ToolRegistry.getToolKey(url));

        if (toolConfig == null) {
            return "";
        }

        return toolConfig.getTool().getIdentifier();
    }

    public String getToolParameters(String url) {

        ToolRegistry toolRegistry = ToolRegistry.getInstance();

        ToolConfig toolConfig = toolRegistry.getToolConfig(ToolRegistry.getToolKey(url));

        return toolConfig.getParams();
    }

    /**
     * For testing only:
     * Creates a MiniMEE registry, data is loaded from the XML file which location is passed
     * as first command line parameter.
     *  
     * @param args
     */
    public static void main(String[] args) {
        try {
            MiniMeeRegistry registry = new MiniMeeRegistry();
            registry.reloadFrom(args[0]);

            List<PreservationActionService> services = registry.findServices(null, null);

            for (PreservationActionService service : services) {
                System.out.println(service.getName());
            }
        } catch (PlatoServiceException e) {
            e.printStackTrace();
        }
    }
}