/** * Copyright (c) 2014-2017 by the respective copyright holders. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.smarthome.config.core.status; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.eclipse.smarthome.config.core.status.ConfigStatusMessage.Type; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; /** * The {@link ConfigStatusInfo} contains {@link ConfigStatusMessage}s to represent the current configuration status of * an entity. Furthermore it provides some convenience operations to filter for specific {@link ConfigStatusMessage}s. * * @author Thomas Höfer - Initial contribution */ public final class ConfigStatusInfo { private final Collection<ConfigStatusMessage> configStatusMessages = new ArrayList<>(); /** * Creates a new {@link ConfigStatusInfo}. */ public ConfigStatusInfo() { super(); } /** * Creates a new {@link ConfigStatusInfo} with the given {@link ConfigStatusMessages}. * * @param configStatusMessages the configuration status messages to be added */ public ConfigStatusInfo(Collection<ConfigStatusMessage> configStatusMessages) { add(configStatusMessages); } /** * Retrieves all configuration status messages. * * @return an unmodifiable collection of available configuration status messages */ public Collection<ConfigStatusMessage> getConfigStatusMessages() { return Collections.unmodifiableCollection(configStatusMessages); } /** * Retrieves all configuration status messages that have one of the given types. * * @param types the types to be filtered for; if empty then all messages are delivered * * @return an unmodifiable collection of the corresponding configuration status messages */ public Collection<ConfigStatusMessage> getConfigStatusMessages(Type... types) { final Collection<Type> typesCollection = ImmutableList.copyOf(types); return filter(typesCollection, new Predicate<ConfigStatusMessage>() { @Override public boolean apply(ConfigStatusMessage configStatusMessage) { return typesCollection.contains(configStatusMessage.type); } }); } /** * Retrieves all configuration status messages that have one of the given parameter names. * * @param parameterNames the parameter names to be filtered for; if empty then all messages are delivered * * @return an unmodifiable collection of the corresponding configuration status messages */ public Collection<ConfigStatusMessage> getConfigStatusMessages(String... parameterNames) { final Collection<String> parameterNamesCollection = ImmutableList.copyOf(parameterNames); return filter(parameterNamesCollection, new Predicate<ConfigStatusMessage>() { @Override public boolean apply(ConfigStatusMessage configStatusMessage) { return parameterNamesCollection.contains(configStatusMessage.parameterName); } }); } /** * Retrieves all configuration status messages that have one of the given parameter names or types. * * @param types the types to be filtered for (must not be null) * @param parameterNames the parameter names to be filtered for (must not be null) * * @return an unmodifiable collection of the corresponding configuration status messages * * @throws NullPointerException if one of types or parameter names collection is empty */ public Collection<ConfigStatusMessage> getConfigStatusMessages(final Collection<Type> types, final Collection<String> parameterNames) { Preconditions.checkNotNull(types); Preconditions.checkNotNull(parameterNames); return filterConfigStatusMessages(getConfigStatusMessages(), new Predicate<ConfigStatusMessage>() { @Override public boolean apply(ConfigStatusMessage configStatusMessage) { return types.contains(configStatusMessage.type) || parameterNames.contains(configStatusMessage.parameterName); } }); } /** * Adds the given {@link ConfigStatusMessage}. * * @param configStatusMessage the configuration status message to be added * * @throws IllegalArgumentException if given configuration status message is null */ public void add(ConfigStatusMessage configStatusMessage) { if (configStatusMessage == null) { throw new IllegalArgumentException("Config status message must not be null"); } configStatusMessages.add(configStatusMessage); } /** * Adds the given given {@link ConfigStatusMessage}s. * * @param configStatusMessages the configuration status messages to be added * * @throws IllegalArgumentException if given collection is null */ public void add(Collection<ConfigStatusMessage> configStatusMessages) { if (configStatusMessages == null) { throw new IllegalArgumentException("Config status messages must not be null"); } for (ConfigStatusMessage configStatusMessage : configStatusMessages) { add(configStatusMessage); } } private Collection<ConfigStatusMessage> filter(Collection<?> filter, Predicate<ConfigStatusMessage> predicate) { if (filter.isEmpty()) { return getConfigStatusMessages(); } return filterConfigStatusMessages(getConfigStatusMessages(), predicate); } private static Collection<ConfigStatusMessage> filterConfigStatusMessages( Collection<ConfigStatusMessage> configStatusMessages, Predicate<ConfigStatusMessage> predicate) { return Collections.unmodifiableCollection(Collections2.filter(configStatusMessages, predicate)); } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((configStatusMessages == null) ? 0 : configStatusMessages.hashCode()); return result; } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ConfigStatusInfo other = (ConfigStatusInfo) obj; if (configStatusMessages == null) { if (other.configStatusMessages != null) return false; } else if (!configStatusMessages.equals(other.configStatusMessages)) return false; return true; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { return "ConfigStatusInfo [configStatusMessages=" + configStatusMessages + "]"; } }