/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.client.impl;
import com.emc.storageos.db.client.DbClient;
import com.emc.storageos.db.client.ModelClient;
import com.emc.storageos.db.client.constraint.AlternateIdConstraint;
import com.emc.storageos.db.client.constraint.Constraint;
import com.emc.storageos.db.client.constraint.ContainmentConstraint;
import com.emc.storageos.db.client.constraint.ContainmentPrefixConstraint;
import com.emc.storageos.db.client.constraint.NamedElementQueryResultList;
import com.emc.storageos.db.client.constraint.PrefixConstraint;
import com.emc.storageos.db.client.constraint.NamedElementQueryResultList.NamedElement;
import com.emc.storageos.db.client.constraint.impl.AlternateIdConstraintImpl;
import com.emc.storageos.db.client.constraint.impl.ContainmentConstraintImpl;
import com.emc.storageos.db.client.constraint.impl.ContainmentPrefixConstraintImpl;
import com.emc.storageos.db.client.constraint.impl.PrefixConstraintImpl;
import com.emc.storageos.db.client.model.*;
import com.emc.storageos.db.common.IterativeList;
import com.emc.storageos.db.exceptions.DatabaseException;
import java.net.URI;
import java.util.List;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Chris Dail
*/
public class ModelClientImpl extends ModelClient {
private static final Logger LOG = LoggerFactory.getLogger(ModelClientImpl.class);
private DbClient dbClient;
public ModelClientImpl() {
}
public ModelClientImpl(DbClient client) {
this.dbClient = client;
}
@PostConstruct
public void init() {
if (dbClient == null) {
throw new IllegalStateException(getClass().getName() + " does not have a DB Client set");
}
dbClient.start();
}
public void setDbClient(DbClient dbClient) {
this.dbClient = dbClient;
}
public DbClient getDbClient() {
return dbClient;
}
/**
* Finds an object by ID.
*
* @param id
* the ID of the object.
* @return the object.
*/
public <T extends DataObject> T findById(URI id) {
if (id == null) {
throw DatabaseException.fatals.nullIdProvided();
}
Class<T> modelClass = getModelClass(id);
if (modelClass != null) {
return of(modelClass).findById(id);
}
else {
return null;
}
}
/**
* Finds an object by ID.
*
* @param id
* the ID of the object.
* @return the object.
*/
public <T extends DataObject> T findById(String id) {
if (id == null) {
throw DatabaseException.fatals.nullIdProvided();
}
return findById(URI.create(id));
}
public <T extends DataObject> List<NamedElement> findByLabel(Class<T> clazz, String label) {
return findByPrefix(clazz, "label", label);
}
public <T extends DataObject> List<URI> findByType(Class<T> clazz, boolean activeOnly) {
return findAllIds(clazz, activeOnly);
}
@Override
public <T extends DataObject> Iterable<T> findByIds(Class<T> clazz, List<URI> ids, boolean activeOnly) throws DatabaseException {
LOG.debug("findByIds({}, {})", new Object[] { clazz, ids });
Iterable<T> it = new IterativeList<T>(dbClient.queryIterativeObjects(clazz, ids, activeOnly));
return it;
}
@Override
public <T extends DataObject> List<URI> findAllIds(Class<T> clazz, boolean activeOnly) throws DatabaseException {
LOG.debug("findAllIds({})", clazz);
List<URI> results = dbClient.queryByType(clazz, activeOnly);
return results;
}
@Override
public <T extends DataObject> T findById(Class<T> clazz, URI id) throws DatabaseException {
LOG.debug("findById({}, {})", new Object[] { clazz, id });
T result = dbClient.queryObject(clazz, id);
return result;
}
@Override
public <T extends DataObject> List<NamedElement> findBy(Class<T> clazz,
String columnField, URI id) throws DatabaseException {
LOG.debug("findBy({}, {}, {})", new Object[] { clazz, columnField, id });
DataObjectType doType = TypeMap.getDoType(clazz);
ColumnField field = doType.getColumnField(columnField);
ContainmentConstraint constraint = new ContainmentConstraintImpl(id, clazz, field);
return queryNamedElementsByConstraint(constraint);
}
@Override
public <T extends DataObject> List<NamedElement> findByPrefix(
Class<T> clazz, String columnField, String prefix)
throws DatabaseException {
LOG.debug("findByPrefix({}, {}, {})", new Object[] { clazz, columnField, prefix });
DataObjectType doType = TypeMap.getDoType(clazz);
PrefixConstraint constraint = new PrefixConstraintImpl(prefix, doType.getColumnField(columnField));
return queryNamedElementsByConstraint(constraint);
}
@Override
public <T extends DataObject> List<NamedElement> findByContainmentAndPrefix(
Class<T> clazz, String columnField, URI id, String labelPrefix)
throws DatabaseException {
LOG.debug("findByContainmentAndPrefix({}, {}, {}, {})", new Object[] { clazz, columnField, id, labelPrefix });
DataObjectType doType = TypeMap.getDoType(clazz);
ContainmentPrefixConstraint constraint = new ContainmentPrefixConstraintImpl(id, labelPrefix, doType.getColumnField(columnField));
return queryNamedElementsByConstraint(constraint);
}
@Override
public <T extends DataObject> void create(T model) throws DatabaseException {
LOG.debug("create({}:{})", model.getClass(), model);
dbClient.createObject(model);
}
@Override
public <T extends DataObject> void update(T model) throws DatabaseException {
LOG.debug("save({}:{})", model.getClass(), model);
dbClient.updateAndReindexObject(model);
}
@Override
public <T extends DataObject> void delete(T model) throws DatabaseException {
LOG.debug("delete({}:{})", model.getClass(), model);
dbClient.markForDeletion(model);
}
protected List<NamedElement> queryNamedElementsByConstraint(Constraint constraint) {
NamedElementQueryResultList queryResults = new NamedElementQueryResultList();
dbClient.queryByConstraint(constraint, queryResults);
return queryResults;
}
@Override
public <T extends DataObject> void delete(List<T> models) throws DatabaseException {
for (T model : models) {
delete(model);
}
}
@Override
public <T extends DataObject> List<NamedElement> findByAlternateId(
Class<T> clazz, String columnField, String value)
throws DatabaseException {
LOG.debug("findByAlternateId({}, {}, {})", new Object[] { clazz, columnField, value });
DataObjectType doType = TypeMap.getDoType(clazz);
AlternateIdConstraint constraint = new AlternateIdConstraintImpl(doType.getColumnField(columnField), value);
return queryNamedElementsByConstraint(constraint);
}
}