/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.ignite.cache.store.jdbc; import javax.cache.configuration.Factory; import javax.sql.DataSource; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.IgniteComponentType; import org.apache.ignite.internal.util.spring.IgniteSpringHelper; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.resources.SpringApplicationContextResource; /** * {@link Factory} implementation for {@link CacheJdbcBlobStore}. * * Use this factory to pass {@link CacheJdbcBlobStore} to {@link CacheConfiguration}. * * <h2 class="header">Spring Example</h2> * <pre name="code" class="xml"> * <bean id= "myDataSource" class="org.h2.jdbcx.JdbcDataSource"/> * * <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> * ... * <property name="cacheConfiguration"> * <list> * <bean class="org.apache.ignite.configuration.CacheConfiguration"> * ... * <property name="cacheStoreFactory"> * <bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStoreFactory"> * <property name="user" value = "Ignite" /> * <property name="dataSourceBean" value = "myDataSource" /> * </bean> * </property> * </bean> * </list> * </property> * </bean> * </pre> * <p> * <img src="http://ignite.apache.org/images/spring-small.png"> * <br> * For information about Spring framework visit <a href="http://www.springframework.org/">www.springframework.org</a> */ public class CacheJdbcBlobStoreFactory<K, V> implements Factory<CacheJdbcBlobStore<K, V>> { /** */ private static final long serialVersionUID = 0L; /** Connection URL. */ private String connUrl = CacheJdbcBlobStore.DFLT_CONN_URL; /** Query to create table. */ private String createTblQry = CacheJdbcBlobStore.DFLT_CREATE_TBL_QRY; /** Query to load entry. */ private String loadQry = CacheJdbcBlobStore.DFLT_LOAD_QRY; /** Query to update entry. */ private String updateQry = CacheJdbcBlobStore.DFLT_UPDATE_QRY; /** Query to insert entries. */ private String insertQry = CacheJdbcBlobStore.DFLT_INSERT_QRY; /** Query to delete entries. */ private String delQry = CacheJdbcBlobStore.DFLT_DEL_QRY; /** User name for database access. */ private String user; /** Password for database access. */ @GridToStringExclude private String passwd; /** Flag for schema initialization. */ private boolean initSchema = true; /** Name of data source bean. */ private String dataSrcBean; /** Data source. */ private transient DataSource dataSrc; /** Application context. */ @SpringApplicationContextResource private Object appCtx; /** {@inheritDoc} */ @Override public CacheJdbcBlobStore<K, V> create() { CacheJdbcBlobStore<K, V> store = new CacheJdbcBlobStore<>(); store.setInitSchema(initSchema); store.setConnectionUrl(connUrl); store.setCreateTableQuery(createTblQry); store.setLoadQuery(loadQry); store.setUpdateQuery(updateQry); store.setInsertQuery(insertQry); store.setDeleteQuery(delQry); store.setUser(user); store.setPassword(passwd); if (dataSrc != null) store.setDataSource(dataSrc); else if (dataSrcBean != null) { if (appCtx == null) throw new IgniteException("Spring application context resource is not injected."); IgniteSpringHelper spring; try { spring = IgniteComponentType.SPRING.create(false); DataSource data = spring.loadBeanFromAppContext(appCtx, dataSrcBean); store.setDataSource(data); } catch (IgniteCheckedException ignored) { throw new IgniteException("Failed to load bean in application context [beanName=" + dataSrcBean + ", igniteConfig=" + appCtx + ']'); } } return store; } /** * Flag indicating whether DB schema should be initialized by Ignite (default behaviour) or * was explicitly created by user. * * @param initSchema Initialized schema flag. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setInitSchema(boolean) */ public CacheJdbcBlobStoreFactory<K, V> setInitSchema(boolean initSchema) { this.initSchema = initSchema; return this; } /** * Sets connection URL. * * @param connUrl Connection URL. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setConnectionUrl(String) */ public CacheJdbcBlobStoreFactory<K, V> setConnectionUrl(String connUrl) { this.connUrl = connUrl; return this; } /** * Sets create table query. * * @param createTblQry Create table query. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setCreateTableQuery(String) */ public CacheJdbcBlobStoreFactory<K, V> setCreateTableQuery(String createTblQry) { this.createTblQry = createTblQry; return this; } /** * Sets load query. * * @param loadQry Load query * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setLoadQuery(String) */ public CacheJdbcBlobStoreFactory<K, V> setLoadQuery(String loadQry) { this.loadQry = loadQry; return this; } /** * Sets update entry query. * * @param updateQry Update entry query. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setUpdateQuery(String) */ public CacheJdbcBlobStoreFactory<K, V> setUpdateQuery(String updateQry) { this.updateQry = updateQry; return this; } /** * Sets insert entry query. * * @param insertQry Insert entry query. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setInsertQuery(String) */ public CacheJdbcBlobStoreFactory<K, V> setInsertQuery(String insertQry) { this.insertQry = insertQry; return this; } /** * Sets delete entry query. * * @param delQry Delete entry query. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setDeleteQuery(String) */ public CacheJdbcBlobStoreFactory<K, V> setDeleteQuery(String delQry) { this.delQry = delQry; return this; } /** * Sets user name for database access. * * @param user User name. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setUser(String) */ public CacheJdbcBlobStoreFactory<K, V> setUser(String user) { this.user = user; return this; } /** * Sets password for database access. * * @param passwd Password. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setPassword(String) */ public CacheJdbcBlobStoreFactory<K, V> setPassword(String passwd) { this.passwd = passwd; return this; } /** * Sets name of the data source bean. * * @param dataSrcBean Data source bean name. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setDataSource(DataSource) */ public CacheJdbcBlobStoreFactory<K, V> setDataSourceBean(String dataSrcBean) { this.dataSrcBean = dataSrcBean; return this; } /** * Sets data source. Data source should be fully configured and ready-to-use. * * @param dataSrc Data source. * @return {@code This} for chaining. * @see CacheJdbcBlobStore#setDataSource(DataSource) */ public CacheJdbcBlobStoreFactory<K, V> setDataSource(DataSource dataSrc) { this.dataSrc = dataSrc; return this; } /** {@inheritDoc} */ @Override public String toString() { return S.toString(CacheJdbcBlobStoreFactory.class, this); } }