Sunday, September 27, 2015

Hadoop Installation


This post covers Hadoop 1.2.1 and Hadoop 2.2.1 installation After downloading the tar ball tar xzf hadoop.tar.gz apply the following changes

HADOOP 1.2.1

On Master

conf/core-site.xml

<configuration> <property> <name>hadoop.tmp.dir</name> <value>/app/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master:59310</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description> </property> </configuration>

conf/mapred-site.xml

<configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://master:59311</value> <description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task. </description> </property> </configuration>

conf/hdfs-site.xml

<configuration> <property> <name>dfs.replication</name> <value>2</value> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time. </description> </property> </configuration>

hadoop-env.sh

Add this: export JAVA_HOME=/usr/lib/jvm/java-1.6.0

conf/masters

add: master

conf/slaves

master slave

On SLAVE

conf/core-site.xml

<configuration> <property> <name>hadoop.tmp.dir</name> <value>/app/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.default.name</name> <value>hdfs://master:59310</value> <description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation. The uri's scheme determines the config property (fs.SCHEME.impl) naming the FileSystem implementation class. The uri's authority is used to determine the host, port, etc. for a filesystem.</description> </property> </configuration>

conf/hadoop-env.sh

Add export JAVA_HOME=/usr/java/jdk1.6.0_23

conf/mapred-site.xml

<configuration> <property> <name>mapred.job.tracker</name> <value>master:59311</value> <description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task. </description> </property> </configuration>

conf/hdfs-site.xml

<configuration> <property> <name>dfs.replication</name> <value>2</value> <description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time. </description> </property> </configuration>

on master jps (with hbase running)

30338 NameNode 30613 SecondaryNameNode 14416 HRegionServer 30856 TaskTracker 14119 HQuorumPeer 30467 DataNode 11112 Jps 30715 JobTracker 10542 RunJar 14248 HMaster

on slave jps

[hduser@tomcattest conf]$ /usr/java/jdk1.6.0_23/bin/jps 28709 Jps 15090 DataNode 15198 TaskTracker

Some helpful Scripts

myprestart.sh

