package net.techreadiness.service;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import net.techreadiness.persistence.dao.EntityDAO.EntityTypeCode;
import net.techreadiness.persistence.dao.EntityFieldDAO;
import net.techreadiness.persistence.dao.OptionListDAO;
import net.techreadiness.persistence.dao.ScopeExtDAO;
import net.techreadiness.persistence.dao.ViewDefDAO;
import net.techreadiness.persistence.dao.ViewDefTypeDAO;
import net.techreadiness.persistence.domain.EntityFieldDO;
import net.techreadiness.persistence.domain.OptionListDO;
import net.techreadiness.persistence.domain.ScopeExtDO;
import net.techreadiness.persistence.domain.ViewDefDO;
import net.techreadiness.persistence.domain.ViewDefFieldDO;
import net.techreadiness.persistence.domain.ViewDefTextDO;
import net.techreadiness.persistence.domain.ViewDefTypeDO;
import net.techreadiness.service.common.ViewColumn;
import net.techreadiness.service.common.ViewDef;
import net.techreadiness.service.common.ViewDef.ViewDefTypeCode;
import net.techreadiness.service.common.ViewField;
import net.techreadiness.service.common.ViewText;
import net.techreadiness.service.exception.ServiceException;
import net.techreadiness.service.object.OptionList;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class ConfigServiceImpl extends BaseServiceImpl implements ConfigService {
@Inject
private RuleService ruleService;
@Inject
private EntityFieldDAO entityFieldDao;
@Inject
private ViewDefDAO viewDefDao;
@Inject
private ScopeExtDAO scopeExtDao;
@Inject
private ViewDefTypeDAO viewDefTypeDao;
@Inject
private OptionListDAO optionListDAO;
@Override
@Transactional(readOnly = true)
@Cacheable(value = "viewDef", key = "#scopeId + #viewTypeCode.toString()")
public ViewDef getViewDefinition(ServiceContext context, Long scopeId, ViewDefTypeCode viewTypeCode)
throws ServiceException {
return getViewDefinition(scopeId, viewTypeCode);
}
@Override
@Transactional(readOnly = true)
@Cacheable(value = "viewDef", key = "#context.scopeId + #viewTypeCode.toString()")
public ViewDef getViewDefinition(ServiceContext context, ViewDef.ViewDefTypeCode viewTypeCode) throws ServiceException {
return getViewDefinition(context.getScopeId(), viewTypeCode);
}
private ViewDef getViewDefinition(Long scopeId, ViewDef.ViewDefTypeCode viewTypeCode) throws ServiceException {
ViewDef viewDef = new ViewDef();
viewDef.setRuleService(ruleService);
ViewDefTypeDO viewDefTypeDo = viewDefTypeDao.getByCode(viewTypeCode.toString());
if (viewDefTypeDo == null || viewDefTypeDo.getEntityType() == null) {
return null;
}
viewDef.setName(viewDefTypeDo.getName());
viewDef.setViewTypeCategory(viewDefTypeDo.getCategory());
EntityTypeCode entityTypeCode = EntityTypeCode.valueOf(viewDefTypeDo.getEntityType().getCode());
viewDef.setEntityTypeCode(entityTypeCode);
ViewDefDO viewDefDO = viewDefDao.getByViewTypeAndScopePath(viewTypeCode.toString(), scopeId);
if (viewDefDO == null) {
viewDefDO = viewDefDao.getByEntityTypeAndScopePath(entityTypeCode.name(), scopeId);
}
if (viewDefDO != null) {
if (StringUtils.isNotBlank(viewDefDO.getName())) {
viewDef.setName(viewDefDO.getName());
}
viewDef.setTypeCode(ViewDef.ViewDefTypeCode.valueOf(viewDefDO.getViewDefType().getCode().toUpperCase()));
viewDef.setTypeName(viewDefDO.getViewDefType().getName());
viewDef.setViewDefId(viewDefDO.getViewDefId());
viewDef.setScopePath(viewDefDO.getScope().getPath());
for (ViewDefFieldDO viewDefFieldDo : viewDefDO.getViewDefFields()) {
ViewField field = new ViewField(viewDefFieldDo.getEntityField(), viewDefFieldDo);
int colNum = 1;
if (viewDefFieldDo.getColumnNumber() != null) {
colNum = viewDefFieldDo.getColumnNumber();
}
if (colNum > 4) {
colNum = 4;
}
if (viewDef.getColumns().size() < colNum) {
for (int i = viewDef.getColumns().size(); i < colNum; i++) {
viewDef.getColumns().add(new ViewColumn());
}
}
ViewColumn column = viewDef.getColumns().get(colNum - 1);
column.add(field);
}
for (ViewDefTextDO viewDefTextDo : viewDefDO.getViewDefTexts()) {
ViewText text = new ViewText(viewDefTextDo);
int colNum = viewDefTextDo.getColumnNumber();
if (colNum > 4) {
colNum = 4;
}
if (viewDef.getColumns().size() < colNum) {
for (int i = viewDef.getColumns().size(); i < colNum; i++) {
viewDef.getColumns().add(new ViewColumn());
}
}
ViewColumn column = viewDef.getColumns().get(colNum - 1);
column.add(text);
}
if (viewDef.getColumns().size() >= 3) {
viewDef.getColumns().get(2).setWidth(viewDefDO.getColumn3Width());
viewDef.getColumns().get(2).setLabelWidth(viewDefDO.getColumn3LabelWidth());
Collections.sort(viewDef.getColumns().get(2).getComponents());
}
if (viewDef.getColumns().size() >= 2) {
viewDef.getColumns().get(1).setWidth(viewDefDO.getColumn2Width());
viewDef.getColumns().get(1).setLabelWidth(viewDefDO.getColumn2LabelWidth());
Collections.sort(viewDef.getColumns().get(1).getComponents());
}
if (viewDef.getColumns().size() >= 1) {
viewDef.getColumns().get(0).setWidth(viewDefDO.getColumn1Width());
viewDef.getColumns().get(0).setLabelWidth(viewDefDO.getColumn1LabelWidth());
Collections.sort(viewDef.getColumns().get(0).getComponents());
}
} else {
List<EntityFieldDO> entityFields = entityFieldDao.findByScopePathAndType(scopeId, viewDef.getEntityTypeCode());
for (EntityFieldDO entityFieldDo : entityFields) {
ViewField field = new ViewField(entityFieldDo);
ViewColumn column = viewDef.getColumns().size() == 0 ? null : viewDef.getColumns().get(0);
if (column == null) {
column = new ViewColumn();
viewDef.getColumns().add(column);
}
column.add(field);
}
}
return viewDef;
}
public void setScopeExtDao(ScopeExtDAO scopeExtDao) {
this.scopeExtDao = scopeExtDao;
}
@Override
public boolean isBooleanActive(ServiceContext context, Long scopeId, String key) {
if (scopeId != null && key != null) {
ScopeExtDO configItem = scopeExtDao.getLowestExistingConfigurationItem(scopeId, key);
if (configItem != null && "true".equals(configItem.getValue())) {
return true;
}
}
return false;
}
@Override
public OptionList getOptionList(ServiceContext serviceContext, String optionListCode, Long scopeId) {
OptionListDO optionListDO = optionListDAO.getOptionListByCode(optionListCode, scopeId);
return getMappingService().getMapper().map(optionListDO, OptionList.class);
}
}