/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma;
import java.util.List;
import java.util.Locale;
import java.util.NoSuchElementException;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
public abstract class AttributeAwareBuilder<T extends AttributeAwareBuilder<?>> {
public T addAttribute(@Nonnull String name, @Nonnull String value) {
if (!Strings.isNullOrEmpty(name) && !Strings.isNullOrEmpty(value)) {
getAttributes().put(name, Attribute.Builder.newAttribute(name).withValue(value).build());
}
return getBuilder();
}
public T addAttribute(@Nonnull String name, @Nonnull String value, @Nullable Locale locale) {
if(locale != null && "".equals(locale.toString())) {
addAttribute(name, value);
} else if (!Strings.isNullOrEmpty(name) && !Strings.isNullOrEmpty(value)) {
getAttributes().put(name, Attribute.Builder.newAttribute(name).withValue(locale, value).build());
}
return getBuilder();
}
public T addAttribute(@Nonnull Attribute attribute) {
if (attribute != null) {
getAttributes().put(attribute.getName(), Attributes.copyOf(attribute));
}
return getBuilder();
}
public T addAttributes(@Nonnull Iterable<Attribute> attributes) {
for(Attribute attribute : attributes) {
addAttribute(attribute);
}
return getBuilder();
}
protected abstract ListMultimap<String, Attribute> getAttributes();
protected abstract T getBuilder();
public static ListMultimap<String, Attribute> overrideAttributes(Iterable<Attribute> existingAttributes,
List<Attribute> overrideAttributes) {
ListMultimap<String, Attribute> existingAttributesMultimap = LinkedListMultimap.create();
for(Attribute attribute : existingAttributes) {
existingAttributesMultimap.put(attribute.getName(), attribute);
}
return overrideAttributes(existingAttributesMultimap, overrideAttributes);
}
public static ListMultimap<String, Attribute> overrideAttributes(ListMultimap<String, Attribute> existingAttributes,
Iterable<Attribute> overrideAttributes) {
for(Attribute attribute : overrideAttributes) {
overrideAttribute(existingAttributes, attribute);
}
return existingAttributes;
}
private static void overrideAttribute(ListMultimap<String, Attribute> attrs, Attribute attribute) {
if(!attrs.containsEntry(attribute.getName(), attribute)) {
if(attrs.containsKey(attribute.getName())) {
if(attribute.isLocalised()) {
removeLocalisedAttribute(attrs, attribute);
} else {
attrs.get(attribute.getName()).remove(0);
}
}
attrs.put(attribute.getName(), attribute);
}
}
private static void removeLocalisedAttribute(ListMultimap<String, Attribute> attrs, final Attribute attribute) {
try {
Attribute attributeToRemove = Iterables.find(attrs.get(attribute.getName()), new Predicate<Attribute>() {
@Override
public boolean apply(Attribute input) {
return input != null //
&& attribute.getName().equals(input.getName()) //
&& (!attribute.isLocalised() && !input.isLocalised() ||
attribute.isLocalised() && input.isLocalised() && attribute.getLocale().equals(input.getLocale()));
}
});
attrs.remove(attributeToRemove.getName(), attributeToRemove);
} catch(NoSuchElementException e) {
// Nothing to remove.
}
}
}