rm -rf $HADOOP_HOME/hdfs rm $HADOO_HOME/logs/* $HADOOP_PREFIX/bin/hdfs namenode -format

mystartall.sh

$HADOOP_PREFIX/sbin/hadoop-daemon.sh start namenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh start datanode $HADOOP_PREFIX/sbin/yarn-daemon.sh start resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh start nodemanager

mystartdfs.sh(note Yarn is introduced in hadoop-2)

#rm -rf $HADOOP_PREFIX/hdfs #$HADOOP_PREFIX/bin/hdfs namenode -format $HADOOP_PREFIX/sbin/start-dfs.sh $HADOOP_PREFIX/bin/hdfs dfs -mkdir -p /user/hduser $HADOOP_PREFIX/sbin/yarn-daemon.sh start resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh start nodemanager

mystopall.sh

$HADOOP_PREFIX/sbin/hadoop-daemon.sh stop namenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop secondarynamenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop datanode $HADOOP_PREFIX/sbin/yarn-daemon.sh stop resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh stop nodemanager $HADOOP_PREFIX/sbin/stop-dfs.sh

mystopdfs.sh

$HADOOP_PREFIX/sbin/stop-dfs.sh $HADOOP_PREFIX/sbin/yarn-daemon.sh stop resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh stop nodemanager

the following scripts are used on SLAVE

myprestart.sh

rm -rf hdfs rm logs/* $HADOOP_PREFIX/bin/hdfs namenode -format

mystartdfs.sh

#rm -rf hdfs #$HADOOP_PREFIX/bin/hdfs namenode -format #./myprestart.sh $HADOOP_PREFIX/sbin/yarn-daemon.sh start resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh start nodemanager

mystopdfs.sh

$HADOOP_PREFIX/sbin/yarn-daemon.sh stop resourcemanager $HADOOP_PREFIX/sbin/yarn-daemon.sh stop nodemanager

Hadoop 2.2.1

MASTER: $HADOOP_HOME/etc/hadoop/slaves

master slave

MASTER: $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master/</value> <description>NameNode URI</description> </property> </configuration>

MASTER: $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed 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. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/local/hadoop-2.2.0/hdfs/datanode</value> <description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/local/hadoop-2.2.0/hdfs/namenode</value> <description>Path on the local filesystem where the NameNode stores the namespace and transaction logs persistently.</description> </property> </configuration>

MASTER: $HADOOP_HOME/etc/hadoop/mapred-site.xml

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed 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. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>1024</value> </property> <property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Xmx768m</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>Execution framework.</description> </property> <property> <name>mapreduce.map.cpu.vcores</name> <value>1</value> <description>The number of virtual cores required for each map task.</description> </property> <property> <name>mapreduce.reduce.cpu.vcores</name> <value>1</value> <description>The number of virtual cores required for each map task.</description> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> <description>Larger resource limit for maps.</description> </property> <property> <name>mapreduce.map.java.opts</name> <value>-Xmx768m</value> <description>Heap-size for child jvms of maps.</description> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>1024</value> <description>Larger resource limit for reduces.</description> </property> <property> <name>mapreduce.reduce.java.opts</name> <property> <name>mapreduce.reduce.java.opts</name> <value>-Xmx768m</value> <description>Heap-size for child jvms of reduces.</description> </property> <property> <name>mapreduce.jobtracker.address</name> <value>master:8021</value> </property> </configuration>

SLAVE:mapred-site.xml

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licensed 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. See accompanying LICENSE file. --> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>1024</value> </property> <property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Xmx768m</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> <description>Execution framework.</description> </property> <property> <name>mapreduce.map.cpu.vcores</name> <value>1</value> <description>The number of virtual cores required for each map task.</description> </property> <property> <name>mapreduce.reduce.cpu.vcores</name> <value>1</value> <description>The number of virtual cores required for each map task.</description> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> <description>Larger resource limit for maps.</description> </property> <property> <name>mapreduce.map.java.opts</name> <value>-Xmx768m</value> <description>Heap-size for child jvms of maps.</description> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>1024</value> <description>Larger resource limit for reduces.</description> </property> <property> <name>mapreduce.reduce.java.opts</name> <value>-Xmx768m</value> <description>Heap-size for child jvms of reduces.</description> </property> <property> <name>mapreduce.jobtracker.address</name> <value>master:8021</value> </property> </configuration>

SLAVE: $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/local/hadoop-2.2.0/hdfs/datanode</value> <description>Comma separated list of paths on the local filesystem of a DataNode where it should store its blocks.</description> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/local/hadoop-2.2.0/hdfs/namenode</value> <description>Path on the local filesystem where the NameNode stores the namespace and transaction logs persistently.</description> </property> </configuration>

Monday, January 19, 2015

Some useful links

Spring Tutorial http://www.javabeat.net/spring-tutorials/ Struts2 http://www.tutorialspoint.com/struts_2/struts_quick_guide.htm Dinesh on Java http://www.dineshonjava.com J2EE Patterns http://www.corej2eepatterns.com/ServiceActivator.htm Hadoop for Windows http://www.codeproject.com/Articles/757934/Apache-Hadoop-for-Windows-Platform (Beware: the downloads in this link don't work)

hacks

Hacks

linux
------

sudo /usr/sbin/tcpdump -nni any port 5060 -s0 -A

netstat -apnt


Asterisk CLI:
sudo /usr/sbin/asterisk -vvvgc
module reload chan_sip.so

core set verbose 3

dialplan reload

queue show

core show help

module show like cdr

cdr show status

sip show users

Asterix links
-------------

#asterisk queues

http://www.orderlyq.com/asteriskqueues.html

#beginners tutorial

http://apricot.net/apricot2006/slides/tutorial/tuesday/Jonny_Martin-Asterisk.pdf

#FastAGI
http://www.asterisk-java.org/development/tutorial.html

http://www.jcgonzalez.com/asterisk-handle-calls-with-java-example


SIPp links
----------

http://sipp.sourceforge.net/doc/reference.pdf

Android

See https://blog-emildesign.rhcloud.com/?p=435
on how to set up the Android maps project


jar signer

C:\Program Files (x86)\Java\jdk1.6.0_17\bin>jarsigner 
-verbose -sigalg SHA1withRSA -digestalg SHA1 
-keystore my-release-key.keystore 
c:\users\dgandikota\Desktop\Peble.apk alias_name


Adb installation

C:\eclipseworkspace\Peble\bin>"c:\Program Files 
(x86)\Android\android-sdk\platfo
rm-tools\adb.exe" install -r c:\users\dgandikota\desktop\Peble.apk

To fire up emulator

C:\eclipseworkspace\Peble\bin>"c:\Program Files (x86)\Android\android-sdk\platfo
rm-tools\adb.exe" shell
root@android:/ # input keyevent 82

Ftp with Android

FTP on Android

package com.example.peble;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.SocketException;
import java.net.UnknownHostException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class FtpActivity extends Activity {
    static Uri currImageURI;
    static TextView tv;
     public void upload( String ftpServer, String user, String password,
             String fileName, String source, String port ) throws MalformedURLException,
             IOException
       {
         Toast.makeText(getApplicationContext(),
                    "pinging",
                    Toast.LENGTH_LONG).show();
         int count = 0;
            String str = "";
            try {
                Process process = Runtime.getRuntime().exec(
                        "/system/bin/ping -c 8 " + ftpServer);
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        process.getInputStream()));
                int i;
                char[] buffer = new char[4096];
                StringBuffer output = new StringBuffer();
                while ((i = reader.read(buffer)) > 0)
                    output.append(buffer, 0, i);
                reader.close();

                // body.append(output.toString()+"\n");
                str = output.toString();
                Toast.makeText(getApplicationContext(),
                        str,
                        Toast.LENGTH_LONG).show();
                // Log.d(TAG, str);
            } catch (IOException e) {
                Toast.makeText(getApplicationContext(),
                        "exception in pingsystem",
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(),
                        "error in pingsystem",
                        Toast.LENGTH_LONG).show();
            }
            Toast.makeText(getApplicationContext(),
                    "trying inet",
                    Toast.LENGTH_LONG).show();
             InetAddress in;
            in = null;
            // Definimos la ip de la cual haremos el ping
            try {
                in = InetAddress.getByName(ftpServer);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                Toast.makeText(getApplicationContext(),
                        "unknown host " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            }    catch (Exception e) {
                Toast.makeText(getApplicationContext(),
                        "exception error unknown host " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            }
            // Definimos un tiempo en el cual ha de responder
            try {
                if (in.isReachable(5000)) {
                    Toast.makeText(getApplicationContext(),
                            "is reachable",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(),
                            "no response",
                            Toast.LENGTH_LONG).show();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Toast.makeText(getApplicationContext(),
                        "exception " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(),
                        "exception error is reachable" + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            }

         Toast.makeText(getApplicationContext(),
                    "uploading",
                    Toast.LENGTH_LONG).show();
          if (ftpServer != null)
          {

             BufferedInputStream bis = null;
             BufferedOutputStream bos = null;
             try
             {
                 FTPClient fc= new FTPClient();
                 Toast.makeText(getApplicationContext(),
                         "uploading2 " + fc.toString() + ";"+ ftpServer + ":"+port + "inet address:" + InetAddress.getByName(ftpServer),
                         Toast.LENGTH_LONG).show();
//                 fc.connect(InetAddress.getByName(ftpServer));
                 fc.connect(InetAddress.getByName(ftpServer), Integer.parseInt(port));
//                 fc.connect("ftp://test:test@10.0.85.120:2121;type=i", 2121);
                 Toast.makeText(getApplicationContext(),
                         "uploading3",
                         Toast.LENGTH_LONG).show();
                 fc.login(user, password);
                 Toast.makeText(getApplicationContext(),
                         "uploading4",
                         Toast.LENGTH_LONG).show();
                 //fc.setFileType(FTP.BINARY_FILE_TYPE);
                 Toast.makeText(getApplicationContext(),
                         "uploading5",
                         Toast.LENGTH_LONG).show();
                 bis = new BufferedInputStream( new FileInputStream(
                         source) );
                 Toast.makeText(getApplicationContext(),
                         "uploading6",
                         Toast.LENGTH_LONG).show();
                 fc.storeFile(fileName, bis);
                 bis.close();
             }  catch (UnknownHostException e) {
                 Toast.makeText(getApplicationContext(),
                            "unknown host" + e.getMessage(),
                            Toast.LENGTH_LONG).show();
             }
                 catch (SocketException e) {
                 Toast.makeText(getApplicationContext(),
                            "socket exception" + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                } catch (IOException e) {
                    Toast.makeText(getApplicationContext(),
                            "ioexception" + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }
                 catch (Exception e) {
                 Toast.makeText(getApplicationContext(),
                            "error here" + e.getMessage(),
                            Toast.LENGTH_LONG).show();
             }
             finally
             {
                if (bis != null)
                   try
                   {
                      bis.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
                if (bos != null)
                   try
                   {
                      bos.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
             }
          }
          else
          {
              Toast.makeText(getApplicationContext(),
                        "error here2" ,
                        Toast.LENGTH_LONG).show();
          }
       }

       /**
        * Download a file from a FTP server. A FTP URL is generated with the
        * following syntax:
        * ftp://user:password@host:port/filePath;type=i.
        *
        * @param ftpServer , FTP server address (optional port ':portNumber').
        * @param user , Optional user name to login.
        * @param password , Optional password for user.
        * @param fileName , Name of file to download (with optional preceeding
        *            relative path, e.g. one/two/three.txt).
        * @param destination , Destination file to save.
        * @throws MalformedURLException, IOException on error.
        */
       public void download( String ftpServer, String user, String password,
             String fileName, String destination, String port ) throws MalformedURLException,
             IOException
       {
          if (ftpServer != null  && fileName != null  && destination != null)
          {
             BufferedInputStream bis = null;
             BufferedOutputStream bos = null;
             try
             {
                FTPClient fc= new FTPClient();
//                fc.connect(ftpServer, Integer.parseInt(port));
//                fc.login(user, password);
//                fc.setFileType(FTP.BINARY_FILE_TYPE);
                bos = new BufferedOutputStream( new FileOutputStream(
                        destination) );
//                fc.retrieveFile(fileName, bos);
                bos.close();
//                fc.deleteFile(fileName);
             }
             finally
             {
                if (bis != null)
                   try
                   {
                      bis.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
                if (bos != null)
                   try
                   {
                      bos.close();
                   }
                   catch (IOException ioe)
                   {
                      ioe.printStackTrace();
                   }
             }
          }
          else
          {
             System.out.println( "Input not available" );
          }
       }
       
       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_ftp);
       }
    // To handle when an image is selected from the browser, add the following to your Activity 
        @Override 
        public void onActivityResult(int requestCode, int resultCode, Intent data) { 
         
         if (resultCode == RESULT_OK) { 
         
         if (requestCode == 1) { 
         
         // currImageURI is the global variable I’m using to hold the content:// URI of the image 
             Toast.makeText(getApplicationContext(),
                        "got currimage" ,
                        Toast.LENGTH_LONG).show();
         currImageURI = data.getData();
         Toast.makeText(getApplicationContext(),
                    "go currimageuri=" + currImageURI ,
                    Toast.LENGTH_LONG).show();
         } 
         } 
        } 
         
        // And to convert the image URI to the direct file system path of the image file 
        public String getRealPathFromURI(Uri contentUri) { 
         
         // can post image 
         String [] proj={MediaStore.Images.Media.DATA}; 
         Cursor cursor = getContentResolver().query(contentUri,
         proj, // Which columns to return 
         null, // WHERE clause; which rows to return (all rows) 
         null, // WHERE clause selection arguments (none) 
         null); // Order-by clause (ascending by name) 
         int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
         cursor.moveToFirst(); 
         
         return cursor.getString(column_index); 
        } 
        /** Called when the user clicks the Select File button */
        public void selectFile(View view) throws Exception {
                Intent picIntent = new Intent();
                picIntent.setType("image/*");
                picIntent.setAction(Intent.ACTION_GET_CONTENT); 
                startActivityForResult(Intent.createChooser(picIntent, "Select Picture"),1); 
        }
        public void uploadFile(View view) throws Exception {
            if (currImageURI != null)
            Toast.makeText(getApplicationContext(),
                    "currImageURI=" + currImageURI.toString(),
                    Toast.LENGTH_LONG).show();
            Toast.makeText(getApplicationContext(),
                    "calling upload" ,
                    Toast.LENGTH_LONG).show();
//            upload("10.0.99.99", "test", "test", currImageURI.toString(), currImageURI.toString(), "2121" );
//            upload("206.82.244.11", "test", "test", currImageURI.toString(), currImageURI.toString(), "2121" );
//            upload("10.0.85.120", "test", "test", null, null, "2121" );
//            upload("213.202.225.203", "test", "test", null, null, "2121" );
            ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);  
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();        
            if (networkInfo != null && networkInfo.isConnected()) {
                Toast.makeText(getApplicationContext(),
                        "starting async task",
                        Toast.LENGTH_LONG).show();
                 tv = (TextView) findViewById(R.id.uploadFilename);
                if (tv != null) tv.setText("hello");
                new DownloadWebpageTask().execute("test");       
            } else {  
                Toast.makeText(getApplicationContext(),
                        "not network",
                        Toast.LENGTH_LONG).show();
            }
            
        }
        
        private class DownloadWebpageTask extends AsyncTask {       
            String result="";
            @Override     
            protected String doInBackground(String... urls) {                          
                // params comes from the execute() call: params[0] is the url.   
                InetAddress in;
                in = null;
                 result += "entered doinbackground";
                 // Definimos la ip de la cual haremos el ping
                try {
                    in = InetAddress.getByName("10.0.85.120");
                    result += ";in done";
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    result += ";not reachable5!" + e.getMessage();
                }    catch (Exception e) {
                    result += ";not reachable4!" + e.getMessage();
                }
                // Definimos un tiempo en el cual ha de responder
                try {
                    
                    if (in != null && in.isReachable(5000)) {
                        result += ";reachable!";
                    } else {
                        result +=";not reachable";
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    result += ";not reachable!" + e.getMessage();
                } catch (Exception e) {
                    result += ";not reachable2!" + e.getMessage();
                }  
                FTPClient fc= new FTPClient();
                try
                 {
                     fc.connect("10.0.85.120", 2121); 
                     result += fc.getReplyString();
                     int reply = fc.getReplyCode();

                     result += "reply=" + reply;
                   if(!FTPReply.isPositiveCompletion(reply)) {
                     fc.disconnect();
                     result += "invalid reply code";
                   }
                       fc.enterLocalPassiveMode();
                     result += "local passive mode;connect sucess";
                     boolean b=fc.login("test", "test");
                     if (!b) {
                         result += ";login failed";
                     } else
                     result += ";login success";
                     if (fc.isConnected()) {
                         result += "; is connected";
                         FTPFile [] fileList=fc.listFiles();
                         reply = fc.getReplyCode();
                         fc.enterLocalPassiveMode();
                          result += "local passive mode;connect sucess";
                          result += "reply2=" + reply;
                          if(!FTPReply.isPositiveCompletion(reply)) {
                              fc.disconnect();
                              result += "invalid reply code2";
                          }
                         for(FTPFile f : fileList) {
                             result += ";" + f.getName();
                         }
                     }
                     result += ";disconnect";
                     fc.disconnect();
                    result +=";connect success";
                 } catch (Exception e) {
                     result += ";not reachable3!" + e.getMessage() + ";reply=" + fc.getReplyCode();
                 }
                
                return result;
            }
            // onPostExecute displays the results of the AsyncTask.        
            @Override        
            protected void onPostExecute(String result) {   
                tv.setText(result);
            }    
    }
}

