Author: hemapani
Date: Wed Dec 15 10:47:27 2010
New Revision: 1049486

URL: http://svn.apache.org/viewvc?rev=1049486&view=rev
Log:
Fix a bug in the XMPP transport which lead to faluires when it is loaded, 
adding missing files

Added:
    
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java
   (with props)
    
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java
   (with props)

Added: 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java?rev=1049486&view=auto
==============================================================================
--- 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java
 (added)
+++ 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java
 Wed Dec 15 10:47:27 2010
@@ -0,0 +1,206 @@
+/*
+ * 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;
+       }
+}
\ No newline at end of file

Propchange: 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientConnectionFactory.java
------------------------------------------------------------------------------
    svn:executable = *

Added: 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java?rev=1049486&view=auto
==============================================================================
--- 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java
 (added)
+++ 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java
 Wed Dec 15 10:47:27 2010
@@ -0,0 +1,98 @@
+/*
+ * 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 java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Semaphore;
+
+import org.apache.axis2.context.MessageContext;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.jivesoftware.smack.PacketListener;
+import org.jivesoftware.smack.packet.Message;
+import org.jivesoftware.smack.packet.Packet;
+
+public class XMPPClientResponseManager implements PacketListener {
+       private static Log log = 
LogFactory.getLog(XMPPClientResponseManager.class);
+       
+       private ConcurrentHashMap<String, WaitingDetails> 
prespectiveResponseMap = new ConcurrentHashMap<String, WaitingDetails>();
+       
+
+       public XMPPClientResponseManager(){
+       }
+
+       
+       public void listenForResponse(String key, MessageContext 
messageContext){
+           prespectiveResponseMap.put(key, new WaitingDetails(messageContext));
+       }
+
+
+    /**
+        * This method will be triggered, when a message is arrived at client 
side
+        */
+       public void processPacket(Packet packet) {              
+               Message message = (Message)packet;
+               String xml = StringEscapeUtils.unescapeXml(message.getBody());
+               log.debug("Client received message : "+message.toXML());
+               InputStream inputStream = new 
ByteArrayInputStream(xml.getBytes());
+               
+               String sequenceNumber = 
(String)message.getProperty(XMPPConstants.SEQUENCE_ID);
+               if(sequenceNumber != null){
+                   WaitingDetails waitingDetails = 
prespectiveResponseMap.remove(sequenceNumber);
+                   if(waitingDetails != null){
+                       
waitingDetails.messageContext.setProperty(MessageContext.TRANSPORT_IN, 
inputStream);
+                       waitingDetails.wait.release();
+                   }else{
+                       log.error("No one waiting for message "+ xml);
+                   }
+               }else{
+                   log.error(XMPPConstants.SEQUENCE_ID + " not found in the 
message");
+               }
+       }
+
+       /**
+        * Indicates response message is received at client side.
+        * @see processPacket(Packet packet)
+        * @return
+        * @throws InterruptedException 
+        */
+       public void waitFor(String key) throws InterruptedException{
+               WaitingDetails waitingDetails = prespectiveResponseMap.get(key);
+               if(waitingDetails == null){
+                   //this mean response has arrvied before wait
+                   return;
+               }
+        waitingDetails.wait.acquire();
+       }
+       
+       public class WaitingDetails{
+           Semaphore wait = new Semaphore(0);
+           MessageContext messageContext;
+        public WaitingDetails(MessageContext messageContext) {
+            super();
+            this.messageContext = messageContext;
+        }
+           
+       }
+
+}

Propchange: 
axis/axis2/java/transports/trunk/modules/xmpp/src/org/apache/axis2/transport/xmpp/util/XMPPClientResponseManager.java
------------------------------------------------------------------------------
    svn:executable = *


Reply via email to