
에 근데 OSGi 장점을 별로 못 살려서 아쉽네요.
일단 extender model로 몇 가지 더 실험을 해봐야 될 듯.
versioning이나 security가 extender model에서도 제대로 작동하는지 말이죠.
package kr.nchovy.kraken.common;
import org.apache.felix.framework.Felix;
import org.apache.felix.framework.cache.BundleCache;
import org.apache.felix.framework.util.FelixConstants;
import org.apache.felix.framework.util.StringMap;
import org.apache.log4j.Logger;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.apache.mina.filter.codec.*;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import kr.nchovy.kraken.console.TelnetCodecFactory;
import kr.nchovy.kraken.console.ConsoleHandler;
public class Kraken implements BundleActivator {
private static Logger logger = Logger.getLogger(Kraken.class);
private static Kraken instance;
private Scheduler scheduler;
private FilterManager filterManager;
private ScriptManager scriptManager;
private BundleManager bundleManager;
static {
instance = new Kraken();
}
public static void main(String[] args) throws Exception {
Kraken.getInstance().boot();
}
private Kraken() {
filterManager = new FilterManager();
scriptManager = new ScriptManager();
bundleManager = new BundleManager();
scheduler = new Scheduler();
}
@SuppressWarnings("unchecked")
public void boot() throws Exception {
Map configMap = new StringMap(false);
configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
"org.osgi.framework; version=1.4.0,"
+ "org.osgi.service.packageadmin; version=1.2.0,"
+ "org.osgi.service.startlevel; version=1.0.0,"
+ "org.osgi.service.url; version=1.0.0,"
+ "kr.nchovy.kraken.common; version=1.0.0,"
+ "kr.nchovy.kraken.filter; version=1.0.0,"
+ "kr.nchovy.kraken.script; version=1.0.0");
configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "cache");
List activators = new ArrayList();
activators.add(this);
new Felix(configMap, activators).start();
}
private void openConsolePort() throws IOException {
NioSocketAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("protocol",
new ProtocolCodecFilter(new TelnetCodecFactory()));
acceptor.setHandler(new ConsoleHandler());
acceptor.bind(new InetSocketAddress(7004));
logger.info("Console port 7004 opened.");
}
@Override
public void start(BundleContext context) throws Exception {
bundleManager.addBundleListener(context);
logger.info("Booting Kraken.");
try {
scheduler.activate();
openConsolePort();
logger.info("Kraken started.");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void stop(BundleContext context) throws Exception {
}
public static Kraken getInstance() {
return instance;
}
public static FilterManager getFilterManager() {
return instance.filterManager;
}
public static ScriptManager getScriptManager() {
return instance.scriptManager;
}
public static BundleManager getBundleManager() {
return instance.bundleManager;
}
}