Android sending text message with attachment

package com.example.peble;

import java.io.FileOutputStream;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.app.NavUtils;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.maps.MapActivity;

public class DisplayMessageActivity extends MapActivity {
 String message="";
 LocationManager locationManager; //<2>  
 Uri currImageURI;
 String smsText="";
 @Override
 protected boolean isRouteDisplayed() {
  return false;
 }
 @Override
 protected void onStart() {
  super.onStart();
  message="";
 }
 @Override
 protected void onRestart() {
  super.onRestart();
  message="";
 }
 public void onRestoreInstanceState(Bundle savedInstanceState) {    
  // Always call the superclass so it can restore the view hierarchy    
  super.onRestoreInstanceState(savedInstanceState);       // Restore state members from saved instance   
 }
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  if (savedInstanceState != null) {
   message = savedInstanceState.getString("message");
  }
    // Get the message from the intent
     Intent intent = getIntent();
     if (message.trim().equals(""))
     message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
     Toast.makeText(getApplicationContext(),
    "message="+message ,
    Toast.LENGTH_LONG).show();
     String filename = "peble_contacts.txt";
     FileOutputStream outputStream;
     try {
      outputStream = openFileOutput(filename, Context.CONTEXT_IGNORE_SECURITY);
      outputStream.write(message.getBytes());
      outputStream.close();
     } catch (Exception e) {
      System.out.println("cannot read file");
     }
     smsText="Please help!";
     try {
      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
   Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
   
         if (location != null) {
             smsText += String.format(
                     "Current Location \n Longitude: %1$s \n Latitude: %2$s",
                     location.getLongitude(), location.getLatitude()
             );
         }
     } catch (Exception e) {
      Toast.makeText(getApplicationContext(),
     "Location faild, please try again later!",
     Toast.LENGTH_LONG).show();
     }
     try {
//   SmsManager smsManager = SmsManager.getDefault();
//   smsManager.sendTextMessage(message, null, smsText, null, null);
//   Intent sendIntent = new Intent(Intent.ACTION_SEND); 
//      Intent sendIntent = new Intent(Intent.ACTION_VIEW);
      
   //sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
//      sendIntent.setType("vnd.android-dir/mms-sms");
//   sendIntent.putExtra("address", message);
//   sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///users/public/pictures/sample pictures/chrysanthemum.jpg"));
//      Runnable myRunnable = new Thread(new Runnable() { public void run() {
//       Intent picIntent = new Intent();
//    picIntent.setType("image/*");
//    picIntent.setAction(Intent.ACTION_GET_CONTENT); 
//    startActivityForResult(Intent.createChooser(picIntent, "Select Picture"),1); 
//     this.notify();
//    }});
//      synchronized(myRunnable) {
//       runOnUiThread(myRunnable);
//       myRunnable.wait();
//      }
////   new Thread(new Runnable() { public void run() {
//    Uri uri = Uri.parse("smsto:" + message);
//       Intent sendIntent = new Intent(Intent.ACTION_SENDTO, uri);
//    sendIntent.putExtra(Intent.EXTRA_STREAM, currImageURI);
//    sendIntent.putExtra("sms_body", smsText); 
//    startActivity(sendIntent);
////   }}).start();
//   Toast.makeText(getApplicationContext(), smsText + " Sent!",
//      Toast.LENGTH_LONG).show();
   //sending audio or video
   /*
    * Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("address", "1213123123");
sendIntent.putExtra("sms_body", "if you are sending text");   
final File file1 = new File(mFileName);
if(file1.exists()){
  System.out.println("file is exist");
}
Uri uri = Uri.fromFile(file1);
sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
sendIntent.setType("video/*");
startActivity(sendIntent);
    */
    } catch (Exception e) {
   Toast.makeText(getApplicationContext(),
    "SMS faild, please try again later!" + e.getMessage(),
    Toast.LENGTH_LONG).show();
   e.printStackTrace();
    }
     // Create the text view
     TextView textView = new TextView(this);
     textView.setTextSize(40);
     textView.setText(message + " will be sent your help Message: " + smsText);
     // Set the text view as the activity layout
//     setContentView(textView);
     setContentView(R.layout.activity_display_message);
 }

 /**
  * Set up the {@link android.app.ActionBar}, if the API is available.
  */
 @TargetApi(Build.VERSION_CODES.HONEYCOMB)
 private void setupActionBar() {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   getActionBar().setDisplayHomeAsUpEnabled(true);
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.display_message, menu);
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case android.R.id.home:
   // This ID represents the Home or Up button. In the case of this
   // activity, the Up button is shown. Use NavUtils to allow users
   // to navigate up one level in the application structure. For
   // more details, see the Navigation pattern on Android Design:
   //
   // http://developer.android.com/design/patterns/navigation.html#up-vs-back
   //
   NavUtils.navigateUpFromSameTask(this);
   return true;
  }
  return super.onOptionsItemSelected(item);
 }
 // To handle when an image is selected from the browser, add the following to your Activity 
 @Override 
 public void onActivityResult(int requestCode, int resultCode, Intent data) { 
  
  if (resultCode == RESULT_OK) { 
  
  if (requestCode == 1) { 
  
  // currImageURI is the global variable I’m using to hold the content:// URI of the image 
  currImageURI = data.getData(); 
  } 
  } 
 } 
  
 // And to convert the image URI to the direct file system path of the image file 
 public String getRealPathFromURI(Uri contentUri) { 
  
  // can post image 
  String [] proj={MediaStore.Images.Media.DATA}; 
  Cursor cursor = managedQuery( contentUri, 
  proj, // Which columns to return 
  null, // WHERE clause; which rows to return (all rows) 
  null, // WHERE clause selection arguments (none) 
  null); // Order-by clause (ascending by name) 
  int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
  cursor.moveToFirst(); 
  
  return cursor.getString(column_index); 
 } 
 /** Called when the user clicks the Send button */
 public void attachImage(View view) {
     // Do something in response to button
  Intent picIntent = new Intent();
  picIntent.setType("image/*");
  picIntent.setAction(Intent.ACTION_GET_CONTENT); 
  startActivityForResult(Intent.createChooser(picIntent, "Select Picture"),1); 
 }
 public void sendText(View view) {
  Intent intent = getIntent();
     message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
  Toast.makeText(getApplicationContext(),
    "phonenm=" + message ,
    Toast.LENGTH_LONG).show();
  Uri uri = Uri.parse("smsto:" + message);
     Intent sendIntent = new Intent(Intent.ACTION_SENDTO, uri);
//     sendIntent.setType("vnd.android-dir/mms-sms");
  sendIntent.putExtra("sms_body", smsText);
  sendIntent.putExtra("address", message);
  sendIntent.setData(Uri.parse("smsto:" + message)); 
  if (currImageURI != null)
  sendIntent.putExtra(Intent.EXTRA_STREAM, currImageURI);
  startActivity(sendIntent);
  Toast.makeText(getApplicationContext(),
    "SMS success" ,
    Toast.LENGTH_LONG).show();
 }
}


Freeswitch mod_java with Launcher

To dynamically load classes in Freeswitch use this Laucher:
/*
 * Launcher.java
 *
 * Created on 13 September 2007, 06:40
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.freeswitch;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 *
 * @author dacha
 */
public class Launcher
{
    static
    {
        // Find and load mod_java
        String javaLibraryPaths = System.getProperty("java.library.path");
        String pathSeparator = System.getProperty("path.separator");
        String libraryPaths[] = javaLibraryPaths.split(pathSeparator);
        
        String libraryName = System.mapLibraryName("mod_java");
        int modJavaIndex = libraryName.indexOf("mod_java");
        if (modJavaIndex >= 0)
            libraryName = libraryName.substring(modJavaIndex);
        
        for (String libraryPath : libraryPaths)
        {
            String fullLibraryPath = libraryPath + File.separatorChar + libraryName;
            if (new File(fullLibraryPath).exists())
            {
                System.load(fullLibraryPath);
                break;
            }
        }
    }

