Package org.oclc.oomRef.config

Source Code of org.oclc.oomRef.config.OpenURLConfig

/**
* Copyright 2006 OCLC Online Computer Library Center Licensed under the Apache
* License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or
* agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.oclc.oomRef.config;

import info.openurl.oom.OpenURLRequestProcessor;
import info.openurl.oom.Service;
import info.openurl.oom.Transport;
import info.openurl.oom.util.XMLHelper;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.xml.transform.TransformerException;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.NodeIterator;

/**
* @author Jeffrey A. Young TODO Describe type
*/
public class OpenURLConfig implements info.openurl.oom.config.OpenURLConfig {

    private ServletConfig servletConfig;

    private static Document oomConfig;
    static {
        try {
            oomConfig =
                    XMLHelper.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("oomRef.xml"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param config
     */
    public OpenURLConfig(ServletConfig config) {
        this.servletConfig = config;
    }

    /**
     * @return The servlet configuration
     */
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    /**
     * Gets the configured transports.
     */
    public Transport[] getTransports() throws TransformerException, ClassNotFoundException, SecurityException,
            NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException,
            InvocationTargetException {
        ArrayList transports = new ArrayList();
        Element xmlnsEl = XMLHelper.getXmlnsEl();
        NodeIterator nodeIter =
                XPathAPI.selectNodeIterator(oomConfig, "/oomRef:config/oomRef:transportMap/oomRef:transport", xmlnsEl);
        Node node;
        while ((node = nodeIter.nextNode()) != null) {
            ClassConfig classConfig = new ClassConfig(node);
            String transportClassName = classConfig.getClassName();
            Class transportClass = Class.forName(transportClassName);
            Constructor transportConstructor = null;
            try {
                transportConstructor =
                        transportClass.getConstructor(new Class[] { info.openurl.oom.config.OpenURLConfig.class,
                            info.openurl.oom.config.ClassConfig.class });
            } catch (NoSuchMethodException e) {
                // Uh Oh. Somebody extended OOMRef-J's HowImpl directly.
                transportConstructor =
                        transportClass.getConstructor(new Class[] { org.oclc.oomRef.config.OpenURLConfig.class,
                            org.oclc.oomRef.config.ClassConfig.class });
            }
            Transport transport = (Transport) transportConstructor.newInstance(new Object[] { this, classConfig });
            transports.add(transport);
        }
        return (Transport[]) transports.toArray(new Transport[transports.size()]);
    }

    /**
     * Gets the service associated with the supplied URI.
     */
    public Service getService(URI uri) throws TransformerException, ClassNotFoundException, SecurityException,
            NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException,
            InvocationTargetException {
        Element xmlnsEl = XMLHelper.getXmlnsEl();
        Node node =
                XPathAPI.selectSingleNode(oomConfig, "/oomRef:config/oomRef:serviceMap/oomRef:service[@ID='" +
                        uri.toString() + "']", xmlnsEl);
        if (node != null) {
            ClassConfig classConfig = new ClassConfig(node);
            String className = XPathAPI.eval(node, "oomRef:className", xmlnsEl).str();
            Class serviceClass = Class.forName(className);
            Constructor serviceConstructor = null;
            try {
                serviceConstructor =
                        serviceClass.getConstructor(new Class[] { info.openurl.oom.config.OpenURLConfig.class,
                            info.openurl.oom.config.ClassConfig.class });
            } catch (NoSuchMethodException e) {
                // Uh Oh. Somebody implemented an OOMRef-J class directly.
                serviceConstructor =
                        serviceClass.getConstructor(new Class[] { org.oclc.oomRef.config.OpenURLConfig.class,
                            org.oclc.oomRef.config.ClassConfig.class });
            }
            return (Service) serviceConstructor.newInstance(new Object[] { this, classConfig });
        }

        return null;
    }

    /**
     * Gets the service associated with the supplied class name.
     */
    public Service getService(String className) throws TransformerException, SecurityException,
            NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException,
            InvocationTargetException {
        try {
            Node node =
                    XPathAPI.selectSingleNode(oomConfig,
                            "/oomRef:config/oomRef:serviceMap/oomRef:service[oomRef:className='" + className + "']",
                            XMLHelper.getXmlnsEl());
            ClassConfig classConfig = new ClassConfig(node);
            Class serviceClass = Class.forName(className);
            Constructor serviceConstructor = null;
            try {
                serviceConstructor =
                        serviceClass.getConstructor(new Class[] { info.openurl.oom.config.OpenURLConfig.class,
                            info.openurl.oom.config.ClassConfig.class });
            } catch (NoSuchMethodException e) {
                // Uh Oh. Somebody extended the ServiceImpl directly.
                serviceConstructor =
                        serviceClass.getConstructor(new Class[] { org.oclc.oomRef.config.OpenURLConfig.class,
                            org.oclc.oomRef.config.ClassConfig.class });
            }
            return (Service) serviceConstructor.newInstance(new Object[] { this, classConfig });
        } catch (ClassNotFoundException e) {
            // do nothing
        }

        return null;
    }

    /**
     * Gets the OpenURL request processor.
     */
    public OpenURLRequestProcessor getProcessor() throws TransformerException, ClassNotFoundException,
            InstantiationException, IllegalAccessException {
        Node node = XPathAPI.selectSingleNode(oomConfig, "/oomRef:config/oomRef:processor", XMLHelper.getXmlnsEl());
        ClassConfig classConfig = new ClassConfig(node);
        String className = classConfig.getClassName();
        Class c = Class.forName(className);
        return (OpenURLRequestProcessor) c.newInstance();
    }

    /**
     * Gets the value for the supplied argument key.
     *
     * @param key An argument key
     */
    public String getArg(String key) throws TransformerException {
        String xpath = new StringBuffer("/oomRef:config/oomRef:args/oomRef:").append(key).toString();
        return XPathAPI.eval(oomConfig, xpath, XMLHelper.getXmlnsEl()).str();
    }

    /**
     * Gets the values associated with the supplied argument key.
     *
     * @param key An argument key
     */
    public String[] getArgs(String key) throws TransformerException {
        ArrayList args = new ArrayList();

        String xpath = new StringBuffer("/oomRef:config/oomRef:args/oomRef:").append(key).toString();
        NodeIterator iter = XPathAPI.selectNodeIterator(oomConfig, xpath, XMLHelper.getXmlnsEl());
        Node node;
        while ((node = iter.nextNode()) != null) {
            args.add(XPathAPI.eval(node, ".").str());
        }
        return (String[]) args.toArray(new String[args.size()]);
    }

    /**
     * Returns all the configurations.
     */
    public Map getArgs() throws TransformerException {
        Map map = new HashMap();

        if (oomConfig != null) {
            NodeIterator iter =
                    XPathAPI.selectNodeIterator(oomConfig, "/oomRef:config/oomRef:args/*", XMLHelper.getXmlnsEl());
            Node node;
            while ((node = iter.nextNode()) != null) {
                String key = XPathAPI.eval(node, "name()").str();
                map.put(key, XPathAPI.eval(node, ".").str());
            }
        }
        return map;
    }
}
TOP

Related Classes of org.oclc.oomRef.config.OpenURLConfig

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.