001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. 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 */
017 package org.apache.camel.component.xmpp;
018
019 import org.apache.camel.Consumer;
020 import org.apache.camel.Processor;
021 import org.apache.camel.Producer;
022 import org.apache.camel.impl.DefaultEndpoint;
023 import org.apache.commons.logging.Log;
024 import org.apache.commons.logging.LogFactory;
025
026 import org.jivesoftware.smack.AccountManager;
027 import org.jivesoftware.smack.XMPPConnection;
028 import org.jivesoftware.smack.XMPPException;
029 import org.jivesoftware.smack.filter.PacketFilter;
030 import org.jivesoftware.smack.packet.Message;
031 import org.jivesoftware.smack.packet.Presence;
032
033 /**
034 * An XMPP Endpoint
035 *
036 * @version $Revision:520964 $
037 */
038 public class XmppEndpoint extends DefaultEndpoint<XmppExchange> {
039 private static final transient Log LOG = LogFactory.getLog(XmppEndpoint.class);
040 private XmppBinding binding;
041 private XMPPConnection connection;
042 private String host;
043 private int port;
044 private String user;
045 private String password;
046 private String resource = "Camel";
047 private boolean login = true;
048 private PacketFilter filter;
049 private boolean createAccount;
050 private String room;
051 private String participant;
052
053 public XmppEndpoint(String uri, XmppComponent component) {
054 super(uri, component);
055 }
056
057 public Producer<XmppExchange> createProducer() throws Exception {
058 if (room != null) {
059 return createGroupChatProducer(room);
060 } else {
061 if (participant == null) {
062 throw new IllegalArgumentException("No room or participant configured on this endpoint: " + this);
063 }
064 return createPrivateChatProducer(participant);
065 }
066 }
067
068 public Producer<XmppExchange> createGroupChatProducer(String room) throws Exception {
069 return new XmppGroupChatProducer(this, room);
070 }
071
072 public Producer<XmppExchange> createPrivateChatProducer(String participant) throws Exception {
073 return new XmppPrivateChatProducer(this, participant);
074 }
075
076 public Consumer<XmppExchange> createConsumer(Processor processor) throws Exception {
077 return new XmppConsumer(this, processor);
078 }
079
080 public XmppExchange createExchange() {
081 return new XmppExchange(getContext(), getBinding());
082 }
083
084 public XmppExchange createExchange(Message message) {
085 return new XmppExchange(getContext(), getBinding(), message);
086 }
087
088 // Properties
089 // -------------------------------------------------------------------------
090 public XmppBinding getBinding() {
091 if (binding == null) {
092 binding = new XmppBinding();
093 }
094 return binding;
095 }
096
097 /**
098 * Sets the binding used to convert from a Camel message to and from an XMPP
099 * message
100 *
101 * @param binding the binding to use
102 */
103 public void setBinding(XmppBinding binding) {
104 this.binding = binding;
105 }
106
107 public String getHost() {
108 return host;
109 }
110
111 public void setHost(String host) {
112 this.host = host;
113 }
114
115 public int getPort() {
116 return port;
117 }
118
119 public void setPort(int port) {
120 this.port = port;
121 }
122
123 public String getUser() {
124 return user;
125 }
126
127 public void setUser(String user) {
128 this.user = user;
129 }
130
131 public String getPassword() {
132 return password;
133 }
134
135 public void setPassword(String password) {
136 this.password = password;
137 }
138
139 public String getResource() {
140 return resource;
141 }
142
143 public void setResource(String resource) {
144 this.resource = resource;
145 }
146
147 public boolean isLogin() {
148 return login;
149 }
150
151 public void setLogin(boolean login) {
152 this.login = login;
153 }
154
155 public PacketFilter getFilter() {
156 return filter;
157 }
158
159 public void setFilter(PacketFilter filter) {
160 this.filter = filter;
161 }
162
163 public boolean isCreateAccount() {
164 return createAccount;
165 }
166
167 public void setCreateAccount(boolean createAccount) {
168 this.createAccount = createAccount;
169 }
170
171 public String getRoom() {
172 return room;
173 }
174
175 public void setRoom(String room) {
176 this.room = room;
177 }
178
179 public String getParticipant() {
180 return participant;
181 }
182
183 public void setParticipant(String participant) {
184 this.participant = participant;
185 }
186
187 public XMPPConnection getConnection() throws XMPPException {
188 if (connection == null) {
189 connection = createConnection();
190 }
191 return connection;
192 }
193
194 public void setConnection(XMPPConnection connection) {
195 this.connection = connection;
196 }
197
198 // Implementation methods
199 // -------------------------------------------------------------------------
200 protected XMPPConnection createConnection() throws XMPPException {
201 XMPPConnection connection;
202 if (port > 0) {
203 connection = new XMPPConnection(host, port);
204 } else {
205 connection = new XMPPConnection(host);
206 }
207 if (login && !connection.isAuthenticated()) {
208 if (user != null) {
209 LOG.info("Logging in to XMPP as user: " + user + " on connection: " + connection);
210 if (password == null) {
211 LOG.warn("No password configured for user: " + user);
212 }
213
214 if (createAccount) {
215 AccountManager accountManager = new AccountManager(connection);
216 accountManager.createAccount(user, password);
217 }
218 if (resource != null) {
219 connection.login(user, password, resource);
220 } else {
221 connection.login(user, password);
222 }
223 } else {
224 LOG.info("Logging in anonymously to XMPP on connection: " + connection);
225 connection.loginAnonymously();
226 }
227
228 // now lets send a presence
229 connection.sendPacket(new Presence(Presence.Type.AVAILABLE));
230 }
231 return connection;
232 }
233
234 public boolean isSingleton() {
235 return true;
236 }
237
238 }