/** * Copyright 2012 the original author or authors. * * 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 de.jbellmann.tomcat.cassandra; import java.util.ArrayList; import java.util.List; /** * Implementation for Cassandra-Data-Access. * * @author Joerg Bellmann * */ public abstract class CassandraTemplate implements CassandraOperations { public static final String CREATIONTIME_COLUMN_NAME = "METADATA-CREATIONTIME"; public static final String LAST_ACCESSTIME_COLUMN_NAME = "METADATA-LASTACCESSTIME"; protected static final List<String> SPECIAL_ATTRIBUTES = new ArrayList<String>(); static { SPECIAL_ATTRIBUTES.add(CREATIONTIME_COLUMN_NAME); SPECIAL_ATTRIBUTES.add(LAST_ACCESSTIME_COLUMN_NAME); } public static final String DEFAULT_CLUSTER_NAME = "TOMCAT_SESSION_MANAGER_CLUSTER"; public static final String DEFAULT_KEYSPACE_NAME = "TOMCAT_SESSION_MANAGER_KEYSPACE"; public static final String DEFAULT_COLUMNFAMILY_NAME = "TOMCAT_SESSION_MANAGER_COLUMNFAMILY"; public static final String DEFAULT_STRATEGY_CLASS_NAME = "org.apache.cassandra.locator.SimpleStrategy"; public static final int DEFAULT_REPLICATION_FACTOR = 1; public static final int DEFAULT_MAX_ACTIVE = 20; public static final int DEFAULT_MAX_IDLE = 5; public static final int DEFAULT_THRIFT_SOCKET_TIMEOUT = 3000; public static final int DEFAULT_MAX_TIME_WHEN_EXHAUSTED = 4000; public static final boolean DEFAULT_LOG_SESSIONS_ON_STARTUP = false; //mandantory private String clusterName = DEFAULT_CLUSTER_NAME; private String keyspaceName = DEFAULT_KEYSPACE_NAME; private String columnFamilyName = DEFAULT_COLUMNFAMILY_NAME; private String strategyClassName = DEFAULT_STRATEGY_CLASS_NAME; private String hosts; private int replicationFactor = DEFAULT_REPLICATION_FACTOR; //optional private int maxActive = DEFAULT_MAX_ACTIVE; private int maxIdle = DEFAULT_MAX_IDLE; // not used, method to set not found private int thriftSocketTimeout = DEFAULT_THRIFT_SOCKET_TIMEOUT; private long maxWaitTimeWhenExhausted = DEFAULT_MAX_TIME_WHEN_EXHAUSTED; private boolean logSessionsOnStartup = DEFAULT_LOG_SESSIONS_ON_STARTUP; public abstract void initialize(ClassLoader classLoader); // public void initialize(ClassLoader classLoader) { // log.info("Initialize Cassandra Template ..."); // objectSerializer = new ObjectSerializer(classLoader); // cluster = HFactory.getOrCreateCluster(getClusterName(), getCassandraHostConfigurator()); // // ColumnFamilyDefinition // ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(getKeyspaceName(), // getColumnFamilyName(), ComparatorType.BYTESTYPE); // // KeyspaceDefinition // KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(getKeyspaceName(), // getStrategyClassName(), getReplicationFactor(), Arrays.asList(columnFamilyDefinition)); // // KeyspaceDefinition description = cluster.describeKeyspace(getKeyspaceName()); // if (description == null) { // // keyspace to cluster // cluster.addKeyspace(keyspaceDefinition, true); // } // // keyspace = HFactory.createKeyspace(getKeyspaceName(), cluster); // log.info("Cassandra-Template initialized"); // if (isLogSessionsOnStartup()) { // List<String> sessionIdList = findSessionKeys(); // log.info("Found " + sessionIdList.size() + " Sessions in DB"); // for (final String sessionId : sessionIdList) { // if(log.isTraceEnabled()){ // log.info("SessionId found : " + sessionId); // } // } // } // } public abstract void shutdown(); // public void shutdown() { // log.info("Release Connections ..."); // this.cluster.getConnectionManager().shutdown(); // log.info("Connections released"); // } // @Override // public long getCreationTime(final String sessionId) { // ColumnQuery<String, String, Long> query = HFactory.createColumnQuery(keyspace, StringSerializer.get(), // StringSerializer.get(), LongSerializer.get()); // query.setColumnFamily(getColumnFamilyName()).setKey(sessionId).setName(CREATIONTIME_COLUMN_NAME); // HColumn<String, Long> column = query.execute().get(); // return column != null ? column.getValue() : -1; // } // // @Override // public void setCreationTime(final String sessionId, final long time) { // log.info("Set CREATION_TIME for Session : " + sessionId + " to value " + time); // Mutator<String> mutator = HFactory.createMutator(this.keyspace, StringSerializer.get()); // mutator.insert(sessionId, this.columnFamilyName, // HFactory.createColumn(CREATIONTIME_COLUMN_NAME, time, StringSerializer.get(), LongSerializer.get())); // } // // @Override // public long getLastAccessedTime(final String sessionId) { // log.info("Get LAST_ACCESSED_TIME for Session : " + sessionId); // ColumnQuery<String, String, Long> query = HFactory.createColumnQuery(keyspace, StringSerializer.get(), // StringSerializer.get(), LongSerializer.get()); // query.setColumnFamily(getColumnFamilyName()).setKey(sessionId).setName(LAST_ACCESSTIME_COLUMN_NAME); // HColumn<String, Long> column = query.execute().get(); // return column != null ? column.getValue() : -1; // } // // @Override // public void setLastAccessedTime(final String sessionId, final long time) { // log.info("Set LAST_ACCESSED_TIME for Session : " + sessionId + " to value " + time); // Mutator<String> mutator = HFactory.createMutator(this.keyspace, StringSerializer.get()); // mutator.insert(sessionId, this.columnFamilyName, // HFactory.createColumn(LAST_ACCESSTIME_COLUMN_NAME, time, StringSerializer.get(), LongSerializer.get())); // } // // @Override // public Object getAttribute(final String sessionId, final String name) { // log.info("Get attribute '" + name + "' for Session : " + sessionId); // ColumnQuery<String, String, Object> query = HFactory.createColumnQuery(keyspace, StringSerializer.get(), // StringSerializer.get(), objectSerializer); // query.setColumnFamily(getColumnFamilyName()).setKey(sessionId).setName(name); // QueryResult<HColumn<String, Object>> result = query.execute(); // HColumn<String, Object> column = result.get(); // return column != null ? column.getValue() : null; // } // // @Override // public void setAttribute(final String sessionId, final String name, final Object value) { // log.info("Set attribute '" + name + "' with value " + value.toString() + " for Session : " + sessionId + ""); // Mutator<String> mutator = HFactory.createMutator(this.keyspace, StringSerializer.get()); // mutator.insert(sessionId, this.columnFamilyName, // HFactory.createColumn(name, value, StringSerializer.get(), objectSerializer)); // } // // @Override // public void removeAttribute(final String sessionId, final String name) { // log.info("Remove attribute '" + name + "' for Session : " + sessionId); // Mutator<String> mutator = HFactory.createMutator(this.keyspace, StringSerializer.get()); // mutator.delete(sessionId, this.columnFamilyName, name, StringSerializer.get()); // } // // @Override // public String[] keys(final String sessionId) { // SliceQuery<String, String, String> sliceQuery = HFactory.createSliceQuery(this.keyspace, // StringSerializer.get(), StringSerializer.get(), StringSerializer.get()); // sliceQuery.setColumnFamily(getColumnFamilyName()).setKey(sessionId); // ColumnSliceIterator<String, String, String> columnSliceIterator = new ColumnSliceIterator<String, String, String>( // sliceQuery, null, "\uFFFF", false); // List<String> resultList = new ArrayList<String>(); // // // while (columnSliceIterator.hasNext()) { // String columnName = columnSliceIterator.next().getName(); // if (!(SPECIAL_ATTRIBUTES.contains(columnName))) { // resultList.add(columnName); // } // } // return resultList.toArray(new String[resultList.size()]); // } // // @Override // public Enumeration<String> getAttributeNames(String sessionId) { // return Collections.enumeration(Arrays.asList(keys(sessionId))); // } // // @Override // public List<String> findSessionKeys() { // List<String> resultList = new ArrayList<String>(); // RangeSlicesQuery<String, String, String> rangeSlicesQuery = HFactory.createRangeSlicesQuery(this.keyspace, // StringSerializer.get(), StringSerializer.get(), StringSerializer.get()); // rangeSlicesQuery.setColumnFamily(this.columnFamilyName); // rangeSlicesQuery.setKeys("", ""); // rangeSlicesQuery.setReturnKeysOnly(); // // // rangeSlicesQuery.setRowCount(500); // // QueryResult<OrderedRows<String, String, String>> result = rangeSlicesQuery.execute(); // for (Row<String, String, String> row : result.get().getList()) { // resultList.add(row.getKey()); // } // return resultList; // } // // @Override // public void removeSession(final String sessionId) { // Mutator<String> mutator = HFactory.createMutator(this.keyspace, StringSerializer.get()); // mutator.delete(sessionId, this.columnFamilyName, null, StringSerializer.get()); // } public String getColumnFamilyName() { return columnFamilyName; } public void setColumnFamilyName(String columnFamilyName) { this.columnFamilyName = columnFamilyName; } public String getClusterName() { return clusterName; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public String getKeyspaceName() { return keyspaceName; } public void setKeyspaceName(String keyspaceName) { this.keyspaceName = keyspaceName; } public String getHosts() { return hosts; } public void setHosts(String hosts) { this.hosts = hosts; } public int getMaxActive() { return maxActive; } public void setMaxActive(int maxActive) { this.maxActive = maxActive; } public int getMaxIdle() { return maxIdle; } public void setMaxIdle(int maxIdle) { this.maxIdle = maxIdle; } public int getThriftSocketTimeout() { return thriftSocketTimeout; } public void setThriftSocketTimeout(int thriftSocketTimeout) { this.thriftSocketTimeout = thriftSocketTimeout; } public long getMaxWaitTimeWhenExhausted() { return maxWaitTimeWhenExhausted; } public void setMaxWaitTimeWhenExhausted(long maxWaitTimeWhenExhausted) { this.maxWaitTimeWhenExhausted = maxWaitTimeWhenExhausted; } public String getStrategyClassName() { return strategyClassName; } public void setStrategyClassName(String strategyClassName) { this.strategyClassName = strategyClassName; } public int getReplicationFactor() { return replicationFactor; } public void setReplicationFactor(int replicationFactor) { this.replicationFactor = replicationFactor; } public boolean isLogSessionsOnStartup() { return logSessionsOnStartup; } public void setLogSessionsOnStartup(boolean logSessionsOnStartup) { this.logSessionsOnStartup = logSessionsOnStartup; } }