import com.google.common.collect.BiMap;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
+
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
+
import javax.ws.rs.core.Response.Status;
+
import org.opendaylight.controller.sal.core.api.mount.MountInstance;
import org.opendaylight.controller.sal.core.api.mount.MountService;
import org.opendaylight.controller.sal.rest.api.Draft02;
private static final Splitter SLASH_SPLITTER = Splitter.on('/');
- private static final Splitter COLON_SPLITTER = Splitter.on(':');
-
private final BiMap<URI, String> uriToModuleName = HashBiMap.<URI, String> create();
private final Map<String, URI> moduleNameToUri = uriToModuleName.inverse();
- private final Map<QName, RpcDefinition> qnameToRpc = new ConcurrentHashMap<>();
+ private final AtomicReference<Map<QName, RpcDefinition>> qnameToRpc =
+ new AtomicReference<>(Collections.<QName, RpcDefinition>emptyMap());
private volatile SchemaContext globalSchema;
private volatile MountService mountService;
private void collectInstanceDataNodeContainers(final List<DataSchemaNode> potentialSchemaNodes,
final DataNodeContainer container, final String name) {
- Set<DataSchemaNode> childNodes = container.getChildNodes();
-
Predicate<DataSchemaNode> filter = new Predicate<DataSchemaNode>() {
@Override
public boolean apply(final DataSchemaNode node) {
}
};
- Iterable<DataSchemaNode> nodes = Iterables.filter(childNodes, filter);
+ Iterable<DataSchemaNode> nodes = Iterables.filter(container.getChildNodes(), filter);
// Can't combine this loop with the filter above because the filter is
// lazily-applied by Iterables.filter.
}
private static String toModuleName(final String str) {
- Preconditions.<String> checkNotNull(str);
- if (str.indexOf(':') != -1) {
- final Iterable<String> args = COLON_SPLITTER.split(str);
- if (Iterables.size(args) == 2) {
- return args.iterator().next();
- }
+ final int idx = str.indexOf(':');
+ if (idx == -1) {
+ return null;
}
- return null;
+
+ // Make sure there is only one occurrence
+ if (str.indexOf(':', idx + 1) != -1) {
+ return null;
+ }
+
+ return str.substring(0, idx);
}
private static String toNodeName(final String str) {
- if (str.indexOf(':') != -1) {
- final Iterable<String> args = COLON_SPLITTER.split(str);
- if (Iterables.size(args) == 2) {
- return Iterables.get(args, 1);
- }
+ final int idx = str.indexOf(':');
+ if (idx == -1) {
+ return str;
+ }
+
+ // Make sure there is only one occurrence
+ if (str.indexOf(':', idx + 1) != -1) {
+ return str;
}
- return str;
+
+ return str.substring(idx + 1);
}
private QName toQName(final String name) {
return namespace.isPresent() ? QName.create(namespace.get(), node) : null;
}
- private boolean isListOrContainer(final DataSchemaNode node) {
+ private static boolean isListOrContainer(final DataSchemaNode node) {
return node instanceof ListSchemaNode || node instanceof ContainerSchemaNode;
}
public RpcDefinition getRpcDefinition(final String name) {
final QName validName = this.toQName(name);
- return validName == null ? null : this.qnameToRpc.get(validName);
+ return validName == null ? null : this.qnameToRpc.get().get(validName);
}
@Override
public void onGlobalContextUpdated(final SchemaContext context) {
if (context != null) {
- this.qnameToRpc.clear();
- this.setGlobalSchema(context);
- Set<RpcDefinition> _operations = context.getOperations();
- for (final RpcDefinition operation : _operations) {
- {
- this.qnameToRpc.put(operation.getQName(), operation);
- }
+ final Collection<RpcDefinition> defs = context.getOperations();
+ final Map<QName, RpcDefinition> newMap = new HashMap<>(defs.size());
+
+ for (final RpcDefinition operation : defs) {
+ newMap.put(operation.getQName(), operation);
}
+
+ // FIXME: still not completely atomic
+ this.qnameToRpc.set(ImmutableMap.copyOf(newMap));
+ this.setGlobalSchema(context);
}
}