/*
* Copyright 2008-2009 LinkedIn, Inc
*
* 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 voldemort.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
/**
* Network class Loader to load Classes on different JVMs needed to provide a
* User Defined Functions (Filter API) on the server side w/o needing to add jar
* on each server.
*
*
*/
public class NetworkClassLoader extends ClassLoader {
private final static Logger logger = Logger.getLogger(NetworkClassLoader.class);
public NetworkClassLoader(ClassLoader parentClassLoader) {
super(parentClassLoader);
}
public Class<?> loadClass(String className, byte[] classBuffer, int offset, int length) {
Class<?> loadedClass = super.findLoadedClass(className);
if(null == loadedClass) {
return super.defineClass(className, classBuffer, offset, length);
}
return loadedClass;
}
/**
* Utility function to convert Class --> byte[] <br>
* call {@link ClassLoader#getResource(String)} internally to find the class
* file and then dump the bytes[]
*
* @param cl The class
* @return Byte representation of the class
* @throws IOException
*/
public byte[] dumpClass(Class<?> cl) throws IOException {
// get class fileName
// Using File.separatorChar in Windows fails. paths for
// Class#getResource() must be forward slashes in order to work
// correctly.
// See:
// https://blogs.atlassian.com/2006/12/how_to_use_file_separator_when/
String filename = cl.getName().replace('.', '/') + ".class";
InputStream in = null;
logger.debug("NetworkClassloader dumpClass() :" + cl.getCanonicalName());
try {
in = this.getResourceAsStream(filename);
byte[] classBytes = IOUtils.toByteArray(in);
return classBytes;
} finally {
if(null != in)
in.close();
}
}
}