org.springsource.loaded.SpringLoaded Maven / Gradle / Ivy
/*
* Copyright 2010-2012 VMware and contributors
*
* 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.springsource.loaded;
/**
* API for directly interacting with SpringLoaded.
*
* @author Andy Clement
* @since 0.8.0
*/
public class SpringLoaded {
/**
* Force a reload of an existing type.
*
* @param clazz the class to be reloaded
* @param newbytes the data bytecode data to reload as the new version
* @return int return code: 0 is success. 1 is unknown classloader, 2 is unknown type (possibly not yet loaded). 3
* is reload event failed. 4 is exception occurred.
*/
public static int loadNewVersionOfType(Class> clazz, byte[] newbytes) {
return loadNewVersionOfType(clazz.getClassLoader(), clazz.getName(), newbytes);
}
/**
* Force a reload of an existing type.
*
* @param classLoader the classloader that was used to load the original form of the type
* @param dottedClassname the dotted name of the type being reloaded, e.g. com.foo.Bar
* @param newbytes the data bytecode data to reload as the new version
* @return int return code: 0 is success. 1 is unknown classloader, 2 is unknown type (possibly not yet loaded). 3
* is reload event failed. 4 is exception occurred.
*/
public static int loadNewVersionOfType(ClassLoader classLoader, String dottedClassname, byte[] newbytes) {
try {
// Obtain the type registry of interest
TypeRegistry typeRegistry = TypeRegistry.getTypeRegistryFor(classLoader);
if (typeRegistry == null) {
return 1;
}
// Find the reloadable type
ReloadableType reloadableType = typeRegistry.getReloadableType(dottedClassname.replace('.', '/'));
if (reloadableType == null) {
return 2;
}
// Create a unique version tag for this reload attempt
String tag = Utils.encode(System.currentTimeMillis());
boolean reloaded = reloadableType.loadNewVersion(tag, newbytes);
return reloaded ? 0 : 3;
}
catch (Exception e) {
e.printStackTrace();
return 4;
}
}
}