+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. 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.opendaylight.controller.md.sal.common.impl.routing;
import java.util.Map.Entry;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
/**
* Base abstract implementation of DataReadRouter, which performs
* a read operation on multiple data readers and then merges result.
- *
+ *
* @param <P>
* @param <D>
*/
-public abstract class AbstractDataReadRouter<P extends Path<?>, D> implements DataReader<P, D> {
+public abstract class AbstractDataReadRouter<P extends Path<P>, D> implements DataReader<P, D> {
- Multimap<P, DataReaderRegistration<P, D>> configReaders = HashMultimap.create();
- Multimap<P, DataReaderRegistration<P, D>> operationalReaders = HashMultimap.create();
+ Multimap<P, DataReaderRegistration<P, D>> configReaders = Multimaps.synchronizedSetMultimap(HashMultimap.<P, DataReaderRegistration<P, D>>create());
+ Multimap<P, DataReaderRegistration<P, D>> operationalReaders = Multimaps.synchronizedSetMultimap(HashMultimap.<P, DataReaderRegistration<P, D>>create());
@Override
public D readConfigurationData(P path) {
@Override
public D readOperationalData(P path) {
FluentIterable<D> dataBits = FluentIterable //
- .from(getReaders(configReaders, path)).transform(operationalRead(path));
+ .from(getReaders(operationalReaders, path)).transform(operationalRead(path));
return merge(path,dataBits);
}
/**
* Merges data readed by reader instances from specified path
- *
+ *
* @param path Path on which read was performed
* @param data Data which was returned by read operation.
* @return Merged result.
/**
* Returns a function which performs configuration read for supplied path
- *
+ *
* @param path
* @return function which performs configuration read for supplied path
*/
-
+
private Function<DataReader<P, D>, D> configurationRead(final P path) {
return new Function<DataReader<P, D>, D>() {
@Override
/**
* Returns a function which performs operational read for supplied path
- *
+ *
* @param path
* @return function which performs operational read for supplied path
*/
/**
* Register's a reader for operational data.
- *
+ *
* @param path Path which is served by this reader
* @param reader Reader instance which is responsible for reading particular subpath.
- * @return
+ * @return
*/
- public Registration<DataReader<P, D>> registerOperationalReader(P path, DataReader<P, D> reader) {
+ public Registration registerOperationalReader(P path, DataReader<P, D> reader) {
OperationalDataReaderRegistration<P, D> ret = new OperationalDataReaderRegistration<>(path, reader);
operationalReaders.put(path, ret);
return ret;
}
- public Registration<DataReader<P, D>> registerConfigurationReader(P path, DataReader<P, D> reader) {
+ public Registration registerConfigurationReader(P path, DataReader<P, D> reader) {
ConfigurationDataReaderRegistration<P, D> ret = new ConfigurationDataReaderRegistration<>(path, reader);
configReaders.put(path, ret);
return ret;
}
private Predicate<? super Entry<P, DataReaderRegistration<P, D>>> affects(final P path) {
-
+
return new Predicate<Entry<P, DataReaderRegistration<P, D>>>() {
-
+
@Override
public boolean apply(Entry<P, DataReaderRegistration<P, D>> input) {
- final Path key = input.getKey();
- return key.contains(path) || ((Path) path).contains(key);
+ final P key = input.getKey();
+ return key.contains(path) || ((P) path).contains(key);
}
-
+
};
}
- private class ConfigurationDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+ @SuppressWarnings("hiding")
+ private class ConfigurationDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
public ConfigurationDataReaderRegistration(P key, DataReader<P, D> instance) {
super(key, instance);
}
}
- private class OperationalDataReaderRegistration<P extends Path<?>, D> extends DataReaderRegistration<P, D> {
+ @SuppressWarnings("hiding")
+ private class OperationalDataReaderRegistration<P extends Path<P>, D> extends DataReaderRegistration<P, D> {
public OperationalDataReaderRegistration(P key, DataReader<P, D> instance) {
super(key, instance);
}
}
- private abstract static class DataReaderRegistration<P extends Path<?>, D> extends
+ private abstract static class DataReaderRegistration<P extends Path<P>, D> extends
AbstractObjectRegistration<DataReader<P, D>> {
private final P key;