<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7243839215222321720</id><updated>2011-11-17T04:35:57.223-08:00</updated><category term='mrf'/><category term='PinTheGlobe'/><category term='JSF'/><category term='b2bua'/><category term='sip'/><category term='welcome'/><category term='sailfin'/><category term='echarts'/><category term='mediaserver'/><category term='samples'/><category term='database'/><title type='text'>Peter's Devlog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-390901906315734762</id><published>2008-04-25T09:39:00.000-07:00</published><updated>2008-04-25T14:21:20.513-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samples'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='mediaserver'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><category scheme='http://www.blogger.com/atom/ns#' term='mrf'/><title type='text'>Using the Asterisk Voip PBX as SIP Mediaserver</title><content type='html'>&lt;span style="font-family:arial;"&gt;Here I show how the open source Voip PBX Asterisk can be used as a simple mediaserver for Sip applications.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;I use the AsteriskNOW software appliance which is prepackaged ready-to-run version of Asterisk. It can be downloaded from &lt;/span&gt;&lt;a href="http://www.asterisknow.org/downloads"&gt;&lt;span style="font-family:arial;"&gt;http://www.asterisknow.org/downloads&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; . There is a very good documentation avaliable as PDF download from &lt;/span&gt;&lt;a href="http://downloads.oreilly.com/books/9780596510480.pdf"&gt;&lt;span style="font-family:arial;"&gt;Asterisk Book Download&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; .&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Asterisk is running on Linux only, so in order to run it on Windows or other OS you need a virtual machine environment e.g. VMware. The download from AsteriskNOW is an ISO image, to run it on VMWare you need VMWare Server which you can get for free from &lt;/span&gt;&lt;a href="http://www.vmware.com/download/server/"&gt;&lt;span style="font-family:arial;"&gt;http://www.vmware.com/download/server/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; . Alternatively you can use VMware Player and run an Asterisk Virtual Appliance which you can get from the VMware virtual appliance directory at &lt;/span&gt;&lt;a href="http://www.vmware.com/appliances/"&gt;&lt;span style="font-family:arial;"&gt;http://www.vmware.com/appliances/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; .&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;I prefer to run it from VMware Server. To install it create a new virtual machine, insert a CD made from the ISO image or mount the image directly and follow the instructions of the graphic installer. There is quickstart guide available at &lt;/span&gt;&lt;a href="http://www.asterisknow.org/support/install"&gt;&lt;span style="font-family:arial;"&gt;http://www.asterisknow.org/support/install&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; .&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Asterisk provides a Web based administration, but for our usecases it is required to have direct access to the Asterisk console. Use an ssh client (e.g. Putty from &lt;/span&gt;&lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/"&gt;&lt;span style="font-family:arial;"&gt;http://www.chiark.greenend.org.uk/~sgtatham/putty/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; ) to connect to the Asterisk server.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Connect to Asterisk using the ssh client and login (default user is &lt;em&gt;admin&lt;/em&gt; and password is &lt;em&gt;password&lt;/em&gt;). Configuration of Asterisk is done by editing various configuration files. When you edit the configuration files you must give yourself the access rights with sudo, e.g sudo vi sip.conf.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The sip configuration file is &lt;em&gt;sip.conf&lt;/em&gt; in /etc/asterisk. Rename the file from the installation (it is very complicated and contains lots of examples) and create a new sip.conf as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;[general]&lt;br /&gt;context=default&lt;br /&gt;allowoverlap=no&lt;br /&gt;bindport=5060&lt;br /&gt;bindaddr=0.0.0.0&lt;br /&gt;srvlookup=yes&lt;br /&gt;[sailfin]&lt;br /&gt;type=peer&lt;br /&gt;context=from-fwd&lt;br /&gt;host=192.168.0.12&lt;br /&gt;insecure=port&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The configuration is done by declaring contexts, in our case the &lt;em&gt;sailfin&lt;/em&gt; context, type=peer means that this context can only receive calls.The host address has to be replaced with the ip address of the sailfin server (yes the sailfin server since it is the peer, not the Asterisk server). Detailed explanation about contents can be found in the Asterisk book.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The next configuration file is &lt;em&gt;extensions.conf&lt;/em&gt;, which contains the dialplan. Rename the file and create a new one like for sip.conf. &lt;/span&gt;&lt;span style="font-family:arial;"&gt;A dialplan tells Asterisk what to do when a call is received. In our example we are using a very simple dialplan which tells Asterisk to play an announcement when a callis received on a certain extension.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;[from-fwd]&lt;br /&gt;exten =&gt; 1234,1,Answer()&lt;br /&gt;exten =&gt; 1234,2,Playback(to-reach-operator)&lt;br /&gt;exten =&gt; 1234,3,Hangup()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When a call is received for the context &lt;em&gt;from-fwd&lt;/em&gt; with the extension &lt;em&gt;1234&lt;/em&gt; the call is answered, then an announcement is played and the call is finished. Announcement are defined as .wav files with a full path, if no path is specified the default directory &lt;em&gt;/var/lib/asterisk/sounds&lt;/em&gt; is used.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;To activate the context type sip reload from the console (the console can be reached from the Asterisk main menu with ALT-F9). There are many other sip related console commands, they are explained in detail in the Asterisk book in appendix E.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The log files for sip can be found in&lt;em&gt; /var/log/asterisk&lt;/em&gt; in file &lt;em&gt;full, &lt;/em&gt;errors are in file &lt;em&gt;messages&lt;/em&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;When you now make a sip call to Asterisk (sip:1234@192.168.0.12 in our example) Asterisk answers the call with 200 OK, then receives an ACK, plays the announcement and ends the call with BYE when the announcement is finished.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The usecase described here is an extremely simple one, Asterisk can do much more than that, e.g. it can act as&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;IVR with voice menus reacting on keypresses and event database access.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Voice mail server&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Call recording server&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;I will try to explore these possibilities and explain in a future post.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-390901906315734762?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/390901906315734762/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=390901906315734762' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/390901906315734762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/390901906315734762'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/04/using-asterisk-voip-pbx-as-sip.html' title='Using the Asterisk Voip PBX as SIP Mediaserver'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-9143808240704188927</id><published>2008-04-24T12:55:00.000-07:00</published><updated>2008-04-25T14:22:57.265-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samples'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='echarts'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Hunting Sample App using ECharts</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;"&gt;In this example I show how to build a more complex sample using the ECharts state machine language. Details about ECharts can be found in &lt;/span&gt;&lt;a href="http://echarts.org/"&gt;&lt;span style="font-family:arial;"&gt;http://echarts.org/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; and also in one my previous posts in &lt;a href="http://petersjb.blogspot.com/2008/02/screening-sample-app-using-echarts-part.html"&gt;screening sample app with ECharts&lt;/a&gt; . The sources for the sample are available in cvs using cvs -d:pserver:[your java.net account]@cvs.dev.java.net:/cvs co sailfin/sailfin-tests and then can be found then in community/samples/hunting, or send an email to &lt;/span&gt;&lt;a href="mailto:peter.c.klein@siemens.com"&gt;&lt;span style="font-family:arial;"&gt;me&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; to get them.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;It provides the functionality to define a list of alternative Sip URI's in a database which are tried in sequence to connect when a call is received until a successful connection is established.&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;The application is triggered only in terminating case via the ECharts application router if the &lt;em&gt;To&lt;/em&gt; address matches the specfied pattern in the app router. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;It then connects the call to a mediaserver (MRF) which plays a dialtone or other announcement to the caller. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;When the dialtone is established it sends a INVITE to the original called party of the call. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;When the called party answers with 200 OK it disconnects from the mediaserver and reconnects via REINVITE to the caller. How to setup a mediaserver I will show in a future blog entry. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;If the called party returns a 486 BUSY or 487 NOT REACHABLE it retrieves the next alternative Sip URI from the database and sends INVITE again.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;If no alternative called party is available it stops the dialtone and signals a failure to the caller.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Sip Callflow for Redirect on Busy&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;The following callflow shows a scenario where the B Party is busy and the call is forwarded to C-Party.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;A-Party......&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Sailfin......B-Party......MRF......C-Party&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;-INVITE SDPa-&gt;.....................................&lt;br /&gt;.............-INVITE--------------------&gt;..........&lt;br /&gt;.............&lt;-200 OK SDPm---------------..........&lt;br /&gt;&lt;-200 OK SDPm-.....................................&lt;br /&gt;-ACK---------&gt;.....................................&lt;br /&gt;.............-ACK-----------------------&gt;..........&lt;br /&gt;.............-INVITE SDPa---&gt;......................&lt;br /&gt;.............&lt;-486 BUSY------......................&lt;br /&gt;.............-ACK-----------&gt;......................&lt;br /&gt;.............-INVITE SDPa-------------------------&gt;&lt;br /&gt;.............&lt;-200 OK SDPc-------------------------&lt;br /&gt;.............-BYE-----------------------&gt;..........&lt;br /&gt;&lt;-200 OK SDPc-.....................................&lt;br /&gt;.............&lt;-200 OK--------------------..........&lt;br /&gt;-ACK---------&gt;.....................................&lt;br /&gt;.............-ACK---------------------------------&gt;&lt;br /&gt;..................t a l k i n g....................&lt;br /&gt;-BYE---------&gt;.....................................&lt;br /&gt;.............-BYE---------------------------------&gt;&lt;br /&gt;.............&lt;-200 OK------------------------------&lt;br /&gt;&lt;-200 OK------.....................................&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;strong&gt;State Machines&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;A graphical description of the state machines can be found in the downloaded sources in hunting/src/echarts/hunting/ech/doc-files&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The MainFSM machine connects to the MRF to play the dialtone using the ConnectFSM machine. When the dialtone is established it transitions to the HuntingFSM which performs the search and connect for the called party. Finally when the call is successfully established it transitions to the TransparentFSM which handles the talking state of the call and also the turndown at the end.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The HuntingFSM runs three paralles states.&lt;br /&gt;The PLAY_DIALTONE state uses the TransparentFSM and monitors the connection to the MRF.&lt;br /&gt;The CALL state uses the CallFSM to make a connection the called party until it has a successful connection.&lt;br /&gt;The REINVITE state uses the ReinviteFSM to handle the reinvite to the caller after a successful connection to the B-Party has been established. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The ConnectFSM machine handles the conenction to the MRF.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The CallFSM handles connect attempts to the B-Party.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The SendReinviteFSM handles the reinvite to the caller.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The TransparentFSM handles the talking state and turndown together with the TransparentHandleRequestFSM. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-9143808240704188927?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/9143808240704188927/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=9143808240704188927' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/9143808240704188927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/9143808240704188927'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/04/hunting-sample-app-using-echarts.html' title='Hunting Sample App using ECharts'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-8469319796536671172</id><published>2008-03-01T12:14:00.000-08:00</published><updated>2008-03-01T12:37:10.775-08:00</updated><title type='text'>Screening App uses ECharts Application Router</title><content type='html'>&lt;span style="font-family:Arial;"&gt;The screening application now uses the ECharts application router. A good description of the application router can be found in &lt;a href="http://echarts.org/ECharts-for-SIP-Servlets/JSR116-Application-Router-Deployment.html"&gt;http://echarts.org/ECharts-for-SIP-Servlets/JSR116-Application-Router-Deployment.html&lt;/a&gt;. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;In the moment the screening app uses the application router only to control triggering so that it is only triggered in originating but not in terminating calls. In the future different kinds of screening could be applied to originating or terminating calls or the screening app could be integrated with other applications in application composition.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Following changes were made to the screening app:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;A new servlet "InitialServlet" was added.This servlet is triggered when the application is not determined yet and handles the initial routing.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;In sip.xml the InitialServlet was added and the mapping rules were enhanced to use the results of application routing.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The ConnectFSM was enhanced to call the approuter before it sends out an initial INVITE.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The approuter.xml file was created, this file has to be copied to sailfin/domains/domain1/config.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-8469319796536671172?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/8469319796536671172/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=8469319796536671172' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/8469319796536671172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/8469319796536671172'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/03/screening-app-uses-echarts-application.html' title='Screening App uses ECharts Application Router'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-9106972775611113377</id><published>2008-02-24T08:34:00.000-08:00</published><updated>2008-02-25T12:55:21.942-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samples'/><category scheme='http://www.blogger.com/atom/ns#' term='JSF'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Screening Sample App using ECharts (Part 2 Web Admin)</title><content type='html'>&lt;p&gt;&lt;span style="font-family:arial;"&gt;The third parts shows how to build a web based administration for the screening application. It is built using the Visual Web JavaServer Faces framework. It provides basic CRUD (Create, Read, Update, Delete) functionality for each of the entities in the database.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Database Contents&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The database contains the following entities:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;UserData:&lt;br /&gt;holds the user id, the name of the used screening profile, the reference to the provider data and the users's Sip Uri.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;ProviderData&lt;br /&gt;holds the system specific data, in our case the Sip Uri of the announcement to be played when a call is not allowed.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;ScreeningProfile&lt;br /&gt;holds the screening data to be checked in blacklists and whitlelists. Each entry consists of a profile name, a blacklist/whitelist indicator and the Sip Uri to be checked itself.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Page Creation&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The application consists of a main page which has links to the Users page, the Providers page and the Screening page. The application is modeled according to the tutorial "Modifying Database Table Rows with the Java Persistence API" in &lt;/span&gt;&lt;a href="http://www.netbeans.org/kb/60/web/web-jpa-part2.html"&gt;&lt;span style="font-family:arial;"&gt;http://www.netbeans.org/kb/60/web/web-jpa-part2.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Do the following steps to build the application:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Right click on the screening application in the project window and select "&lt;em&gt;New-Visual Web JSF Page&lt;/em&gt;" for each page.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Right click on the screening application in the project window and select "&lt;em&gt;New-Visual Web JSF Session Bean&lt;/em&gt;" once.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Drag and Drop the hyperlinks for users, providers and screening to the main page.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add the code for three properties userDataList, providerDataList and screeningProfileList to SessionBean1 as well as the corresponding methods to fill this lists from the database (updateUserData(), updateProviderData() and updateScreeningProfile() ) and one helper method findProviderDataById(String providerId).&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Page Layout&lt;/strong&gt;, each entity page contains:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a static text field for the headline&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a grid panel with id mainContainer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a table which is bound to the data in SessionBean1&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a grid panel with id buttonPanel with 2 buttons, an add-update button and a delete button&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a grid panel with name addUpdatePanel with one label and one text field or dropdown list for each field in the entity.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;a hyperlink to go back to the main page&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Page Flow&lt;/strong&gt;, open the faces-config.xml file and in the graphical editor&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Connect each of the hyperlinks on the main page with the corresponding entity page&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Connect the backlink on the entity pages with the main page&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Connect the buttons on each entity page with the entity page itself&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Binding to Data&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Right click the table and select "&lt;em&gt;Table Layout&lt;/em&gt;", then select the corresponding list in "&lt;em&gt;Get Data From&lt;/em&gt;".Set the id's of the table columns as [property name]Column and the table fields as [property name]Text.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Set the id's of the addUpdatePanel elements as [property name][field or list]&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;.For the dropdown list for providers in the Users page select it, right click and select "&lt;em&gt;Bind to Data&lt;/em&gt;", then choose providerIdList.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;For the dropdown list for screening profiles in the Users page select it, right click and select "&lt;em&gt;Bind to Data&lt;/em&gt;", then choose screeningNameList&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Handling Selection&lt;/strong&gt; using an addtional radio button in each table row&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add the code for a TableSelectPhaseListener to the java bean for the page as shown in the example code&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add the javascript code for initAllRows() as shown in the example code. This code is specífic for each page because it also updates the addUpdatePanel fields when a table row is selected.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Right click the table and select "&lt;em&gt;Table Layout&lt;/em&gt;", then "&lt;em&gt;New&lt;/em&gt;" and select Radio Button from component type and click "&lt;em&gt;Up&lt;/em&gt;" until the button is on the top of the column. Set the button's id to selectButton.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Select the radio button, right click in the navigator window and select "&lt;em&gt;Property Bindings&lt;/em&gt;". Add the bindings for selected, selected value and name. For name enter manually&lt;br /&gt;"#{[page name]selectButton.id}". This binds the select button to the TableSelectPhaseListener object.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Select the selectColumn in the navigator window and set the bindings for selectId to&lt;br /&gt;"#{[page name]selectButton.id}" and the bindings for onClick to "setTimeout('initAllRows()', 0)".This performs the update of the table when a radio button is clicked.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Select the tableRowGroup in the navigator window and set the bindings for selected to the selectedState property.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Command Handlers&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add persistency to the page by right clicking in the source editor and then select"&lt;em&gt;Persistence-&gt;Use Entity Manager&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add the code for merge() and delete() as shown in the example code. You can delete the generated code for persist().&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Doubleclick the "add-update" button and enter the java code as shown in the example code.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Doubleclick the "delete" button and enter the java code as shown in the example code.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Build and deploy the application, then point the webbrowser to &lt;/span&gt;&lt;a href="http://localhost:8080/screening"&gt;&lt;span style="font-family:arial;"&gt;http://localhost:8080/screening&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;To make an initial fill of the database go to the screening directory and execute ant -f tests.xml filldata&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-9106972775611113377?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/9106972775611113377/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=9106972775611113377' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/9106972775611113377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/9106972775611113377'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/02/screening-sample-app-using-echarts-part_24.html' title='Screening Sample App using ECharts (Part 2 Web Admin)'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-5897993356560629356</id><published>2008-02-08T23:44:00.000-08:00</published><updated>2008-02-25T09:33:37.067-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samples'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='echarts'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Screening Sample App - ECharts Details</title><content type='html'>&lt;span style="font-family:arial;"&gt;The following diagram show the structure of the screening application, the diagram is generated by the build process in the echarts/screening/ech/doc-files folder. From the initial state &lt;em&gt;RECEIVE_INVITE&lt;/em&gt; either the state &lt;em&gt;PLAY_ANNO&lt;/em&gt; is reached (if screening is applied) or the state &lt;em&gt;CONNECT&lt;/em&gt; if screening is not applied. When the connection is successfully established the state &lt;em&gt;TALKING&lt;/em&gt; becomes active which handles the call until finish.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_bJlpcoyPESM/R61c_38AOhI/AAAAAAAAAAU/YZmMIx3YMVQ/s1600-h/MainFSM_1.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5164886600080964114" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_bJlpcoyPESM/R61c_38AOhI/AAAAAAAAAAU/YZmMIx3YMVQ/s400/MainFSM_1.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_bJlpcoyPESM/R61cAn8AOgI/AAAAAAAAAAM/cFaAYYTUEWE/s1600-h/MainFSM.JPG"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-5897993356560629356?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/5897993356560629356/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=5897993356560629356' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/5897993356560629356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/5897993356560629356'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/02/screening-sample-app-using-echarts-part_08.html' title='Screening Sample App - ECharts Details'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bJlpcoyPESM/R61c_38AOhI/AAAAAAAAAAU/YZmMIx3YMVQ/s72-c/MainFSM_1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-2330253825837048428</id><published>2008-02-04T12:49:00.000-08:00</published><updated>2008-03-20T10:37:38.905-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='samples'/><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='echarts'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Screening Sample App using ECharts (Part 1 - Application)</title><content type='html'>&lt;span style="font-family:arial;"&gt;In this example I will show how to build a simple screening application for Sailfin using the ECharts state machine language. The application checks the dialed number and either let the call proceed or plays an announcement to the caller that the call is forbidden. Each user is assigned a screening profile which contains his screening rules consisting of blacklisted numbers and exceptional whitelisted numbers. A call is forbidden if the dialed number is contained in the blacklist but not in the whitelist. A call is allowed if the dialed number is not contained in any list or in the whitelist only.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;What is ECharts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;According to the description on the ECharts website (&lt;a href="http://echarts.org/"&gt;http://echarts.org/&lt;/a&gt;) it is a state machine-based programming language for event-driven systems derived from the standardized UML stacharts language. ECharts is a hosted language which means that it is dependent on an underlying programming language such as Java.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Benefits of ECharts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;It provides a problem oriented language. State machines are a typical method to describe message processing applications and a language whose paradigm fits to the domain makes application development easier.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;From an application developers point of view your application has to handle only a single call in contrast to the servlet programming model where you have to deal with all calls handled by the servlet in parallel. The session and dialog management is abstracted by the so called box model.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;It allows to build reuseable parts by defining state machines which handle a certain task and can be inserted as a single state in an outer state machine. In the example I will show a Connect machine which builds up a connection to the called party, a Transparent machine which handles the talking state and a PlayAnnouncement machine which plays announcements to the caller.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Get the ECharts 2.2. SDK from &lt;a href="http://echarts.org/Downloads.html"&gt;http://echarts.org/Downloads.html&lt;/a&gt; and unzip it.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The ECharts compiler uses Python, if do not have it get it from &lt;a href="http://www.python.org/download/"&gt;http://www.python.org/download/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;If on order to use the documentation generator for state machines on Windows you need graphviz from &lt;a href="http://www.graphviz.org/"&gt;http://www.graphviz.org/&lt;/a&gt;. For some strange reasons I had to directly set the path for the graphviz "dot" program in ech2javadoc to make it working.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;In the sailfin application server set the following JVM options with the admin console on &lt;a href="http://localhost:4848/"&gt;http://localhost:4848/&lt;/a&gt; by "&lt;em&gt;Application Server-&gt;JVM Settings-&gt;JVM Options-&gt;Add Option&lt;/em&gt;".&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;-Dorg.echarts.servlet.sip.messagelog=true&lt;br /&gt;-Dorg.echarts.debugging=true&lt;br /&gt;-Dorg.echarts.servlet.sip.debugging=true&lt;br /&gt;-Dorg.echarts.servlet.sip.logdir=${com.sun.aas.instanceRoot}/echlogs&lt;br /&gt;-Dorg.echarts.system.transitionTimerManager.class=&lt;br /&gt;org.echarts.servlet.sip.TransitionTimerManager&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The sources are available in cvs using&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;cvs -d:pserver:[your java.net account]@cvs.dev.java.net:/cvs co sailfin/sailfin-tests&lt;br /&gt;and then can be found then in community/samples/screening, or send an email to &lt;/span&gt;&lt;a href="mailto:peter.c.klein@siemens.com"&gt;&lt;span style="font-family:arial;"&gt;peter.c.klein@siemens.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; to get them.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Creating the Screening Sample&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a new database with database name "screening" and a new Converged Servlet Application with name screening like in &lt;a href="http://petersjb.blogspot.com/2008/01/create-sip-application-for-sailfin.html"&gt;http://petersjb.blogspot.com/2008/01/create-sip-application-for-sailfin.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Add the entity classes for UserData, SceeningProfile and ProviderDataand copy their sources from the downloaded cvs sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add the java class for ModelFacade as well as the java class for RegisterSipServlet and copy its sources from the downloaded cvs sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Add a java class FSMSupport which contains helper functions called by the state machines and copy its sources from the downloaded cvs sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Add antlr.jar, approuter.jar, echarts.jar and echarts-sipserlet.jar in the &lt;edkdir&gt;/lib folder to the projects libraries.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a new folder structure echarts/screening/ech in screening/src to hold the echarts sources and copy the *.ech files from the downloaded cvs sources. Add this folder in the &lt;/span&gt;&lt;span style="font-family:arial;"&gt;project properties to sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add to the build.xml file the properties and targets -pre-compile (for ech2java compilation) and -post-compile (for generating state machine documentation) as in the build.xml file in the downloaded sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Add the EChartsSipServlet and the RegisterSipServlet to the sip.xml as shown in the example code. Note that the state machines themselves are no servlets but are called from the EChartsSipServlet. Also add ModelFacade to web.xml&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Compile and deploy the application.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Setup the data in the database as shown in the filldata.sql file in the&lt;br /&gt;"scenarios/tc-001-basic-ua" folder.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Depending on the dialed number and contents of the screening profile the call will either be connected to the called party or the party defined in the ProviderData.anno attribute.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;I the next post I will show the web based admin and some insights how it works.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The web based admin is already included in the sources but in the moment only viewing works, modify and delete have to be added.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-2330253825837048428?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/2330253825837048428/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=2330253825837048428' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2330253825837048428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2330253825837048428'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/02/screening-sample-app-using-echarts-part.html' title='Screening Sample App using ECharts (Part 1 - Application)'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-2323154009603537789</id><published>2008-02-01T13:18:00.000-08:00</published><updated>2008-02-01T13:38:34.609-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='b2bua'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Create a SIP Application for Sailfin (Part 3 Webapp)</title><content type='html'>&lt;span style="font-family:arial;"&gt;The third and last part shows how to build a simple web based administration for the user database with basic create, read, update and delete functionality. The application is modeled after the sample in &lt;a href="http://www.netbeans.org/kb/60/web/inserts-updates-deletes.html"&gt;http://www.netbeans.org/kb/60/web/inserts-updates-deletes.html&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;View the Data&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create the web page with "&lt;em&gt;New-&gt;Visual Web JSF Page&lt;/em&gt;" and a session bean with&lt;br /&gt;"&lt;em&gt;New-&gt;Visual Web JSF Session Bean&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Open the visual web page editor for the created page. Then go to the "&lt;em&gt;Services&lt;/em&gt;" tab, connect to the database and select the USERDATA table. Drag and drop it to the editor's canvas. You will see in the navigator window that a Data Provider object and a Row Set object were created.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Drag and drop a table on the canvas. Select the table, right click and select "&lt;em&gt;Bind to Data&lt;/em&gt;". Choose the userdataDataProvider which was created before and click OK. The table is now able to display data for users.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Deploy the application and point your browser to localhost:8080/b2bua to view the contents of USERDATA.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Create and Delete&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Add a button "&lt;em&gt;Add User&lt;/em&gt;" and a button "&lt;em&gt;Save Changes&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Doubleclick the "&lt;em&gt;Add User&lt;/em&gt;" button and enter the action code from the sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Doubleclick the "&lt;em&gt;Save Changes&lt;/em&gt;" button and enter the action code from the sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Select the table and open the layout editor. Add a new column and change the type of the column to "Button". &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Doubleclick the "&lt;em&gt;Delete&lt;/em&gt;" button and enter the action code from the sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Deploy the application again. You can now create and delete user data. The changes are stored in  the database when you click "&lt;em&gt;Save Changes&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-2323154009603537789?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/2323154009603537789/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=2323154009603537789' title='3 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2323154009603537789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2323154009603537789'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/02/create-sip-application-for-sailfin-part_01.html' title='Create a SIP Application for Sailfin (Part 3 Webapp)'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-2760271878084063024</id><published>2008-02-01T01:43:00.000-08:00</published><updated>2008-02-01T10:23:42.901-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='b2bua'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Create a SIP Application for Sailfin (Part 2 Servlets)</title><content type='html'>&lt;span style="font-family:arial;"&gt;In this part we will add a Sip Servlet for registration (handling the REGISTER message and storing the users contact information in the database) and a Sip Servlet which acts as a B2B User Agent transparently routing between A and B party.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Create Servlets&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a new class ModelFacade in the sip.model package. This class contains the methods UserData findUserDataById(String userId) and UserData updateUserData(UserData user) which are used by the Registration Servlet.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a RegisterSipServlet class and a B2BUASipServlet class with "&lt;em&gt;New-&gt;Sip Servlet&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The code for both you can copy from provided sources.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;In configuration files add the RegisterSipServlet and the B2BUASipServlet to sip.xml and the ModelFacade to web.xml.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Deploy the application.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Prerequisites for Testing&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Get a softphone (e.g. X-Lite from &lt;a href="http://www.counterpath.com/"&gt;http://www.counterpath.com/&lt;/a&gt;) and configure its settings (e.g. username to "Bob", domain to "test.com", proxy to localhost:5060).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;If you are running the second softphone on the same machine you need a different model as second phone (e.g. 3CX VOIP phone from &lt;a href="http://www.3cx.de/voip-telefon/index.html"&gt;http://www.3cx.de/voip-telefon/index.html&lt;/a&gt;) and configure it for a second user (e.g. Alice)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Test the Application&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Start both softphones, on X-Lite you should see "Ready, your username is Bob" on the display&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Dial from A party as &lt;em&gt;sip:user&lt;username&gt;@siphost&lt;server-ip&gt;&lt;ip&gt;:port&lt;port&gt;&lt;port&gt;,&lt;/em&gt; e.g. sip:Alice@localhost:5057&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;The second phone rings and you can start the conversation&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;When you go onhook the call is terminated.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Automatic Testing with SIPp tool&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Download the SIPp tool from &lt;a href="http://sipp.sourceforge.net/"&gt;http://sipp.sourceforge.net/&lt;/a&gt;. On Windows you also have to download WinPCap from &lt;a href="http://www.winpcap.org/devel.htm"&gt;http://www.winpcap.org/devel.htm&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Run a basic test with ant -f tests.xml tc-001-basic-ua&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-2760271878084063024?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/2760271878084063024/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=2760271878084063024' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2760271878084063024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/2760271878084063024'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/02/create-sip-application-for-sailfin-part.html' title='Create a SIP Application for Sailfin (Part 2 Servlets)'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-519013996177278223</id><published>2008-01-31T10:03:00.000-08:00</published><updated>2008-03-20T10:30:00.809-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sip'/><category scheme='http://www.blogger.com/atom/ns#' term='b2bua'/><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><title type='text'>Create a SIP Application for Sailfin (Part 1 Database)</title><content type='html'>&lt;span style="font-family:Arial;"&gt;I will go step by step through creating a simple SIP application using the NetBeans IDE for the Sailfin Sip application server. In part 1 we will setup the user database where the Sip users will register themselves.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;get the NetBeans IDE from &lt;/span&gt;&lt;a href="http://www.netbeans.org/community/releases/60/index.html"&gt;&lt;span style="font-family:arial;"&gt;http://www.netbeans.org/community/releases/60/index.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; and the NetBeans Sip application development from &lt;/span&gt;&lt;a href="https://sailfin.dev.java.net/servlets/ProjectDocumentList"&gt;&lt;span style="font-family:arial;"&gt;https://sailfin.dev.java.net/servlets/ProjectDocumentList&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; (in the appdevnb section).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;follow the installation instructions in &lt;/span&gt;&lt;a href="http://blogs.sun.com/nb_sip_sailfin_installation/resource/nb_sip_sailfin_installation.html"&gt;&lt;span style="font-family:arial;"&gt;http://blogs.sun.com/nb_sip_sailfin_installation/resource/nb_sip_sailfin_installation.html&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The sources are available in cvs using&lt;br /&gt;cvs -d:pserver:[your java.net account]&lt;java.net.id&gt;@cvs.dev.java.net:/cvs co sailfin/sailfin-tests and then can be found then in community/samples/b2bua, or send an email to &lt;/span&gt;&lt;a href="mailto:peter.c.klein@siemens.com"&gt;&lt;span style="font-family:arial;"&gt;peter.c.klein@siemens.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; to get them.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Preparing the database:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Open the database settings in NetBeans with "&lt;em&gt;Tools-&gt;Java DB Database-&gt;Settings&lt;/em&gt;" and select your Java DB installation (normally in sailfin/javadb) and the database location (normally in sailfin/databases).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Start the DB server with "&lt;em&gt;Tools-&gt;Java DB Database-&gt;Start Server&lt;/em&gt;".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a new database with "&lt;em&gt;Tools-&gt;Java DB Database-&gt;Create Database&lt;/em&gt;", then enter the database name (b2bua), the username (APP) and password (APP).&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;You can then connect to the database from the Servers tab. Click on the database connection, right click and then Connect.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;The application itself is a simple Sip back-to-back user agent which allows to build up a communication between two Sip phones and acts as a Registrar which handles the registration of the Sip users.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;Creating the Data Storage&lt;/span&gt; &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;Create a new project with "&lt;em&gt;File-&gt;New Project&lt;/em&gt;" and choose Sip and Converged Servlet Application as project type. The project name of our sample is b2bua.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Arial;"&gt;In the project view select Source Packages, right click and choose "&lt;em&gt;New-&gt;Sip Servlet&lt;/em&gt;", enter RegisterSipServlet as class name and b2bua.sip as package name.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;In the project view select Source Packages, right click and choose "&lt;em&gt;New-&gt;Entity Class&lt;/em&gt;", enter UserData as class name and b2bua.model as package name. In the same dialog box click on "Create Persistence Unit".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Choose "New Data Source" and in the next dialog box set jdbc/b2bua as JNDI name and select the prevously created database connection to b2bua.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Look at the downloaded source code for UserData.java. You will see that the attribute sipURI and its getter and setter methods were added. In sipURI the URI of the registered user is stored.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Deployment of Part 1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Open the projects properties, go to the "Run" page, select Java System Application Server as server and uncheck the "Display Browser on Run" checkbox.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Select "&lt;em&gt;Run-&gt;Run Main Project&lt;/em&gt;" to deploy the application. Depending on the sailfin version you are using there might be some warnings during deployment. Important is the output line "Enable of b2bua in target server completed successfully".&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Check the deployment on the sailfin admin console. Point your browser to &lt;/span&gt;&lt;a href="http://localhost:4848/"&gt;&lt;span style="font-family:arial;"&gt;http://localhost:4848/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; and check "&lt;em&gt;Applications-&gt;Sip-&gt;Converged Sip Modules&lt;/em&gt;" entries. b2bua should be visible as deployed.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Connect to the database, open the USERDATA table, right click and select "&lt;em&gt;View Data&lt;/em&gt;". The table should be empty. Add data by entering "insert into USERDATA values (&lt;/span&gt;&lt;a href="mailto:"&gt;&lt;span style="font-family:arial;"&gt;'Bob@test.com'&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, ''); in the SQL window, right click and select "&lt;em&gt;Run Statement&lt;/em&gt;". &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;You can also another SQl client, e.q Squirrel (download from &lt;/span&gt;&lt;a href="http://squirrel-sql.sourceforge.net/"&gt;&lt;span style="font-family:arial;"&gt;http://squirrel-sql.sourceforge.net/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, good instructions can be found in &lt;/span&gt;&lt;a href="http://db.apache.org/derby/integrate/SQuirreL_Derby.html"&gt;&lt;span style="font-family:arial;"&gt;http://db.apache.org/derby/integrate/SQuirreL_Derby.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;). Squirrel allows to directly modify the database without using SQL statements&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-519013996177278223?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/519013996177278223/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=519013996177278223' title='4 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/519013996177278223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/519013996177278223'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/01/create-sip-application-for-sailfin.html' title='Create a SIP Application for Sailfin (Part 1 Database)'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7243839215222321720.post-4201750150088486680</id><published>2008-01-17T12:20:00.000-08:00</published><updated>2008-01-18T04:51:29.490-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sailfin'/><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><category scheme='http://www.blogger.com/atom/ns#' term='PinTheGlobe'/><title type='text'>Welcome to my Devlog</title><content type='html'>&lt;span style="font-family:arial;"&gt;Hello,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;This weblog tells you about the private development projects I am involved in, cu&lt;/span&gt;&lt;span style="font-family:arial;"&gt;rrently this are:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;PinTheGlobe:&lt;/strong&gt; a GoogleMaps based website (&lt;/span&gt;&lt;a href="http://www.pintheglobe.com/"&gt;&lt;span style="font-family:arial;"&gt;http://www.pintheglobe.com&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;) which allows to view and add georeferenced information (so called geotags) to the map, e.g.&lt;/span&gt; you can add favorite places you want to share with others. I created this website mainly to learn new website development techniques like javascript and Ajax.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Sailfin&lt;/strong&gt;: participating in sample applications and testing for the sailfin project. Sailfin (&lt;a href="https://sailfin.dev.java.net/"&gt;https://sailfin.dev.java.net/&lt;/a&gt;) is an open source converged SIP and HTTP application server based on glassfish.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7243839215222321720-4201750150088486680?l=petersjb.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petersjb.blogspot.com/feeds/4201750150088486680/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7243839215222321720&amp;postID=4201750150088486680' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/4201750150088486680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7243839215222321720/posts/default/4201750150088486680'/><link rel='alternate' type='text/html' href='http://petersjb.blogspot.com/2008/01/welcome-my-developers-junglebook.html' title='Welcome to my Devlog'/><author><name>Peter</name><uri>http://www.blogger.com/profile/03564958689322422660</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
