use of org.eclipse.milo.opcua.sdk.server.OpcUaServer in project milo by eclipse.
the class DefaultSubscriptionServiceSet method onTransferSubscriptions.
@Override
public void onTransferSubscriptions(ServiceRequest service) throws UaException {
TransferSubscriptionsRequest request = (TransferSubscriptionsRequest) service.getRequest();
OpcUaServer server = service.attr(ServiceAttributes.SERVER_KEY).get();
Session session = service.attr(ServiceAttributes.SESSION_KEY).get();
List<UInteger> subscriptionIds = l(request.getSubscriptionIds());
if (subscriptionIds.isEmpty()) {
throw new UaException(StatusCodes.Bad_NothingToDo);
}
List<TransferResult> results = Lists.newArrayList();
for (UInteger subscriptionId : subscriptionIds) {
Subscription subscription = server.getSubscriptions().get(subscriptionId);
if (subscription == null) {
results.add(new TransferResult(new StatusCode(StatusCodes.Bad_SubscriptionIdInvalid), new UInteger[0]));
} else {
Session otherSession = subscription.getSession();
if (!sessionsHaveSameUser(session, otherSession)) {
results.add(new TransferResult(new StatusCode(StatusCodes.Bad_UserAccessDenied), new UInteger[0]));
} else {
UInteger[] availableSequenceNumbers;
synchronized (subscription) {
otherSession.getSubscriptionManager().sendStatusChangeNotification(subscription, new StatusCode(StatusCodes.Good_SubscriptionTransferred));
otherSession.getSubscriptionManager().removeSubscription(subscriptionId);
subscription.setSubscriptionManager(session.getSubscriptionManager());
subscriptionManager.addSubscription(subscription);
subscription.getMonitoredItems().values().forEach(item -> item.setSession(session));
availableSequenceNumbers = subscription.getAvailableSequenceNumbers();
if (request.getSendInitialValues()) {
subscription.getMonitoredItems().values().stream().filter(item -> item instanceof MonitoredDataItem).map(item -> (MonitoredDataItem) item).forEach(MonitoredDataItem::maybeSendLastValue);
}
}
subscription.getSubscriptionDiagnostics().getTransferRequestCount().increment();
ApplicationDescription toClient = session.getClientDescription();
ApplicationDescription fromClient = otherSession.getClientDescription();
if (Objects.equals(toClient, fromClient)) {
subscription.getSubscriptionDiagnostics().getTransferredToSameClientCount().increment();
} else {
subscription.getSubscriptionDiagnostics().getTransferredToAltClientCount().increment();
}
results.add(new TransferResult(StatusCode.GOOD, availableSequenceNumbers));
}
}
}
TransferSubscriptionsResponse response = new TransferSubscriptionsResponse(service.createResponseHeader(), a(results, TransferResult.class), new DiagnosticInfo[0]);
service.setResponse(response);
}
use of org.eclipse.milo.opcua.sdk.server.OpcUaServer in project milo by eclipse.
the class BrowseHelper method browseNext.
public void browseNext(ServiceRequest service) {
OpcUaServer server = service.attr(ServiceAttributes.SERVER_KEY).get();
BrowseNextRequest request = (BrowseNextRequest) service.getRequest();
List<ByteString> continuationPoints = l(request.getContinuationPoints());
if (continuationPoints.size() > server.getConfig().getLimits().getMaxBrowseContinuationPoints().intValue()) {
service.setServiceFault(StatusCodes.Bad_TooManyOperations);
} else {
server.getExecutorService().execute(new BrowseNext(server, service));
}
}
use of org.eclipse.milo.opcua.sdk.server.OpcUaServer in project milo by eclipse.
the class DefaultAttributeServiceSet method onRead.
@Override
public void onRead(ServiceRequest service) {
ReadRequest request = (ReadRequest) service.getRequest();
OpcUaServer server = service.attr(ServiceAttributes.SERVER_KEY).get();
Session session = service.attr(ServiceAttributes.SESSION_KEY).get();
List<ReadValueId> nodesToRead = l(request.getNodesToRead());
if (nodesToRead.isEmpty()) {
service.setServiceFault(StatusCodes.Bad_NothingToDo);
return;
}
if (nodesToRead.size() > server.getConfig().getLimits().getMaxNodesPerRead().longValue()) {
service.setServiceFault(StatusCodes.Bad_TooManyOperations);
return;
}
if (request.getMaxAge() < 0d) {
service.setServiceFault(StatusCodes.Bad_MaxAgeInvalid);
return;
}
if (request.getTimestampsToReturn() == null) {
service.setServiceFault(StatusCodes.Bad_TimestampsToReturnInvalid);
return;
}
DiagnosticsContext<ReadValueId> diagnosticsContext = new DiagnosticsContext<>();
ReadContext context = new ReadContext(server, session, diagnosticsContext);
server.getAddressSpaceManager().read(context, request.getMaxAge(), request.getTimestampsToReturn(), nodesToRead);
context.getFuture().thenAccept(values -> {
ResponseHeader header = service.createResponseHeader();
DiagnosticInfo[] diagnosticInfos = diagnosticsContext.getDiagnosticInfos(nodesToRead);
ReadResponse response = new ReadResponse(header, values.toArray(new DataValue[0]), diagnosticInfos);
service.setResponse(response);
});
}
use of org.eclipse.milo.opcua.sdk.server.OpcUaServer in project milo by eclipse.
the class DefaultAttributeServiceSet method onWrite.
@Override
public void onWrite(ServiceRequest service) {
WriteRequest request = (WriteRequest) service.getRequest();
OpcUaServer server = service.attr(ServiceAttributes.SERVER_KEY).get();
Session session = service.attr(ServiceAttributes.SESSION_KEY).get();
List<WriteValue> nodesToWrite = l(request.getNodesToWrite());
if (nodesToWrite.isEmpty()) {
service.setServiceFault(StatusCodes.Bad_NothingToDo);
return;
}
if (nodesToWrite.size() > server.getConfig().getLimits().getMaxNodesPerWrite().intValue()) {
service.setServiceFault(StatusCodes.Bad_TooManyOperations);
return;
}
DiagnosticsContext<WriteValue> diagnosticsContext = new DiagnosticsContext<>();
WriteContext context = new WriteContext(server, session, new DiagnosticsContext<>());
server.getAddressSpaceManager().write(context, nodesToWrite);
context.getFuture().thenAccept(values -> {
ResponseHeader header = service.createResponseHeader();
DiagnosticInfo[] diagnosticInfos = diagnosticsContext.getDiagnosticInfos(nodesToWrite);
WriteResponse response = new WriteResponse(header, values.toArray(new StatusCode[0]), diagnosticInfos);
service.setResponse(response);
});
}
use of org.eclipse.milo.opcua.sdk.server.OpcUaServer in project milo by eclipse.
the class DefaultViewServiceSet method onTranslateBrowsePaths.
@Override
public void onTranslateBrowsePaths(ServiceRequest service) {
translateBrowsePathsCounter.record(service);
OpcUaServer server = service.attr(ServiceAttributes.SERVER_KEY).get();
Session session = service.attr(ServiceAttributes.SESSION_KEY).get();
BrowsePathsHelper browsePathsHelper = new BrowsePathsHelper(() -> Optional.ofNullable(session), server);
browsePathsHelper.onTranslateBrowsePaths(service);
}
Aggregations