package ch.uzh.ifi.ddis.ifp.esper.cassandra;
/*
* #%L
* Cassandra for Esper
* %%
* Copyright (C) 2013 University of Zurich
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
import java.net.URI;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.datastax.driver.core.DataType;
/**
* Maps java classes to Cassandra datatypes.
*
* @author Thomas Scharrenbach
* @version 0.2.4
* @since 0.2.4
*
*/
public class DatatypeRegistry {
private static final Logger _log = LoggerFactory
.getLogger(DatatypeRegistry.class);
private static final Map<Class<?>, DataType> _defaultRegistryPrivate = new HashMap<Class<?>, DataType>();
static {
_defaultRegistryPrivate.put(String.class, DataType.varchar());
_defaultRegistryPrivate.put(Long.class, DataType.bigint());
_defaultRegistryPrivate.put(byte[].class, DataType.blob());
_defaultRegistryPrivate.put(Boolean.class, DataType.cboolean());
_defaultRegistryPrivate.put(Double.class, DataType.cdouble());
_defaultRegistryPrivate.put(Float.class, DataType.cfloat());
_defaultRegistryPrivate.put(Integer.class, DataType.cint());
_defaultRegistryPrivate.put(URI.class, DataType.inet());
_defaultRegistryPrivate.put(Date.class, DataType.timestamp());
_defaultRegistryPrivate.put(UUID.class, DataType.uuid());
}
public static final Map<Class<?>, DataType> DEFAULTREGISTRY = Collections
.unmodifiableMap(_defaultRegistryPrivate);
private static final DatatypeRegistry _defaultInstance = new DatatypeRegistry(
DEFAULTREGISTRY);
/**
*
* @return singleton instance with unmodifiable default values.
*/
public static final DatatypeRegistry defaultRegistry() {
return _defaultInstance;
}
/**
*
* @return new instance with changeable default values.
*/
public static final DatatypeRegistry newInstance() {
return new DatatypeRegistry(new HashMap<Class<?>, DataType>(
_defaultRegistryPrivate));
}
//
//
//
private final Map<Class<?>, DataType> _registry;
private DatatypeRegistry(Map<Class<?>, DataType> registry) {
_registry = registry;
}
public void addDataTypeMap(Class<?> clazz, DataType datatype) {
if (_registry.containsKey(clazz)) {
_log.warn("Overwriting exisiting datatype mapping!");
}
_registry.put(clazz, datatype);
}
public void removeDatatTypeMap(Class<?> clazz) {
if (_registry.containsKey(clazz)) {
DataType datatype = _registry.get(clazz);
_log.info("Removing datatype map {} to {}", clazz, datatype);
_registry.remove(clazz);
} else {
_log.warn("Trying to remove non-existing mapping for class {} !",
clazz);
}
}
public DataType get(Class<?> clazz) {
return _registry.get(clazz);
}
public boolean contains(Class<?> clazz) {
return _registry.containsKey(clazz);
}
/**
*
* @return copy of registry.
*/
public Map<Class<?>, DataType> getRegistry() {
return new HashMap<Class<?>, DataType>(_registry);
}
}