Java tutorial
/* * Copyright 2018-present Open Networking Foundation * * 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 org.onosproject.netconf; import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.xml.bind.JAXBElement; import org.onosproject.netconf.rpc.ErrorInfoType; import org.onosproject.netconf.rpc.ErrorSeverity; import org.onosproject.netconf.rpc.ErrorTag; import org.onosproject.netconf.rpc.ErrorType; import org.onosproject.netconf.rpc.RpcErrorType; import org.onosproject.netconf.rpc.RpcErrorType.ErrorMessage; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; /** * Wrapper around {@link RpcErrorType} for ease of handling and logging. * * @see NetconfRpcParserUtil */ @Beta public class NetconfRpcError { /** * Protocol mandated error-info: {@value}. */ public static final String BAD_ATTRIBUTE = "bad-attribute"; /** * Protocol mandated error-info: {@value}. */ public static final String BAD_ELEMENT = "bad-element"; /** * Protocol mandated error-info: {@value}. */ public static final String OK_ELEMENT = "ok-element"; /** * Protocol mandated error-info: {@value}. */ public static final String ERR_ELEMENT = "err-element"; /** * Protocol mandated error-info: {@value}. */ public static final String NOOP_ELEMENT = "noop-element"; /** * Protocol mandated error-info: {@value}. */ public static final String BAD_NAMESPACE = "bad-namespace"; private final RpcErrorType msg; public static final NetconfRpcError wrap(RpcErrorType msg) { return new NetconfRpcError(msg); } protected NetconfRpcError(RpcErrorType msg) { this.msg = checkNotNull(msg); } /** * Returns conceptual layer that the error occurred. * * @return the type */ public ErrorType type() { return msg.getErrorType(); } /** * Returns a tag identifying the error condition. * * @return the tag */ public ErrorTag tag() { return msg.getErrorTag(); } /** * Returns error severity. * * @return severity */ public ErrorSeverity severity() { return msg.getErrorSeverity(); } /** * Returns a string identifying the data-model-specific * or implementation-specific error condition, if one exists. * * @return app tag */ public Optional<String> appTag() { return Optional.ofNullable(msg.getErrorAppTag()); } /** * Returns absolute XPath expression identifying the element path * to the node that is associated with the error being reported. * * @return XPath expression */ public Optional<String> path() { return Optional.ofNullable(msg.getErrorPath()); } /** * Returns human readable error message. * * @return message */ //@Nonnull public String message() { return Optional.ofNullable(msg.getErrorMessage()).map(ErrorMessage::getValue).orElse(""); } /** * Returns session-id in error-info if any. * * @return session-id */ public Optional<Long> infoSessionId() { return Optional.ofNullable(msg.getErrorInfo()).map(ErrorInfoType::getSessionId); } /** * Returns protocol-mandated contents if any. * * @return Map containing protocol-mandated contents * <p> * Possible Map keys: * {@link #BAD_ATTRIBUTE}, * {@link #BAD_ELEMENT}, * {@link #OK_ELEMENT}, * {@link #ERR_ELEMENT}, * {@link #NOOP_ELEMENT}, * {@link #BAD_NAMESPACE} */ @Beta public Map<String, String> info() { return Optional.ofNullable(msg.getErrorInfo()).map(ErrorInfoType::getBadAttributeAndBadElementAndOkElement) .map(Collection::stream).orElse(Stream.empty()) .collect(Collectors.<JAXBElement<? extends Serializable>, String, String, Map<String, String>>toMap( elm -> elm.getName().getLocalPart(), elm -> String.valueOf(elm.getValue()), (v1, v2) -> v1, LinkedHashMap::new)); } /** * Returns any other elements if present. * * @return any other elements */ @Beta public List<Object> infoAny() { return Optional.ofNullable(msg.getErrorInfo()).map(ErrorInfoType::getAny).orElse(ImmutableList.of()); } /** * Returns protocol- or data-model-specific error content. * * @return error info */ @Beta public Optional<ErrorInfoType> rawInfo() { return Optional.ofNullable(msg.getErrorInfo()); } @Override public String toString() { return MoreObjects.toStringHelper(this).add("type", type()).add("tag", tag()).add("severity", severity()) .add("appTag", appTag().orElse(null)).add("path", path().orElse(null)) .add("message", Strings.emptyToNull(message())).add("info-session-id", infoSessionId().orElse(null)) .add("info", info()).omitNullValues().toString(); } }