    public static void launch(String sessionUuid, String args) throws Exception
    {
        String argv[] = args.split("[ ]");
        if (argv.length == 0)
        {
            System.out.println("Too few arguments to mod java");
            System.out.println("Usage: java /path/to/file.jar fully.qualified.class arg1 arg2 arg3");
            System.out.println("Usage: java fully.qualified.class arg1 arg2 arg3");
            return;
        }
        
        Class klazz=null;

        int argsOffset;
 System.out.println("argv[0]=" + argv[0]);
        if (argv[0].endsWith(".jar") || argv[0].endsWith(".JAR"))
        {
  System.out.println("in jar");
            if (argv.length < 2)
                throw new Exception("Too few arguments: must specify fully qualified class name when loading from JAR file");
     MyClassLoaderFromJar mycjar = new MyClassLoaderFromJar(argv[0]);
     klazz=mycjar.findClass(argv[1]);
            argsOffset = argv[0].length() + argv[1].length() + 2;
        }
        else
        {
          

            //klazz = Class.forName(argv[0]);
          try{
                 ClassLoader parentClassLoader = MyClassLoader.class.getClassLoader();
                 MyClassLoader classLoader = new MyClassLoader(parentClassLoader);
                
                 klazz = classLoader.loadClass(argv[0]);
                 
                
          } catch (Exception e) {
                 System.out.println("notice cannot load class!!!" + e.getMessage());
         }

            argsOffset = argv[0].length() + 1;
        }
        
        Constructor constructor = klazz.getConstructor();
        Object object = constructor.newInstance();
        Method run = klazz.getMethod("run", String.class, String.class);
        String newArgs = "";
        if (argsOffset < args.length())
            newArgs = args.substring(argsOffset);
        run.invoke(object, sessionUuid, newArgs);
    }
}

MyClassLoader class is a helper class that goes into mod_java/src/org/freeswitch along with Launcher

 package org.freeswitch;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;

class MyClassLoader extends ClassLoader{

        public MyClassLoader(ClassLoader parent) {
            super(parent);
        }

