碳版本对比钠版本
碳版本
import com.google.common.base.Optional;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.MountPoint;
import org.opendaylight.controller.md.sal.binding.api.MountPointService;
import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
钠版本
import java.util.Optional;
import org.opendaylight.mdsal.binding.api.DataBroker;
import org.opendaylight.mdsal.binding.api.MountPoint;
import org.opendaylight.mdsal.binding.api.MountPointService;
import org.opendaylight.mdsal.binding.api.NotificationPublishService;
import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
碳版本 | 钠版本 |
---|---|
org.opendaylight.controller.md.sal.binding.api.DataBroker; | org.opendaylight.mdsal.binding.api.DataBroker; |
org.opendaylight.controller.md.sal.binding.api.MountPoint; | org.opendaylight.mdsal.binding.api.MountPoint; |
org.opendaylight.controller.md.sal.binding.api.MountPointService; | org.opendaylight.mdsal.binding.api.MountPointService; |
org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; | org.opendaylight.mdsal.binding.api.NotificationPublishService; |
org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; | org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; |
org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; | org.opendaylight.mdsal.common.api.LogicalDatastoreType; |
com.google.common.base.Optional; | java.util.Optional; |
引起的方法变化
1、监听
在Topology节点上注册监听器,在碳版本中是如下实现
DataTreeIdentifier<Topology> nodeDTChangeListener =
new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, NETCONF_TOPO_IID);
在钠版本中是如下实现
DataTreeIdentifier<Topology> nodeDTChangeListener =
DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, NETCONF_TOPO_IID);
假如不进行修改,将会出现以下错误
DataTreeIdentifier(org.opendaylight.mdsal.common.api.@org.eclipse.jdt.annotation.NonNull LogicalDatastoreType, org.opendaylight.yangtools.yang.binding.@org.eclipse.jdt.annotation.NonNull InstanceIdentifier) **has private access** in org.opendaylight.mdsal.binding.api.DataTreeIdentifier
意味着这个成员已经变成了私有
打开如下,果然如此
package org.opendaylight.mdsal.binding.api;
public final class DataTreeIdentifier <T extends org.opendaylight.yangtools.yang.binding.DataObject> implements org.opendaylight.yangtools.concepts.Immutable, org.opendaylight.yangtools.concepts.Path<org.opendaylight.mdsal.binding.api.DataTreeIdentifier<?>>, java.io.Serializable {
private static final long serialVersionUID = 1L;
@org.eclipse.jdt.annotation.NonNull
private final org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> rootIdentifier;
@org.eclipse.jdt.annotation.NonNull
private final org.opendaylight.mdsal.common.api.LogicalDatastoreType datastoreType;
private DataTreeIdentifier(@org.eclipse.jdt.annotation.NonNull org.opendaylight.mdsal.common.api.LogicalDatastoreType datastoreType, @org.eclipse.jdt.annotation.NonNull org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> rootIdentifier) { /* compiled code */ }
@org.eclipse.jdt.annotation.NonNull
public static <T extends org.opendaylight.yangtools.yang.binding.DataObject> org.opendaylight.mdsal.binding.api.DataTreeIdentifier<T> create(@org.eclipse.jdt.annotation.NonNull org.opendaylight.mdsal.common.api.LogicalDatastoreType datastoreType, @org.eclipse.jdt.annotation.NonNull org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> rootIdentifier) { /* compiled code */ }
@org.eclipse.jdt.annotation.NonNull
public org.opendaylight.mdsal.common.api.LogicalDatastoreType getDatastoreType() { /* compiled code */ }
@org.eclipse.jdt.annotation.NonNull
public org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> getRootIdentifier() { /* compiled code */ }
public boolean contains(org.opendaylight.mdsal.binding.api.DataTreeIdentifier<?> other) { /* compiled code */ }
public int hashCode() { /* compiled code */ }
public boolean equals(java.lang.Object obj) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
但是仔细观察,找到一个新的方法提供,create,返回值与之前一样,参数也一致,并且是public static
以下是之前碳版本的内容
package org.opendaylight.controller.md.sal.binding.api;
/**
* @deprecated
*/
@java.lang.Deprecated
public final class DataTreeIdentifier <T extends org.opendaylight.yangtools.yang.binding.DataObject> implements org.opendaylight.yangtools.concepts.Immutable, org.opendaylight.yangtools.concepts.Path<org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier<?>>, java.io.Serializable {
private static final long serialVersionUID = 1L;
@org.eclipse.jdt.annotation.NonNull
private final org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> rootIdentifier;
@org.eclipse.jdt.annotation.NonNull
private final org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType datastoreType;
public DataTreeIdentifier(org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType datastoreType, org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> rootIdentifier) { /* compiled code */ }
@org.eclipse.jdt.annotation.NonNull
public org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType getDatastoreType() { /* compiled code */ }
@org.eclipse.jdt.annotation.NonNull
public org.opendaylight.yangtools.yang.binding.InstanceIdentifier<T> getRootIdentifier() { /* compiled code */ }
public boolean contains(org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier<?> other) { /* compiled code */ }
public int hashCode() { /* compiled code */ }
public boolean equals(java.lang.Object obj) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
}
2、读写
2.1 读操作
钠版本ReadOnlyTransaction已经移除,使用ReadTransaction
钠版本的读操作实现
ReadTransaction xrNodeReadTx = getBrokerTransaction(nodeName);
Optional<Me> meCfg;
try {
// Read from a transaction is asynchronous, but a simple
// get/checkedGet makes the call synchronous
meCfg = xrNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, iid).get();
} catch (InterruptedException|ExecutionException e) {
throw new IllegalStateException("Unexpected error reading data from " + nodeName, e);
}
碳版本的读操作实现
ReadOnlyTransaction xrNodeReadTx = getBrokerTransaction(nodeName);
Optional<Me> meCfg;
try {
// Read from a transaction is asynchronous, but a simple
// get/checkedGet makes the call synchronous
meCfg = xrNodeReadTx.read(LogicalDatastoreType.OPERATIONAL, iid).checkedGet();
} catch (ReadFailedException e) {
throw new IllegalStateException("Unexpected error reading data from " + nodeName, e);
}
2.2 写操作
关于WriteTransaction 的事务操作
钠版本中提交事务为commit()
package org.opendaylight.mdsal.binding.api;
public interface WriteTransaction extends org.opendaylight.mdsal.binding.api.Transaction, org.opendaylight.mdsal.binding.api.WriteOperations {
boolean cancel();
@edu.umd.cs.findbugs.annotations.CheckReturnValue
@org.eclipse.jdt.annotation.NonNull
com.google.common.util.concurrent.FluentFuture<? extends org.opendaylight.mdsal.common.api.CommitInfo> commit();
}
示例:
final Optional<MountPoint> mountPoint = NcmountProvider.getMountPointByNodeName(input.getNodeName());
MountPoint xrNode = mountPoint.get();
DataBroker xrNodeBroker = xrNode.getService(DataBroker.class).get();
WriteTransaction wt = xrNodeBroker.newWriteOnlyTransaction();
InstanceIdentifier<SetManagedElementTimeOutput> aiid = InstanceIdentifier.create(SetManagedElementTimeOutput.class);
SetManagedElementTimeOutputBuilder setManagedElementTimeOutputBuilder = new SetManagedElementTimeOutputBuilder();
wt.put(LogicalDatastoreType.CONFIGURATION, aiid,setManagedElementTimeOutputBuilder.build());
//java.lang.IllegalArgumentException: Can edit only configuration data, not OPERATIONAL
try {
wt.commit();
} catch (Exception e) {
LOG.error("set alarm mask error with exc:", e);
return Futures.immediateFuture(RpcResultBuilder.<RestSetManagedElementTimeOutput>failed()
.withError(RpcError.ErrorType.RPC,
"set alarm mask fail !").build());
}
在碳版本中的提交事务为submit(),并且定位, 例:submit().checkedGet();
/**
* @deprecated
*/
@java.lang.Deprecated
default com.google.common.util.concurrent.CheckedFuture<java.lang.Void,org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException> submit() { /* compiled code */ }
示例:
final Optional<MountPoint> mountPoint = NcmountProvider.getMountPointByNodeName(input.getNodeName());
MountPoint xrNode = mountPoint.get();
DataBroker xrNodeBroker = xrNode.getService(DataBroker.class).get();
WriteTransaction wt = xrNodeBroker.newWriteOnlyTransaction();
InstanceIdentifier<SetManagedElementTimeOutput> aiid = InstanceIdentifier.create(SetManagedElementTimeOutput.class);
SetManagedElementTimeOutputBuilder setManagedElementTimeOutputBuilder = new SetManagedElementTimeOutputBuilder();
wt.put(LogicalDatastoreType.CONFIGURATION, aiid,setManagedElementTimeOutputBuilder.build());
//java.lang.IllegalArgumentException: Can edit only configuration data, not OPERATIONAL
try {
wt.submit().checkedGet();
} catch (Exception e) {
LOG.error("set alarm mask error with exc:", e);
return Futures.immediateFuture(RpcResultBuilder.<RestSetManagedElementTimeOutput>failed()
.withError(RpcError.ErrorType.RPC,
"set alarm mask fail !").build());
}
两个版本包内容对比