Merge "Bug 714 - Fixed creating DOM Document's element with namespace"
authorTony Tkacik <ttkacik@cisco.com>
Tue, 15 Apr 2014 10:40:30 +0000 (10:40 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 15 Apr 2014 10:40:30 +0000 (10:40 +0000)
1  2 
opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/NetconfMappingTest.java
opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java
opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/mapping/operations/DefaultCloseSession.java

index 054972dde71b8aa5f9ee278a2d30453efbb03842,43edced0a1088bba2edc6347d67b0e5d9cc0f94c..96522712daa90c8e52b67e37fd178296835f9611
@@@ -8,11 -8,34 +8,34 @@@
  
  package org.opendaylight.controller.netconf.confignetconfconnector;
  
- import com.google.common.base.Optional;
- import com.google.common.base.Preconditions;
- import com.google.common.collect.Lists;
- import com.google.common.collect.Maps;
- import com.google.common.collect.Sets;
+ import static org.junit.Assert.assertEquals;
+ import static org.junit.Assert.assertThat;
+ import static org.junit.Assert.assertTrue;
+ import static org.junit.Assert.fail;
+ import static org.mockito.Mockito.doNothing;
+ import static org.mockito.Mockito.doReturn;
+ import static org.mockito.Mockito.mock;
+ import static org.mockito.Mockito.verify;
+ import static org.mockito.Mockito.verifyNoMoreInteractions;
+ import java.io.FileNotFoundException;
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.math.BigInteger;
+ import java.net.URISyntaxException;
+ import java.util.ArrayList;
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.HashSet;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ import javax.management.InstanceAlreadyExistsException;
+ import javax.management.InstanceNotFoundException;
+ import javax.management.ObjectName;
+ import javax.xml.parsers.ParserConfigurationException;
  import org.apache.commons.lang3.StringUtils;
  import org.junit.Before;
  import org.junit.Ignore;
@@@ -52,7 -75,7 +75,7 @@@ import org.opendaylight.controller.netc
  import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
  import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
  import org.opendaylight.controller.netconf.impl.mapping.operations.DefaultCloseSession;
 -import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshot;
 +import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceSnapshotImpl;
  import org.opendaylight.controller.netconf.mapping.api.HandlingPriority;
  import org.opendaylight.controller.netconf.mapping.api.NetconfOperation;
  import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution;
@@@ -75,32 -98,11 +98,11 @@@ import org.w3c.dom.Element
  import org.w3c.dom.NodeList;
  import org.xml.sax.SAXException;
  
- import javax.management.InstanceAlreadyExistsException;
- import javax.management.InstanceNotFoundException;
- import javax.management.ObjectName;
- import javax.xml.parsers.ParserConfigurationException;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import java.math.BigInteger;
- import java.net.URISyntaxException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertThat;
- import static org.junit.Assert.assertTrue;
- import static org.junit.Assert.fail;
- import static org.mockito.Mockito.doNothing;
- import static org.mockito.Mockito.doReturn;
- import static org.mockito.Mockito.mock;
- import static org.mockito.Mockito.verify;
- import static org.mockito.Mockito.verifyNoMoreInteractions;
+ import com.google.common.base.Optional;
+ import com.google.common.base.Preconditions;
+ import com.google.common.collect.Lists;
+ import com.google.common.collect.Maps;
+ import com.google.common.collect.Sets;
  
  
  public class NetconfMappingTest extends AbstractConfigTest {
      @Mock
      NetconfOperationRouter netconfOperationRouter;
      @Mock
 -    NetconfOperationServiceSnapshot netconfOperationServiceSnapshot;
 +    NetconfOperationServiceSnapshotImpl netconfOperationServiceSnapshot;
  
      private TransactionProvider transactionProvider;
  
          String enumContent = "TWO";
  
          for (XmlElement moduleElement : modulesElement.getChildElements("module")) {
-             String name = moduleElement.getOnlyChildElement("name").getTextContent();
+             String name = moduleElement.getOnlyChildElement("prefix:name").getTextContent();
              if(name.equals(INSTANCE_NAME)) {
                  XmlElement enumAttr = moduleElement.getOnlyChildElement(enumName);
                  assertEquals(enumContent, enumAttr.getTextContent());
index 6fce8d333ad49b28f7365c2c3dc8555432528c8c,4c551a60209fc09068b966f8af9e8f4fe8503cf3..9ffb8da1dd975fc6592e2b789e49e7f5492e0069
@@@ -8,15 -8,18 +8,20 @@@
  
  package org.opendaylight.controller.netconf.impl;
  
- import com.google.common.base.Preconditions;
  import io.netty.channel.Channel;
  import io.netty.util.Timer;
  import io.netty.util.concurrent.Promise;
+ import java.io.InputStream;
+ import javax.xml.xpath.XPathConstants;
+ import javax.xml.xpath.XPathExpression;
  import org.opendaylight.controller.netconf.api.NetconfServerSessionPreferences;
  import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider;
 -import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationServiceFactoryListener;
 +import org.opendaylight.controller.netconf.impl.osgi.SessionMonitoringService;
 +import org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider;
 +import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceSnapshot;
  import org.opendaylight.controller.netconf.util.NetconfUtil;
  import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage;
  import org.opendaylight.controller.netconf.util.xml.XMLNetconfUtil;
@@@ -29,12 -32,9 +34,11 @@@ import org.w3c.dom.Document
  import org.w3c.dom.Element;
  import org.w3c.dom.Node;
  
- import javax.xml.xpath.XPathConstants;
- import javax.xml.xpath.XPathExpression;
- import java.io.InputStream;
+ import com.google.common.base.Optional;
+ import com.google.common.base.Preconditions;
  
 +import static org.opendaylight.controller.netconf.mapping.api.NetconfOperationProvider.NetconfOperationProviderUtil.getNetconfSessionIdForReporting;
 +
  public class NetconfServerSessionNegotiatorFactory implements SessionNegotiatorFactory<NetconfHelloMessage, NetconfServerSession, NetconfServerSessionListener> {
  
      public static final String SERVER_HELLO_XML_LOCATION = "/server_hello.xml";
  
      private static final Document helloMessageTemplate = loadHelloMessageTemplate();
      private final SessionIdProvider idProvider;
 -    private final NetconfOperationServiceFactoryListener factoriesListener;
 +    private final NetconfOperationProvider netconfOperationProvider;
      private final long connectionTimeoutMillis;
 +    private final DefaultCommitNotificationProducer commitNotificationProducer;
 +    private final SessionMonitoringService monitoringService;
  
 -    public NetconfServerSessionNegotiatorFactory(Timer timer, NetconfOperationServiceFactoryListener factoriesListener,
 -            SessionIdProvider idProvider, long connectionTimeoutMillis) {
 +    public NetconfServerSessionNegotiatorFactory(Timer timer, NetconfOperationProvider netconfOperationProvider,
 +                                                 SessionIdProvider idProvider, long connectionTimeoutMillis,
 +                                                 DefaultCommitNotificationProducer commitNot, SessionMonitoringService monitoringService) {
          this.timer = timer;
 -        this.factoriesListener = factoriesListener;
 +        this.netconfOperationProvider = netconfOperationProvider;
          this.idProvider = idProvider;
          this.connectionTimeoutMillis = connectionTimeoutMillis;
 +        this.commitNotificationProducer = commitNot;
 +        this.monitoringService = monitoringService;
      }
  
      private static Document loadHelloMessageTemplate() {
          return NetconfUtil.createMessage(resourceAsStream).getDocument();
      }
  
 +    /**
 +     *
 +     * @param defunctSessionListenerFactory will not be taken into account as session listener factory can
 +     *                                      only be created after snapshot is opened, thus this method constructs
 +     *                                      proper session listener factory.
 +     * @param channel Underlying channel
 +     * @param promise Promise to be notified
 +     * @return session negotiator
 +     */
      @Override
 -    public SessionNegotiator<NetconfServerSession> getSessionNegotiator(SessionListenerFactory<NetconfServerSessionListener> sessionListenerFactory, Channel channel,
 -            Promise<NetconfServerSession> promise) {
 +    public SessionNegotiator<NetconfServerSession> getSessionNegotiator(SessionListenerFactory<NetconfServerSessionListener> defunctSessionListenerFactory,
 +                                                                        Channel channel, Promise<NetconfServerSession> promise) {
          long sessionId = idProvider.getNextSessionId();
 +        NetconfOperationServiceSnapshot netconfOperationServiceSnapshot = netconfOperationProvider.openSnapshot(
 +                getNetconfSessionIdForReporting(sessionId));
 +        CapabilityProvider capabilityProvider = new CapabilityProviderImpl(netconfOperationServiceSnapshot);
 +
 +        NetconfServerSessionPreferences proposal = new NetconfServerSessionPreferences(
 +                createHelloMessage(sessionId, capabilityProvider), sessionId);
 +
 +        NetconfServerSessionListenerFactory sessionListenerFactory = new NetconfServerSessionListenerFactory(
 +                commitNotificationProducer, monitoringService,
 +                netconfOperationServiceSnapshot, capabilityProvider);
  
 -        NetconfServerSessionPreferences proposal = new NetconfServerSessionPreferences(createHelloMessage(sessionId),
 -                sessionId);
          return new NetconfServerSessionNegotiator(proposal, promise, channel, timer,
                  sessionListenerFactory.getSessionListener(), connectionTimeoutMillis);
      }
      private static final XPathExpression capabilitiesXPath = XMLNetconfUtil
              .compileXPath("/netconf:hello/netconf:capabilities");
  
 -    private NetconfHelloMessage createHelloMessage(long sessionId) {
 +    private NetconfHelloMessage createHelloMessage(long sessionId, CapabilityProvider capabilityProvider) {
          Document helloMessageTemplate = getHelloTemplateClone();
  
          // change session ID
          final Element capabilitiesElement = (Element) XmlUtil.evaluateXPath(capabilitiesXPath, helloMessageTemplate,
                  XPathConstants.NODE);
  
 -        CapabilityProvider capabilityProvider = new CapabilityProviderImpl(factoriesListener.getSnapshot(sessionId));
 -
          for (String capability : capabilityProvider.getCapabilities()) {
-             final Element capabilityElement = helloMessageTemplate.createElement(XmlNetconfConstants.CAPABILITY);
+             final Element capabilityElement = XmlUtil.createElement(helloMessageTemplate, XmlNetconfConstants.CAPABILITY, Optional.<String>absent());
              capabilityElement.setTextContent(capability);
              capabilitiesElement.appendChild(capabilityElement);
          }
index af19335389fb03dc5c78ecf51a5007205c2151c2,2b48f5d51c5877d6441a9052e75b5aae283ac2c2..f31233987e97531a563fca3f186fee480e6b6616
@@@ -8,15 -8,18 +8,18 @@@
  
  package org.opendaylight.controller.netconf.impl.mapping.operations;
  
 -import java.util.Collections;
 -
  import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
  import org.opendaylight.controller.netconf.util.mapping.AbstractSingletonNetconfOperation;
  import org.opendaylight.controller.netconf.util.xml.XmlElement;
  import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
+ import org.opendaylight.controller.netconf.util.xml.XmlUtil;
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  
+ import com.google.common.base.Optional;
 +import java.util.Collections;
 +
  public class DefaultCloseSession extends AbstractSingletonNetconfOperation {
      public static final String CLOSE_SESSION = "close-session";
      private final AutoCloseable sessionResources;
@@@ -48,6 -51,6 +51,6 @@@
                      NetconfDocumentedException.ErrorSeverity.error, Collections.singletonMap(
                      NetconfDocumentedException.ErrorSeverity.error.toString(), e.getMessage()));
          }
-         return document.createElement(XmlNetconfConstants.OK);
+         return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent());
      }
  }