        public Class loadClass(String name) throws ClassNotFoundException {
            System.setSecurityManager(null);

            try {
                System.out.println("in load class");
                String url = "file:/usr/local/freeswitch/scripts/" + name + ".class";
                URL myUrl = new URL(url);
                URLConnection connection = myUrl.openConnection();
                InputStream input = connection.getInputStream();
                ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                int data = input.read();

                while(data != -1){
                    buffer.write(data);
                    data = input.read();
                }

                input.close();

                byte[] classData = buffer.toByteArray();

                Class cl = defineClass(name,
                        classData, 0, classData.length);
                System.out.println("class defined!!!!!!!!!!");
                return cl;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }

MyClassLoaderFromJar is another helper class to load classes from Jar

 package org.freeswitch;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.util.zip.*;
public final class MyClassLoaderFromJar extends ClassLoader {
    private final ZipFile file;

    public MyClassLoaderFromJar(String filename) throws IOException {
        this.file = new ZipFile(filename);
    }

    @Override
    protected Class findClass(String name) throws ClassNotFoundException {
 System.out.println("in find class");
        ZipEntry entry = this.file.getEntry(name.replace('.', '/') + ".class");
        if (entry == null) {
            throw new ClassNotFoundException(name);
        }
 System.out.println("entry=" + entry);
        try {
            byte[] array = new byte[1024];
            InputStream in = this.file.getInputStream(entry);
            ByteArrayOutputStream out = new ByteArrayOutputStream(array.length);
            int length = in.read(array);
            while (length > 0) {
                out.write(array, 0, length);
                length = in.read(array);
            }
     System.out.println("returning class define");
            return defineClass(name, out.toByteArray(), 0, out.size());
        }
        catch (IOException exception) {
            throw new ClassNotFoundException(name, exception);
        }
    }
}

Put these files mod_java/src/org/freeswitch and do "make mod_java-install". The resulting mod_java.so is copied to /usr/local/freeswitch/mod. Note java.conf.xml sets the classpath for all the jars.


Scroller using Jquery



function scaleImage3(imageSrc, imageId, requiredWidth, requiredHeight) {
    // Create new off screen image to test
    var theImage = new Image();
    theImage.src = imageSrc;
    // Get accurate measurements from that.
    var width = theImage.width;
    var height = theImage.height;
    if ((width > 0) &&
        (height > 0)) {
     var horizontalMultiplier = requiredWidth / width;
     var verticalMultiplier = requiredHeight / height;
     var smallestMultiplier = Math.min(verticalMultiplier, horizontalMultiplier);

     // Get scaled sizes
     width *= smallestMultiplier;
     height *= smallestMultiplier;

     // Apply sizes to image
     $('#'+imageId).attr('width', width );
     $('#'+imageId).attr('height', height );
     $('#'+imageId).attr('src', imageSrc );
     $('#'+imageId).attr('style', {display :"inline"});
     var image_height=height;
     var arr = imageId.split("_");
     
     var accountId = arr[1];
     var originalListItemId = "listItem_" + accountId;
     var divHt=$("#scrollerDiv").css('height');
     divHt = divHt.replace('px', '');
     var top_margin = (divHt - image_height)/2;  
        //and change the margin-top css attribute to center the image
     if (imageId.indexOf("_clean") > -1) {
      var counter = arr[2];
         $("#listItem_" + accountId + "_" + counter + "_clean").css( 'margin-top' , top_margin);
     } else if (imageId.indexOf("_clone") > -1) {
      $("#listItem_" + accountId + "_clone").css( 'margin-top' , top_margin);
     } else {
      $("#listItem_" + accountId).css( 'margin-top' , top_margin);
     }
    }
}

/*
 * simplyScroll 2 - a scroll-tastic jQuery plugin
 *
 * http://logicbox.net/jquery/simplyscroll/
 *
 * Copyright (c) 2009-2012 Will Kelly - http://logicbox.net
 *
 * Dual licensed under the MIT and GPL licenses.
 *
 * Version: 2.0.5 Last revised: 10/05/2012
 *
 */
 
(function($,window,undefined) {

$.fn.simplyScroll = function(options) {
 return this.each(function() {
  new $.simplyScroll(this,options);
 });
};

var defaults = {
 customClass: 'simply-scroll',
 frameRate: 24, //No of movements per second
 speed: 1, //No of pixels per frame
 orientation: 'horizontal', //'horizontal or 'vertical' - not to be confused with device orientation
 auto: true,
 autoMode: 'loop', //auto = true, 'loop' or 'bounce',
 manualMode: 'end', //auto = false, 'loop' or 'end'
 direction: 'forwards', //'forwards' or 'backwards'.
 pauseOnHover: true, //autoMode = loop|bounce only
 pauseOnTouch: true, //" touch device only
 pauseButton: false, //" generates an extra element to allow manual pausing 
 startOnLoad: false, //use this to delay starting of plugin until all page assets have loaded
 //customization
 maxWidth: 650//customization: use this to set the width of the container for horizontal scrolling
};
 
$.simplyScroll = function(el,options) {
 
 var self = this;
 
 this.o = $.extend({}, defaults, options || {});
 this.isAuto = this.o.auto!==false && this.o.autoMode.match(/^loop|bounce$/)!==null;
 this.isHorizontal = this.o.orientation.match(/^horizontal|vertical$/)!==null && this.o.orientation==defaults.orientation; 
 this.isRTL = this.isHorizontal && $("html").attr('dir') == 'rtl';
 this.isForwards = !this.isAuto  || (this.isAuto && this.o.direction.match(/^forwards|backwards$/)!==null && this.o.direction==defaults.direction) && !this.isRTL;
 this.isLoop = this.isAuto && this.o.autoMode == 'loop' || !this.isAuto && this.o.manualMode == 'loop';
 // customization
 this.maxWidth = defaults.maxWidth || 650;
 this.supportsTouch = ('createTouch' in document);
 
 this.events = this.supportsTouch ? 
  {start:'touchstart MozTouchDown',move:'touchmove MozTouchMove',end:'touchend touchcancel MozTouchRelease'} : 
  {start:'mouseenter',end:'mouseleave'};
 
 this.$list = $(el); //called on ul/ol/div etc
 var $items = this.$list.children();
 
 //generate extra markup
 this.$list.addClass('simply-scroll-list')
  .wrap('
') .parent().wrap('
'); if (!this.isAuto) { //button placeholders this.$list.parent().parent() .prepend('
') .prepend('
'); } else { if (this.o.pauseButton) { this.$list.parent().parent() .prepend('
'); this.o.pauseOnHover = false; } } //wrap an extra div around the whole lot if elements scrolled aren't equal if ($items.length > 1) { var extra_wrap = false, total = 0; if (this.isHorizontal) { $items.each(function() { total+=$(this).outerWidth(true); }); extra_wrap = $items.eq(0).outerWidth(true) * $items.length !== total; } else { $items.each(function() { total+=$(this).outerHeight(true); }); extra_wrap = $items.eq(0).outerHeight(true) * $items.length !== total; } if (extra_wrap) { this.$list = this.$list.wrap('
').parent().addClass('simply-scroll-list'); if (this.isHorizontal) { this.$list.children().css({"float":'left',width: total + 'px'}); } else { this.$list.children().css({height: total + 'px'}); } } } if (!this.o.startOnLoad) { this.init(); } else { //wait for load before completing setup $(window).load(function() { self.init(); }); } }; $.simplyScroll.fn = $.simplyScroll.prototype = {}; $.simplyScroll.fn.extend = $.simplyScroll.extend = $.extend; $.simplyScroll.fn.extend({ init: function() { this.$items = this.$list.children(); this.$clip = this.$list.parent(); //this is the element that scrolls this.$container = this.$clip.parent(); this.$btnBack = $('.simply-scroll-back',this.$container); this.$btnForward = $('.simply-scroll-forward',this.$container); if (!this.isHorizontal) { this.itemMax = this.$items.eq(0).outerHeight(true); this.clipMax = this.$clip.height(); this.dimension = 'height'; this.moveBackClass = 'simply-scroll-btn-up'; this.moveForwardClass = 'simply-scroll-btn-down'; this.scrollPos = 'Top'; } else { this.itemMax = this.$items.eq(0).outerWidth(true); this.clipMax = this.$clip.width(); // customization var numClips = Math.round(this.maxWidth/this.clipMax); this.clipMax = numClips * this.clipMax; //if (this.clipMax > this.maxWidth) { //this.maxWidth = this.clipMax; //} this.dimension = 'width'; this.moveBackClass = 'simply-scroll-btn-left'; this.moveForwardClass = 'simply-scroll-btn-right'; this.scrollPos = 'Left'; } this.posMin = 0; this.posMax = this.$items.length * this.itemMax; var addItems = Math.ceil(this.clipMax / this.itemMax); //auto scroll loop & manual scroll bounce or end(to-end) if (this.isAuto && this.o.autoMode=='loop') { this.$list.css(this.dimension,this.posMax+(this.itemMax*addItems) +'px'); this.posMax += (this.clipMax - this.o.speed); if (this.isForwards) { this.resetPosition = 0; //customization //this.$items.slice(0,addItems).clone(false).appendTo(this.$list); var counter=1; var itemsToFix=this.$items.slice(0,addItems).clone(true); counter=1; //assign ids to img elements for the scroller to work in IE9 $(itemsToFix).find('img').attr('id', function(idx, oldId){ var arr = oldId.split("_");var accountId=arr[1]; return "img_" + accountId + "_" + counter++ + "_clean";}); counter =1; //assign ids to li elements for the scroller to work in IE9 $(itemsToFix).each(function() { $(this).attr('id', function(idx, oldId){ var arr = oldId.split("_");var accountId=arr[1]; return "listItem_" + accountId + "_" + counter++ + "_clean";}); }); $(itemsToFix).appendTo(this.$list); this.$list.find("img").each(function() { scaleImage3($(this).attr('src'), $(this).attr('id'), 80, 80); }); } else { this.$items.slice(-addItems).clone(true).prependTo(this.$list); this.resetPosition = this.$items.length * this.itemMax; //due to inconsistent RTL implementation force back to LTR then fake if (this.isRTL) { this.$clip[0].dir = 'ltr'; //based on feedback seems a good idea to force float right this.$items.css('float','right'); } } //manual and loop } else if (!this.isAuto && this.o.manualMode=='loop') { this.posMax += this.itemMax * addItems; this.$list.css(this.dimension,this.posMax+(this.itemMax*addItems) +'px'); this.posMax += (this.clipMax - this.o.speed); var items_append = this.$items.slice(0,addItems).clone(true).appendTo(this.$list); var items_prepend = this.$items.slice(-addItems).clone(true).prependTo(this.$list); this.resetPositionForwards = this.resetPosition = addItems * this.itemMax; this.resetPositionBackwards = this.$items.length * this.itemMax; //extra events to force scroll direction change var self = this; this.$btnBack.bind(this.events.start,function() { self.isForwards = false; self.resetPosition = self.resetPositionBackwards; }); this.$btnForward.bind(this.events.start,function() { self.isForwards = true; self.resetPosition = self.resetPositionForwards; }); } else { //(!this.isAuto && this.o.manualMode=='end') this.$list.css(this.dimension,this.posMax +'px'); if (this.isForwards) { this.resetPosition = 0; } else { this.resetPosition = this.$items.length * this.itemMax; //due to inconsistent RTL implementation force back to LTR then fake if (this.isRTL) { this.$clip[0].dir = 'ltr'; //based on feedback seems a good idea to force float right this.$items.css('float','right'); } } } this.resetPos() //ensure scroll position is reset this.interval = null; this.intervalDelay = Math.floor(1000 / this.o.frameRate); if (!(!this.isAuto && this.o.manualMode=='end')) { //loop mode //ensure that speed is divisible by item width. Helps to always make images even not odd widths! while (this.itemMax % this.o.speed !== 0) { this.o.speed--; if (this.o.speed===0) { this.o.speed=1; break; } } } var self = this; this.trigger = null; this.funcMoveBack = function(e) { if (e !== undefined) { e.preventDefault(); } self.trigger = !self.isAuto && self.o.manualMode=='end' ? this : null; if (self.isAuto) { self.isForwards ? self.moveBack() : self.moveForward(); } else { self.moveBack(); } }; this.funcMoveForward = function(e) { if (e !== undefined) { e.preventDefault(); } self.trigger = !self.isAuto && self.o.manualMode=='end' ? this : null; if (self.isAuto) { self.isForwards ? self.moveForward() : self.moveBack(); } else { self.moveForward(); } }; this.funcMovePause = function() { self.movePause(); }; this.funcMoveStop = function() { self.moveStop(); }; this.funcMoveResume = function() { self.moveResume(); }; if (this.isAuto) { this.paused = false; function togglePause() { if (self.paused===false) { self.paused=true; self.funcMovePause(); } else { self.paused=false; self.funcMoveResume(); } return self.paused; }; //disable pauseTouch when links are present if (this.supportsTouch && this.$items.find('a').length) { this.supportsTouch=false; } if (this.isAuto && this.o.pauseOnHover && !this.supportsTouch) { this.$clip.bind(this.events.start,this.funcMovePause).bind(this.events.end,this.funcMoveResume); } else if (this.isAuto && this.o.pauseOnTouch && !this.o.pauseButton && this.supportsTouch) { var touchStartPos, scrollStartPos; this.$clip.bind(this.events.start,function(e) { togglePause(); var touch = e.originalEvent.touches[0]; touchStartPos = self.isHorizontal ? touch.pageX : touch.pageY; scrollStartPos = self.$clip[0]['scroll' + self.scrollPos]; e.stopPropagation(); e.preventDefault(); }).bind(this.events.move,function(e) { e.stopPropagation(); e.preventDefault(); var touch = e.originalEvent.touches[0], endTouchPos = self.isHorizontal ? touch.pageX : touch.pageY, pos = (touchStartPos - endTouchPos) + scrollStartPos; if (pos < 0) pos = 0; else if (pos > self.posMax) pos = self.posMax; self.$clip[0]['scroll' + self.scrollPos] = pos; //force pause self.funcMovePause(); self.paused = true; }); } else { if (this.o.pauseButton) { this.$btnPause = $(".simply-scroll-btn-pause",this.$container) .bind('click',function(e) { e.preventDefault(); togglePause() ? $(this).addClass('active') : $(this).removeClass('active'); }); } } this.funcMoveForward(); } else { this.$btnBack .addClass('simply-scroll-btn' + ' ' + this.moveBackClass) .bind(this.events.start,this.funcMoveBack).bind(this.events.end,this.funcMoveStop); this.$btnForward .addClass('simply-scroll-btn' + ' ' + this.moveForwardClass) .bind(this.events.start,this.funcMoveForward).bind(this.events.end,this.funcMoveStop); if (this.o.manualMode == 'end') { !this.isRTL ? this.$btnBack.addClass('disabled') : this.$btnForward.addClass('disabled'); } } }, moveForward: function() { var self = this; this.movement = 'forward'; if (this.trigger !== null) { this.$btnBack.removeClass('disabled'); } self.interval = setInterval(function() { if (self.$clip[0]['scroll' + self.scrollPos] < (self.posMax-self.clipMax)) { self.$clip[0]['scroll' + self.scrollPos] += self.o.speed; } else if (self.isLoop) { self.resetPos(); } else { self.moveStop(self.movement); } },self.intervalDelay); }, moveBack: function() { var self = this; this.movement = 'back'; if (this.trigger !== null) { this.$btnForward.removeClass('disabled'); } self.interval = setInterval(function() { if (self.$clip[0]['scroll' + self.scrollPos] > self.posMin) { self.$clip[0]['scroll' + self.scrollPos] -= self.o.speed; } else if (self.isLoop) { self.resetPos(); } else { self.moveStop(self.movement); } },self.intervalDelay); }, movePause: function() { clearInterval(this.interval); }, moveStop: function(moveDir) { this.movePause(); if (this.trigger!==null) { if (typeof moveDir !== 'undefined') { $(this.trigger).addClass('disabled'); } this.trigger = null; } if (this.isAuto) { if (this.o.autoMode=='bounce') { moveDir == 'forward' ? this.moveBack() : this.moveForward(); } } }, moveResume: function() { this.movement=='forward' ? this.moveForward() : this.moveBack(); }, resetPos: function() { this.$clip[0]['scroll' + this.scrollPos] = this.resetPosition; } }); })(jQuery,window);

Use it in JSP




<div id="scrollerDiv">
      <ul class="myulclass" id="scroller">
        <s:iterator value="scrollerAccounts">
          <s:if test="profilePic != null && profilePic != ''">
           <li  id="listItem_${accountId}"><a href="host?number=${virtualNumber}"><img id="img_${accountId}" src="profile/${accountId}/${profilePic}" width="80" height="80"></a></li>
          </s:if>
          <s:elseif test="gender.description == \"Female\"">
           <li id="listItem_${accountId}"><a href="host?number=${virtualNumber}"><img id="img_${accountId}" src="img/noImageFemale.png" width="80" height="80"></a></li>
          </s:elseif>
          <s:else>
           <li id="listItem_${accountId}"><a href="host?number=${virtualNumber}"><img id="img_${accountId}" src="img/noImageMale.png" width="80" height="80"></a></li>
          </s:else>
        </s:iterator>
        <!--   called clones to ensure the clip is completely filled before the scrolling starts -->
        <s:iterator value="scrollerAccounts">
          <s:if test="profilePic != null && profilePic != ''">
           <li  id="listItem_${accountId}_clone"><a href="host?number=${virtualNumber}"><img id="img_${accountId}_clone" src="profile/${accountId}/${profilePic}" width="80" height="80"></a></li>
          </s:if>
          <s:elseif test="gender.description == \"Female\"">
           <li id="listItem_${accountId}_clone"><a href="host?number=${virtualNumber}"><img id="img_${accountId}" src="img/noImageFemale.png" width="80" height="80"></a></li>
          </s:elseif>
          <s:else>
           <li id="listItem_${accountId}_clone"><a href="host?number=${virtualNumber}"><img id="img_${accountId}" src="img/noImageMale.png" width="80" height="80"></a></li>
          </s:else>
        </s:iterator>
      </ul>
     </div>

Customizing ENUM in Hibernate


We create the GenericEnumUserType class as follows and use it like this in *.hbm.xml

<property name="responseCode" column="RESPONSE_CODE">
   <type name="net.mycompany.tps.domain.GenericEnumUserType">
    <param name="enumClass">net.mycompany.tps.domain.ExternalResponseCodeEnum</param>
   </type>
  </property>
Here is the net.mycompany.tps.domain.ExternalResponseCodeEnum NOTE the parseId method has to be a static
public enum ExternalResponseCodeEnum {
  ercNotSet(-1),
     ercInvalidCard(101),
     ercOTBDeclined(200),
     ercBlockedCard (210),
     ercBlockedANI(215),
     ercChargeback(220),
     ercBlockedRISK(222),
     ercExceededRiskParameters(230),
     ercCCWDeclined(271),
     ercFirstTimeCaller(280),
     ercSaleDeclined(300),
     ercOTBApproved(400),
     ercCCWTimeoutO(401),
     ercPositiveData(410),
     ercCCWApproved(421),
     ercSaleApproved(500),
     ercCCWTimeoutS(501);
     private int externalResponseCode;

    public static final Map lookupExternalResponseCodeEnum = new HashMap();

    static {
         //Create reverse lookup hash map 
         for(ExternalResponseCodeEnum d : ExternalResponseCodeEnum.values())
             lookupExternalResponseCodeEnum.put(d.getId(), d);
  }
  //constructor
  private ExternalResponseCodeEnum(int code) {
   this.externalResponseCode
   = code;
  }
  public int getId() {
   return externalResponseCode;
  }
  public static int parseId(int id) {
   return "set up the reverse lookup of enum based on id"
  }
}

import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.TypeResolver;
import org.hibernate.usertype.ParameterizedType;
import org.hibernate.usertype.UserType;


public class GenericEnumUserType implements UserType, ParameterizedType {

    private Class  enumClass;

    private Class  identifierType;

    private Method identifierMethod;

    private Method valueOfMethod;

    private static final String defaultIdentifierMethodName = "getId";

    private static final String defaultValueOfMethodName = "parseId";

    private AbstractSingleColumnStandardBasicType type;

    private int[] sqlTypes;

    @Override
    public void setParameterValues(Properties parameters) {
        String enumClassName = parameters.getProperty("enumClass");
        try {
            enumClass = Class.forName(enumClassName).asSubclass(Enum.class);
        } catch (ClassNotFoundException exception) {
            throw new HibernateException("Enum class not found", exception);
        }

        String identifierMethodName =
                parameters.getProperty("identifierMethod",
                        defaultIdentifierMethodName);

        try {
            identifierMethod =
                    enumClass.getMethod(identifierMethodName, new Class[0]);
            identifierType = identifierMethod.getReturnType();
        } catch (Exception exception) {
            throw new HibernateException("Failed to optain identifier method",
                    exception);
        }

        TypeResolver tr = new TypeResolver();
        type =
                (AbstractSingleColumnStandardBasicType) tr.basic(identifierType
                        .getName());
        if (type == null) {
            throw new HibernateException("Unsupported identifier type "
                    + identifierType.getName());
        }
        sqlTypes = new int[] {type.sqlType()};

        String valueOfMethodName = parameters.getProperty("valueOfMethod",
                defaultValueOfMethodName);
        try {
            valueOfMethod = enumClass.getMethod(valueOfMethodName,
                            new Class[] {identifierType});
        } catch (Exception exception) {
            throw new HibernateException("Failed to optain valueOf method",
                    exception);
        }
    }

    @Override
    public Class returnedClass() {
        return enumClass;
    }

    public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
            throws HibernateException, SQLException {
        Object identifier = type.get(rs, names[0], null);
        if (identifier == null) {
            return null;
        }

        if (valueOfMethod == null) {

        }

        try {
            return valueOfMethod.invoke(enumClass, new Object[] {identifier});
        } catch (Exception exception) {
            throw new HibernateException(
                    "Exception while invoking valueOfMethod of enumeration class: ",
                    exception);
        }
    }

    public void nullSafeSet(PreparedStatement st, Object value, int index)
            throws HibernateException, SQLException {
        try {
            Object identifier =
                    value != null ? identifierMethod.invoke(value,
                            new Object[0]) : null;
            st.setObject(index, identifier);
        } catch (Exception exception) {
            throw new HibernateException(
                    "Exception while invoking identifierMethod of enumeration class: ",
                    exception);

        }
    }

    @Override
    public int[] sqlTypes() {
        return sqlTypes;
    }

    @Override
    public Object assemble(Serializable cached, Object owner)
            throws HibernateException {
        return cached;
    }

    @Override
    public Object deepCopy(Object value) throws HibernateException {
        return value;
    }

    @Override
    public Serializable disassemble(Object value) throws HibernateException {
        return (Serializable) value;
    }

    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        return x == y;
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        return x.hashCode();
    }

    public boolean isMutable() {
        return false;
    }

    public Object replace(Object original, Object target, Object owner)
            throws HibernateException {
        return original;
    }

 @Override
 public Object nullSafeGet(ResultSet arg0, String[] arg1,
   SessionImplementor arg2, Object arg3) throws HibernateException,
   SQLException {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public void nullSafeSet(PreparedStatement arg0, Object arg1, int arg2,
   SessionImplementor arg3) throws HibernateException, SQLException {
  // TODO Auto-generated method stub
  nullSafeSet(arg0, arg1, arg2);
 }
}

Selenium Javascript


Selenium Script for Chrome Driver
package net.mycom.myapp.selenium;

import static org.junit.Assert.assertEquals;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class TestPopcornMultipleFunctionsMobile {
  private static WebDriver driver;

  //private static String baseUrl = "http://localhost:8080/";
  //private static String context="mycommyappWebsite/";
  private static String context="home?mobile=true";
  private static String baseUrl = "http://qa.i.opentalk.com/";
  
  private static String login = "seleniumnewuser";
  private static String password = "welcome";
  private static String changePassword = "welcome2";
  private static String testNumber = "2565137992";
  private static String testTextMsg = "hello there...testing with selenium";
  private static String facebookUserName;
  private static String facebookPassword = "";
        private static int countTestUsers = 1;
  private static String loginAs;
  
  @BeforeClass
  public static void setUp() throws Exception {
            for (int i = 1; i <= countTestUsers; i++) {
                System.setProperty("webdriver.chrome.driver", "C:\\Users\\Chrome\\chromedriver.exe");
                driver = new ChromeDriver();
//                driver = new FirefoxDriver();
             driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
             driver.get(baseUrl + context);
//             driver.get(baseUrl);
             System.out.println(baseUrl);
              assertEquals("Phone call | opentalk | Feed", driver.getTitle());
       driver.findElement(By.xpath("//a[@href='loginPage']")).getAttribute("href");
       driver.findElement(By.xpath("//a[@href='loginPage']")).click();
       login(i);
            }
  }
  @AfterClass
  public static void tearDown() throws Exception {
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='logout']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Login", driver.getTitle());
   driver.quit();
  }
  
  private static void login(int i) {
   loginAs = login + i + "@mycom.net";
   driver.findElement(By.id("emailOrPhone")).clear();
   driver.findElement(By.id("emailOrPhone")).sendKeys(loginAs);
   driver.findElement(By.id("password")).sendKeys(password);
   driver.findElement(By.name("submit")).click();
   assertEquals("Phone call |opentalk | Feed", driver.getTitle());
//   driver.findElement(By.id("menu")).click();
//         sendTextMessage();
        }
  
  //@Test
  public void checkTextHistory() throws Exception {
   driver.findElement(By.linkText("Text History")).click();
//   assertEquals("Text History", driver.getTitle().substring(0,12));
   //driver.findElement(By.xpath("//a[contains(@href,'popupMenu?')]")).click();
   List anchors = driver.findElememycom(By.xpath("//a[contains(@href,'popupMenu?')]"));
   Iterator j = anchors.iterator();
   while(j.hasNext()) {
    WebElement anchor = j.next();
    System.out.println(anchor.getAttribute("href"));
   }
  }
   
  //@Test
  public void sendTextMessage() throws Exception {
   driver.findElement(By.linkText("Call/Text")).click();
   assertEquals("Make Call / Send Text", driver.getTitle().substring(0,21));
   driver.findElement(By.id("sendText_to")).sendKeys(testNumber);
      driver.findElement(By.id("message")).sendKeys(testTextMsg);
   driver.findElement(By.id("sendTextButton")).click();
/*   for (String handle : driver.getWindowHandles()) {
       driver.switchTo().window(handle);
       if (driver.findElement(By.linkText("Send Text")).isDisplayed()) {
        driver.findElement(By.linkText("Send Text")).click();
        break;
       }
   } */
   // Check that we're back to the Text History screen. Don't rely on your variable
   assertEquals("Phone call | open Talk | Text History", driver.getTitle().substring(0,12));
  }
  
  @Test
  public void showHistory() throws Exception {
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='callHistory']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Call History", driver.getTitle().substring(0,36));
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='textHistory']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Text History", driver.getTitle().substring(0,36));
   
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='voicemail']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Voicemail", driver.getTitle().substring(0,33));
   
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='phoneBookListEntries']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Phonebook", driver.getTitle().substring(0,33));
   
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='displaySettingsMobile?appActiveTab=tab7']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Review Purchase", driver.getTitle().substring(0,39));
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='recentActiveAgemycomearch']")).getAttribute("href"));
      
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='displaySettingsMobile?hasResponseAction=false']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Setttings", driver.getTitle().substring(0,33));

        }

  //@Test
  public void showProfile() throws Exception {
   driver.findElement(By.xpath("//a[@href='home']")).click();
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='displaySettings']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab2Link']")).click(); //profile
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab3Link']")).click(); //phone & voicemail
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab4Link']")).click(); //time/date
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab5Link']")).click(); //privacy
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab6Link']")).click(); //profile picture
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.xpath("//li[@id='tab7Link']")).click(); //billing
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
  }

  @Test
  public void changePassword() throws Exception {
   //change password
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='displaySettingsMobile?hasResponseAction=false']")).getAttribute("href"));
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='changePassword']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.id("changePasswordConfirm_oldPassword")).sendKeys(password); 
   driver.findElement(By.id("changePasswordConfirm_newPassword")).sendKeys(changePassword); 
   driver.findElement(By.id("changePasswordConfirm_confirmNewPassword")).sendKeys(changePassword); 
   driver.findElement(By.id("blueButton")).click();
   assertEquals("Phone call |opentalk | Feed", driver.getTitle());
   
   //logout
   driver.findElement(By.id("toggleButton")).click();
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='logout']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Login", driver.getTitle());
   
   //logback with new password
         driver.get(baseUrl + context);
   driver.findElement(By.xpath("//a[@href='loginPage']")).getAttribute("href");
   driver.findElement(By.xpath("//a[@href='loginPage']")).click();
   driver.findElement(By.id("emailOrPhone")).clear();
   driver.findElement(By.id("emailOrPhone")).sendKeys(loginAs);
   driver.findElement(By.id("password")).sendKeys(changePassword);
   driver.findElement(By.name("submit")).click();
   
   //revert password
   driver.findElement(By.id("toggleButton")).click();
         driver.navigate().to(driver.findElement(By.xpath("//a[@href='displaySettingsMobile?hasResponseAction=false']")).getAttribute("href"));
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='changePassword']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Settings", driver.getTitle());
   driver.findElement(By.id("changePasswordConfirm_oldPassword")).sendKeys(changePassword); 
   driver.findElement(By.id("changePasswordConfirm_newPassword")).sendKeys(password); 
   driver.findElement(By.id("changePasswordConfirm_confirmNewPassword")).sendKeys(password);
   driver.findElement(By.id("blueButton")).click();   
   assertEquals("Phone call |opentalk | Feed", driver.getTitle());
