/* * Copyright (c) 2013 Websquared, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * swsong - initial API and implementation */ package org.fastcatsearch.db; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.fastcatsearch.alert.ClusterAlertService; import org.fastcatsearch.db.InternalDBModule.MapperSession; import org.fastcatsearch.db.mapper.ManagedMapper; import org.fastcatsearch.env.Environment; import org.fastcatsearch.exception.FastcatSearchException; import org.fastcatsearch.module.ModuleException; import org.fastcatsearch.service.AbstractService; import org.fastcatsearch.service.ServiceManager; import org.fastcatsearch.settings.Settings; public abstract class AbstractDBService extends AbstractService { protected InternalDBModule internalDBModule; private Class<?>[] mapperList; public AbstractDBService(String dbPath, Class<?>[] mapperList, Environment environment, Settings settings, ServiceManager serviceManager) { super(environment, settings, serviceManager); this.mapperList = mapperList; String absoluteDbPath = environment.filePaths().file(dbPath).getAbsolutePath(); // system관련 mapper설정. List<URL> mapperFileList = new ArrayList<URL>(); for (Class<?> mapperDAO : mapperList) { try { String mapperFilePath = mapperDAO.getName().replace('.', '/') + ".xml"; URL mapperFile = Resources.getResourceURL(mapperFilePath); mapperFileList.add(mapperFile); } catch (IOException e) { logger.error("error load MapperFile", e); } } internalDBModule = new InternalDBModule(absoluteDbPath, mapperFileList, environment, settings); } public InternalDBModule internalDBModule() { return internalDBModule; } public <T> MapperSession<T> getMapperSession(Class<T> type) { SqlSession session = internalDBModule.openSession(); return new MapperSession<T>(session, session.getMapper(type)); } @Override protected boolean doStart() throws FastcatSearchException { internalDBModule.load(); for (Class<?> mapperDAO : mapperList) { Class<? extends ManagedMapper> clazz = (Class<? extends ManagedMapper>) mapperDAO; MapperSession<? extends ManagedMapper> mapperSession = (MapperSession<? extends ManagedMapper>) getMapperSession(clazz); try { ManagedMapper managedMapper = mapperSession.getMapper(); try { logger.debug("valiadte {}", clazz.getSimpleName()); managedMapper.validateTable(); } catch (Exception e) { try { logger.debug("drop {}", clazz.getSimpleName()); managedMapper.dropTable(); mapperSession.commit(); } catch (Exception ignore) { } try { logger.debug("create table {}", clazz.getSimpleName()); managedMapper.createTable(); mapperSession.commit(); logger.debug("create index {}", clazz.getSimpleName()); managedMapper.createIndex(); mapperSession.commit(); initMapper(managedMapper); } catch (Exception e2) { logger.error("", e2); ClusterAlertService.getInstance().alert(e); } } } finally { if (mapperSession != null) { mapperSession.closeSession(); } } } return true; } protected abstract void initMapper(ManagedMapper managedMapper) throws Exception; @Override protected boolean doStop() throws FastcatSearchException { try { internalDBModule.unload(); } catch (ModuleException e) { logger.error(e.getMessage(), e); return false; } return true; } @Override protected boolean doClose() throws FastcatSearchException { internalDBModule = null; return true; } }