/**
* Copyright (C) 2010 hprange <hprange@gmail.com>
*
* 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 com.woinject;
import java.security.AccessController;
import java.security.PrivilegedAction;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Loader;
/**
* The <code>WOInject</code> class initializes the application intercepting core
* methods used by WebObjects classes to create objects.
* <p>
* How to use:
*
* <pre>
* public static void main(String[] argv) {
* WOInject.init("com.company.app.Application", argv);
* }
* </pre>
* <p>
* <strong>Note</strong>: to ensure well functioning, do not obtain the
* <code>Application</code> class name programmatically. No WebObjects classes
* should be loaded before the WOInject initialization.
*
* @author <a href="mailto:hprange@gmail.com">Henrique Prange</a>
* @since 1.0
*/
public class WOInject {
/**
* Initialize the <code>WOApplication</code> with the WOInject capabilities.
*
* @param applicationClass
* the name of the application class
* @param args
* the application's command line arguments
*/
public static void init(String applicationClass, String[] args) {
final ClassPool pool = ClassPool.getDefault();
Loader loader = AccessController.doPrivileged(new PrivilegedAction<Loader>() {
public Loader run() {
return new Loader(pool);
}
});
loader.delegateLoadingOf("com.apple.");
try {
CtClass clazz = pool.get("com.webobjects.foundation._NSUtilities");
CtMethod method = clazz.getDeclaredMethod("instantiateObject");
method.insertBefore("{ return com.webobjects.foundation.InstantiationInterceptor.instantiateObject($1, $2, $3, $4, $5); }");
method = clazz.getDeclaredMethod("instantiateObjectWithConstructor");
method.insertBefore("{ return com.webobjects.foundation.InstantiationInterceptor.instantiateObject($1, $2, $3, $4, $5); }");
Thread.currentThread().setContextClassLoader(loader);
Class<?> erxApp = loader.loadClass("er.extensions.appserver.ERXApplication");
Class<?> app = loader.loadClass(applicationClass);
Class<?> injectableApp = loader.loadClass("com.woinject.InjectableApplication");
if (!injectableApp.isAssignableFrom(app)) {
throw new Error("Cannot initialize the injector. The Application class doesn't extend InjectableApplication.");
}
erxApp.getDeclaredMethod("main", String[].class, Class.class).invoke(null, args, app);
} catch (Throwable exception) {
throw new Error("Cannot initialize the application to take advantage of WOInject features.", exception);
}
}
}