/**
* 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;
}
}