/**
* Copyright 2008 - CommonCrawl Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 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. If not, see <http://www.gnu.org/licenses/>.
*
**/
package org.commoncrawl.server;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.util.StringUtils;
/**
*
* @author rana
*
*/
public abstract class ServletRegistry {
public static class DispatchVector {
Pattern _urlPattern;
String _className;
DispatchVector(String pattern, String className) {
_urlPattern = Pattern.compile(pattern);
_className = className;
}
}
public static final Log LOG = LogFactory.getLog(ServletRegistry.class);
static void addClassPathEntries(File directory, ArrayList<URL> urlListOut) throws MalformedURLException {
File files[] = directory.listFiles();
if (files != null) {
for (File file : files) {
if (!file.isDirectory()) {
// LOG.info("Adding ClassPath Entry:" + file.toURL().toString());
urlListOut.add(file.toURI().toURL());
} else {
addClassPathEntries(file, urlListOut);
}
}
}
}
private ArrayList<DispatchVector> _registry = new ArrayList<DispatchVector>();
public HttpServlet getServletForURI(String uri) throws ServletException, IOException {
for (DispatchVector d : _registry) {
if (d._urlPattern.matcher(uri).matches()) {
// LOG.info("Loading Servlet:" + d._className + " for uri:" + uri);
HttpServlet servlet = loadServlet(d._className);
if (servlet != null) {
return servlet;
}
}
}
return null;
}
HttpServlet loadServlet(String servletName) {
String classesRoot = System.getProperty("commoncrawl.classes.root");
// LOG.info("Classes Root is:" + classesRoot);
if (classesRoot == null) {
classesRoot = new File("/Users/rana/commoncrawl/commoncrawl_trunk/trunk/deploy/bin").getAbsolutePath();
}
// LOG.info("Classes Root is:" + classesRoot);
try {
ArrayList<URL> urls = new ArrayList<URL>();
urls.add(new File(classesRoot).toURI().toURL());
LOG.info("URL is:" + urls.get(0).toString());
addClassPathEntries(new File(classesRoot, "lib"), urls);
DynamicClassLoader loader = new DynamicClassLoader(urls.toArray(new URL[0]), ClassLoader.getSystemClassLoader(),
servletName);
// LOG.info("Loader Init Successfull");
try {
LOG.info("Construct class type:" + servletName);
Class theClass = loader.loadClass(servletName, true);
LOG.info("Loaded Class Type:" + theClass);
return (HttpServlet) theClass.newInstance();
} catch (ClassNotFoundException e) {
LOG.error(StringUtils.stringifyException(e));
throw new RuntimeException(e);
}
} catch (MalformedURLException e1) {
LOG.error(StringUtils.stringifyException(e1));
} catch (Throwable e) {
LOG.error(StringUtils.stringifyException(e));
throw new RuntimeException(e);
}
return null;
}
protected void registerServlet(String pathRegEx, String serveletClassName) {
_registry.add(new DispatchVector(pathRegEx, serveletClassName));
}
}