/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.domain;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Hibernate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractExtendEntity<E, A extends AbstractAttribute<A>> extends AbstractEntity<E> {
private final Logger logger = LoggerFactory.getLogger(getClass());
/**
* Generated UID
*/
private static final long serialVersionUID = -171223653896353957L;
abstract public Set<A> getAttributes();
public List<A> getGlobalAttributes() {
List<A> globalAttributes = null;
if (getAttributes() != null && Hibernate.isInitialized(getAttributes())) {
globalAttributes = new ArrayList<A>();
for (A attribute : getAttributes()) {
AttributeDefinition attributeDefinition = attribute.getAttributeDefinition();
if (attributeDefinition != null && attributeDefinition.isGlobal()) {
globalAttributes.add(attribute);
}
}
}
return globalAttributes;
}
public List<A> getMarketAreaAttributes(Long marketAreaId) {
List<A> marketAreaAttributes = null;
if (getAttributes() != null && Hibernate.isInitialized(getAttributes())) {
marketAreaAttributes = new ArrayList<A>();
for (A attribute : getAttributes()) {
AttributeDefinition attributeDefinition = attribute.getAttributeDefinition();
if (attributeDefinition != null && !attributeDefinition.isGlobal()) {
marketAreaAttributes.add(attribute);
}
}
}
return marketAreaAttributes;
}
public A getAttribute(String attributeCode, Long marketAreaId, String localizationCode) {
A AbstractAttributeToReturn = null;
// 1: GET THE GLOBAL VALUE
A globalAttribute = getAttribute(getGlobalAttributes(), attributeCode, marketAreaId, localizationCode);
// 2: GET THE MARKET AREA VALUE
A marketAreaAttribute = getAttribute(getMarketAreaAttributes(marketAreaId), attributeCode, marketAreaId, localizationCode);
if(marketAreaAttribute != null){
AbstractAttributeToReturn = marketAreaAttribute;
} else if (globalAttribute != null){
AbstractAttributeToReturn = globalAttribute;
}
return AbstractAttributeToReturn;
}
public A getAttribute(List<A> attributes, String attributeCode, Long marketAreaId, String localizationCode) {
A attributeToReturn = null;
List<A> attributesFilter = new ArrayList<A>();
if(attributes != null) {
// GET ALL attributes FOR THIS ATTRIBUTE
for (A attribute : attributes) {
AttributeDefinition attributeDefinition = attribute.getAttributeDefinition();
if (attributeDefinition != null && attributeDefinition.getCode().equalsIgnoreCase(attributeCode)) {
attributesFilter.add(attribute);
}
}
// REMOVE ALL attributes NOT ON THIS MARKET AREA
if(marketAreaId != null) {
for (Iterator<A> iterator = attributesFilter.iterator(); iterator.hasNext();) {
A attribute = iterator.next();
AttributeDefinition attributeDefinition = attribute.getAttributeDefinition();
if(BooleanUtils.negate(attributeDefinition.isGlobal())) {
if(attribute.getMarketAreaId() != null && BooleanUtils.negate(attribute.getMarketAreaId().equals(marketAreaId))){
iterator.remove();
}
}
}
}
// FINALLY RETAIN ONLY attributes FOR THIS LOCALIZATION CODE
if(StringUtils.isNotEmpty(localizationCode)) {
for (Iterator<A> iterator = attributesFilter.iterator(); iterator.hasNext();) {
A attribute = (A) iterator.next();
String attributeLocalizationCode = attribute.getLocalizationCode();
if(StringUtils.isNotEmpty(attributeLocalizationCode) && BooleanUtils.negate(attributeLocalizationCode.equals(localizationCode))){
iterator.remove();
}
}
if(attributesFilter.size() == 0){
// TODO : warning ?
}
}
}
if(attributesFilter.size() == 1){
attributeToReturn = attributesFilter.get(0);
} else if(attributesFilter.size() > 1){
attributeToReturn = attributesFilter.get(0);
logger.error("Too many values (" + attributesFilter.size() + ") for this attribute, code : " + attributeCode);
} else {
// nothing
// TODO : throw error ?
}
return attributeToReturn;
}
public A getAttribute(String attributeCode) {
return getAttribute(attributeCode, null, null);
}
public A getAttribute(String attributeCode, String localizationCode) {
return getAttribute(attributeCode, null, localizationCode);
}
public A getAttribute(String attributeCode, Long marketAreaId) {
return getAttribute(attributeCode, marketAreaId, null);
}
}