//         System.out.println(driver.getTitle());
  }

  @Test
  public void forgotPassword() {
   //logback in
   driver.findElement(By.id("toggleButton")).click();
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='logout']")).getAttribute("href"));
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='passwordResetRequestInit']")).getAttribute("href"));
         System.out.println(loginAs);
   driver.findElement(By.name("emailOrPhone")).clear();
   driver.findElement(By.name("emailOrPhone")).sendKeys(loginAs);
   driver.findElement(By.name("Submit")).click();
   //logback in
         driver.get(baseUrl + context);
   driver.findElement(By.xpath("//a[@href='loginPage']")).getAttribute("href");
   driver.findElement(By.xpath("//a[@href='loginPage']")).click();
   driver.findElement(By.id("emailOrPhone")).clear();
   driver.findElement(By.id("emailOrPhone")).sendKeys(loginAs);
   driver.findElement(By.id("password")).sendKeys(password);
   driver.findElement(By.name("submit")).click();
   assertEquals("Phone call |opentalk | Feed", driver.getTitle());
  }

  //@Test
  public void facebookLogin() {
   facebookUserName = loginAs;
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='logout']")).getAttribute("href"));
   assertEquals("opentalk Login", driver.getTitle());
   driver.findElement(By.xpath("//img[@src='img/facebook_signin3.png']")).click();
   for (String handle : driver.getWindowHandles()) {
       driver.switchTo().window(handle);
       if (driver.findElememycom(By.id("email")).size() != 0) {
        driver.findElement(By.id("email")).clear();
        driver.findElement(By.id("email")).sendKeys(facebookUserName);
     driver.findElement(By.id("pass")).sendKeys(facebookPassword);
     driver.findElement(By.name("login")).click();
        break;
       }
   }
   assertEquals("Phone call | open Talk | opentalk Feed", driver.getTitle());
   
   //logout
   driver.navigate().to(driver.findElement(By.xpath("//a[@href='logout']")).getAttribute("href"));
   assertEquals("Phone call | open Talk | Login", driver.getTitle());
   
   //logback in
   driver.findElement(By.id("login_emailOrPhone")).clear();
   driver.findElement(By.id("login_emailOrPhone")).sendKeys(loginAs);
   driver.findElement(By.id("login_password")).sendKeys(password);
   driver.findElement(By.name("Submit")).click();
   assertEquals("Phone call | open Talk | opentalk Feed", driver.getTitle());
   
  }

  //@Test
  public void showPagination() throws Exception {
//   driver.findElement(By.xpath("//a[@href='home']")).click();
   driver.findElement(By.id("toggleButton")).click();
   driver.findElement(By.cssSelector("a > strong")).click();
   assertEquals("Phone call | open Talk | opentalk Feed", driver.getTitle());
  }


}
Firefox Driver
package net.mycom.myapp.selenium;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.util.concurrent.TimeUnit;

