/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.resource.adapter.couchbase;
import java.util.concurrent.TimeUnit;
import javax.resource.ResourceException;
import javax.resource.spi.InvalidPropertyException;
import org.teiid.core.BundleUtil;
import org.teiid.resource.spi.BasicConnectionFactory;
import org.teiid.resource.spi.BasicManagedConnectionFactory;
import com.couchbase.client.java.env.CouchbaseEnvironment;
import com.couchbase.client.java.env.DefaultCouchbaseEnvironment;
/**
* Represents a managed connection factory instance for create {@code CouchbaseConnection}.
*
* @author kylin
*
*/
public class CouchbaseManagedConnectionFactory extends BasicManagedConnectionFactory{
private static final long serialVersionUID = 8822399069779170119L;
public static final BundleUtil UTIL = BundleUtil.getBundleUtil(CouchbaseManagedConnectionFactory.class);
private Long managementTimeout = TimeUnit.SECONDS.toMillis(75);
private Long queryTimeout = TimeUnit.SECONDS.toMillis(75);
private Long viewTimeout = TimeUnit.SECONDS.toMillis(75);
private Long kvTimeout = Long.valueOf(2500);
private Long searchTimeout = TimeUnit.SECONDS.toMillis(75);
private Long connectTimeout = TimeUnit.SECONDS.toMillis(5);
private Boolean dnsSrvEnabled = false;
/**
* The connection string to identify the remote cluster
*/
private String connectionString = null;
/**
* The Keyspace/Bucket in Couchbase Server
*/
private String keyspace = null;
private String namespace = null;
/**
* The Keyspace/Bucket password in Couchbase Server
*/
private String password = null;
/**
* Pair with connectTimeout, allowed value including MILLISECONDS, SECONDS, etc.
*/
private String timeUnit = null;
public Long getManagementTimeout() {
return managementTimeout;
}
public void setManagementTimeout(Long managementTimeout) {
this.managementTimeout = managementTimeout;
}
public Long getQueryTimeout() {
return queryTimeout;
}
public void setQueryTimeout(Long queryTimeout) {
this.queryTimeout = queryTimeout;
}
public Long getViewTimeout() {
return viewTimeout;
}
public void setViewTimeout(Long viewTimeout) {
this.viewTimeout = viewTimeout;
}
public Long getKvTimeout() {
return kvTimeout;
}
public void setKvTimeout(Long kvTimeout) {
this.kvTimeout = kvTimeout;
}
public Long getSearchTimeout() {
return searchTimeout;
}
public void setSearchTimeout(Long searchTimeout) {
this.searchTimeout = searchTimeout;
}
public Long getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(Long connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Boolean getDnsSrvEnabled() {
return dnsSrvEnabled;
}
public void setDnsSrvEnabled(Boolean dnsSrvEnabled) {
this.dnsSrvEnabled = dnsSrvEnabled;
}
public String getConnectionString() {
return connectionString;
}
public void setConnectionString(String connectionString) {
this.connectionString = connectionString;
}
public String getKeyspace() {
return keyspace;
}
public void setKeyspace(String keyspace) {
this.keyspace = keyspace;
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTimeUnit() {
return timeUnit;
}
public void setTimeUnit(String timeUnit) {
this.timeUnit = timeUnit;
}
@SuppressWarnings("serial")
@Override
public BasicConnectionFactory<CouchbaseConnectionImpl> createConnectionFactory() throws ResourceException {
final CouchbaseEnvironment environment = DefaultCouchbaseEnvironment.builder()
.managementTimeout(managementTimeout)
.queryTimeout(queryTimeout)
.viewTimeout(viewTimeout)
.kvTimeout(kvTimeout)
.searchTimeout(searchTimeout)
.connectTimeout(connectTimeout)
.dnsSrvEnabled(dnsSrvEnabled)
.build();
if (this.connectionString == null) {
throw new InvalidPropertyException(UTIL.getString("no_server")); //$NON-NLS-1$
}
if (this.keyspace == null) {
throw new InvalidPropertyException(UTIL.getString("no_keyspace")); //$NON-NLS-1$
}
if (this.namespace == null) {
throw new InvalidPropertyException(UTIL.getString("no_namespace")); //$NON-NLS-1$
}
TimeUnit unit = TimeUnit.MILLISECONDS;
if(this.timeUnit != null) {
try {
unit = TimeUnit.valueOf(timeUnit);
} catch (IllegalArgumentException e) {
throw new InvalidPropertyException(UTIL.getString("invalid_timeUnit", timeUnit)); //$NON-NLS-1$
}
}
final TimeUnit timeoutUnit = unit;
return new BasicConnectionFactory<CouchbaseConnectionImpl>(){
@Override
public CouchbaseConnectionImpl getConnection() throws ResourceException {
return new CouchbaseConnectionImpl(environment, connectionString, keyspace, password, timeoutUnit, namespace);
}};
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.getManagementTimeout().hashCode();
result = prime * result + this.getConnectTimeout().hashCode();
result = prime * result + this.getQueryTimeout().hashCode();
result = prime * result + this.getViewTimeout().hashCode();
result = prime * result + this.getKvTimeout().hashCode();
result = prime * result + this.getSearchTimeout().hashCode();
result = prime * result + this.getDnsSrvEnabled().hashCode();
result = prime * result + this.getConnectionString().hashCode();
result = prime * result + ((this.keyspace == null) ? 0 : this.getKeyspace().hashCode());
result = prime * result + ((this.namespace == null) ? 0 : this.getNamespace().hashCode());
result = prime * result + ((this.password == null) ? 0 : this.getPassword().hashCode());
result = prime * result + ((this.timeUnit == null) ? 0 : this.getTimeUnit().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CouchbaseManagedConnectionFactory other = (CouchbaseManagedConnectionFactory) obj;
if(this.managementTimeout != other.managementTimeout){
return false;
}
if(this.queryTimeout != other.queryTimeout) {
return false;
}
if(this.viewTimeout != other.viewTimeout) {
return false;
}
if(this.kvTimeout != other.kvTimeout) {
return false;
}
if(this.searchTimeout != other.searchTimeout) {
return false;
}
if(this.connectTimeout != other.connectTimeout) {
return false;
}
if(!this.dnsSrvEnabled.equals(other.dnsSrvEnabled)) {
return false;
}
if (!checkEquals(this.connectionString, other.connectionString)) {
return false;
}
if (!checkEquals(this.keyspace, other.keyspace)) {
return false;
}
if (!checkEquals(this.namespace, other.namespace)) {
return false;
}
if (!checkEquals(this.password, other.password)) {
return false;
}
if (!checkEquals(this.timeUnit, other.timeUnit)) {
return false;
}
return true;
}
}