All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.archinnov.achilles.integration.spring.CQLPersistenceManagerFactoryBean Maven / Gradle / Ivy

/**
 *
 * Copyright (C) 2012-2013 DuyHai DOAN
 *
 * 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 info.archinnov.achilles.integration.spring;

import static info.archinnov.achilles.configuration.CQLConfigurationParameters.*;
import static info.archinnov.achilles.configuration.ConfigurationParameters.*;
import static org.apache.commons.lang.StringUtils.*;
import info.archinnov.achilles.entity.manager.CQLPersistenceManager;
import info.archinnov.achilles.entity.manager.CQLPersistenceManagerFactory;
import info.archinnov.achilles.json.ObjectMapperFactory;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.config.AbstractFactoryBean;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ProtocolOptions.Compression;
import com.datastax.driver.core.SSLOptions;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.policies.LoadBalancingPolicy;
import com.datastax.driver.core.policies.ReconnectionPolicy;
import com.datastax.driver.core.policies.RetryPolicy;

public class CQLPersistenceManagerFactoryBean extends AbstractFactoryBean {
	private static CQLPersistenceManager manager;
	private String entityPackages;

	private String contactPoints;
	private Integer port;
	private String keyspaceName;
	private Cluster cluster;
	private Session session;

	private Compression compression;
	private RetryPolicy retryPolicy;
	private LoadBalancingPolicy loadBalancingPolicy;
	private ReconnectionPolicy reconnectionPolicy;
	private String username;
	private String password;
	private Boolean disableJmx;
	private Boolean disableMetrics;
	private Boolean sslEnabled;
	private SSLOptions sslOptions;

	private ObjectMapperFactory objectMapperFactory;
	private ObjectMapper objectMapper;

	private String consistencyLevelReadDefault;
	private String consistencyLevelWriteDefault;
	private Map consistencyLevelReadMap;
	private Map consistencyLevelWriteMap;

	private boolean forceColumnFamilyCreation = false;

	protected void initialize() {
		Map configMap = new HashMap();

		fillEntityPackages(configMap);

		fillCluster(configMap);

		fillCompression(configMap);

		fillPolicies(configMap);

		fillCredentials(configMap);

		fillJmxAndMetrics(configMap);

		fillSSLConfig(configMap);

		fillObjectMapper(configMap);

		fillConsistencyLevels(configMap);

		configMap.put(FORCE_CF_CREATION_PARAM, forceColumnFamilyCreation);

		CQLPersistenceManagerFactory pmf = new CQLPersistenceManagerFactory(configMap);
		manager = pmf.createPersistenceManager();
	}

	private void fillEntityPackages(Map configMap) {
		if (isNotBlank(entityPackages)) {
			configMap.put(ENTITY_PACKAGES_PARAM, entityPackages);
		}
	}

	private void fillCluster(Map configMap) {
		if ((isBlank(contactPoints) || port == null || isBlank(keyspaceName)) && (cluster == null || session == null)) {
			throw new IllegalArgumentException(
					"Either 'contactPoints/port/keyspace name' or 'cluster/session' should be provided");
		}

		if (cluster != null && session != null) {
			configMap.put(CLUSTER_PARAM, cluster);
			configMap.put(NATIVE_SESSION_PARAM, session);
		} else {
			configMap.put(CONNECTION_CONTACT_POINTS_PARAM, contactPoints);
			configMap.put(CONNECTION_PORT_PARAM, port);
			configMap.put(KEYSPACE_NAME_PARAM, keyspaceName);
		}
	}

	private void fillCompression(Map configMap) {
		if (compression != null) {
			configMap.put(COMPRESSION_TYPE, compression);
		}
	}

	private void fillPolicies(Map configMap) {
		if (retryPolicy != null) {
			configMap.put(RETRY_POLICY, retryPolicy);
		}

		if (loadBalancingPolicy != null) {
			configMap.put(LOAD_BALANCING_POLICY, loadBalancingPolicy);
		}

		if (reconnectionPolicy != null) {
			configMap.put(RECONNECTION_POLICY, reconnectionPolicy);
		}
	}

	private void fillJmxAndMetrics(Map configMap) {
		if (disableJmx != null) {
			configMap.put(DISABLE_JMX, disableJmx);
		}

		if (disableMetrics != null) {
			configMap.put(DISABLE_METRICS, disableMetrics);
		}
	}

	private void fillCredentials(Map configMap) {
		if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
			configMap.put(USERNAME, username);
			configMap.put(PASSWORD, password);
		}
	}

	private void fillSSLConfig(Map configMap) {
		if (sslEnabled != null) {
			if (sslOptions == null)
				throw new IllegalArgumentException("'sslOptions' property should be set when SSL is enabled");

			configMap.put(SSL_ENABLED, sslEnabled);
			configMap.put(SSL_OPTIONS, sslOptions);
		}
	}

	private void fillObjectMapper(Map configMap) {
		if (objectMapperFactory != null) {
			configMap.put(OBJECT_MAPPER_FACTORY_PARAM, objectMapperFactory);
		}
		if (objectMapper != null) {
			configMap.put(OBJECT_MAPPER_PARAM, objectMapper);
		}
	}

	private void fillConsistencyLevels(Map configMap) {
		if (consistencyLevelReadDefault != null) {
			configMap.put(CONSISTENCY_LEVEL_READ_DEFAULT_PARAM, consistencyLevelReadDefault);
		}
		if (consistencyLevelWriteDefault != null) {
			configMap.put(CONSISTENCY_LEVEL_WRITE_DEFAULT_PARAM, consistencyLevelWriteDefault);
		}

		if (consistencyLevelReadMap != null) {
			configMap.put(CONSISTENCY_LEVEL_READ_MAP_PARAM, consistencyLevelReadMap);
		}
		if (consistencyLevelWriteMap != null) {
			configMap.put(CONSISTENCY_LEVEL_WRITE_MAP_PARAM, consistencyLevelWriteMap);
		}
	}

	public void setContactPoints(String contactPoints) {
		this.contactPoints = contactPoints;
	}

	public void setPort(Integer port) {
		this.port = port;
	}

	public void setKeyspaceName(String keyspaceName) {
		this.keyspaceName = keyspaceName;
	}

	public void setCluster(Cluster cluster) {
		this.cluster = cluster;
	}

	public void setSession(Session session) {
		this.session = session;
	}

	public void setCompression(Compression compression) {
		this.compression = compression;
	}

	public void setRetryPolicy(RetryPolicy retryPolicy) {
		this.retryPolicy = retryPolicy;
	}

	public void setLoadBalancingPolicy(LoadBalancingPolicy loadBalancingPolicy) {
		this.loadBalancingPolicy = loadBalancingPolicy;
	}

	public void setReconnectionPolicy(ReconnectionPolicy reconnectionPolicy) {
		this.reconnectionPolicy = reconnectionPolicy;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setDisableJmx(Boolean disableJmx) {
		this.disableJmx = disableJmx;
	}

	public void setDisableMetrics(Boolean disableMetrics) {
		this.disableMetrics = disableMetrics;
	}

	public void setSslEnabled(Boolean sslEnabled) {
		this.sslEnabled = sslEnabled;
	}

	public void setSslOptions(SSLOptions sslOptions) {
		this.sslOptions = sslOptions;
	}

	public void setEntityPackages(String entityPackages) {
		this.entityPackages = entityPackages;
	}

	public void setForceColumnFamilyCreation(boolean forceColumnFamilyCreation) {
		this.forceColumnFamilyCreation = forceColumnFamilyCreation;
	}

	public void setObjectMapperFactory(ObjectMapperFactory objectMapperFactory) {
		this.objectMapperFactory = objectMapperFactory;
	}

	public void setObjectMapper(ObjectMapper objectMapper) {
		this.objectMapper = objectMapper;
	}

	public void setConsistencyLevelReadDefault(String consistencyLevelReadDefault) {
		this.consistencyLevelReadDefault = consistencyLevelReadDefault;
	}

	public void setConsistencyLevelWriteDefault(String consistencyLevelWriteDefault) {
		this.consistencyLevelWriteDefault = consistencyLevelWriteDefault;
	}

	public void setConsistencyLevelReadMap(Map consistencyLevelReadMap) {
		this.consistencyLevelReadMap = consistencyLevelReadMap;
	}

	public void setConsistencyLevelWriteMap(Map consistencyLevelWriteMap) {
		this.consistencyLevelWriteMap = consistencyLevelWriteMap;
	}

	@Override
	public Class getObjectType() {
		return CQLPersistenceManager.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	@Override
	protected CQLPersistenceManager createInstance() throws Exception {
		synchronized (this) {
			if (manager == null) {
				initialize();
			}
		}
		return manager;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy