/* * Copyright 2009 VoidSearch.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.voidsearch.voidbase.core; import com.voidsearch.voidbase.module.VoidBaseModule; import com.voidsearch.voidbase.module.VoidBaseModuleException; import com.voidsearch.voidbase.module.VoidBaseModuleResponse; import com.voidsearch.voidbase.module.VoidBaseModuleRequest; import com.voidsearch.voidbase.supervision.StorageSupervisor; import com.voidsearch.voidbase.config.VoidBaseConfiguration; import com.voidsearch.voidbase.config.Config; import com.voidsearch.voidbase.tcp.TCPServerContainer; import com.voidsearch.voidbase.tcp.TCPServerException; import com.voidsearch.voidbase.util.GenericUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.LinkedList; import java.util.LinkedHashMap; import java.util.Set; import java.io.IOException; public class VoidBaseCore implements VoidBaseModule { protected static final Logger logger = LoggerFactory.getLogger(VoidBaseCore.class.getName()); private LinkedHashMap<String, VoidBaseModule> moduleMap = new LinkedHashMap<String, VoidBaseModule>(); StorageSupervisor supervisor = StorageSupervisor.getInstance(); VoidBaseResourceRegister resourceRegister = VoidBaseResourceRegister.getInstance(); VoidBaseLogService logService = VoidBaseLogService.getInstance(); private static final VoidBaseCore INSTANCE = new VoidBaseCore(); private VoidBaseCore() { } public static VoidBaseCore getInstance() { return INSTANCE; } public void initialize(String name) throws VoidBaseModuleException { logger.info("VoidBaseCore : initializing"); // initialize global dispatcher module if (VoidBaseConfiguration.contains(Config.GLOBAL, Config.DISPATCHER, Config.CLASS)) { String className = VoidBaseConfiguration.get(Config.GLOBAL, Config.DISPATCHER, Config.CLASS); try { VoidBaseModule childModule = reflectModule(className); moduleMap.put(getModuleMapKey(childModule, Config.DISPATCHER),childModule); childModule.initialize(Config.DISPATCHER); childModule.run(); } catch (Exception e) { throw new VoidBaseModuleException("Error initializing dispatcher module"); } } else { throw new VoidBaseModuleException("Missing dispatcher module in configuration"); } // initialize user modules LinkedList<String> modules = VoidBaseConfiguration.getKeyList(Config.MODULES); for (String module : modules) { String active = VoidBaseConfiguration.get(Config.MODULES,module, Config.STATUS); if (active.equals(Config.ACTIVE)) { if (VoidBaseConfiguration.contains(Config.MODULES,module, Config.CLASS)) { String className = VoidBaseConfiguration.get(Config.MODULES,module, Config.CLASS); try { VoidBaseModule childModule = reflectModule(className); moduleMap.put(getModuleMapKey(childModule,module),childModule); // preregisted handler try { String uri = VoidBaseConfiguration.get(Config.MODULES, module, Config.RESOURCE_URI); if (uri != null) { resourceRegister.register(uri,childModule); } } catch (ResourceAlreadyRegisteredException e) { throw new VoidBaseModuleException("failed to register resource"); } // preregister logger if (VoidBaseConfiguration.contains(Config.MODULES, module, Config.LOG_FILE)) { String logFile = VoidBaseConfiguration.get(Config.MODULES, module, Config.LOG_FILE); try { logService.registerLogger(module,logFile); } catch (IOException e) { e.printStackTrace(); } } // preregister logger if (VoidBaseConfiguration.contains(Config.MODULES, module, Config.LOG_QUEUE)) { String logQueue = VoidBaseConfiguration.get(Config.MODULES, module, Config.LOG_QUEUE); try { logService.registerQueue(module,logQueue); } catch (IOException e) { e.printStackTrace(); } } // invoke module-specific initialization childModule.initialize(module); if (childModule instanceof Thread) { ((Thread)childModule).start(); } } catch (Exception e) { GenericUtil.logException(e); } } } } // initialize tcp connection handlers try { TCPServerContainer.getInstance(); } catch (TCPServerException e) { GenericUtil.logException(e); } } public void run() { } public VoidBaseModuleResponse handle(VoidBaseModuleRequest request) throws VoidBaseModuleException { return null; } public String getModuleMapKey(VoidBaseModule module, String moduleName) { return moduleName; } public Set<String> getRegisteredModules() { return moduleMap.keySet(); } public boolean containsModule(String moduleName) { return moduleMap.containsKey(moduleMap); } // broadcast command to all modules public void moduleBroadcast() { } protected VoidBaseModule reflectModule(String name) throws Exception { Class obj = Class.forName(name); logger.info("Getting reflection for class " + name); return (VoidBaseModule)obj.newInstance(); } }