/* * * Copyright (C) 2007-2015 Licensed to the Comunes Association (CA) under * one or more contributor license agreements (see COPYRIGHT for details). * The CA licenses this file to you under the GNU Affero General Public * License version 3, (the "License"); you may not use this file except in * compliance with the License. This file is part of kune. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package cc.kune.core.server.persist; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.persistence.EntityManager; import org.apache.commons.configuration.SystemConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; import org.hibernate.Session; import cc.kune.core.server.properties.KuneProperties; import cc.kune.core.server.properties.KunePropertiesDefault; import cc.kune.domain.finders.ContainerFinder; import cc.kune.domain.finders.ContentFinder; import cc.kune.domain.finders.ExtMediaDescripFinder; import cc.kune.domain.finders.GroupFinder; import cc.kune.domain.finders.I18nCountryFinder; import cc.kune.domain.finders.I18nLanguageFinder; import cc.kune.domain.finders.I18nTranslationFinder; import cc.kune.domain.finders.InvitationFinder; import cc.kune.domain.finders.LicenseFinder; import cc.kune.domain.finders.ParticipantEntityFinder; import cc.kune.domain.finders.RateFinder; import cc.kune.domain.finders.TagFinder; import cc.kune.domain.finders.TagUserContentFinder; import cc.kune.domain.finders.UserFinder; import cc.kune.domain.finders.UserSignInLogFinder; import cc.kune.domain.finders.WaveEntityFinder; import com.google.inject.Key; import com.google.inject.PrivateModule; import com.google.inject.Provider; import com.google.inject.persist.jpa.JpaPersistModule; import com.google.inject.persist.jpa.KuneJpaLocalTxnInterceptor; // TODO: Auto-generated Javadoc /** * The Class DataSourceKunePersistModule. * * @author vjrj@ourproject.org (Vicente J. Ruiz Jurado) */ public class DataSourceKunePersistModule extends PrivateModule { // http://code.google.com/p/google-guice/wiki/GuicePersistMultiModules /** The Constant LOG. */ public static final Log LOG = LogFactory.getLog(DataSourceKunePersistModule.class); /** The Constant MY_DATA_SOURCE_ONE_FILTER_KEY. */ public static final Key<CustomPersistFilter> MY_DATA_SOURCE_ONE_FILTER_KEY = Key.get( CustomPersistFilter.class, DataSourceKune.class); /** The kune config. */ private String kuneConfig; /** The kune properties. */ private KunePropertiesDefault kuneProperties; /** The log4 conf. */ private String log4Conf = null; /** The setted jpa unit. */ private String settedJpaUnit = null; /** The transaction interceptor. */ private KuneJpaLocalTxnInterceptor transactionInterceptor; /** * Instantiates this module (main constructor). */ public DataSourceKunePersistModule() { init(null); } /** * Instantiates this module only during tests. * * @param settedProperties * the setted properties * @param settedJpaUnit * the setted jpa unit */ public DataSourceKunePersistModule(final String settedProperties, final String settedJpaUnit) { this.settedJpaUnit = settedJpaUnit; init(settedProperties); } /* * (non-Javadoc) * * @see com.google.inject.PrivateModule#configure() */ @Override public void configure() { bind(KuneProperties.class).toInstance(kuneProperties); if (log4Conf == null) { configureLog4j(); } // precedence method param > properties final String configuredJpaUnit = kuneProperties.get(KuneProperties.SITE_DB_PERSISTENCE_NAME); final String jpaUnit = settedJpaUnit != null ? settedJpaUnit : configuredJpaUnit != null ? configuredJpaUnit : "development"; LOG.info(String.format("Using persistence unit '%s' and properties '%s'", jpaUnit, kuneConfig)); final JpaPersistModule jpm = new JpaPersistModule(jpaUnit); if (!jpaUnit.equals("test")) { // In tests (and development) we don't override this db info) final Properties dbProperties = new Properties(); final String dbUrl = kuneProperties.get(KuneProperties.SITE_DB_URL); final String dbUser = kuneProperties.get(KuneProperties.SITE_DB_USER); final String dbPass = kuneProperties.get(KuneProperties.SITE_DB_PASSWORD); dbProperties.setProperty("hibernate.connection.url", dbUrl); dbProperties.setProperty("hibernate.connection.username", dbUser); dbProperties.setProperty("hibernate.connection.password", dbPass); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_SCHEMA, "hibernate.hbm2ddl.auto"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_ACQUIRE_INCREMENT, "hibernate.c3p0.acquire_increment"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_AUTOCOMMITONCLOSE, "hibernate.c3p0.autoCommitOnClose"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_MAX_SIZE, "hibernate.c3p0.max_size"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_MAX_STATEMENTS, "hibernate.c3p0.max_statements"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_MIN_SIZE, "hibernate.c3p0.min_size"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_TEST_PERIOD, "hibernate.c3p0.idle_test_period"); setPropertyIfExists(dbProperties, KuneProperties.SITE_DB_C3P0_TIMEOUT, "hibernate.c3p0.timeout"); jpm.properties(dbProperties); LOG.info(String.format("Using user '%s' and connection '%s'", dbUser, dbUrl)); // LOG.debug(String.format("dbpass '%s'", dbPass)); // <property name="hibernate.connection.provider_class" // value="org.hibernate.connection.C3P0ConnectionProvider"/> // <property name="hibernate.c3p0.min_size" value="5"/> // <property name="hibernate.c3p0.max_size" value="50"/> // <property name="hibernate.c3p0.timeout" value="100"/> // <property name="hibernate.c3p0.max_statements" value="0"/> // <property name="hibernate.c3p0.idle_test_period" value="3000"/> // <property name="c3p0.preferredTestQuery" value="SELECT 1"/> } // http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Injector.html // (...) Just-in-time bindings created for child injectors will be // created in an ancestor injector whenever possible (...) // (This fails with finders, then we make explicit bindings) jpm.addFinder(ContainerFinder.class); jpm.addFinder(ContentFinder.class); jpm.addFinder(ExtMediaDescripFinder.class); jpm.addFinder(GroupFinder.class); jpm.addFinder(I18nCountryFinder.class); jpm.addFinder(I18nLanguageFinder.class); jpm.addFinder(I18nTranslationFinder.class); jpm.addFinder(LicenseFinder.class); jpm.addFinder(RateFinder.class); jpm.addFinder(TagFinder.class); jpm.addFinder(TagUserContentFinder.class); jpm.addFinder(UserFinder.class); jpm.addFinder(UserSignInLogFinder.class); jpm.addFinder(InvitationFinder.class); jpm.addFinder(ParticipantEntityFinder.class); jpm.addFinder(WaveEntityFinder.class); install(jpm); bind(Session.class).annotatedWith(DataSourceKune.class).toProvider( DataSourceKuneSessionProvider.class); final Provider<EntityManager> entityManagerProvider = binder().getProvider(EntityManager.class); bind(EntityManager.class).annotatedWith(DataSourceKune.class).toProvider(entityManagerProvider); transactionInterceptor = new KuneJpaLocalTxnInterceptor(); requestInjection(transactionInterceptor); // bind(KuneJpaLocalTxnInterceptor.class).toInstance(transactionInterceptor); bind(MY_DATA_SOURCE_ONE_FILTER_KEY).to(CustomPersistFilter.class); expose(EntityManager.class).annotatedWith(DataSourceKune.class); expose(Session.class).annotatedWith(DataSourceKune.class); expose(KuneProperties.class); expose(ContainerFinder.class); expose(ContentFinder.class); expose(ExtMediaDescripFinder.class); expose(GroupFinder.class); expose(I18nCountryFinder.class); expose(I18nLanguageFinder.class); expose(I18nTranslationFinder.class); expose(LicenseFinder.class); expose(RateFinder.class); expose(TagFinder.class); expose(TagUserContentFinder.class); expose(UserFinder.class); expose(UserSignInLogFinder.class); expose(WaveEntityFinder.class); expose(InvitationFinder.class); expose(ParticipantEntityFinder.class); expose(MY_DATA_SOURCE_ONE_FILTER_KEY); // expose(KuneJpaLocalTxnInterceptor.class); bind(GenericPersistenceInitializer.class).asEagerSingleton(); } /** * Configure log4j. */ private void configureLog4j() { try { final Properties properties = new Properties(); final InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream( "log4j.properties"); // "log4j.dev.properties"); properties.load(input); PropertyConfigurator.configure(properties); } catch (final IOException e) { e.printStackTrace(); } } /** * Gets the kune properties. * * @return the kune properties */ public KuneProperties getKuneProperties() { return kuneProperties; } /** * Gets the transaction interceptor. * * @return the transaction interceptor */ public KuneJpaLocalTxnInterceptor getTransactionInterceptor() { return transactionInterceptor; } /** * Inits the. * * @param settedProperties * the setted properties */ private void init(final String settedProperties) { final SystemConfiguration sysConf = new SystemConfiguration(); kuneConfig = settedProperties != null ? settedProperties : sysConf.getString("kune.server.config"); kuneProperties = new KunePropertiesDefault(kuneConfig); log4Conf = sysConf.getString("log4j.configuration"); } /** * Sets the property if exists. * * @param dbProperties * the db properties * @param kuneProperty * the kune property * @param persistenceProperty * the persistence property */ private void setPropertyIfExists(final Properties dbProperties, final String kuneProperty, final String persistenceProperty) { if (kuneProperties.has(kuneProperty)) { final String value = kuneProperties.get(kuneProperty); LOG.info(String.format("Setting property '%s' to '%s'", persistenceProperty, value)); dbProperties.setProperty(persistenceProperty, value); } } }