/*
* 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.tag.dao.jdbi.FileDAO;
import static com.intel.mtwilson.tag.dao.jooq.generated.Tables.MW_FILE;
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.RepositoryDeleteException;
import com.intel.mtwilson.repository.RepositoryException;
import com.intel.mtwilson.repository.RepositoryRetrieveException;
import com.intel.mtwilson.repository.RepositorySearchException;
import com.intel.mtwilson.repository.RepositoryStoreConflictException;
import com.intel.mtwilson.repository.RepositoryStoreException;
import com.intel.mtwilson.tag.dao.TagJdbi;
import com.intel.mtwilson.tag.model.File;
import com.intel.mtwilson.tag.model.FileCollection;
import com.intel.mtwilson.tag.model.FileFilterCriteria;
import com.intel.mtwilson.tag.model.FileLocator;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.SelectQuery;
/**
*
* @author ssbangal
*/
public class FileRepository implements DocumentRepository<File, FileCollection, FileFilterCriteria, FileLocator> {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(FileRepository.class);
@Override
@RequiresPermissions("files:search")
public FileCollection search(FileFilterCriteria criteria) {
log.debug("File:Search - Got request to search for the Files.");
FileCollection objCollection = new FileCollection();
try(JooqContainer jc = TagJdbi.jooq()) {
DSLContext jooq = jc.getDslContext();
SelectQuery sql = jooq.select().from(MW_FILE).getQuery();
if (criteria.filter) {
if( criteria.id != null ) {
sql.addConditions(MW_FILE.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_FILE.NAME.equalIgnoreCase(criteria.nameEqualTo));
}
if( criteria.nameContains != null && criteria.nameContains.length() > 0 ) {
sql.addConditions(MW_FILE.NAME.lower().contains(criteria.nameContains.toLowerCase()));
}
if( criteria.contentTypeEqualTo != null && criteria.contentTypeEqualTo.length() > 0 ) {
sql.addConditions(MW_FILE.CONTENTTYPE.equalIgnoreCase(criteria.contentTypeEqualTo));
}
if( criteria.contentTypeContains != null && criteria.contentTypeContains.length() > 0 ) {
sql.addConditions(MW_FILE.CONTENTTYPE.lower().startsWith(criteria.contentTypeContains.toLowerCase()));
}
}
Result<Record> result = sql.fetch();
log.debug("Got {} records", result.size());
for(Record r : result) {
File obj = new File();
obj.setId(UUID.valueOf(r.getValue(MW_FILE.ID)));
obj.setName(r.getValue(MW_FILE.NAME));
obj.setContentType(r.getValue(MW_FILE.CONTENTTYPE));
obj.setContent(r.getValue(MW_FILE.CONTENT));
}
sql.close();
} catch (Exception ex) {
log.error("Certificate:Search - Error during file search.", ex);
throw new RepositorySearchException(ex, criteria);
}
log.debug("Certificate:Search - Returning back {} of results.", objCollection.getFiles().size());
return objCollection;
}
@Override
@RequiresPermissions("files:retrieve")
public File retrieve(FileLocator locator) {
if (locator == null || locator.id == null ) { return null;}
log.debug("File:Retrieve - Got request to retrieve file with id {}.", locator.id);
try(FileDAO dao = TagJdbi.fileDao()) {
File obj = dao.findById(locator.id);
if (obj != null)
return obj;
} catch (Exception ex) {
log.error("File:Retrieve - Error during file search.", ex);
throw new RepositoryRetrieveException(ex, locator);
}
return null;
}
@Override
@RequiresPermissions("files:store")
public void store(File item) {
if (item == null) {return;}
log.debug("File:Store - Got request to update File with id {}.", item.getId().toString());
FileLocator locator = new FileLocator();
locator.id = item.getId();
try(FileDAO dao = TagJdbi.fileDao()) {
File obj = dao.findById(item.getId());
if (obj != null) {
dao.update(item.getId(), item.getName(), item.getContentType(), item.getContent());
log.debug("File:Store - Updated the File {} successfully.", item.getId().toString());
} else {
log.error("File:Store - File will not be updated since it does not exist.");
throw new RepositoryStoreConflictException(locator);
}
} catch (RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("File:Store - Error during File update.", ex);
throw new RepositoryStoreException(ex, locator);
}
}
@Override
@RequiresPermissions("files:create")
public void create(File item) {
log.debug("File:Create - Got request to create a new File {}.", item.getId().toString());
FileLocator locator = new FileLocator();
locator.id = item.getId();
try(FileDAO dao = TagJdbi.fileDao()) {
File obj = dao.findById(item.getId());
if (obj == null) {
if (item.getName() == null || item.getName().isEmpty() || item.getContentType()== null
|| item.getContentType().isEmpty() || item.getContent().length == 0) {
log.error("File:Create - Invalid input specified by the user.");
throw new RepositoryCreateException();
}
obj = dao.findByName(item.getName());
if (obj == null) {
dao.insert(item.getId(), item.getName(), item.getContentType(), item.getContent());
log.debug("File:Create - Created the File {} successfully.", item.getId().toString());
} else {
log.error("File:Create - File {} will not be created since a duplicate File already exists.", item.getId().toString());
throw new RepositoryCreateConflictException(locator);
}
} else {
log.error("File:Create - File {} will not be created since a duplicate File already exists.", item.getId().toString());
throw new RepositoryCreateConflictException(locator);
}
} catch (RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("File:Create - Error during File creation.", ex);
throw new RepositoryCreateException(ex, locator);
}
}
@Override
@RequiresPermissions("files:delete")
public void delete(FileLocator locator) {
if( locator == null || locator.id == null ) { return; }
log.debug("File:Delete - Got request to delete File with id {}.", locator.id.toString());
try(FileDAO dao = TagJdbi.fileDao()) {
File obj = dao.findById(locator.id);
if (obj != null) {
dao.delete(locator.id);
log.debug("File:Delete - Deleted the File {} successfully.", locator.id.toString());
}else {
log.info("File:Delete - File does not exist in the system.");
}
} catch (Exception ex) {
log.error("File:Delete - Error during attribute deletion.", ex);
throw new RepositoryDeleteException(ex, locator);
}
}
@Override
@RequiresPermissions("files:delete,search")
public void delete(FileFilterCriteria criteria) {
log.debug("File:Delete - Got request to delete file by search criteria.");
FileCollection objCollection = search(criteria);
try {
for (File obj : objCollection.getFiles()) {
FileLocator locator = new FileLocator();
locator.id = obj.getId();
delete(locator);
}
} catch(RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("File:Delete - Error during File deletion.", ex);
throw new RepositoryDeleteException(ex);
}
}
}