/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.user.service.impl.hbase;
import com.google.inject.Inject;
import com.smartitengineering.common.dao.search.CommonFreeTextSearchDao;
import com.smartitengineering.dao.common.CommonReadDao;
import com.smartitengineering.dao.common.CommonWriteDao;
import com.smartitengineering.dao.common.queryparam.QueryParameterFactory;
import com.smartitengineering.user.domain.Organization;
import com.smartitengineering.user.domain.UniqueConstrainedField;
import com.smartitengineering.user.filter.AbstractFilter.Order;
import com.smartitengineering.user.filter.OrganizationFilter;
import com.smartitengineering.user.observer.CRUDObservable;
import com.smartitengineering.user.observer.ObserverNotification;
import com.smartitengineering.user.service.ExceptionMessage;
import com.smartitengineering.user.service.OrganizationService;
import java.util.Collection;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author imyousuf
*/
public class OrganizationServiceImpl implements OrganizationService {
public static final Logger logger = LoggerFactory.getLogger(OrganizationServiceImpl.class);
@Inject
private CommonWriteDao<Organization> writeDao;
@Inject
private CommonReadDao<Organization, String> readDao;
@Inject
private CRUDObservable observable;
@Inject
protected CommonFreeTextSearchDao<Organization> freeTextSearchDao;
@Override
public void save(Organization organization) {
validateOrganization(organization);
final Date date = new Date();
organization.setCreationDate(date);
organization.setLastModifiedDate(date);
try {
writeDao.save(organization);
logger.info("notify observer.................");
observable.notifyObserver(ObserverNotification.CREATE_ORGANIZATION, organization);
}
catch (Exception e) {
String message = ExceptionMessage.STALE_OBJECT_STATE_EXCEPTION.name() + "-" + UniqueConstrainedField.OTHER;
throw new RuntimeException(message, e);
}
}
@Override
public void update(Organization organization) {
final Date date = new Date();
organization.setLastModifiedDate(date);
validateOrganization(organization);
Organization oldOrganization = readDao.getById(organization.getId());
if (oldOrganization == null) {
throw new IllegalArgumentException("Trying to update non-existent person!");
}
organization.setCreationDate(oldOrganization.getCreationDate());
try {
writeDao.update(organization);
observable.notifyObserver(ObserverNotification.UPDATE_ORGANIZATION, organization);
}
catch (Exception e) {
String message = ExceptionMessage.STALE_OBJECT_STATE_EXCEPTION.name() + "-" + UniqueConstrainedField.OTHER;
throw new RuntimeException(message, e);
}
}
@Override
public void delete(Organization organization) {
try {
observable.notifyObserver(ObserverNotification.DELETE_ORGNIZATION, organization);
writeDao.delete(organization);
if (logger.isInfoEnabled()) {
logger.info("Service Impl :: Organization Deleted " + organization.getUniqueShortName());
}
}
catch (Exception e) {
logger.info(e.getMessage(), e);
String message = ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" +
UniqueConstrainedField.ORGANIZATION;
throw new RuntimeException(message, e);
}
}
@Override
public Collection<Organization> getAllOrganization() {
return readDao.getAll();
}
@Override
public Collection<Organization> search(OrganizationFilter organizationFilter) {
StringBuilder q = new StringBuilder();
final String id = organizationFilter.getOrganizationUniqueShortName();
if (StringUtils.isNotBlank(id)) {
q.append("id: ").append("org\\: ").append(ClientUtils.escapeQueryChars(id)).append('*');
}
if (StringUtils.isBlank(id)) {
q.append("id: ").append("org\\:").append('*');
}
final String name = organizationFilter.getName();
if (StringUtils.isNotBlank(name)) {
q.append(" AND ").append(" name: ").append(ClientUtils.escapeQueryChars(id)).append('*');
}
if (organizationFilter.getSortBy() == null) {
organizationFilter.setSortBy("id");
}
if (organizationFilter.getSortOrder() == null) {
organizationFilter.setSortOrder(Order.ASC);
}
if (organizationFilter.getCount() == null) {
logger.info("count is null");
}
else {
if (logger.isInfoEnabled()) {
logger.info("count is " + organizationFilter.getCount());
}
}
if (logger.isInfoEnabled()) {
logger.info(">>>>>>>>>>>QUERY>>>>>>>>>>" + q.toString());
}
if (organizationFilter.getCount() != null && organizationFilter.getIndex() != null) {
return freeTextSearchDao.search(QueryParameterFactory.getStringLikePropertyParam("q", q.toString()), QueryParameterFactory.
getMaxResultsParam(organizationFilter.getCount()), QueryParameterFactory.getFirstResultParam(organizationFilter.
getIndex() * organizationFilter.getCount()), QueryParameterFactory.getOrderByParam(organizationFilter.
getSortBy(), com.smartitengineering.dao.common.queryparam.Order.valueOf(
organizationFilter.getSortOrder().name())));
}
else {
return freeTextSearchDao.search(QueryParameterFactory.getStringLikePropertyParam("q", q.toString()), QueryParameterFactory.
getOrderByParam(organizationFilter.getSortBy(), com.smartitengineering.dao.common.queryparam.Order.valueOf(organizationFilter.
getSortOrder().name())));
}
}
@Override
public Collection<Organization> getOrganizations(String organizationNameLike, String shortName, boolean isSmallerThan,
int count) {
OrganizationFilter organizationFilter = new OrganizationFilter();
organizationFilter.setName(organizationNameLike);
organizationFilter.setOrganizationUniqueShortName(shortName);
organizationFilter.setCount(count);
return search(organizationFilter);
}
@Override
public Organization getOrganizationByUniqueShortName(String uniqueShortName) {
OrganizationFilter organizationFilter = new OrganizationFilter();
organizationFilter.setOrganizationUniqueShortName(uniqueShortName);
Organization organization = readDao.getById(uniqueShortName);
return organization;
}
@Override
public void validateOrganization(Organization organization) {
if (StringUtils.isEmpty(organization.getUniqueShortName())) {
logger.warn("Constriant violation for empty short name! " + organization.getUniqueShortName() + " " + organization.
getId());
throw new RuntimeException(ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.ORGANIZATION_UNIQUE_SHORT_NAME.
name());
}
if (organization.getCreationDate() == null) {
Organization testOrg = readDao.getById(organization.getId());
if (testOrg != null) {
throw new RuntimeException(ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.ORGANIZATION_UNIQUE_SHORT_NAME.
name());
}
}
}
}