/** * Copyright 2012 Universitat Pompeu Fabra. * * 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.onexus.website.api.widgets.tags.tagstore; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDataSource; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; import org.h2.Driver; import org.onexus.resource.api.session.LoginContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class TagStoreManager implements ITagStoreManager { private static final Logger LOGGER = LoggerFactory.getLogger(TagStoreManager.class); private String database = "onexus-h2-tags"; private String username = "sa"; private String password = ""; private Map<String, TagStore> tagStores; private DataSource dataSource; public TagStoreManager() { super(); } public void init() { LOGGER.debug("Connecting to '{}' as '{}'.", database, username); Driver.load(); // Initialize the DataSource with a connection pool ConnectionFactory connectionFactory = new H2ConnectionFactory(); ObjectPool connectionPool = new GenericObjectPool(null, GenericObjectPool.DEFAULT_MAX_ACTIVE, GenericObjectPool.WHEN_EXHAUSTED_GROW, GenericObjectPool.DEFAULT_MAX_WAIT); @SuppressWarnings("unused") PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( connectionFactory, connectionPool, null, null, false, true); dataSource = new PoolingDataSource(connectionPool); this.tagStores = Collections.synchronizedMap(new HashMap<String, TagStore>()); } @Override public TagStore getUserStore(String namespace) { String userToken = LoginContext.get().getUserName(); return get(userToken + "_" + namespace); } private TagStore get(String namespace) { if (!tagStores.containsKey(namespace)) { tagStores.put(namespace, new TagStore(namespace, dataSource)); } return tagStores.get(namespace); } public void stop() { try { if (dataSource != null) { Connection conn = dataSource.getConnection(); Statement stat = conn.createStatement(); stat.execute("SHUTDOWN"); stat.close(); conn.close(); } } catch (Exception e) { LOGGER.error("Closing tag store connection", e); } } public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void stop(ITagStoreManager store, @SuppressWarnings("rawtypes") Map properties) { try { if (dataSource != null) { Connection conn = dataSource.getConnection(); Statement stat = conn.createStatement(); stat.execute("SHUTDOWN"); stat.close(); conn.close(); } } catch (Exception e) { LOGGER.error("Closing tag store connection", e); } } public class H2ConnectionFactory implements ConnectionFactory { @Override public Connection createConnection() throws SQLException { return DriverManager.getConnection( "jdbc:h2:" + database, username, password); } } }