001/**
002 *
003 * Copyright © 2014-2024 Florian Schmaus
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jxmpp.jid.impl;
018
019import org.jxmpp.JxmppContext;
020import org.jxmpp.jid.BareJid;
021import org.jxmpp.jid.EntityBareJid;
022import org.jxmpp.jid.DomainBareJid;
023import org.jxmpp.jid.DomainFullJid;
024import org.jxmpp.jid.EntityFullJid;
025import org.jxmpp.jid.EntityJid;
026import org.jxmpp.jid.FullJid;
027import org.jxmpp.jid.parts.Domainpart;
028import org.jxmpp.jid.parts.Localpart;
029import org.jxmpp.jid.parts.Resourcepart;
030import org.jxmpp.stringprep.XmppStringprepException;
031
032/**
033 * RFC6122 2.4 allows JIDs with only a domain and resource part.
034 * <p>
035 * Note that this implementation does not require an cache for the unescaped
036 * string, compared to {@link LocalDomainAndResourcepartJid}.
037 * </p>
038 *
039 */
040public final class DomainAndResourcepartJid extends AbstractJid implements DomainFullJid {
041
042        /**
043         *
044         */
045        private static final long serialVersionUID = 1L;
046
047        private final DomainBareJid domainBareJid;
048        private final Resourcepart resource;
049
050        DomainAndResourcepartJid(String domain, String resource, JxmppContext context) throws XmppStringprepException {
051                this(new DomainpartJid(domain, context), Resourcepart.from(resource, context));
052        }
053
054        DomainAndResourcepartJid(DomainBareJid domainBareJid, Resourcepart resource) {
055                this.domainBareJid = requireNonNull(domainBareJid, "The DomainBareJid must not be null");
056                this.resource = requireNonNull(resource, "The Resource must not be null");
057        }
058
059        @Override
060        public String toString() {
061                if (cache != null) {
062                        return cache;
063                }
064                cache = domainBareJid.toString() + '/' + resource;
065                return cache;
066        }
067
068        @Override
069        public DomainBareJid asDomainBareJid() {
070                return domainBareJid;
071        }
072
073        @Override
074        public boolean hasNoResource() {
075                return false;
076        }
077
078        @Override
079        public EntityBareJid asEntityBareJidIfPossible() {
080                return null;
081        }
082
083        @Override
084        public EntityFullJid asEntityFullJidIfPossible() {
085                return null;
086        }
087
088        @Override
089        public DomainFullJid asDomainFullJidIfPossible() {
090                return this;
091        }
092
093        @Override
094        public Resourcepart getResourceOrNull() {
095                return getResourcepart();
096        }
097
098        @Override
099        public boolean isParentOf(EntityBareJid bareJid) {
100                return false;
101        }
102
103        @Override
104        public boolean isParentOf(EntityFullJid fullJid) {
105                return false;
106        }
107
108        @Override
109        public boolean isParentOf(DomainBareJid domainBareJid) {
110                return false;
111        }
112
113        @Override
114        public boolean isParentOf(DomainFullJid domainFullJid) {
115                return domainBareJid.equals(domainFullJid.getDomain()) && resource.equals(domainFullJid.getResourcepart());
116        }
117
118        @Override
119        public boolean isStrictParentOf(EntityBareJid bareJid) {
120                return false;
121        }
122
123        @Override
124        public boolean isStrictParentOf(EntityFullJid fullJid) {
125                return false;
126        }
127
128        @Override
129        public boolean isStrictParentOf(DomainBareJid domainBareJid) {
130                return false;
131        }
132
133        @Override
134        public boolean isStrictParentOf(DomainFullJid domainFullJid) {
135                // A DomainFullJid can never be the strict parent of another DomainFullJid.
136                return false;
137        }
138
139        @Override
140        public Resourcepart getResourcepart() {
141                return resource;
142        }
143
144        @Override
145        public BareJid asBareJid() {
146                return asDomainBareJid();
147        }
148
149        @Override
150        public Domainpart getDomain() {
151                return domainBareJid.getDomain();
152        }
153
154        @Override
155        public String asUnescapedString() {
156                return toString();
157        }
158
159        @Override
160        public EntityJid asEntityJidIfPossible() {
161                return null;
162        }
163
164        @Override
165        public FullJid asFullJidIfPossible() {
166                return this;
167        }
168
169        @Override
170        public Localpart getLocalpartOrNull() {
171                return null;
172        }
173}