/** * * Copyright © 2014-2023 Florian Schmaus * * 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.jivesoftware.smack.packet; import java.util.Objects; import javax.xml.namespace.QName; /** * An XMPP error IQ. *

* According to RFC 6120 § 8.3.1 "4. An error stanza MUST contain an <error/> child element.", so this class can * only be constructed if a stanza error is provided. */ public final class ErrorIQ extends IQ { public static final String ELEMENT = StanzaError.ERROR; private final IQ request; private ErrorIQ(Builder builder, QName childElementQName) { super(builder, childElementQName); Objects.requireNonNull(builder.getError(), "Must provide an stanza error when building error IQs"); this.request = builder.request; } public static ErrorIQ createErrorResponse(final IQ request, final StanzaError error) { Builder builder = new Builder(error, request); builder.setError(error); return builder.build(); } @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { if (request == null) { return null; } return request.getIQChildElementBuilder(xml); } public static Builder builder(StanzaError error) { return new Builder(error, IqData.EMPTY.ofType(IQ.Type.error)); } public static Builder builder(StanzaError error, IqData iqData) { return new Builder(error, iqData); } public static final class Builder extends IqBuilder { private IQ request; Builder(StanzaError error, IqData iqData) { super(iqData); if (iqData.getType() != IQ.Type.error) { throw new IllegalArgumentException("Error IQs must be of type 'error'"); } Objects.requireNonNull(error, "Must provide an stanza error when building error IQs"); setError(error); } Builder(StanzaError error, IQ request) { this(error, AbstractIqBuilder.createErrorResponse(request)); this.request = request; } @Override public Builder getThis() { return this; } @Override public ErrorIQ build() { QName childElementQname = null; if (request != null) { childElementQname = request.getChildElementQName(); } return new ErrorIQ(this, childElementQname); } } }