1package eu.siacs.conversations.xmpp;
2
3import org.jxmpp.jid.impl.JidCreate;
4import org.jxmpp.jid.parts.Domainpart;
5import org.jxmpp.jid.parts.Localpart;
6import org.jxmpp.jid.parts.Resourcepart;
7import org.jxmpp.stringprep.XmppStringprepException;
8
9import java.io.Serializable;
10import java.util.regex.Matcher;
11import java.util.regex.Pattern;
12
13public interface Jid extends Comparable<Jid>, Serializable, CharSequence {
14
15 Pattern JID = Pattern.compile("^((.*?)@)?([^/@]+)(/(.*))?$");
16
17 static Jid of(CharSequence local, CharSequence domain, CharSequence resource) {
18 if (local == null) {
19 if (resource == null) {
20 return ofDomain(domain);
21 } else {
22 return ofDomainAndResource(domain, resource);
23 }
24 }
25 if (resource == null) {
26 return ofLocalAndDomain(local, domain);
27 }
28 try {
29 return new WrappedJid(JidCreate.entityFullFrom(
30 Localpart.fromUnescaped(local.toString()),
31 Domainpart.from(domain.toString()),
32 Resourcepart.from(resource.toString())
33 ));
34 } catch (XmppStringprepException e) {
35 throw new IllegalArgumentException(e);
36 }
37 }
38
39 static Jid ofEscaped(CharSequence local, CharSequence domain, CharSequence resource) {
40 try {
41 if (resource == null) {
42 return new WrappedJid(
43 JidCreate.bareFrom(
44 Localpart.from(local.toString()),
45 Domainpart.from(domain.toString())
46 )
47 );
48 }
49 return new WrappedJid(JidCreate.entityFullFrom(
50 Localpart.from(local.toString()),
51 Domainpart.from(domain.toString()),
52 Resourcepart.from(resource.toString())
53 ));
54 } catch (XmppStringprepException e) {
55 throw new IllegalArgumentException(e);
56 }
57 }
58
59
60 static Jid ofDomain(CharSequence domain) {
61 try {
62 return new WrappedJid(JidCreate.domainBareFrom(domain));
63 } catch (XmppStringprepException e) {
64 throw new IllegalArgumentException(e);
65 }
66 }
67
68 static Jid ofLocalAndDomain(CharSequence local, CharSequence domain) {
69 try {
70 return new WrappedJid(
71 JidCreate.bareFrom(
72 Localpart.fromUnescaped(local.toString()),
73 Domainpart.from(domain.toString())
74 )
75 );
76 } catch (XmppStringprepException e) {
77 throw new IllegalArgumentException(e);
78 }
79 }
80
81 static Jid ofDomainAndResource(CharSequence domain, CharSequence resource) {
82 try {
83 return new WrappedJid(
84 JidCreate.domainFullFrom(
85 Domainpart.from(domain.toString()),
86 Resourcepart.from(resource.toString())
87 ));
88 } catch (XmppStringprepException e) {
89 throw new IllegalArgumentException(e);
90 }
91 }
92
93 static Jid ofLocalAndDomainEscaped(CharSequence local, CharSequence domain) {
94 try {
95 return new WrappedJid(
96 JidCreate.bareFrom(
97 Localpart.from(local.toString()),
98 Domainpart.from(domain.toString())
99 )
100 );
101 } catch (XmppStringprepException e) {
102 throw new IllegalArgumentException(e);
103 }
104 }
105
106 static Jid of(CharSequence jid) {
107 if (jid instanceof Jid) {
108 return (Jid) jid;
109 }
110 Matcher matcher = JID.matcher(jid);
111 if (matcher.matches()) {
112 return of(matcher.group(2), matcher.group(3), matcher.group(5));
113 } else {
114 throw new IllegalArgumentException("Could not parse JID: " + jid);
115 }
116 }
117
118 static Jid ofEscaped(CharSequence jid) {
119 try {
120 return new WrappedJid(JidCreate.from(jid));
121 } catch (final XmppStringprepException e) {
122 throw new IllegalArgumentException(e);
123 }
124 }
125
126 boolean isFullJid();
127
128 boolean isBareJid();
129
130 boolean isDomainJid();
131
132 Jid asBareJid();
133
134 Jid withResource(CharSequence resource);
135
136 String getLocal();
137
138 String getEscapedLocal();
139
140 Jid getDomain();
141
142 String getResource();
143
144 String toEscapedString();
145}