/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.smartitengineering.user.service.impl;
import com.smartitengineering.dao.common.queryparam.Order;
import com.smartitengineering.dao.common.queryparam.QueryParameter;
import com.smartitengineering.dao.common.queryparam.QueryParameterFactory;
import com.smartitengineering.dao.impl.hibernate.AbstractCommonDaoImpl;
import com.smartitengineering.user.domain.Organization;
import com.smartitengineering.user.domain.UniqueConstrainedField;
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.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.hibernate.StaleStateException;
import org.hibernate.exception.ConstraintViolationException;
/**
*
* @author modhu7
*/
public class OrganizationServiceImpl extends AbstractCommonDaoImpl<Organization> implements OrganizationService {
private CRUDObservable observable;
public CRUDObservable getObservable() {
return observable;
}
public void setObservable(CRUDObservable observable) {
this.observable = observable;
}
public OrganizationServiceImpl() {
setEntityClass(Organization.class);
}
@Override
public void save(Organization organization) {
final Date date = new Date();
organization.setCreationDate(date);
organization.setLastModifiedDate(date);
validateOrganization(organization);
try {
super.save(organization);
observable.notifyObserver(ObserverNotification.CREATE_ORGANIZATION, organization);
}
catch (ConstraintViolationException e) {
String message = ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.OTHER;
throw new RuntimeException(message, e);
}
catch (StaleStateException 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);
try {
super.update(organization);
}
catch (ConstraintViolationException e) {
String message = ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.OTHER;
throw new RuntimeException(message, e);
}
catch (StaleStateException e) {
String message =
ExceptionMessage.STALE_OBJECT_STATE_EXCEPTION.name() + "-" + UniqueConstrainedField.OTHER;
throw new RuntimeException(message, e);
}
}
@Override
public Collection<Organization> getAllOrganization() {
Collection<Organization> organizations = new HashSet<Organization>();
try {
organizations = super.getAll();
}
catch (Exception e) {
}
return organizations;
}
@Override
public Collection<Organization> getOrganizations(String organizationNameLike, String shortName, boolean isSmallerThan,
int count) {
List<QueryParameter> params = new ArrayList<QueryParameter>();
if (StringUtils.isNotBlank(organizationNameLike)) {
final QueryParameter orgNameLikeParam = QueryParameterFactory.getStringLikePropertyParam("name",
organizationNameLike);
params.add(orgNameLikeParam);
}
if (StringUtils.isNotBlank(shortName)) {
if (isSmallerThan) {
params.add(QueryParameterFactory.getLesserThanPropertyParam("uniqueShortName", shortName));
}
else {
params.add(QueryParameterFactory.getGreaterThanPropertyParam("uniqueShortName", shortName));
}
}
params.add(QueryParameterFactory.getMaxResultsParam(count));
params.add(QueryParameterFactory.getOrderByParam("uniqueShortName", isSmallerThan ? Order.DESC : Order.ASC));
params.add(QueryParameterFactory.getDistinctPropProjectionParam("uniqueShortName"));
List<String> organizationShortNames = getOtherList(params);
if (organizationShortNames != null && !organizationShortNames.isEmpty()) {
List<Organization> organizations = new ArrayList<Organization>(getByUniqueShortNames(organizationShortNames));
Collections.sort(organizations, new Comparator<Organization>() {
@Override
public int compare(Organization o1, Organization o2) {
return o1.getUniqueShortName().toUpperCase().compareTo(o2.getUniqueShortName().toUpperCase());
}
});
return organizations;
}
else {
return Collections.emptySet();
}
}
@Override
public Organization getOrganizationByUniqueShortName(String uniqueShortName) {
QueryParameter qp;
qp = QueryParameterFactory.getEqualPropertyParam("uniqueShortName", uniqueShortName);
Organization organization = new Organization("", "");
try {
organization = super.getSingle(qp);
}
catch (Exception e) {
e.printStackTrace();
}
return organization;
}
public List<Organization> getByUniqueShortNames(List<String> shortNames) {
QueryParameter<String> param = QueryParameterFactory.<String>getIsInPropertyParam("uniqueShortName", shortNames.
toArray(new String[0]));
Collection<Organization> result;
try {
result = getList(param);
}
catch (Exception ex) {
ex.printStackTrace();
result = Collections.<Organization>emptyList();
}
return new ArrayList<Organization>(result);
}
@Override
public void validateOrganization(Organization organization) {
if (StringUtils.isEmpty(organization.getUniqueShortName())) {
throw new RuntimeException(ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.ORGANIZATION_UNIQUE_SHORT_NAME.
name());
}
if (organization.getId() == null) {
Integer count = (Integer) super.getOther(
QueryParameterFactory.getElementCountParam("uniqueShortName"), QueryParameterFactory.
getStringLikePropertyParam(
"uniqueShortName",
organization.getUniqueShortName()));
if (count.intValue() > 0) {
throw new RuntimeException(ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.ORGANIZATION_UNIQUE_SHORT_NAME.
name());
}
}
else {
Integer count = (Integer) super.getOther(
QueryParameterFactory.getElementCountParam("uniqueShortName"),
QueryParameterFactory.getConjunctionParam(
QueryParameterFactory.getNotEqualPropertyParam("id",
organization.getId()), QueryParameterFactory.
getStringLikePropertyParam(
"uniqueShortName", organization.getUniqueShortName())));
if (count.intValue() > 0) {
throw new RuntimeException(ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" + UniqueConstrainedField.ORGANIZATION_UNIQUE_SHORT_NAME.
name());
}
}
}
@Override
public void delete(Organization organization) {
try {
observable.notifyObserver(ObserverNotification.DELETE_ORGNIZATION, organization);
super.delete(organization);
}
catch (RuntimeException e) {
String message = ExceptionMessage.CONSTRAINT_VIOLATION_EXCEPTION.name() + "-" +
UniqueConstrainedField.ORGANIZATION;
throw new RuntimeException(message, e);
}
}
@Override
public Collection<Organization> search(OrganizationFilter filter) {
QueryParameter qp;
List<QueryParameter> queryParameters = new ArrayList<QueryParameter>();
if (!StringUtils.isEmpty(filter.getOrganizationUniqueShortName())) {
qp = QueryParameterFactory.getEqualPropertyParam("uniqueShortName",
filter.getOrganizationUniqueShortName());
queryParameters.add(qp);
}
Collection<Organization> organizations = new HashSet<Organization>();
if (queryParameters.isEmpty()) {
try {
organizations = super.getAll();
}
catch (Exception e) {
}
}
else {
organizations = super.getList(queryParameters);
}
return organizations;
}
}