From 384a2d20c0f5822626f4499b99e8a288311d5e04 Mon Sep 17 00:00:00 2001 From: Andrej Mak Date: Mon, 7 Mar 2016 08:39:40 +0100 Subject: [PATCH] Reimplement NetconfDevice schema setup without recursion Change-Id: I2a41f9a46b8d545efa2c854b024f3a8b9707afa9 Signed-off-by: Andrej Mak --- .../sal/connect/netconf/NetconfDevice.java | 64 ++++++++----------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDevice.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDevice.java index bb63554d54..1b8a820f4f 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDevice.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/NetconfDevice.java @@ -143,7 +143,7 @@ public class NetconfDevice implements RemoteDevice listener; private final NetconfDeviceCapabilities capabilities; - public RecursiveSchemaSetup(final DeviceSources deviceSources, final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceCommunicator listener) { + public SchemaSetup(final DeviceSources deviceSources, final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceCommunicator listener) { this.deviceSources = deviceSources; this.remoteSessionCapabilities = remoteSessionCapabilities; this.listener = listener; @@ -391,37 +391,23 @@ public class NetconfDevice implements RemoteDevice requiredSources) { - LOG.trace("{}: Trying to build schema context from {}", id, requiredSources); - - // If no more sources, fail - if(requiredSources.isEmpty()) { - final IllegalStateException cause = new IllegalStateException(id + ": No more sources for schema context"); - handleSalInitializationFailure(cause, listener); - salFacade.onDeviceFailed(cause); - return; - } - - final CheckedFuture schemaBuilderFuture = schemaContextFactory.createSchemaContext(requiredSources); - - final FutureCallback RecursiveSchemaBuilderCallback = new FutureCallback() { - - @Override - public void onSuccess(final SchemaContext result) { + private void setUpSchema(Collection requiredSources) { + while (!requiredSources.isEmpty()) { + LOG.trace("{}: Trying to build schema context from {}", id, requiredSources); + try { + final CheckedFuture schemaBuilderFuture = schemaContextFactory.createSchemaContext(requiredSources); + final SchemaContext result = schemaBuilderFuture.checkedGet(); LOG.debug("{}: Schema context built successfully from {}", id, requiredSources); final Collection filteredQNames = Sets.difference(deviceSources.getRequiredSourcesQName(), capabilities.getUnresolvedCapabilites().keySet()); capabilities.addCapabilities(filteredQNames); capabilities.addNonModuleBasedCapabilities(remoteSessionCapabilities.getNonModuleCaps()); handleSalInitializationSuccess(result, remoteSessionCapabilities, getDeviceSpecificRpc(result)); - } - - @Override - public void onFailure(final Throwable t) { - // In case source missing, try without it - if (t instanceof MissingSchemaSourceException) { + return; + } catch (Throwable t) { + if (t instanceof MissingSchemaSourceException){ + // In case source missing, try without it final SourceIdentifier missingSource = ((MissingSchemaSourceException) t).getSourceId(); LOG.warn("{}: Unable to build schema context, missing source {}, will reattempt without it", id, missingSource); LOG.debug("{}: Unable to build schema context, missing source {}, will reattempt without it", t); @@ -429,27 +415,29 @@ public class NetconfDevice implements RemoteDevice unresolvedSources = resolutionException.getUnsatisfiedImports().keySet(); capabilities.addUnresolvedCapabilities(getQNameFromSourceIdentifiers(unresolvedSources), UnavailableCapability.FailureReason.UnableToResolve); LOG.warn("{}: Unable to build schema context, unsatisfied imports {}, will reattempt with resolved only", id, resolutionException.getUnsatisfiedImports()); LOG.debug("{}: Unable to build schema context, unsatisfied imports {}, will reattempt with resolved only", resolutionException); - setUpSchema(resolutionException.getResolvedSources()); - // unknown error, fail + requiredSources = resolutionException.getResolvedSources(); } else { + // unknown error, fail handleSalInitializationFailure(t, listener); + return; } } - }; - - Futures.addCallback(schemaBuilderFuture, RecursiveSchemaBuilderCallback); + } + // No more sources, fail + final IllegalStateException cause = new IllegalStateException(id + ": No more sources for schema context"); + handleSalInitializationFailure(cause, listener); + salFacade.onDeviceFailed(cause); } + protected NetconfDeviceRpc getDeviceSpecificRpc(final SchemaContext result) { return new NetconfDeviceRpc(result, listener, new NetconfMessageTransformer(result, true)); } -- 2.36.6