| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.vysper.xmpp.modules.extension.xep0045_muc.handler; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.apache.vysper.xml.fragment.XMLElement; |
| import org.apache.vysper.xmpp.addressing.Entity; |
| import org.apache.vysper.xmpp.addressing.EntityFormatException; |
| import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.AbstractInviteDecline; |
| import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Decline; |
| import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Invite; |
| import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Password; |
| import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X; |
| import org.apache.vysper.xmpp.protocol.NamespaceURIs; |
| import org.apache.vysper.xmpp.stanza.Stanza; |
| import org.apache.vysper.xmpp.stanza.StanzaBuilder; |
| import org.apache.vysper.xmpp.stanza.StanzaErrorCondition; |
| import org.apache.vysper.xmpp.stanza.StanzaErrorType; |
| |
| /** |
| * |
| * |
| * @author The Apache MINA Project (dev@mina.apache.org) |
| */ |
| public class MUCHandlerHelper { |
| |
| public static boolean verifyNamespace(Stanza stanza) { |
| // either, the stanza should have a x element with the MUC namespace. Or, no extension |
| // element at all. Else, return false |
| |
| XMLElement xElement = stanza.getFirstInnerElement(); |
| if (xElement != null && xElement.getName().equals("x") |
| && xElement.getNamespaceURI().equals(NamespaceURIs.XEP0045_MUC)) { |
| // got x element and in the correct namespace |
| return true; |
| } else if (xElement != null && xElement.getNamespaceURI().length() == 0) { |
| // no extension namespace, ok |
| return true; |
| } else if (xElement == null) { |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| public static Stanza createErrorStanza(String stanzaName, String namespaceUri, Entity from, Entity to, String id, |
| String type, String errorName, List<XMLElement> innerElements) { |
| // <presence |
| // from='darkcave@chat.shakespeare.lit' |
| // to='hag66@shakespeare.lit/pda' |
| // type='error'> |
| // <error type='modify'> |
| // <jid-malformed xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> |
| // </error> |
| // </presence> |
| |
| StanzaBuilder builder = new StanzaBuilder(stanzaName, namespaceUri); |
| builder.addAttribute("from", from.getFullQualifiedName()); |
| builder.addAttribute("to", to.getFullQualifiedName()); |
| if (id != null) |
| builder.addAttribute("id", id); |
| builder.addAttribute("type", "error"); |
| |
| if (innerElements != null) { |
| for (XMLElement innerElement : innerElements) { |
| builder.addPreparedElement(innerElement); |
| } |
| } |
| |
| builder.startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", type); |
| builder.startInnerElement(errorName, NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement(); |
| builder.endInnerElement(); |
| |
| return builder.build(); |
| } |
| |
| public static Stanza createErrorReply(Stanza originalStanza, StanzaErrorType type, StanzaErrorCondition error) { |
| StanzaBuilder builder = new StanzaBuilder(originalStanza.getName(), originalStanza.getNamespaceURI()); |
| builder.addAttribute("from", originalStanza.getTo().getFullQualifiedName()); |
| builder.addAttribute("to", originalStanza.getFrom().getFullQualifiedName()); |
| builder.addAttribute("id", originalStanza.getAttributeValue("id")); |
| builder.addAttribute("type", "error"); |
| |
| for (XMLElement inner : originalStanza.getInnerElements()) { |
| builder.addPreparedElement(inner); |
| } |
| |
| builder.startInnerElement("error", NamespaceURIs.JABBER_CLIENT).addAttribute("type", type.value()); |
| builder.startInnerElement(error.value(), NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).endInnerElement(); |
| builder.endInnerElement(); |
| |
| return builder.build(); |
| } |
| |
| public static Stanza createInviteMessageStanza(Stanza original, String password) throws EntityFormatException { |
| X orginalX = X.fromStanza(original); |
| |
| Invite invite = orginalX.getInvite(); |
| if (invite == null || invite.getTo() == null) { |
| throw new IllegalArgumentException("Invalid invite element, must exist and contain to attribute"); |
| } |
| |
| Invite newInvite = new Invite(original.getFrom(), null, invite.getReason()); |
| return createInviteDeclineMessageStanza(original, invite.getTo(), password, newInvite); |
| } |
| |
| public static Stanza createDeclineMessageStanza(Stanza original) throws EntityFormatException { |
| X orginalX = X.fromStanza(original); |
| |
| Decline decline = orginalX.getDecline(); |
| if (decline == null || decline.getTo() == null) { |
| throw new IllegalArgumentException("Invalid decline element, must exist and contain to attribute"); |
| } |
| |
| Decline newDecline = new Decline(original.getFrom(), null, decline.getReason()); |
| return createInviteDeclineMessageStanza(original, decline.getTo(), null, newDecline); |
| } |
| |
| public static Stanza createInviteDeclineMessageStanza(Stanza original, Entity to, String password, |
| AbstractInviteDecline invdec) throws EntityFormatException { |
| StanzaBuilder builder = StanzaBuilder.createMessageStanza(original.getTo(), to, null, null); |
| List<XMLElement> inner = new ArrayList<XMLElement>(); |
| inner.add(invdec); |
| if (password != null) { |
| inner.add(new Password(password)); |
| } |
| |
| X newX = new X(NamespaceURIs.XEP0045_MUC_USER, inner); |
| builder.addPreparedElement(newX); |
| return builder.build(); |
| } |
| |
| } |