import net.mycom.myapp.domain.Account;
import net.mycom.myapp.domain.AccountPending;
import net.mycom.myapp.domain.dao.AccountDao;
import net.mycom.myapp.domain.dao.AccountDaoImpl;
import net.mycom.myapp.util.HibernateUtil;
import net.mycom.myapp.vn.dao.VirtualNumberDao;
import net.mycom.myapp.vn.dao.VirtualNumberDaoImpl;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.chrome.ChromeDriver;

public class TestmystuffMultipleUser {
 int countTestUsers = 10;
 private static WebDriver driver;

 // private static String baseUrl = "http://localhost:8080/";
 // private static String context = "mycommyappWebsite/";
 private static String context = "";
 //private static String dbUrl = "//mydb/myapp";
 //private static String dbUrl = "//mydb/myapp";
 private static String baseUrl = "http://qa.i.opentalk.com/";
 private static String dbUrl = "//mydbqa.i.mystuff.com/myapp";

 private static String dbLogin = "myapp_web";
 private static String dbPassword = "welcome";
 private static String dbShowSql = "true";
 private static String firstName = "Selenium";
 private static String lastName = "Newuser";
 private static String email = "seleniumNewUser";
 private static String password = "welcome";
 private static String areaCode = "818";
 int terminal = 5555000;
 private static String terminalString = "";

 private static String gender[] = { "Male", "Female" };

 @BeforeClass
 public static void setUp() throws Exception {
  HibernateUtil.setConnectionParameters(dbUrl, dbLogin, dbPassword,dbShowSql);
     System.out.println("Before  FireFox");
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Chrome\\chromedriver.exe");
        driver = new ChromeDriver();
//  driver = new FirefoxDriver();
  driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
     System.out.println("After  FireFox");
 }

 @AfterClass
 public static void tearDown() throws Exception {
  driver.quit();
 }

