2 * Copyright © 2016 AT&T and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.transportpce.test;
10 import com.google.common.base.Preconditions;
11 import com.google.common.base.Strings;
12 import com.google.common.collect.Lists;
13 import java.io.InputStream;
14 import java.util.AbstractMap;
15 import java.util.List;
16 import java.util.Map.Entry;
17 import java.util.Optional;
18 import java.util.concurrent.ExecutionException;
19 import javax.annotation.Nonnull;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
22 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
23 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
24 import org.opendaylight.transportpce.common.DataStoreContext;
25 import org.opendaylight.transportpce.common.DataStoreContextImpl;
26 import org.opendaylight.transportpce.common.converter.XMLDataObjectConverter;
27 import org.opendaylight.transportpce.common.converter.api.DataObjectConverter;
28 import org.opendaylight.yangtools.yang.common.QName;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
31 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
37 * Wrapper class around {@link DataBroker} and {@link DOMDataBroker}.
40 public final class DeviceWrapper {
41 private static final Logger LOG = LoggerFactory.getLogger(DeviceWrapper.class);
43 private final String identifier;
44 private final DataBroker dataBroker;
45 private final DOMDataBroker domDataBroker;
48 * May be created only inside of {@link AbstractDeviceTest}.
50 * @param identifier id of this simulator
51 * @param dataBroker data broker used in this simulator
52 * @param domDataBroker dom data broker used in this simulator
54 private DeviceWrapper(String identifier, DataBroker dataBroker, DOMDataBroker domDataBroker) {
55 this.identifier = identifier;
56 this.dataBroker = dataBroker;
57 this.domDataBroker = domDataBroker;
61 * Gets the data broker.
63 * @return the dataBroker
65 public DataBroker getDataBroker() {
70 * Gets the DOM data broker.
72 * @return the domDataBroker
74 public DOMDataBroker getDomDataBroker() {
79 * Gets the identifier.
81 * @return the identifier
83 public String getIdentifier() {
88 * Creates a device wrapper.
90 * @see #createDeviceWrapper(String, List) with a single list element
91 * @param key identifier of creating simulator
92 * @param initialDataXmlInputStream {@link InputStream} of xml with initial data for simulator
93 * @param intialDataQName {@link QName} of initial data
94 * @return device simulator
96 public static DeviceWrapper createDeviceWrapper(@Nonnull String key, @Nonnull InputStream initialDataXmlInputStream,
97 @Nonnull QName intialDataQName) {
98 Preconditions.checkNotNull(initialDataXmlInputStream, "Input stream cannot be null");
99 Preconditions.checkNotNull(intialDataQName, "QName cannot be null");
100 return createDeviceWrapper(key, Lists.newArrayList(
101 new AbstractMap.SimpleEntry<QName, InputStream>(intialDataQName, initialDataXmlInputStream)));
105 * Creates an instance of {@link DeviceWrapper} with initial data provided via xml
106 * input streams and theirs {@link QName}s the xml data <b>must</b> be wrapped
107 * inside a <b>data</b> tag provided by
108 * <b>urn:ietf:params:xml:ns:netconf:base:1.0</b>.
110 * @param key string identifier for the device
111 * @param initialData {@link List} of {@link Entry} values
112 * @return created {@link DeviceWrapper} with all initial data provided by initial data
114 public static DeviceWrapper createDeviceWrapper(@Nonnull String key,
115 @Nonnull List<Entry<QName, InputStream>> initialData) {
116 Preconditions.checkArgument(!Strings.isNullOrEmpty(key), "The provided key cannot be null or empty");
117 Preconditions.checkArgument(initialData != null && !initialData.isEmpty(),
118 "Initial data cannot be null or empty");
119 DataStoreContext dsContext = new DataStoreContextImpl();
120 DataObjectConverter xmlConverter = XMLDataObjectConverter.createWithDataStoreUtil(dsContext);
121 for (Entry<QName, InputStream> entryData : initialData) {
122 insertDataIntoDS(xmlConverter, entryData.getValue(), entryData.getKey(), dsContext.getDOMDataBroker());
124 return new DeviceWrapper(key, dsContext.getDataBroker(), dsContext.getDOMDataBroker());
127 private static void insertDataIntoDS(DataObjectConverter xmlConverter, InputStream xmlDataInputStream,
128 QName dataQName, DOMDataBroker domDataBroker) {
129 Optional<NormalizedNode<? extends PathArgument, ?>> initialDataNormalizedNodes =
130 xmlConverter.transformIntoNormalizedNode(xmlDataInputStream);
131 Preconditions.checkArgument(initialDataNormalizedNodes.isPresent(),
132 "Initial data could not be converted to normalized nodes");
133 LOG.debug("Input data converted into normalizedNodes");
135 YangInstanceIdentifier initialDataIi = YangInstanceIdentifier.of(dataQName);
136 LOG.debug("Searching for {} inside {}", initialDataIi, initialDataNormalizedNodes.get());
137 Optional<NormalizedNode<?, ?>> dataNormalizedNodes =
138 NormalizedNodes.findNode(initialDataNormalizedNodes.get(), initialDataIi);
139 Preconditions.checkArgument(dataNormalizedNodes.isPresent());
140 LOG.info("Initial data was successfully stored into ds");
141 DOMDataTreeWriteTransaction writeOnlyTransaction = domDataBroker.newWriteOnlyTransaction();
142 writeOnlyTransaction.put(LogicalDatastoreType.OPERATIONAL, initialDataIi, dataNormalizedNodes.get());
144 writeOnlyTransaction.commit().get();
145 } catch (InterruptedException | ExecutionException e) {
146 LOG.error("This should be not reached {}", e.getMessage(), e);
147 throw new IllegalStateException(e);
152 public String toString() {
153 StringBuilder builder = new StringBuilder();
154 builder.append("DeviceWrapper [identifier=");
155 builder.append(identifier);
156 builder.append(", dataBroker=");
157 builder.append(dataBroker);
158 builder.append(", domDataBroker=");
159 builder.append(domDataBroker);
161 return builder.toString();