/*******************************************************************************
*
* Pentaho Big Data
*
* Copyright (C) 2002-2012 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* 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.pentaho.cassandra;
import java.util.HashMap;
import java.util.Map;
import org.apache.cassandra.thrift.AuthenticationRequest;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.KsDef;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.pentaho.di.core.Const;
/**
* Class for establishing a connection with Cassandra. Encapsulates
* the transport and Cassandra client object.
*
* @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
* @version $Revision; $
*/
public class CassandraConnection {
private TTransport m_transport;
protected Cassandra.Client m_client;
protected String m_keyspaceName;
/**
* Construct an CassandaraConnection with no authentication.
*
* @param host the host to connect to
* @param port the port to use
* @throws Exception if the connection fails
*/
public CassandraConnection(String host, int port)
throws Exception {
this (host, port, null, null, -1);
}
/**
* Construct a CassandraConnection with no authentication
* and the supplied socket timeout (milliseconds).
*
* @param host the host to connect to
* @param port the port to use
* @param timeout the socket timeout to use in milliseconds
* @throws Exception if the connection fails
*/
public CassandraConnection(String host, int port, int timeout)
throws Exception {
this (host, port, null, null, timeout);
}
/**
* Construct an CassandaraConnection with optional authentication.
*
* @param host the host to connect to
* @param port the port to use
* @param username the username to authenticate with (may be null
* for no authentication)
* @param password the password to authenticate with (may be null
* for no authentication)
* @throws Exception if the connection fails
*/
public CassandraConnection(String host, int port,
String username, String password, int timeout) throws Exception {
TSocket socket = new TSocket(host, port);
if (timeout > 0) {
socket.setTimeout(timeout);
}
m_transport = new TFramedTransport(socket);
TProtocol protocol = new TBinaryProtocol(m_transport);
m_client = new Cassandra.Client(protocol);
m_transport.open();
if (!Const.isEmpty(username) && !Const.isEmpty(password)) {
Map<String, String> creds = new HashMap<String, String>();
creds.put("username", username);
creds.put("password", password);
m_client.login(new AuthenticationRequest(creds));
}
}
/**
* Get the encapsulated Cassandra.Client object
*
* @return the encapsulated Cassandra.Client object
*/
public Cassandra.Client getClient() {
return m_client;
}
/**
* Get a keyspace definition for the set keyspace
*
* @return a keyspace definition
* @throws Exception if a problem occurs
*/
public KsDef describeKeyspace() throws Exception {
if (m_keyspaceName == null || m_keyspaceName.length() == 0) {
throw new Exception("No keyspace has been set!");
}
return m_client.describe_keyspace(m_keyspaceName);
}
public void close() {
if (m_transport != null) {
m_transport.close();
m_transport = null;
m_client = null;
}
}
private void checkOpen() throws Exception {
if (m_transport == null && m_client == null) {
throw new Exception("Connection is closed!");
}
}
/**
* Set the Cassandra keyspace (database) to use.
*
* @param keySpace the name of the keyspace to use
* @throws Exception if the keyspace doesn't exist
*/
public void setKeyspace(String keySpace) throws Exception {
checkOpen();
m_client.set_keyspace(keySpace);
m_keyspaceName = keySpace;
}
/**
* Get the column family meta data for the supplied column family (table) name
*
* @param colFam the name of the column family to get meta data for
* @return the column family meta data
* @throws Exception if a problem occurs
*/
public CassandraColumnMetaData getColumnFamilyMetaData(String colFam)
throws Exception {
if (m_keyspaceName == null) {
throw new Exception("No keypsace set!");
}
CassandraColumnMetaData meta = new CassandraColumnMetaData(this, colFam);
return meta;
}
}