[ONOS-4849] NETCONF function for FUJITSU OLT #6

- Add alart command for FUJITSU OLT
   volt-notification-alertfilter <netconf:target>
   volt-notification-setalertfilter <netconf:target> <alert-severity>
   volt-notification-subscribe <netconf:target> {disable}
- Update fujitsu-drivers.xml and shell-config.xml in FUJITSU directory
- Apply Yuta's and Andrea's suggestion to startSubscription method and other methods which related to startSubscription method.
  -> Remove startSubscriptionConnection() and createSubscriptionString() method in 4th patch-set.
  -> Modify cosmetic issue related to Static-string.
  -> Update "No replay" to "No reply" in VoltGetPonLinksCommand.java

Change-Id: I2c8d5484ea0ff9f0b1b970fe8b183bec12193c46
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
index e359641..fde6bc2 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfSessionImpl.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.netconf.ctl;
 
+import com.google.common.annotations.Beta;
 import ch.ethz.ssh2.Connection;
 import ch.ethz.ssh2.Session;
 import com.google.common.base.Preconditions;
@@ -66,8 +67,8 @@
     private static final String WITH_DEFAULT_CLOSE = "</with-defaults>";
     private static final String DEFAULT_OPERATION_OPEN = "<default-operation>";
     private static final String DEFAULT_OPERATION_CLOSE = "</default-operation>";
-    private static final String FILTER_OPEN = "<filter type=\"subtree\">";
-    private static final String FILTER_CLOSE = "</filter>";
+    private static final String SUBTREE_FILTER_OPEN = "<filter type=\"subtree\">";
+    private static final String SUBTREE_FILTER_CLOSE = "</filter>";
     private static final String EDIT_CONFIG_OPEN = "<edit-config>";
     private static final String EDIT_CONFIG_CLOSE = "</edit-config>";
     private static final String TARGET_OPEN = "<target>";
@@ -80,6 +81,8 @@
             "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"";
     private static final String NETCONF_WITH_DEFAULTS_NAMESPACE =
             "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\"";
+    private static final String SUBSCRIPTION_SUBTREE_FILTER_OPEN =
+            "<filter xmlns:base10=\"urn:ietf:params:xml:ns:netconf:base:1.0\" base10:type=\"subtree\">";
 
     private final AtomicInteger messageIdInteger = new AtomicInteger(0);
     private Connection netconfConnection;
@@ -157,11 +160,13 @@
         }
     }
 
-    private void startSubscriptionConnection() throws NetconfException {
+
+    @Beta
+    private void startSubscriptionConnection(String filterSchema) throws NetconfException {
         if (!serverCapabilities.contains("interleave")) {
             throw new NetconfException("Device" + deviceInfo + "does not support interleave");
         }
-        String reply = sendRequest(createSubscriptionString());
+        String reply = sendRequest(createSubscriptionString(filterSchema));
         if (!checkReply(reply)) {
             throw new NetconfException("Subscription not successful with device "
                                                + deviceInfo + " with reply " + reply);
@@ -169,18 +174,37 @@
         subscriptionConnected = true;
     }
 
+    @Override
     public void startSubscription() throws NetconfException {
         if (!subscriptionConnected) {
-            startSubscriptionConnection();
+            startSubscriptionConnection(null);
         }
         streamHandler.setEnableNotifications(true);
     }
 
-    private String createSubscriptionString() {
+    @Beta
+    @Override
+    public void startSubscription(String filterSchema) throws NetconfException {
+        if (!subscriptionConnected) {
+            startSubscriptionConnection(filterSchema);
+        }
+        streamHandler.setEnableNotifications(true);
+    }
+
+    @Beta
+    private String createSubscriptionString(String filterSchema) {
         StringBuilder subscriptionbuffer = new StringBuilder();
         subscriptionbuffer.append("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n");
         subscriptionbuffer.append("  <create-subscription\n");
         subscriptionbuffer.append("xmlns=\"urn:ietf:params:xml:ns:netconf:notification:1.0\">\n");
+        // FIXME Only subtree filtering supported at the moment.
+        if (filterSchema != null) {
+            subscriptionbuffer.append("    ");
+            subscriptionbuffer.append(SUBSCRIPTION_SUBTREE_FILTER_OPEN).append(NEW_LINE);
+            subscriptionbuffer.append(filterSchema).append(NEW_LINE);
+            subscriptionbuffer.append("    ");
+            subscriptionbuffer.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
+        }
         subscriptionbuffer.append("  </create-subscription>\n");
         subscriptionbuffer.append("</rpc>\n");
         subscriptionbuffer.append(ENDPATTERN);
@@ -323,9 +347,9 @@
         rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
         rpc.append(GET_OPEN).append(NEW_LINE);
         if (filterSchema != null) {
-            rpc.append(FILTER_OPEN).append(NEW_LINE);
+            rpc.append(SUBTREE_FILTER_OPEN).append(NEW_LINE);
             rpc.append(filterSchema).append(NEW_LINE);
-            rpc.append(FILTER_CLOSE).append(NEW_LINE);
+            rpc.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
         }
         if (withDefaultsMode != null) {
             rpc.append(WITH_DEFAULT_OPEN).append(NETCONF_WITH_DEFAULTS_NAMESPACE).append(">");
@@ -577,7 +601,9 @@
             }
             CompletableFuture<String> completedReply =
                     replies.get(messageId.get());
-            completedReply.complete(event.getMessagePayload());
+            if (completedReply != null) {
+                completedReply.complete(event.getMessagePayload());
+            }
         }
     }
 }