blob: 62783985af74876e37f0f9b45e97cc00a9c0cab5 [file] [log] [blame]
/*
* 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.axis2.transport.xmpp.util;
import org.apache.axis2.AxisFault;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.FromContainsFilter;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.ToContainsFilter;
import java.util.HashMap;
import java.util.Map;
public class XMPPClientConnectionFactory {
private static Log log = LogFactory.getLog(XMPPClientConnectionFactory.class);
private XMPPConnection xmppConnection = null;
private PacketFilter packetFilter = null;
private Map<String,XMPPConnectionDetails> xmppConnections = new HashMap<String,XMPPConnectionDetails>();
public XMPPClientConnectionFactory(){}
/**
* Connects to a XMPP server based on the details available in serverCredentials object
* @param serverCredentials
* @throws XMPPException
*/
public XMPPConnection connect(final XMPPServerCredentials serverCredentials) throws AxisFault {
//XMPPConnection.DEBUG_ENABLED = true;
if(XMPPConstants.XMPP_SERVER_TYPE_JABBER.equals(serverCredentials.getServerType())){
xmppConnection = new XMPPConnection(serverCredentials.getServerUrl());
try {
xmppConnection.connect();
} catch (XMPPException e) {
log.error("Failed to connect to server :"+serverCredentials.getServerUrl(), e);
throw new AxisFault("Failed to connect to server :"+serverCredentials.getServerUrl());
}
//Pause for a small time before trying to login.
//This prevents random ssl exception from Smack API
try {
Thread.sleep(100);
} catch (InterruptedException e5) {
log.debug("Sleep interrupted ",e5);
}
if(xmppConnection.isConnected()){
String resource = serverCredentials.getResource()+ new Object().hashCode();
if(! xmppConnection.isAuthenticated()){
try {
//xmppConnection.login(serverCredentials.getAccountName()+"@"+
// serverCredentials.getServerUrl(),
xmppConnection.login(serverCredentials.getAccountName(),
serverCredentials.getPassword(),
resource,
true);
} catch (XMPPException e) {
try {
log.error("Login failed for "
+serverCredentials.getAccountName()
+"@"+serverCredentials.getServerUrl()
+".Retrying in 2 secs",e);
Thread.sleep(2000);
//xmppConnection.login(serverCredentials.getAccountName()+"@"+
// serverCredentials.getServerUrl(),
xmppConnection.login(serverCredentials.getAccountName(),
serverCredentials.getPassword(),
resource,
true);
} catch (InterruptedException e1) {
log.error("Sleep interrupted.",e1);
} catch (XMPPException e2) {
log.error("Login failed for : "+serverCredentials.getAccountName()
+"@"+serverCredentials.getServerUrl(),e2);
throw new AxisFault("Login failed for : "+serverCredentials.getAccountName()
+"@"+serverCredentials.getServerUrl());
}
}
//Listen for Message type packets from specified server url
//packetFilter = new AndFilter(new PacketTypeFilter(Message.class),
// new FromContainsFilter(serverCredentials.getServerUrl()));
packetFilter = new FromContainsFilter(serverCredentials.getServerUrl());
}
}
}else if(XMPPConstants.XMPP_SERVER_TYPE_GOOGLETALK.equals(serverCredentials.getServerType())){
ConnectionConfiguration connectionConfiguration =
new ConnectionConfiguration(XMPPConstants.GOOGLETALK_URL
,XMPPConstants.GOOGLETALK_PORT
,XMPPConstants.GOOGLETALK_SERVICE_NAME);
xmppConnection = new XMPPConnection(connectionConfiguration);
try {
xmppConnection.connect();
xmppConnection.login(serverCredentials.getAccountName()
, serverCredentials.getPassword()
,serverCredentials.getResource(),
true);
//packetFilter = new AndFilter(new PacketTypeFilter(Message.class),
// new FromContainsFilter(XMPPConstants.GOOGLETALK_FROM));
//packetFilter = new FromContainsFilter(XMPPConstants.GOOGLETALK_FROM);
packetFilter = new ToContainsFilter("@gmail.com");
} catch (XMPPException e1) {
log.error("Error occured while connecting to Googletalk server.",e1);
throw new AxisFault("Error occured while connecting to Googletalk server.");
}
}
ConnectionListener connectionListener = null;
connectionListener = new ConnectionListener(){
public void connectionClosed() {
log.debug("Connection closed normally");
}
public void connectionClosedOnError(
Exception e1) {
log.error("Connection to "+serverCredentials.getServerUrl()
+ " closed with error.",e1);
}
public void reconnectingIn(int seconds) {
log.error("Connection to "+serverCredentials.getServerUrl()
+" failed. Reconnecting in "+seconds+"s");
}
public void reconnectionFailed(Exception e) {
log.error("Reconnection to "+serverCredentials.getServerUrl()+" failed.",e);
}
public void reconnectionSuccessful() {
log.debug("Reconnection to "+serverCredentials.getServerUrl()+" successful.");
}
};
if(xmppConnection != null && xmppConnection.isConnected()){
xmppConnection.addConnectionListener(connectionListener);
log.info("Connected to " +serverCredentials.getAccountName()+ "@"
+ serverCredentials.getServerUrl()+ "/"+ serverCredentials.getResource());
}else{
log.warn(" Not Connected to " +serverCredentials.getAccountName()+ "@"
+ serverCredentials.getServerUrl()+ "/"+ serverCredentials.getResource());
}
return xmppConnection;
}
public XMPPConnection getXmppConnection(){
return xmppConnection;
}
// public XMPPConnection getConnection(XMPPServerCredentials credentials) throws AxisFault{
// StringBuffer buf = new StringBuffer();
// String key = buf.append(credentials.getServerUrl()).append(credentials.getAccountName()).toString();
//
// XMPPConnectionDetails connDetails = xmppConnections.get(key);
// if(connDetails == null){
// connDetails = new XMPPConnectionDetails();
// connDetails.connection = connect(credentials);
// connDetails.userCount = 1;
// xmppConnections.put(key, connDetails);
// }else{
// connDetails.userCount = 1;
// }
// return connDetails.connection;
// }
//
// public void disconnect(XMPPServerCredentials credentials){
// StringBuffer buf = new StringBuffer();
// String key = buf.append(credentials.getServerUrl()).append(credentials.getAccountName()).toString();
//
// XMPPConnectionDetails connDetails = xmppConnections.get(key);
// if(connDetails != null){
// connDetails.userCount--;
// }
// if(connDetails.userCount == 0){
// xmppConnections.remove(key);
// connDetails.connection.disconnect();
// }
// }
// public void listen(XMPPPacketListener packetListener){
// xmppConnection.addPacketListener(packetListener,packetFilter);
// }
public void stop() {}
public class XMPPConnectionDetails{
XMPPConnection connection;
int userCount;
}
}