use of org.eclipse.milo.opcua.sdk.server.items.BaseMonitoredItem in project milo by eclipse.
the class SubscriptionManager method modifyMonitoredItems.
public void modifyMonitoredItems(ServiceRequest service) throws UaException {
ModifyMonitoredItemsRequest request = (ModifyMonitoredItemsRequest) service.getRequest();
UInteger subscriptionId = request.getSubscriptionId();
Subscription subscription = subscriptions.get(subscriptionId);
TimestampsToReturn timestamps = request.getTimestampsToReturn();
List<MonitoredItemModifyRequest> itemsToModify = l(request.getItemsToModify());
if (subscription == null) {
throw new UaException(StatusCodes.Bad_SubscriptionIdInvalid);
}
if (timestamps == null) {
throw new UaException(StatusCodes.Bad_TimestampsToReturnInvalid);
}
if (itemsToModify.isEmpty()) {
throw new UaException(StatusCodes.Bad_NothingToDo);
}
List<NodeId> distinctNodeIds = itemsToModify.stream().map(item -> {
UInteger itemId = item.getMonitoredItemId();
BaseMonitoredItem<?> monitoredItem = subscription.getMonitoredItems().get(itemId);
return monitoredItem != null ? monitoredItem.getReadValueId().getNodeId() : NodeId.NULL_VALUE;
}).filter(NodeId::isNotNull).distinct().collect(toList());
CompletableFuture<Map<NodeId, AttributeGroup>> attributesFuture = readMonitoringAttributes(distinctNodeIds);
attributesFuture.thenAccept(attributeGroups -> {
MonitoredItemModifyResult[] modifyResults = new MonitoredItemModifyResult[itemsToModify.size()];
List<BaseMonitoredItem<?>> monitoredItems = new ArrayList<>();
for (int i = 0; i < itemsToModify.size(); i++) {
MonitoredItemModifyRequest modifyRequest = itemsToModify.get(i);
try {
BaseMonitoredItem<?> monitoredItem = modifyMonitoredItem(modifyRequest, timestamps, subscription, attributeGroups);
monitoredItems.add(monitoredItem);
modifyResults[i] = new MonitoredItemModifyResult(StatusCode.GOOD, monitoredItem.getSamplingInterval(), uint(monitoredItem.getQueueSize()), monitoredItem.getFilterResult());
} catch (UaException e) {
modifyResults[i] = new MonitoredItemModifyResult(e.getStatusCode(), 0.0, UInteger.MIN, null);
}
}
subscription.resetLifetimeCounter();
/*
* Notify AddressSpaces of the items we just modified.
*/
byMonitoredItemType(monitoredItems, dataItems -> server.getAddressSpaceManager().onDataItemsModified(dataItems), eventItems -> server.getAddressSpaceManager().onEventItemsModified(eventItems));
/*
* AddressSpaces have been notified; send response.
*/
ResponseHeader header = service.createResponseHeader();
ModifyMonitoredItemsResponse response = new ModifyMonitoredItemsResponse(header, modifyResults, new DiagnosticInfo[0]);
service.setResponse(response);
});
}
use of org.eclipse.milo.opcua.sdk.server.items.BaseMonitoredItem in project milo by eclipse.
the class SubscriptionManager method sessionClosed.
public void sessionClosed(boolean deleteSubscriptions) {
Iterator<Subscription> iterator = subscriptions.values().iterator();
while (iterator.hasNext()) {
Subscription s = iterator.next();
s.setStateListener(null);
if (deleteSubscriptions) {
server.getSubscriptions().remove(s.getId());
server.getEventBus().post(new SubscriptionDeletedEvent(s));
List<BaseMonitoredItem<?>> deletedItems = s.deleteSubscription();
/*
* Notify AddressSpaces the items for this subscription are deleted.
*/
byMonitoredItemType(deletedItems, dataItems -> server.getAddressSpaceManager().onDataItemsDeleted(dataItems), eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems));
}
iterator.remove();
}
if (deleteSubscriptions) {
while (publishQueue.isNotEmpty()) {
ServiceRequest publishService = publishQueue.poll();
if (publishService != null) {
publishService.setServiceFault(StatusCodes.Bad_SessionClosed);
}
}
}
}
use of org.eclipse.milo.opcua.sdk.server.items.BaseMonitoredItem in project milo by eclipse.
the class SubscriptionManager method setMonitoringMode.
public void setMonitoringMode(ServiceRequest service) {
SetMonitoringModeRequest request = (SetMonitoringModeRequest) service.getRequest();
UInteger subscriptionId = request.getSubscriptionId();
try {
Subscription subscription = subscriptions.get(subscriptionId);
List<UInteger> itemsToModify = l(request.getMonitoredItemIds());
if (subscription == null) {
throw new UaException(StatusCodes.Bad_SubscriptionIdInvalid);
}
if (itemsToModify.isEmpty()) {
throw new UaException(StatusCodes.Bad_NothingToDo);
}
/*
* Set MonitoringMode on each monitored item, if it exists.
*/
MonitoringMode monitoringMode = request.getMonitoringMode();
StatusCode[] results = new StatusCode[itemsToModify.size()];
List<MonitoredItem> modified = newArrayListWithCapacity(itemsToModify.size());
for (int i = 0; i < itemsToModify.size(); i++) {
UInteger itemId = itemsToModify.get(i);
BaseMonitoredItem<?> item = subscription.getMonitoredItems().get(itemId);
if (item != null) {
item.setMonitoringMode(monitoringMode);
modified.add(item);
results[i] = StatusCode.GOOD;
} else {
results[i] = new StatusCode(StatusCodes.Bad_MonitoredItemIdInvalid);
}
}
/*
* Notify AddressSpace of the items whose MonitoringMode has been modified.
*/
server.getAddressSpaceManager().onMonitoringModeChanged(modified);
/*
* Build and return results.
*/
ResponseHeader header = service.createResponseHeader();
SetMonitoringModeResponse response = new SetMonitoringModeResponse(header, results, new DiagnosticInfo[0]);
service.setResponse(response);
} catch (UaException e) {
service.setServiceFault(e);
}
}
use of org.eclipse.milo.opcua.sdk.server.items.BaseMonitoredItem in project milo by eclipse.
the class SubscriptionManager method deleteMonitoredItems.
public void deleteMonitoredItems(ServiceRequest service) throws UaException {
DeleteMonitoredItemsRequest request = (DeleteMonitoredItemsRequest) service.getRequest();
UInteger subscriptionId = request.getSubscriptionId();
Subscription subscription = subscriptions.get(subscriptionId);
List<UInteger> itemsToDelete = l(request.getMonitoredItemIds());
if (subscription == null) {
throw new UaException(StatusCodes.Bad_SubscriptionIdInvalid);
}
if (itemsToDelete.isEmpty()) {
throw new UaException(StatusCodes.Bad_NothingToDo);
}
StatusCode[] deleteResults = new StatusCode[itemsToDelete.size()];
List<BaseMonitoredItem<?>> deletedItems = newArrayListWithCapacity(itemsToDelete.size());
synchronized (subscription) {
for (int i = 0; i < itemsToDelete.size(); i++) {
UInteger itemId = itemsToDelete.get(i);
BaseMonitoredItem<?> item = subscription.getMonitoredItems().get(itemId);
if (item == null) {
deleteResults[i] = new StatusCode(StatusCodes.Bad_MonitoredItemIdInvalid);
} else {
deletedItems.add(item);
deleteResults[i] = StatusCode.GOOD;
}
}
subscription.removeMonitoredItems(deletedItems);
}
/*
* Notify AddressSpaces of the items that have been deleted.
*/
byMonitoredItemType(deletedItems, dataItems -> server.getAddressSpaceManager().onDataItemsDeleted(dataItems), eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems));
/*
* Build and return results.
*/
ResponseHeader header = service.createResponseHeader();
DeleteMonitoredItemsResponse response = new DeleteMonitoredItemsResponse(header, deleteResults, new DiagnosticInfo[0]);
service.setResponse(response);
}
use of org.eclipse.milo.opcua.sdk.server.items.BaseMonitoredItem in project milo by eclipse.
the class SubscriptionManager method deleteSubscription.
public void deleteSubscription(ServiceRequest service) throws UaException {
DeleteSubscriptionsRequest request = (DeleteSubscriptionsRequest) service.getRequest();
List<UInteger> subscriptionIds = l(request.getSubscriptionIds());
if (subscriptionIds.isEmpty()) {
throw new UaException(StatusCodes.Bad_NothingToDo);
}
StatusCode[] results = new StatusCode[subscriptionIds.size()];
for (int i = 0; i < subscriptionIds.size(); i++) {
UInteger subscriptionId = subscriptionIds.get(i);
Subscription subscription = subscriptions.remove(subscriptionId);
if (subscription != null) {
server.getSubscriptions().remove(subscription.getId());
server.getEventBus().post(new SubscriptionDeletedEvent(subscription));
List<BaseMonitoredItem<?>> deletedItems = subscription.deleteSubscription();
/*
* Notify AddressSpaces of the items we just deleted.
*/
byMonitoredItemType(deletedItems, dataItems -> server.getAddressSpaceManager().onDataItemsDeleted(dataItems), eventItems -> server.getAddressSpaceManager().onEventItemsDeleted(eventItems));
results[i] = StatusCode.GOOD;
} else {
results[i] = new StatusCode(StatusCodes.Bad_SubscriptionIdInvalid);
}
}
ResponseHeader header = service.createResponseHeader();
DeleteSubscriptionsResponse response = new DeleteSubscriptionsResponse(header, results, new DiagnosticInfo[0]);
service.setResponse(response);
while (subscriptions.isEmpty() && publishQueue.isNotEmpty()) {
ServiceRequest publishService = publishQueue.poll();
if (publishService != null) {
publishService.setServiceFault(StatusCodes.Bad_NoSubscription);
}
}
}
Aggregations