001/**
002 *
003 * Copyright © 2014-2017 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.jid.BareJid;
020import org.jxmpp.jid.EntityBareJid;
021import org.jxmpp.jid.DomainBareJid;
022import org.jxmpp.jid.DomainFullJid;
023import org.jxmpp.jid.EntityFullJid;
024import org.jxmpp.jid.EntityJid;
025import org.jxmpp.jid.FullJid;
026import org.jxmpp.jid.parts.Domainpart;
027import org.jxmpp.jid.parts.Localpart;
028import org.jxmpp.jid.parts.Resourcepart;
029import org.jxmpp.stringprep.XmppStringprepException;
030
031/**
032 * RFC6122 2.4 allows JIDs with only a domain and resource part.
033 * <p>
034 * Note that this implementation does not require an cache for the unescaped
035 * string, compared to {@link LocalDomainAndResourcepartJid}.
036 * </p>
037 *
038 */
039public final class DomainAndResourcepartJid extends AbstractJid implements DomainFullJid {
040
041        /**
042         *
043         */
044        private static final long serialVersionUID = 1L;
045
046        private final DomainBareJid domainBareJid;
047        private final Resourcepart resource;
048
049        DomainAndResourcepartJid(String domain, String resource) throws XmppStringprepException {
050                this(new DomainpartJid(domain), Resourcepart.from(resource));
051        }
052
053        DomainAndResourcepartJid(DomainBareJid domainBareJid, Resourcepart resource) {
054                this.domainBareJid = requireNonNull(domainBareJid, "The DomainBareJid must not be null");
055                this.resource = requireNonNull(resource, "The Resource must not be null");
056        }
057
058        @Override
059        public String toString() {
060                if (cache != null) {
061                        return cache;
062                }
063                cache = domainBareJid.toString() + '/' + resource;
064                return cache;
065        }
066
067        @Override
068        public DomainBareJid asDomainBareJid() {
069                return domainBareJid;
070        }
071
072        @Override
073        public boolean hasNoResource() {
074                return false;
075        }
076
077        @Override
078        public EntityBareJid asEntityBareJidIfPossible() {
079                return null;
080        }
081
082        @Override
083        public EntityFullJid asEntityFullJidIfPossible() {
084                return null;
085        }
086
087        @Override
088        public DomainFullJid asDomainFullJidIfPossible() {
089                return this;
090        }
091
092        @Override
093        public Resourcepart getResourceOrNull() {
094                return getResourcepart();
095        }
096
097        @Override
098        public boolean isParentOf(EntityBareJid bareJid) {
099                return false;
100        }
101
102        @Override
103        public boolean isParentOf(EntityFullJid fullJid) {
104                return false;
105        }
106
107        @Override
108        public boolean isParentOf(DomainBareJid domainBareJid) {
109                return false;
110        }
111
112        @Override
113        public boolean isParentOf(DomainFullJid domainFullJid) {
114                return domainBareJid.equals(domainFullJid.getDomain()) && resource.equals(domainFullJid.getResourcepart());
115        }
116
117        @Override
118        public Resourcepart getResourcepart() {
119                return resource;
120        }
121
122        @Override
123        public BareJid asBareJid() {
124                return asDomainBareJid();
125        }
126
127        @Override
128        public Domainpart getDomain() {
129                return domainBareJid.getDomain();
130        }
131
132        @Override
133        public String asUnescapedString() {
134                return toString();
135        }
136
137        @Override
138        public EntityJid asEntityJidIfPossible() {
139                return null;
140        }
141
142        @Override
143        public FullJid asFullJidIfPossible() {
144                return this;
145        }
146
147        @Override
148        public Localpart getLocalpartOrNull() {
149                return null;
150        }
151}