package org.archstudio.bna.utils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.archstudio.bna.IThing;
import org.archstudio.bna.facets.IHasBackground;
import org.archstudio.bna.facets.IHasHidden;
import org.archstudio.bna.keys.IThingKey;
import org.archstudio.bna.keys.ThingKey;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class UserEditableUtils {
private static final IThingKey<Set<String>> USER_EDITABLE_QUALITIES_KEY = ThingKey.create("userEditableQualities");
public static void addEditableQualities(final IThing thing, final String... qualities) {
Set<String> newEditableQualities =
Sets.newHashSet(thing.get(USER_EDITABLE_QUALITIES_KEY, Sets.<String> newHashSet()));
newEditableQualities.addAll(Arrays.asList(qualities));
thing.set(USER_EDITABLE_QUALITIES_KEY, newEditableQualities);
}
public static void removeEditableQualities(final IThing thing, final String... qualities) {
Set<String> newEditableQualities =
Sets.newHashSet(thing.get(USER_EDITABLE_QUALITIES_KEY, Collections.<String> emptySet()));
newEditableQualities.removeAll(Arrays.asList(qualities));
thing.set(USER_EDITABLE_QUALITIES_KEY, newEditableQualities);
}
public static boolean isEditable(IThing thing) {
if (thing.has(IHasHidden.HIDDEN_KEY, true)) {
return false;
}
if (thing.has(IHasBackground.BACKGROUND_KEY, true)) {
return false;
}
return true;
}
public static boolean isEditableForAllQualities(IThing thing, final String... editableQualities) {
if (!isEditable(thing)) {
return false;
}
if (editableQualities.length == 0) {
return true;
}
Set<String> thingEditableQualities = thing.get(USER_EDITABLE_QUALITIES_KEY, Collections.<String> emptySet());
for (String editableQuality : editableQualities) {
if (!thingEditableQualities.contains(editableQuality)) {
return false;
}
}
return true;
}
public static <T extends IThing> List<T> getEditableForAllQualities(Iterable<T> things,
final String... editableQualities) {
return Lists.newArrayList(Iterables.filter(things, new Predicate<IThing>() {
@Override
public boolean apply(IThing input) {
return isEditableForAllQualities(input, editableQualities);
}
}));
}
public static <T extends IThing> List<T> getEditableForAllQualities(Iterable<IThing> things, Class<T> ofType,
final String... editableQualities) {
return Lists.newArrayList(Iterables.filter(getEditableForAllQualities(things, editableQualities), ofType));
}
public static boolean isEditableForAnyQualities(IThing thing, final String... editableQualities) {
if (!isEditable(thing)) {
return false;
}
if (editableQualities.length == 0) {
return true;
}
Set<String> thingEditableQualities = thing.get(USER_EDITABLE_QUALITIES_KEY, Collections.<String> emptySet());
for (String editableQuality : editableQualities) {
if (thingEditableQualities.contains(editableQuality)) {
return true;
}
}
return false;
}
public static List<IThing> getEditableForAnyQualities(Iterable<IThing> things, final String... editableQualities) {
return Lists.newArrayList(Iterables.filter(things, new Predicate<IThing>() {
@Override
public boolean apply(IThing input) {
return isEditableForAnyQualities(input, editableQualities);
}
}));
}
public static <T extends IThing> List<T> getEditableForAnyQualities(List<IThing> things, Class<T> ofType,
final String... editableQualities) {
return Lists.newArrayList(Iterables.filter(getEditableForAnyQualities(things, editableQualities), ofType));
}
}