/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.sa.model.mock;
import java.net.URI;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.emc.storageos.db.client.model.uimodels.Order;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.emc.sa.model.dao.DBClientWrapper;
import com.emc.sa.model.dao.DataAccessException;
import com.emc.storageos.db.client.URIUtil;
import com.emc.storageos.db.client.constraint.NamedElementQueryResultList.NamedElement;
import com.emc.storageos.db.client.model.DataObject;
import com.emc.storageos.db.client.model.DataObjectWithACLs;
import com.emc.storageos.security.authorization.PermissionsKey;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class InMemoryDbClient implements DBClientWrapper {
private static final Logger LOG = Logger.getLogger(InMemoryDbClient.class);
private Map<URI, DataObject> data = Maps.newLinkedHashMap();
private Object getColumnField(DataObject o, String columnField) {
try {
return PropertyUtils.getProperty(o, columnField);
} catch (Exception e) {
return null;
}
}
private NamedElement createNamedElement(DataObject value) {
NamedElement elem = new NamedElement();
elem.setId(value.getId());
elem.setName(value.getLabel());
return elem;
}
@Override
public <T extends DataObject> List<NamedElement> findByAlternateId(Class<T> clazz, String columnField, String value)
throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(clazz)) {
T model = findById(clazz, modelId);
Object o = getColumnField(model, columnField);
if (ObjectUtils.equals(o, value)) {
results.add(createNamedElement(model));
}
}
return results;
}
@Override
public List<NamedElement> findOrdersByAlternateId(String columnField, String value, long startTime, long endTime,
int maxCount)
throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(Order.class)) {
Order order = findById(Order.class, modelId);
Object o = getColumnField(order, columnField);
if (ObjectUtils.equals(o, value)) {
results.add(createNamedElement(order));
}
}
return results;
}
@Override
public long getOrderCount(String userId, String fieldName, long startTime, long endTime) {
//TODO:
return 0;
}
@Override
public Map<String, Long> getOrderCount(List<URI> tids, String fieldName, long startTime, long endTime) {
//TODO:
return null;
}
@Override
public <T extends DataObject> List<NamedElement> findByContainmentAndPrefix(Class<T> clazz, String columnField, URI id,
String labelPrefix) throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(clazz)) {
T model = findById(clazz, modelId);
Object o = getColumnField(model, columnField);
if (ObjectUtils.equals(o, id) && StringUtils.startsWith(model.getLabel(), labelPrefix)) {
results.add(createNamedElement(model));
}
}
return results;
}
@Override
public List<NamedElement> findAllOrdersByTimeRange(URI tid, String columnField, Date startTime, Date endTime, int maxCount)
throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(Order.class)) {
Order model = findById(Order.class, modelId);
Object o = getColumnField(model, columnField);
results.add(createNamedElement(model));
}
return results;
}
@Override
public <T extends DataObject> List<NamedElement> findBy(Class<T> clazz, String columnField, URI id) throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(clazz)) {
T model = findById(clazz, modelId);
Object o = getColumnField(model, columnField);
if (ObjectUtils.equals(o, id)) {
results.add(createNamedElement(model));
}
}
return results;
}
@Override
public <T extends DataObject> List<NamedElement> findByPrefix(Class<T> clazz, String columnField, String prefix)
throws DataAccessException {
List<NamedElement> results = Lists.newArrayList();
for (URI modelId : findAllIds(clazz)) {
T model = findById(clazz, modelId);
Object o = getColumnField(model, columnField);
if (o != null && o.toString().startsWith(prefix)) {
results.add(createNamedElement(model));
}
}
return results;
}
@Override
public <T extends DataObject> List<URI> findAllIds(Class<T> clazz) throws DataAccessException {
LOG.debug("findAllIds(" + clazz.getSimpleName() + ")");
List<URI> results = Lists.newArrayList();
for (Map.Entry<URI, DataObject> entry : data.entrySet()) {
if (entry.getValue().getClass() == clazz) {
LOG.debug(" - " + entry.getKey());
results.add(entry.getKey());
}
}
return results;
}
@Override
public <T extends DataObject> T findById(Class<T> clazz, URI id) throws DataAccessException {
@SuppressWarnings("unchecked")
T result = (T) data.get(id);
LOG.debug("findById(" + clazz.getSimpleName() + ", " + id + ") = " + result);
return result;
}
@Override
public <T extends DataObject> List<T> findByIds(Class<T> clazz, List<URI> ids) throws DataAccessException {
List<T> results = Lists.newArrayList();
for (URI id : ids) {
results.add(findById(clazz, id));
}
return results;
}
@Override
public <T extends DataObject> void update(T model) throws DataAccessException {
if (model != null) {
if (model.getId() == null) {
model.setId(URIUtil.createId(model.getClass()));
LOG.debug("save(" + model.getId() + ") (new)");
}
else {
LOG.debug("save(" + model.getId() + ")");
}
URI id = model.getId();
data.put(id, model);
}
}
@Override
public <T extends DataObject> void create(T model) throws DataAccessException {
update(model);
}
@Override
public <T extends DataObject> void delete(T model) throws DataAccessException {
if (model != null) {
URI id = model.getId();
if (data.remove(id) != null) {
LOG.debug("Deleted " + model.getClass().getSimpleName() + " with ID: " + id);
}
else {
LOG.debug("No such object: " + id);
}
}
}
@Override
public <T extends DataObject> void delete(List<T> models) throws DataAccessException {
for (T model : models) {
delete(model);
}
}
@Override
public <T extends DataObjectWithACLs> Map<URI, Set<String>> findByPermission(Class<T> type, PermissionsKey key)
throws DataAccessException {
return Maps.newHashMap();
}
@Override
public <T extends DataObjectWithACLs> Map<URI, Set<String>> findByPermission(Class<T> type, PermissionsKey key,
Set<String> filterBy) throws DataAccessException {
return Maps.newHashMap();
}
}