 @Test
 public void newUserWithoutVN() throws Exception {
  // loop to check, delete, and create the accoumycom
     System.out.println("Before  Loop");

  for (int i = 0; i < countTestUsers; i++) {

   driver.get(baseUrl + context + "home");
   assertEquals("mystuff Login", driver.getTitle());
   terminal = terminal + i;
   terminalString = areaCode + terminal;
   System.out.println(terminalString);

   Session session = HibernateUtil.getCurremycomession();
   Criteria crit = session.createCriteria(Account.class);
   crit.add(Restrictions.eq("terminatingNumber", terminalString));
   Account ac = (Account) crit.uniqueResult();
   // Delete account if it exists
   if (ac != null) {
    Transaction tran = session.beginTransaction();
    VirtualNumberDao vnDao = new VirtualNumberDaoImpl(null);
    vnDao.deprovision(ac.getAccountId());
    AccountDao accountDao = new AccountDaoImpl();
    accountDao.deleteAccount(ac.getAccountId());
    tran.commit();
   }

   driver.findElement(By.id("signup_firstName")).clear();
   driver.findElement(By.id("signup_firstName")).sendKeys(
     firstName + i);
   driver.findElement(By.id("signup_lastName")).clear();
   driver.findElement(By.id("signup_lastName")).sendKeys(lastName + i);
   driver.findElement(By.id("signup_email")).clear();
   driver.findElement(By.id("signup_email")).sendKeys(
     email + i + "@mycom.net");
   driver.findElement(By.id("signup_email2")).clear();
   driver.findElement(By.id("signup_email2")).sendKeys(
     email + i + "@mycom.net");
   driver.findElement(By.id("signup_password")).clear();
   driver.findElement(By.id("signup_password")).sendKeys(password);
   driver.findElement(By.id("signup_gender")).sendKeys(password);
   Select select = new Select(driver.findElement(By
     .id("signup_gender")));
   // select.deselectAll();
   select.selectByVisibleText(gender[i % 2]);

   driver.findElement(By.xpath("//input[@value='Sign Up']")).click();
   session.close();

   // Reset connection so we can see new inserts
   session = HibernateUtil.getCurremycomession();

   // get from db account pending
   crit = session.createCriteria(AccountPending.class);
   crit.add(Restrictions.eq("email", (email + i + "@mycom.net")));
   crit.addOrder(Order.desc("idAccountPending"));
   crit.setMaxResults(1);
   AccountPending ap = (AccountPending) crit.uniqueResult();
   if (ap == null) {
    fail("could not read account pending");
   }

   // Generate url that the email would send
   String emailCode = ap.getEmailCode();
   driver.navigate().to(
     baseUrl + context + "/emailConfWoVn?id="
       + ap.getIdAccountPending() + "&emailCode="
       + emailCode);

   // terminatingNumber.jsp
   driver.findElement(By.name("areaCode")).sendKeys(areaCode);
   driver.findElement(By.name("teleport")).sendKeys(
     terminalString.substring(3, 6));
   driver.findElement(By.name("terminal")).sendKeys(
     terminalString.substring(6, 10));
   driver.findElement(By.xpath("//input[@value='Continue']")).click();

   // ivrTnVerification.jsp
   driver.findElement(By.xpath("//input[@value='Continue']")).click();

   long accountPendingId = ap.getIdAccountPending();
   session.evict(ap);
   session.close();
   session = HibernateUtil.getCurremycomession();
   ap = (AccountPending) session.get(AccountPending.class,
     accountPendingId);
   Transaction tran = session.beginTransaction();
   ap.setTnCodeVerified(true);
   session.saveOrUpdate(ap);
   tran.commit();

   // ivrTnVerificationConfirm.jsp
   driver.findElement(By.xpath("//input[@value='Continue']")).click();

   // chooseAreaCode.jsp
   driver.findElement(By.xpath("//input[@value='Continue']")).click();

   // chooseVn.jsp
   driver.findElement(By.xpath("//input[@value='Continue']")).click();

   // accountCreated.jsp
   driver.findElement(By.xpath("//input[@value='Go To My Account']"))
     .click();
   driver.navigate().to(
     driver.findElement(By.xpath("//a[@href='logout']"))
       .getAttribute("href"));
   assertEquals("mystuff Login", driver.getTitle());

  }
 }
}

FB Authentication


FB Authentication
•  User clicks on the FB button on home page
•  the user is redirected to https://graph.facebook.com/oauth/authorize with these parameters:

client_id FB App Id
type web_server
display Popup
redirect_uri /myServices/connectToFBCallback
response_type Token
auth_type Reauthenticate
state Test
scope Email

• Note that  is set up in the FB App at developers.facebook.com

• after the user logs successfully into FB, the callback URL (/myServices/connectToFBCallback) is invoked by FB we are interested in the 2 parameters that are passed into the callback URL.

1) code
2) state

•  if code is null or empty, we assume the user is not authorized by FB and send the user to registration

•  state should be same as the one we passed with the  URL https://graph.facebook.com/oauth/authorize 

•  if state is null or empty, we assume the user is not authorized by FB and send the user to  registration

• Note: if the callback URL is never invoked by FB, there is nothing that we can do
 to inform the user about the status of their login

• the next step is to get the access token

•  the URL is https://graph.facebook.com/oauth/access_token

• parameters:

client_id 
code 
type web_server
client_secret 

•  open the URL connection is https://graph.facebook.com/oauth/access_token using HTTPS protocol and read the input. We are interested in the access token that could be read in the input as access_token=xyz...

• Save the access token in the Database

• We then need to get the FB username of the user 

•  open HTTPS URL connection to https://graph.facebook.com/me

• with parameter

 access_token=

•  the response from FB is read into a Gson object 
•  the username and email are parsed and stored in the Gson object
•  we then look up the   Account table using the email of Gson object
1) if the account is found, we log the user in and we are done
2) if the account is not found, we send the user to registration

Logging in FB User

• We redirect the user to myWebsite/loginFB.action with the following parameters:

1) email (ex:abc@abc.com)
2) profilePic (ex: https://graph.facebook.com//picture)

• The loginFB method will store the profile pic in  Account.profile_pic.

• For example: https://graph.facebook.com/gandikotam/picture will  be the value stored in the Account.profile_pic for the FB user with username gandikotam

• To retrieve the image, the ProfilePicController needs to be modified to download the image using HTTPS protocol.

Sample mobile JSP


<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html>
<html>
 <head>
  <title><%= myappProperties.sitePageTitle() %> Action Menu</title>
  <s:head />
  <jsp:include page="/mobile/mobileScriptsAndStyles.jsp"></jsp:include>
  <style type="text/css">
   p img {
    max-width: 100%;
   }
  </style>
  
  <script type="text/javascript" src="js/mobile/scaleImage.js"></script>
  <script type="text/javascript">
   $("div[data-role='page']").live("pageshow", function(event, ui) {
    <s:if test="account.profilePic != null && account.profilePic != ''">
     scaleImage("profile/${account.accountId}/${account.profilePic}", "profilePicture2", 60, 60);
    </s:if>
    <s:elseif test="genderOfPhoneBookEntry == \"F\"">
     scaleImage("img/noImageFemale.png", "profilePicture2", 60, 60);
    </s:elseif>
    <s:else>
     scaleImage("img/noImageMale.png", "profilePicture2", 60, 60);
    </s:else>
   });
  </script>
 </head>

 <body>
  <div data-role="page" data-theme="c">
   <div data-role="content" style="background-color:#FFFFFF;">
    <!-- Menu button -->
    <div id="toggleButton" onclick="toggleMenu();" style="width: 26px; height: 26px; background: url(img/mobile/list.png) 0 0 no-repeat; cursor: pointer; float: left;"></div>
    <!-- Menu overlay -->
    <div id="menuClickOverlay">
     <%@ include file="/mobile/logo.jsp" %><br />
     
     <div data-role="content">
      <%@ include file="/mobile/popupCommon.jsp" %>
      <div id="agentProfile" style="width: 100%; min-width: 0px; line-height:auto; margin-top:0px;">
       ${account.profilePageHtml}
      </div>
     </div>
    </div>
    <!-- /Menu overlay -->
    <!-- Menu -->
    <%@ include file="/mobile/mobileMenu.jsp" %>
    <!-- /Menu -->
   </div>
   
   <jsp:include page="/mobile/navbar.jsp"></jsp:include>
  </div>
 </body>
</html>

mobileScriptsAndStyles.jsp
<%@page import="net.mycom.myapp.misc.myappProperties" %>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="format-detection" content="telephone=yes">

<link rel="apple-touch-icon-precomposed" href="img/mobile/apple-touch-icon.png" />
<link rel="apple-touch-startup-image" href="img/mobile/apple-touch-startup-image.png" />

<link rel="stylesheet" href="css/mobile/jquery.mobile-1.2.0.min.css" />
<link rel="stylesheet" href="css/mobile/jquery.mobile-1.1.0.c_mycom.css" />

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
 $(document).bind("mobileinit", function() {
  $.mobile.ajaxEnabled = false;
  $.mobile.hashListeningEnabled = false;
 });
</script>
<script type="text/javascript" src="js/mobile/jquery.mobile-1.2.0.min.js"></script>

<link href="css/style.css" rel="stylesheet" type="text/css" />
<link href="css/<%= myappProperties.siteTheme() %>.css" rel="stylesheet" type="text/css" />


<style type="text/css">
 /* Menu
  */
 .ui-btn-text,
 .ui-btn input, .ui-btn button,
 .ui-checkbox, .ui-radio,
 .ui-checkbox input, .ui-radio input,
 .ui-checkbox .ui-btn, .ui-radio .ui-btn,
 .ui-select .ui-btn select {
  z-index: 0;
 }
 
 /* Counters on menu */
 .ui-li-count {
  display: none;
 }
 /* /Menu
  */
  /* prevent zooming */
  .ui-select .ui-btn select{font-size: 50px;}
</style>

<jsp:include page="/analytics.jsp" />