/*
* 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 static com.intel.mtwilson.tag.dao.jooq.generated.Tables.MW_CONFIGURATION;
import com.intel.mtwilson.tag.dao.jdbi.ConfigurationDAO;
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.common.Global;
import com.intel.mtwilson.tag.dao.TagJdbi;
import com.intel.mtwilson.tag.model.CertificateLocator;
import com.intel.mtwilson.tag.model.Configuration;
import com.intel.mtwilson.tag.model.ConfigurationCollection;
import com.intel.mtwilson.tag.model.ConfigurationFilterCriteria;
import com.intel.mtwilson.tag.model.ConfigurationLocator;
import java.io.IOException;
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 ConfigurationRepository implements DocumentRepository<Configuration, ConfigurationCollection, ConfigurationFilterCriteria, ConfigurationLocator> {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ConfigurationRepository.class);
@Override
@RequiresPermissions("configurations:search")
public ConfigurationCollection search(ConfigurationFilterCriteria criteria) {
log.debug("Configuration:Search - Got request to search for the Configurations.");
ConfigurationCollection objCollection = new ConfigurationCollection();
try(JooqContainer jc = TagJdbi.jooq()) {
DSLContext jooq = jc.getDslContext();
SelectQuery sql = jooq.select().from(MW_CONFIGURATION).getQuery();
if (criteria.filter) {
if( criteria.id != null ) {
sql.addConditions(MW_CONFIGURATION.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_CONFIGURATION.NAME.equalIgnoreCase(criteria.nameEqualTo));
}
if( criteria.nameContains != null && criteria.nameContains.length() > 0 ) {
sql.addConditions(MW_CONFIGURATION.NAME.lower().contains(criteria.nameContains.toLowerCase()));
}
}
Result<Record> result = sql.fetch();
log.debug("Got {} records", result.size());
for(Record r : result) {
Configuration configObj = new Configuration();
configObj.setId(UUID.valueOf(r.getValue(MW_CONFIGURATION.ID)));
configObj.setName(r.getValue(MW_CONFIGURATION.NAME));
try {
configObj.setXmlContent(r.getValue(MW_CONFIGURATION.CONTENT));
}
catch(IOException e) {
log.error("Failed to load configuration content for {}: {}", configObj.getId().toString(), e.getMessage());
}
objCollection.getConfigurations().add(configObj);
}
sql.close();
} catch (Exception ex) {
log.error("Configuration:Search - Error during configuration search.", ex);
throw new RepositorySearchException(ex, criteria);
}
log.debug("Configuration:Search - Returning back {} of results.", objCollection.getConfigurations().size());
return objCollection;
}
@Override
@RequiresPermissions("configurations:retrieve")
public Configuration retrieve(ConfigurationLocator locator) {
if( locator == null || locator.id == null ) { return null; }
log.debug("Configuration:Retrieve - Got request to retrieve Configuration with id {}.", locator.id);
try (ConfigurationDAO dao = TagJdbi.configurationDao()) {
Configuration obj = dao.findById(locator.id);
if (obj != null) {
return obj;
}
} catch (Exception ex) {
log.error("Configuration:Retrieve - Error during configuration retrieval.", ex);
throw new RepositoryRetrieveException(ex, locator);
}
return null;
}
@Override
@RequiresPermissions("configurations:store")
public void store(Configuration item) {
if (item == null) {return;}
log.debug("Configuration:Store - Got request to update Configuration with id {}.", item.getId().toString());
ConfigurationLocator locator = new ConfigurationLocator();
locator.id = item.getId();
try (ConfigurationDAO dao = TagJdbi.configurationDao()) {
Configuration existingConfiguration = dao.findById(item.getId());
if( existingConfiguration == null ) {
log.error("Configuration:Store - Configuration will not be updated since it does not exist.");
throw new RepositoryStoreConflictException(locator);
}
dao.update(item.getId(), item.getName(), item.getXmlContent());
Global.reset(); // new configuration will take effect next time it is needed (if it's the active one)
log.debug("Configuration:Store - Updated the Configuration {} successfully.", item.getId().toString());
} catch (RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("Configuration:Store - Error during Configuration update.", ex);
throw new RepositoryStoreException(ex, locator);
}
}
@Override
@RequiresPermissions("configurations:create")
public void create(Configuration item) {
log.debug("Configuration:Create - Got request to create a new Configuration {}.", item.getId().toString());
CertificateLocator locator = new CertificateLocator();
locator.id = item.getId();
try (ConfigurationDAO dao = TagJdbi.configurationDao()) {
Configuration obj = dao.findById(item.getId());
if (obj == null) {
dao.insert(item.getId(), item.getName(), item.getXmlContent());
log.debug("Configuration:Create - Created the Configuration {} successfully.", item.getId().toString());
} else {
log.error("Configuration:Create - Configuration {} will not be created since a duplicate Configuration already exists.", item.getId().toString());
throw new RepositoryCreateConflictException(locator);
}
} catch (RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("Configuration:Create - Error during Configuration creation.", ex);
throw new RepositoryCreateException(ex, locator);
}
}
@Override
@RequiresPermissions("configurations:delete")
public void delete(ConfigurationLocator locator) {
if( locator == null || locator.id == null ) { return; }
log.debug("Configuration:Delete - Got request to delete Configuration with id {}.", locator.id.toString());
try (ConfigurationDAO dao = TagJdbi.configurationDao()) {
Configuration obj = dao.findById(locator.id);
if (obj != null) {
dao.delete(locator.id);
log.debug("Configuration:Delete - Deleted the Configuration {} successfully.", locator.id.toString());
}else {
log.info("Configuration:Delete - Configuration does not exist in the system.");
}
} catch (Exception ex) {
log.error("Configuration:Delete - Error during configuration deletion.", ex);
throw new RepositoryDeleteException(ex, locator);
}
}
@Override
@RequiresPermissions("configurations:delete,search")
public void delete(ConfigurationFilterCriteria criteria) {
log.debug("Configuration:Delete - Got request to delete configuration by search criteria.");
ConfigurationCollection objCollection = search(criteria);
try {
for (Configuration obj : objCollection.getConfigurations()) {
ConfigurationLocator locator = new ConfigurationLocator();
locator.id = obj.getId();
delete(locator);
}
} catch(RepositoryException re) {
throw re;
} catch (Exception ex) {
log.error("Configuration:Delete - Error during Configuration deletion.", ex);
throw new RepositoryDeleteException(ex);
}
}
}