/*
* Copyright 2015 Kevin Herron
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.digitalpetri.opcua.stack.core.types.builtin;
import java.util.Objects;
/**
* Vendor-specific diagnostic information
*/
public final class DiagnosticInfo {
public static final DiagnosticInfo NULL_VALUE = new DiagnosticInfo(-1, -1, -1, -1, null, null, null);
/**
* The symbolicId is defined within the context of a namespace. This namespace is represented as a string and is
* conveyed to the Client in the stringTable parameter of the ResponseHeader parameter defined in 7.27. The
* namespaceUri parameter contains the index into the stringTable for this string. -1 indicates that no string is
* specified.
* <p>
* The namespaceUri shall not be the standard OPC UA namespace. There are no symbolicIds provided for
* standard StatusCodes.
*/
private final int namespaceUri;
/**
* The symbolicId shall be used to identify a vendor-specific error or condition; typically the result of some
* server internal operation. The maximum length of this string is 32 characters. Servers wishing to return a
* numeric return code should convert the return code into a string and use this string as symbolicId
* (e.g., "0xC0040007" or "-4").
* <p>
* This symbolic identifier string is conveyed to the Client in the stringTable
* parameter of the ResponseHeader parameter defined in 7.27. The symbolicId parameter contains the index into the
* stringTable for this string. -1 indicates that no string is specified.
* <p>
* The symbolicId shall not contain StatusCodes. If the localizedText contains a translation for the description of
* a StatusCode, the symbolicId is -1.
*/
private final int symbolicId;
/**
* The locale part of the vendor-specific localized text describing the symbolic id.
* <p>
* This localized text string is conveyed to the Client in the stringTable parameter of the ResponseHeader parameter
* defined in 7.27. The localizedText parameter contains the index into the stringTable for this string. -1
* indicates that no string is specified.
*/
private final int locale;
/**
* A vendor-specific localized text string describes the symbolic id. The maximum length of this text string is
* 256 characters.
* <p>
* This localized text string is conveyed to the Client in the stringTable parameter of the ResponseHeader
* parameter defined in 7.27. The localizedTextIndex parameter contains the index into the stringTable for this
* string. -1 indicates that no string is specified.
* <p>
* The localizedText refers to the symbolicId if present or the string that describes the standard StatusCode if
* the server provides translations. If the index is -1, the server has no translation to return and the client
* should use the invariant StatusCode description from the specification.
*/
private final int localizedText;
/**
* Vendor-specific diagnostic information.
*/
private final String additionalInfo;
/**
* The StatusCode from the inner operation.
* <p>
* Many applications will make calls into underlying systems during OPC UA request processing. An OPC UA Server has
* the option of reporting the status from the underlying system in the diagnostic info.
*/
private final StatusCode innerStatusCode;
/**
* The diagnostic info associated with the inner StatusCode.
*/
private final DiagnosticInfo innerDiagnosticInfo;
public DiagnosticInfo(int namespaceUri,
int symbolicId,
int locale,
int localizedText,
String additionalInfo,
StatusCode innerStatusCode,
DiagnosticInfo innerDiagnosticInfo) {
this.namespaceUri = namespaceUri;
this.symbolicId = symbolicId;
this.locale = locale;
this.localizedText = localizedText;
this.additionalInfo = additionalInfo;
this.innerStatusCode = innerStatusCode;
this.innerDiagnosticInfo = innerDiagnosticInfo;
}
public int getNamespaceUri() {
return namespaceUri;
}
public int getSymbolicId() {
return symbolicId;
}
public int getLocale() {
return locale;
}
public int getLocalizedText() {
return localizedText;
}
public String getAdditionalInfo() {
return additionalInfo;
}
public StatusCode getInnerStatusCode() {
return innerStatusCode;
}
public DiagnosticInfo getInnerDiagnosticInfo() {
return innerDiagnosticInfo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DiagnosticInfo that = (DiagnosticInfo) o;
return Objects.equals(symbolicId, that.symbolicId) &&
Objects.equals(namespaceUri, that.namespaceUri) &&
Objects.equals(localizedText, that.localizedText) &&
Objects.equals(locale, that.locale) &&
Objects.equals(additionalInfo, that.additionalInfo) &&
Objects.equals(innerStatusCode, that.innerStatusCode) &&
Objects.equals(innerDiagnosticInfo, that.innerDiagnosticInfo);
}
@Override
public int hashCode() {
int result = namespaceUri;
result = 31 * result + symbolicId;
result = 31 * result + locale;
result = 31 * result + localizedText;
result = 31 * result + (additionalInfo != null ? additionalInfo.hashCode() : 0);
result = 31 * result + (innerStatusCode != null ? innerStatusCode.hashCode() : 0);
result = 31 * result + (innerDiagnosticInfo != null ? innerDiagnosticInfo.hashCode() : 0);
return result;
}
}