Specialize protocol-framework to netconf
[netconf.git] / netconf / netconf-client / src / main / java / org / opendaylight / netconf / client / NetconfClientSessionNegotiatorFactory.java
index 2d6cac2ba01c8b95886c6bc23e82cf63b12973ce..2e8a90719fc8dd0abaad287513989e0516b2fa31 100644 (file)
@@ -5,33 +5,33 @@
  * 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.netconf.client;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
+import com.siemens.ct.exi.core.CodingMode;
+import com.siemens.ct.exi.core.FidelityOptions;
+import com.siemens.ct.exi.core.exceptions.UnsupportedOption;
 import io.netty.channel.Channel;
 import io.netty.util.Timer;
 import io.netty.util.concurrent.Promise;
 import java.util.Set;
-import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
-import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
-import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.api.NetconfClientSessionPreferences;
-import org.opendaylight.netconf.api.NetconfDocumentedException;
 import org.opendaylight.netconf.api.NetconfMessage;
+import org.opendaylight.netconf.api.NetconfSessionListenerFactory;
+import org.opendaylight.netconf.api.messages.NetconfHelloMessage;
+import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader;
 import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
-import org.opendaylight.protocol.framework.SessionListenerFactory;
-import org.opendaylight.protocol.framework.SessionNegotiator;
-import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
-import org.openexi.proc.common.AlignmentType;
-import org.openexi.proc.common.EXIOptions;
-import org.openexi.proc.common.EXIOptionsException;
+import org.opendaylight.netconf.nettyutil.NetconfSessionNegotiatorFactory;
+import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters;
+import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorFactory<NetconfMessage, NetconfClientSession, NetconfClientSessionListener> {
+public class NetconfClientSessionNegotiatorFactory
+        implements NetconfSessionNegotiatorFactory<NetconfClientSession, NetconfClientSessionListener> {
 
     public static final Set<String> EXI_CLIENT_CAPABILITIES = ImmutableSet.of(
             XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0,
@@ -51,28 +51,26 @@ public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorF
 
     private static final Logger LOG = LoggerFactory.getLogger(NetconfClientSessionNegotiatorFactory.class);
     private static final String START_EXI_MESSAGE_ID = "default-start-exi";
-    private static final EXIOptions DEFAULT_OPTIONS;
-
-    private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
-    private final long connectionTimeoutMillis;
-    private final Timer timer;
-    private final EXIOptions options;
+    private static final EXIParameters DEFAULT_OPTIONS;
 
     static {
-        final EXIOptions opts = new EXIOptions();
+        final FidelityOptions fidelity = FidelityOptions.createDefault();
         try {
-            opts.setPreserveDTD(true);
-            opts.setPreserveNS(true);
-            opts.setPreserveLexicalValues(true);
-            opts.setAlignmentType(AlignmentType.byteAligned);
-        } catch (EXIOptionsException e) {
-            throw new ExceptionInInitializerError(e);
+            fidelity.setFidelity(FidelityOptions.FEATURE_DTD, true);
+            fidelity.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, true);
+            fidelity.setFidelity(FidelityOptions.FEATURE_PREFIX, true);
+        } catch (UnsupportedOption e) {
+            LOG.warn("Failed to set fidelity options, continuing", e);
         }
 
-        DEFAULT_OPTIONS = opts;
+        DEFAULT_OPTIONS = new EXIParameters(CodingMode.BYTE_PACKED, fidelity);
     }
 
+    private final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader;
     private final Set<String> clientCapabilities;
+    private final long connectionTimeoutMillis;
+    private final Timer timer;
+    private final EXIParameters options;
 
     public NetconfClientSessionNegotiatorFactory(final Timer timer,
                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
@@ -89,14 +87,15 @@ public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorF
 
     public NetconfClientSessionNegotiatorFactory(final Timer timer,
                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
-                                                 final long connectionTimeoutMillis, final EXIOptions exiOptions) {
+                                                 final long connectionTimeoutMillis, final EXIParameters exiOptions) {
         this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, EXI_CLIENT_CAPABILITIES);
     }
 
     public NetconfClientSessionNegotiatorFactory(final Timer timer,
                                                  final Optional<NetconfHelloMessageAdditionalHeader> additionalHeader,
-                                                 final long connectionTimeoutMillis, final EXIOptions exiOptions, final Set<String> capabilities) {
-        this.timer = Preconditions.checkNotNull(timer);
+                                                 final long connectionTimeoutMillis, final EXIParameters exiOptions,
+                                                 final Set<String> capabilities) {
+        this.timer = requireNonNull(timer);
         this.additionalHeader = additionalHeader;
         this.connectionTimeoutMillis = connectionTimeoutMillis;
         this.options = exiOptions;
@@ -104,21 +103,15 @@ public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorF
     }
 
     @Override
-    public SessionNegotiator<NetconfClientSession> getSessionNegotiator(final SessionListenerFactory<NetconfClientSessionListener> sessionListenerFactory,
-                                                                        final Channel channel,
-            final Promise<NetconfClientSession> promise) {
+    public NetconfClientSessionNegotiator getSessionNegotiator(
+            final NetconfSessionListenerFactory<NetconfClientSessionListener> sessionListenerFactory,
+            final Channel channel, final Promise<NetconfClientSession> promise) {
 
         NetconfMessage startExiMessage = NetconfStartExiMessage.create(options, START_EXI_MESSAGE_ID);
-        NetconfHelloMessage helloMessage = null;
-        try {
-            helloMessage = NetconfHelloMessage.createClientHello(clientCapabilities, additionalHeader);
-        } catch (NetconfDocumentedException e) {
-            LOG.error("Unable to create client hello message with capabilities {} and additional handler {}", clientCapabilities,additionalHeader);
-            throw new IllegalStateException(e);
-        }
+        NetconfHelloMessage helloMessage = NetconfHelloMessage.createClientHello(clientCapabilities, additionalHeader);
 
         NetconfClientSessionPreferences proposal = new NetconfClientSessionPreferences(helloMessage, startExiMessage);
         return new NetconfClientSessionNegotiator(proposal, promise, channel, timer,
-                sessionListenerFactory.getSessionListener(),connectionTimeoutMillis);
+                sessionListenerFactory.getSessionListener(), connectionTimeoutMillis);
     }
 }