/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.intel.mtwilson.tag.rest.v2.repository;
import com.intel.dcsg.cpg.io.UUID;
import com.intel.mtwilson.jaxrs2.server.resource.DocumentRepository;
import com.intel.mtwilson.jooq.util.JooqContainer;
import com.intel.mtwilson.repository.RepositoryCreateConflictException;
import com.intel.mtwilson.repository.RepositoryCreateException;
import com.intel.mtwilson.repository.RepositoryInvalidInputException;
import com.intel.mtwilson.repository.RepositoryDeleteException;
import com.intel.mtwilson.repository.RepositoryException;
import com.intel.mtwilson.repository.RepositoryRetrieveException;
import com.intel.mtwilson.repository.RepositorySearchException;
import com.intel.mtwilson.tag.dao.TagJdbi;
import com.intel.mtwilson.tag.dao.jdbi.KvAttributeDAO;
import com.intel.mtwilson.tag.dao.jdbi.SelectionDAO;
import com.intel.mtwilson.tag.dao.jdbi.SelectionKvAttributeDAO;
import com.intel.mtwilson.tag.model.SelectionKvAttribute;
import com.intel.mtwilson.tag.model.SelectionKvAttributeCollection;
import com.intel.mtwilson.tag.model.SelectionKvAttributeFilterCriteria;
import com.intel.mtwilson.tag.model.SelectionKvAttributeLocator;
import static com.intel.mtwilson.tag.dao.jooq.generated.Tables.MW_TAG_SELECTION;
import static com.intel.mtwilson.tag.dao.jooq.generated.Tables.MW_TAG_SELECTION_KVATTRIBUTE;
import static com.intel.mtwilson.tag.dao.jooq.generated.Tables.MW_TAG_KVATTRIBUTE;
import com.intel.mtwilson.tag.model.CertificateLocator;
import com.intel.mtwilson.tag.model.KvAttribute;
import com.intel.mtwilson.tag.model.Selection;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jooq.DSLContext;
import org.jooq.JoinType;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SelectQuery;
/**
*
* @author ssbangal
*/
public class SelectionKvAttributeRepository implements DocumentRepository<SelectionKvAttribute, SelectionKvAttributeCollection, SelectionKvAttributeFilterCriteria, SelectionKvAttributeLocator> {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SelectionKvAttributeRepository.class);
@Override
@RequiresPermissions("tag_selection_kv_attributes:search")
public SelectionKvAttributeCollection search(SelectionKvAttributeFilterCriteria criteria) {
log.debug("SelectionKvAttribute:Search - Got request to search for the SelectionKvAttributes.");
SelectionKvAttributeCollection objCollection = new SelectionKvAttributeCollection();
try(JooqContainer jc = TagJdbi.jooq()) {
DSLContext jooq = jc.getDslContext();
SelectQuery sql = jooq.select()
.from(MW_TAG_KVATTRIBUTE.join(MW_TAG_SELECTION_KVATTRIBUTE, JoinType.JOIN)
.on(MW_TAG_KVATTRIBUTE.ID.equal(MW_TAG_SELECTION_KVATTRIBUTE.KVATTRIBUTEID))
.join(MW_TAG_SELECTION, JoinType.JOIN).on(MW_TAG_SELECTION_KVATTRIBUTE.SELECTIONID.equal(MW_TAG_SELECTION.ID)))
.getQuery();
if (criteria.filter) {
if( criteria.attrNameEqualTo != null && criteria.attrNameEqualTo.length() > 0 ) {
sql.addConditions(MW_TAG_KVATTRIBUTE.NAME.equalIgnoreCase(criteria.attrNameEqualTo));
}
if( criteria.attrNameContains != null && criteria.attrNameContains.length() > 0 ) {
sql.addConditions(MW_TAG_KVATTRIBUTE.NAME.lower().contains(criteria.attrNameContains.toLowerCase()));
}
if( criteria.attrValueEqualTo != null && criteria.attrValueEqualTo.length() > 0 ) {
sql.addConditions(MW_TAG_KVATTRIBUTE.VALUE.equalIgnoreCase(criteria.attrValueEqualTo));
}
if( criteria.attrValueContains != null && criteria.attrValueContains.length() > 0 ) {
sql.addConditions(MW_TAG_KVATTRIBUTE.VALUE.lower().contains(criteria.attrValueContains.toLowerCase()));
}
if( criteria.id != null ) {
sql.addConditions(MW_TAG_SELECTION.ID.equalIgnoreCase(criteria.id.toString())); // when uuid is stored in database as the standard UUID string format (36 chars)
}
if( criteria.nameEqualTo != null && criteria.nameEqualTo.length() > 0 ) {
sql.addConditions(MW_TAG_SELECTION.NAME.equalIgnoreCase(criteria.nameEqualTo));
}
if( criteria.nameContains != null && criteria.nameContains.length() > 0 ) {
sql.addConditions(MW_TAG_SELECTION.NAME.lower().contains(criteria.nameContains.toLowerCase()));
}
}
sql.addOrderBy(MW_TAG_SELECTION.NAME);
Result<Record> result = sql.fetch();
log.debug("Got {} selection records", result.size());
for(Record r : result) {
SelectionKvAttribute sAttr = new SelectionKvAttribute();
sAttr.setId(UUID.valueOf(r.getValue(MW_TAG_SELECTION_KVATTRIBUTE.ID)));
sAttr.setSelectionId(UUID.valueOf(r.getValue(MW_TAG_SELECTION.ID)));
sAttr.setSelectionName(r.getValue(MW_TAG_SELECTION.NAME));
sAttr.setKvAttributeId(UUID.valueOf(r.getValue(MW_TAG_KVATTRIBUTE.ID)));
sAttr.setKvAttributeName(r.getValue(MW_TAG_KVATTRIBUTE.NAME));
sAttr.setKvAttributeValue(r.getValue(MW_TAG_KVATTRIBUTE.VALUE));
sAttr.setSelectionDescription(r.getValue(MW_TAG_SELECTION.DESCRIPTION));
objCollection.getSelectionKvAttributeValues().add(sAttr);
}
sql.close();
} catch (Exception ex) {
log.error("Error during attribute search.", ex);
throw new RepositorySearchException(ex, criteria);
}
log.debug("SelectionKvAttribute:Search - Returning back {} of results.", objCollection.getSelectionKvAttributeValues().size());
return objCollection;
}
@Override
@RequiresPermissions("tag_selection_kv_attributes:retrieve")
public SelectionKvAttribute retrieve(SelectionKvAttributeLocator locator) {
if (locator == null || locator.id == null ) { return null;}
log.debug("SelectionKvAttribute:Retrieve - Got request to retrieve SelectionKvAttribute with id {}.", locator.id);
try(SelectionKvAttributeDAO dao = TagJdbi.selectionKvAttributeDao()) {
SelectionKvAttribute obj = dao.findById(locator.id);
if (obj != null)
return obj;
} catch (Exception ex) {
log.error("SelectionKvAttribute:Retrieve - Error during SelectionKvAttribute retrieval.", ex);
throw new RepositoryRetrieveException(ex, locator);
}
return null;
}
@Override
@RequiresPermissions("tag_selection_kv_attributes:store")
public void store(SelectionKvAttribute item) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
@RequiresPermissions("tag_selection_kv_attributes:create")
public void create(SelectionKvAttribute item) {
log.debug("SelectionKvAttribute:Create - Got request to create a new SelectionKvAttribute {}.", item.getId().toString());
CertificateLocator locator = new CertificateLocator();
locator.id = item.getId();
try(SelectionKvAttributeDAO dao = TagJdbi.selectionKvAttributeDao();
SelectionDAO selectionDao = TagJdbi.selectionDao();
KvAttributeDAO attrDao = TagJdbi.kvAttributeDao()) {
Selection selectionObj;
SelectionKvAttribute obj = dao.findById(item.getId());
if (obj == null) {
if (item.getSelectionName() == null || item.getKvAttributeId() == null) {
log.error("SelectionKvAttribute:Create - Invalid input specified by the user.");
throw new RepositoryInvalidInputException(locator);
}
selectionObj = selectionDao.findByName(item.getSelectionName());
if (selectionObj == null) {
log.error("SelectionKvAttribute:Create - Invalid input specified by the user. Specified selection is not configured.");
throw new RepositoryInvalidInputException(locator);
}
KvAttribute attrObj = attrDao.findById(item.getKvAttributeId());
if (attrObj == null) {
log.error("SelectionKvAttribute:Create - Invalid input specified by the user. Specified attribute is not configured.");
throw new RepositoryInvalidInputException(locator);
}
dao.insert(item.getId(), selectionObj.getId(), item.getKvAttributeId());
log.debug("SelectionKvAttribute:Create - Created the SelectionKvAttribute {} successfully.", item.getId().toString());
} else {
log.error("SelectionKvAttribute:Create - SelectionKvAttribute {} will not be created since a duplicate SelectionKvAttribute already exists.", item.getId().toString());
throw new RepositoryCreateConflictException(locator);
}
} catch (RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("SelectionKvAttribute:Create - Error during SelectionKvAttribute creation.", ex);
throw new RepositoryCreateException(ex, locator);
}
}
@Override
@RequiresPermissions("tag_selection_kv_attributes:delete")
public void delete(SelectionKvAttributeLocator locator) {
if (locator == null || locator.id == null) { return; }
log.debug("SelectionKvAttribute:Delete - Got request to delete SelectionKvAttribute with id {}.", locator.id.toString());
try(SelectionKvAttributeDAO dao = TagJdbi.selectionKvAttributeDao()) {
SelectionKvAttribute obj = dao.findById(locator.id);
if (obj != null) {
dao.delete(locator.id);
log.debug("SelectionKvAttribute:Delete - Deleted the SelectionKvAttribute {} successfully.", locator.id.toString());
} else {
log.info("SelectionKvAttribute:Delete - SelectionKvAttribute does not exist in the system.");
}
} catch (Exception ex) {
log.error("SelectionKvAttribute:Delete - Error during SelectionKvAttribute deletion.", ex);
throw new RepositoryDeleteException(ex, locator);
}
}
@Override
@RequiresPermissions("tag_selection_kv_attributes:delete,search")
public void delete(SelectionKvAttributeFilterCriteria criteria) {
log.debug("SelectionKvAttribute:Delete - Got request to delete SelectionKvAttribute by search criteria.");
SelectionKvAttributeCollection objCollection = search(criteria);
try {
for (SelectionKvAttribute obj : objCollection.getSelectionKvAttributeValues()) {
SelectionKvAttributeLocator locator = new SelectionKvAttributeLocator();
locator.id = obj.getId();
delete(locator);
}
} catch(RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("SelectionKvAttribute:Delete - Error during Certificate deletion.", ex);
throw new RepositoryDeleteException(ex);
}
}
}